#ifndef NS_SYSTEM_HH
#define NS_SYSTEM_HH
#include <unordered_map>
using std::unordered_map;
#include "fmt/format.h"
#include "Props.hh"
#include "Util.hh"
#include "NsLayer.hh"
#include "NsTract.hh"
#include "NsPattern.hh"
static const string hpcLayerId = "HPC";
static const string accLayerId = "ACC";
static const string sc0LayerId = "SC0";
static const string sc1LayerId = "SC1";
static const string hpcTractTypeId = "hpc";
static const string ncTractTypeId = "nc";
static const string hpcLayerTypeId = "hpc";
static const string ncLayerTypeId = "nc";
/**
* Output trace message (without locator) if traceLevel is
* INFO or lower
*/
template <typename... Args>
void infoTrace(const char *fmt, Args ... args)
{
if (TRACE_INFO_IS_ON) {
fmt::vprint(stdout, fmt, fmt::make_format_args(args...));
}
}
/**
* Output trace message (without locator) if traceLevel is
* INFO1 or lower
*/
template <typename... Args>
void info1Trace(const char *fmt, Args ... args)
{
if (TRACE_INFO1_IS_ON) {
fmt::vprint(stdout, fmt, fmt::make_format_args(args...));
}
}
/**
* Output trace message (without locator) if traceLevel is
* DEBUG or lower
*/
template <typename... Args>
void debugTrace(const char *fmt, Args ... args)
{
if (TRACE_DEBUG_IS_ON) {
fmt::vprint(stdout, fmt, fmt::make_format_args(args...));
}
}
class NsSystem {
public:
NsSystem() {}
NsSystem(Props &props);
void addLayer(const string &id, const string &type);
void addTract(const string &fromLayerId, const string &toLayerId,
const string &type);
/**
* Add bidirectional tracts between two layers
*/
void addBiTract(const string &layer1Id, const string &layer2Id,
const string &type);
/**
* Calculates rates for current timeStep value for all tracts
*/
void calcRates();
void acquire(uint numTrainCycles, const char *tag);
void consolidate();
void maintain();
void clear();
void setFrozen(const string &layerId, bool state);
void lesion(const string &layerId);
void settle();
void runBackgroundProcesses();
void retrieve(const string &cueLayerId, const string &patternId,
const string &tag);
void train();
void reactivate();
void test(const string &cueLayerId, const string &patternId,
const string &condition);
void togglePsi(string layerId, bool state);
static void printStateHdrs();
void printState() const;
void printGrids(const string &tag, const string &targetId = "") const;
NsLayer *getLayer(const string &id) { return layers.at(id); }
NsTract *getTract(const string &id) { return tracts.at(id); }
void printSize();
string toStr(uint iLvl = 0, const string &iStr = " ") const;
unordered_map<string, NsLayer *> layers;
unordered_map<string, NsTract *> tracts;
uint trainNumStimCycles;
uint consNumStimCycles;
uint reactNumStimCycles;
uint numSettleCycles;
};
#endif
|