#include "sys.hpp" // for libcwd #include "debug.hpp" // for libcwd #include "simloop.hpp" #include "simelement.hpp" #include "layer.hpp" #include "connection.hpp" #include "normalize.hpp" #include "filesystem.hpp" #include /** Signal-Handler */ void ProcessSignal(int SigNum) { switch (SigNum) { case SIGUSR1: Dout(dc::simloop, "received custom signal SIGUSR1 "); GetGlobalSimLoop()->ProcessSignalUsr1(); break; case SIGUSR2: Dout(dc::simloop, "received custom signal SIGUSR2 "); break; } } SimLoop* GlobalMainSimLoop=0; SimLoop* InitLibCSim(int _MacroTimeStep, float _DeltaT) { GlobalMainSimLoop = new SimLoop(_MacroTimeStep, _DeltaT); return GlobalMainSimLoop; } void deleteGlobalSimLoop() { delete GlobalMainSimLoop; GlobalMainSimLoop=0; } SimLoop* GetGlobalSimLoop() { if (GlobalMainSimLoop) { return GlobalMainSimLoop; } else { return InitLibCSim(); } } /////////////////////////////// SimLoop::SimLoop(int _MacroTimeStep, float _DeltaT) :MacroTimeStep(_MacroTimeStep), DeltaT(_DeltaT), ElementCounter(0), MaximumDelay(0) { Dout(dc::simloop, "SimLoop Default Constructor"); SimElementList = new vector; ConnectionList = new TConnectionList; NormList = new TNormList; DataDirectory=""; // DeltaT=0.25; Dout(dc::simloop, " One time step is DeltaT = " << DeltaT << " ms"); if (signal(SIGUSR1, ProcessSignal) == SIG_ERR) { cerr << "ERROR connecting signal to handler\n"; } else { Dout(dc::simloop, "connected signal to handler"); }; } /** * @brief element is added to SimLoop, and SimLoop takes ownership of the SimElement. * SimLoop is therefore responsible for deleting the SimElements * * @param element * @return */ int SimLoop::AddSimElement(SimElement* element) { (*SimElementList).push_back(element); element->IdNumber = ++ElementCounter; Dout(dc::simloop, "add SimElement"); element->Hallo(); } int SimLoop::AddSimElement(layer* element) { SimElement* NewElement = static_cast(element); AddSimElement(NewElement); Dout(dc::simloop, " new SimElement is a Layer "); } int SimLoop::AddSimElement(Connection* element) { (*ConnectionList).push_back(element); SimElement* NewElement = static_cast(element); AddSimElement(NewElement); Dout(dc::simloop, " new SimElement is a Connection "); } int SimLoop::AddSimElement(AbstractNormalize* element) { (*NormList).push_back(element); SimElement* NewElement = static_cast(element); AddSimElement(NewElement); Dout(dc::simloop, " new SimElement is a Normalization Object"); } void SimLoop::Hallo() { Dout(dc::simloop, "This is SimLoop::Hallo()"); Debug( libcw_do.inc_indent(2) ); for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { (*it)->Hallo(); } Debug( libcw_do.dec_indent(2) ); Dout(dc::simloop, "DataDirectory=" << DataDirectory << " MacroTimeStep=" << MacroTimeStep); } void SimLoop::SetSimTag(const char* _tag) { for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { (*it)->SetSimTag(_tag); } } int SimLoop::proceede(int TotalTime) { for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { if ((*it)->On()) (*it)->proceede(TotalTime); } } int SimLoop::reset(int t) { for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { if ((*it)->On() && (*it)->Resetable()) (*it)->reset(t); } } void SimLoop::SetParameter(ParaType p, double value) { for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { (*it)->SetParameter(p, value); } } void SimLoop::showMemoryConsumption() { cout << "MemoryConsumption:\n"; long TotalMemorySum=0; for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { long CurElementMemConsumption = (*it)->calcMemoryConsumption(); TotalMemorySum +=CurElementMemConsumption; cout << (*it)->Name << ": " << CurElementMemConsumption/1000000. << " MB \n "; } cout << "Total Memory Sum = " << TotalMemorySum/1000000. << " MB\n"; } int SimLoop::prepare(int mst) { for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { if ((*it)->On()) (*it)->prepare(mst); // fm14.8.08: if-Abfrage eingefuegt, noch nicht auf side effects geprueft } } void SimLoop::SetDataDirectory(const char* _dirname) { SetDataDirectory_(_dirname); } void SimLoop::SetDataDirectory_(const char* _dirname) { // expand $HOME std::string HomeDir(getenv("HOME")); std::string TmpDataDir = _dirname; string::size_type HomeStrPos = TmpDataDir.find("$HOME"); if (HomeStrPos != string::npos) { TmpDataDir.replace(HomeStrPos, HomeStrPos+5, HomeDir); Dout(dc::simloop, "Expand $HOME to " << TmpDataDir); } if (fexist(TmpDataDir.c_str())) { Dout(dc::simloop, "DataDirectory = " << TmpDataDir); DataDirectory = TmpDataDir; } else { Dout(dc::simloop, "Directory " << TmpDataDir << " doesn't exist."); Dout(dc::simloop, "Try creating "<< TmpDataDir); if (MakeDirRecursively(TmpDataDir.c_str())) { Dout(dc::simloop, "New Directory "<\n"; for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { (*it)->SaveSimInfo(); (*it)->WriteSimInfo(file_op); } file_op << "\n"; file_op.close(); // fclose(fw); } void SimLoop::deleteAllSimElements() { Dout(dc::simloop, "SimLoop deletes all registered SimElements"); for (vector::iterator it=(*SimElementList).begin(); it!=(*SimElementList).end(); ++it) { delete (*it); } } void SimLoop::SetMaximumDelay(int newmax) { if (newmax>MaximumDelay) { MaximumDelay=newmax; } } int SimLoop::GetMaximumDelay() { return MaximumDelay; } int SimLoop::GetMacroTimeStep() { return MacroTimeStep; } int SimLoop::SetDeltaT(float _dt) { DeltaT = _dt; } float SimLoop::GetDeltaT() { return DeltaT; } void SimLoop::TurnOffLearning() { Dout(dc::simloop, "TurnOffLearning");fflush(stdout); for (ConIter it=(*ConnectionList).begin(); it!=(*ConnectionList).end(); ++it) { (*it)->SetLearn(false); } for (NormIter it=(*NormList).begin(); it!=(*NormList).end(); ++it) { (*it)->TurnOff(); } } void SimLoop::TurnOnLearning() { Dout(dc::simloop, "TurnOnLearning");fflush(stdout); for (ConIter it=(*ConnectionList).begin(); it!=(*ConnectionList).end(); ++it) { (*it)->SetLearn(true); } for (NormIter it=(*NormList).begin(); it!=(*NormList).end(); ++it) { (*it)->TurnOn(); } } void SimLoop::SaveLearningWeights(int TrialNr) { for (ConIter it=(*ConnectionList).begin(); it!=(*ConnectionList).end(); ++it) { if ((*it)->Learning()) (*it)->Save(TrialNr); } } void SimLoop::CropLearningWeights(float threshold) { for (ConIter it=(*ConnectionList).begin(); it!=(*ConnectionList).end(); ++it) { if ((*it)->Learning()) (*it)->DeleteLowWeights(threshold); } } void SimLoop::ProcessSignalUsr1() { Dout(dc::simloop, "SimLoop::ProcessSignalUsr1()"); Hallo(); }