#ifndef NS_CONNECTION_HH
#define NS_CONNECTION_HH
#include <math.h>
#include "NsUnit.hh"
#include "NsGlobals.hh"
class NsTract;
class NsConnection {
private:
bool forceStaticInit;
public:
NsConnection(const NsTract *tract, const NsUnit *from, NsUnit *to);
void stimulate(double learnRate, uint numStimCycles, const char *tag);
void amparTrafficking(double cpAmparRemovalRate,
double ciAmparInsertionRate,
double ciAmparRemovalRate);
static void printStateHdr();
void depotentiate(const char *tag);
void togglePsi(bool state) { psiIsOn = state; }
void reactivate();
double getStrength() const;
void printState() const;
string toStr(uint iLvl = 0, const string &iStr = " ") const;
bool isHebbian() const { return fromUnit->isActive && toUnit->isActive; }
bool isPotentiated;
const NsUnit *fromUnit;
NsUnit *toUnit;
private:
void potentiate(const char *tag);
bool initializeStatics();
void setNumCiAmpars(double n)
{
TRACE_DEBUG("simTime: {} {}.numCiAmpars {:5.2f} --> {:5.2f}\n",
simTime, id, numCiAmpars, n);
ABORT_IF(n < minNumCiAmpars || isnan(n), "Oops");
numCiAmpars = n;
}
void setNumCpAmpars(double n)
{
TRACE_DEBUG("simTime: {} {}.numCpAmpars {:5.2f} --> {:5.2f}\n",
simTime, id, numCpAmpars, n);
ABORT_IF(n < minNumCpAmpars || isnan(n), "Oops");
numCpAmpars = n;
}
void learn(double learnRate, uint numStimCycles, const char *tag);
const NsTract *tract;
const string id;
double psdSize;
double numCiAmpars;
double numCpAmpars;
bool psiIsOn;
bool staticsInitialized;
static double minPsdSize;
static double maxPsdSize;
static double minNumCiAmpars;
static double minNumCpAmpars;
static double potProbK; // K value for potentiation probability as
// function of numTrainCycles
static double potProbHalf; // numTrainCycles value at which probability
// of potentiation is 0.5
};
#endif