parascan.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. #include "sys.hpp" // for libcwd
  2. #include "debug.hpp" // for libcwd
  3. #include "parascan.hpp"
  4. #include "vconnection.hpp"
  5. #include "vnormalize.hpp"
  6. #include "simmodules/simmodules.hpp"
  7. #include "input.hpp"
  8. #include "simloop.hpp"
  9. #include <external/tinyxml/tinyxml.h>
  10. #include "stopwatch.hpp"
  11. #include <sstream>
  12. using namespace std;
  13. ParaScanValues::ParaScanValues(pair<float,float> _Range, int NValues)
  14. {
  15. mValues = GenerateScanParaValues(_Range.first, _Range.second, NValues);
  16. }
  17. ParaScanValues::ParaScanValues(vector<float> _Values): mValues(_Values)
  18. {
  19. }
  20. const vector<float>& ParaScanValues::Values()
  21. {
  22. return mValues;
  23. }
  24. void ParaScanValues::print()
  25. {
  26. ostringstream stream;
  27. for (vector<float>::iterator it=mValues.begin(); it!=mValues.end(); ++it)
  28. {
  29. stream << (*it) << " ";
  30. }
  31. Dout(dc::para, stream.str());
  32. }
  33. /** generate a list of parameter values in the range of LowBound to HighBound
  34. *
  35. * @param LowBound is the lower boundery
  36. * @param HighBound is the upper boundery
  37. * @param NValues is the number of values
  38. * @return vector of equally spaced parameter values
  39. */
  40. vector<float> GenerateScanParaValues(float LowBound, float HighBound, int NValues)
  41. {
  42. vector<float> RetVect;
  43. RetVect.push_back(LowBound);
  44. if (NValues <2) {
  45. return RetVect;
  46. }
  47. float StepSize=(HighBound-LowBound)/(NValues-1);
  48. for (int i=1;i<NValues;++i) {
  49. RetVect.push_back(LowBound+i*StepSize);
  50. }
  51. return RetVect;
  52. }
  53. //////////////////////////////
  54. SingleValuePara::SingleValuePara(string _ParaName, vector<float> _ValueList):
  55. ParaName(_ParaName), ValueList(_ValueList)
  56. {
  57. NValues=ValueList.size();
  58. CurVal=0;
  59. }
  60. void SingleValuePara::Hello()
  61. {
  62. Dout(dc::para, "SingleValuePara, name=" << ParaName);
  63. }
  64. void SingleValuePara::WriteXmlAttribute(TiXmlElement* para) {
  65. Dout(dc::para, "SingleValuePara::WriteXmlAttribute(TiXmlElement* para)");
  66. para->SetDoubleAttribute(ParaName.c_str(), ValueList[CurVal]);
  67. };
  68. bool SingleValuePara::Next()
  69. {
  70. ++CurVal;
  71. bool Rewind=false;
  72. if (CurVal==NValues) {
  73. CurVal=0;
  74. Rewind=true;
  75. }
  76. return Rewind;
  77. }
  78. //////////////////////////////
  79. TwoValuesPara::TwoValuesPara(string _Para1Name, string _Para2Name,
  80. vector<float> _Value1List, vector<float> _Value2List):
  81. Para1Name(_Para1Name), Para2Name(_Para2Name),
  82. Value1List(_Value1List), Value2List(_Value2List)
  83. {
  84. NValues1=Value1List.size();
  85. NValues2=Value2List.size();
  86. CurVal1=0;
  87. CurVal2=0;
  88. }
  89. void TwoValuesPara::Hello()
  90. {
  91. Dout(dc::para, "TwoValuesPara, name1=" << Para1Name << " name2=" << Para2Name);
  92. }
  93. void TwoValuesPara::WriteXmlAttribute(TiXmlElement* para) {
  94. Dout(dc::para, "TwoValuesPara::WriteXmlAttribute(TiXmlElement* para)");
  95. para->SetDoubleAttribute(Para2Name.c_str(), Value2List[CurVal2]);
  96. para->SetDoubleAttribute(Para1Name.c_str(), Value1List[CurVal1]);
  97. };
  98. bool TwoValuesPara::Next()
  99. {
  100. bool RewindSecond=false;
  101. bool RewindFirst=false;
  102. if (++CurVal2>=NValues2) {
  103. CurVal2=0;
  104. RewindSecond=true;
  105. }
  106. if (RewindSecond) {
  107. if (++CurVal1>=NValues1) {
  108. CurVal1=0;
  109. RewindFirst=true;
  110. }
  111. }
  112. return RewindFirst;
  113. }
  114. //////////////////////////
  115. SimLoopPara::SimLoopPara(SimLoop* _SimLoop,
  116. ParaType _ptype,
  117. vector<float> _ValueList,
  118. string _ParaName):
  119. MainSimLoop(_SimLoop),
  120. ptype(_ptype),
  121. SingleValuePara(_ParaName, _ValueList)
  122. {
  123. }
  124. void SimLoopPara::SetPara()
  125. {
  126. MainSimLoop->SetParameter(ptype, ValueList[CurVal]);
  127. }
  128. ///////////////////////////////
  129. ContrastInputPara::ContrastInputPara(PictureSequenceInput* _PInput,
  130. vector<float> _BackgroundStrength,
  131. vector<float> _StimContrast):
  132. TwoValuesPara("InputStrength",
  133. "StimContrast",
  134. _BackgroundStrength,
  135. _StimContrast),
  136. PInput(_PInput)
  137. {
  138. }
  139. void ContrastInputPara::SetPara()
  140. {
  141. float Contrast=Value2List[CurVal2];
  142. float Background=Value1List[CurVal1];
  143. float Strength = Background*Contrast;
  144. PInput->SetBackgroundStrength(Background);
  145. PInput->SetInputStrength(Strength);
  146. }
  147. void ContrastInputPara::SetParaBackgroundOnly()
  148. {
  149. float Contrast=Value2List[CurVal2];
  150. float Background=Value1List[CurVal1];
  151. float Strength = Background*Contrast;
  152. PInput->SetBackgroundStrength(Background);
  153. PInput->SetInputStrength(0*Strength);
  154. }
  155. void NoiseAmplitudePara::SetPara()
  156. {
  157. mLayer->SetNoiseAmplitude(ValueList[CurVal]);
  158. }
  159. ////////////////////////
  160. GaussConProfilePara::GaussConProfilePara(VecConnection* _con,
  161. vector<float> Range,
  162. vector<float> Strength,
  163. float _MinDelay,
  164. float _MaxDelay)
  165. :TwoValuesPara("ExExRange",
  166. "ExExStrength",
  167. Range,
  168. Strength),
  169. con(_con),
  170. MinDelay(_MinDelay),
  171. MaxDelay(_MaxDelay)
  172. {
  173. }
  174. void GaussConProfilePara::SetPara()
  175. {
  176. int ConNumber=CurVal1*NValues2+CurVal2;
  177. float NewRangeVal = Value1List[CurVal1];
  178. float NewStrengthVal = Value2List[CurVal2];
  179. if (NewRangeVal != OldRangeVal || NewStrengthVal != OldStrengthVal) {
  180. con->DeleteSynapseArrays();
  181. con->ConnectGaussian(NewRangeVal,
  182. NewStrengthVal,
  183. MaxDelay,
  184. MinDelay,
  185. true);
  186. // con->Save(ConNumber);
  187. OldRangeVal=NewRangeVal;
  188. OldStrengthVal=NewStrengthVal;
  189. }
  190. }
  191. ////////////////////////
  192. ChangableTwoValuePara::ChangableTwoValuePara(const string& NameVal1,
  193. const string& NameVal2,
  194. vector<float> Values1,
  195. vector<float> Values2,
  196. Changable* ObjectToBeChanged)
  197. :TwoValuesPara(NameVal1, NameVal2, Values1, Values2), mParaChangeTarget(ObjectToBeChanged), mOldValue1(0), mOldValue2(0)
  198. {
  199. }
  200. void ChangableTwoValuePara::SetPara()
  201. {
  202. float NewValue1 = Value1List[CurVal1];
  203. float NewValue2 = Value2List[CurVal2];
  204. if (NewValue1 != mOldValue1 || NewValue2 != mOldValue2) {
  205. TwoParameters<float,float> Val1Val2 = TwoParameters<float,float>(NewValue1, NewValue2);
  206. mParaChangeTarget->changeParameter(&Val1Val2);
  207. mOldValue1 = NewValue1;
  208. mOldValue2 = NewValue2;
  209. }
  210. }
  211. ////////////////////////
  212. void InhExStrengthPara::SetPara()
  213. {
  214. Dout(dc::para, "InhExStrengthPara::SetPara(): SetInhExWeightStrength");
  215. CompInh->SetInhExWeightStrength(ValueList[CurVal]);
  216. }
  217. ///////////////////////
  218. void ParameterCollection::AddContrastInputPara(PictureSequenceInput* _PInput,
  219. vector<float> _BackgroundStrength,
  220. vector<float> _StimContrast)
  221. {
  222. ContrastInputPara* StimContrastInput = new ContrastInputPara(
  223. _PInput,
  224. _BackgroundStrength,
  225. _StimContrast);
  226. AddPara(StimContrastInput);
  227. }
  228. /** set next parameter combination
  229. * @return true if all parameters were rewinded (after last parameter in parameter space)
  230. */
  231. bool ParameterCollection::NextPara()
  232. {
  233. size_t NParas=ScanParaList.size();
  234. bool RewindAll=false;
  235. bool IncNextPara=true;
  236. size_t ParaNum=0;
  237. while (ScanParaList[ParaNum]->Next()) {
  238. // next returns true if para was rewinded --> then the next para has to be increased.
  239. ++ParaNum;
  240. if (ParaNum==NParas) {
  241. RewindAll=true;
  242. break;
  243. }
  244. }
  245. return RewindAll;
  246. }
  247. /** set all parameters according to current values
  248. */
  249. void ParameterCollection::SetPara()
  250. {
  251. for (ScanParaIter it=ScanParaList.begin();it!=ScanParaList.end();++it) {
  252. (*it)->SetPara();
  253. }
  254. }
  255. /** write xml attributes for all current parameters
  256. */
  257. void ParameterCollection::WriteXmlAttributes(TiXmlElement* para)
  258. {
  259. for (ScanParaIter it=ScanParaList.begin();it!=ScanParaList.end();++it) {
  260. (*it)->WriteXmlAttribute(para);
  261. }
  262. }
  263. bool TestParameterCollection()
  264. {
  265. }
  266. void ParameterCollection::testNetwork(const pair<float,float>& InputIntervalInSec,
  267. const float& SecondsPerParameter,
  268. input* TestInput )
  269. {
  270. Interval InputInterval(InputIntervalInSec);
  271. int LoopCount=0;
  272. int step=0;
  273. int sec =0;
  274. int t=0;
  275. StopWatch TestStopWatch;
  276. SimLoop* MainSimLoop = TestInput->getSimLoop();
  277. float dt = MainSimLoop->GetDeltaT();
  278. int MacroTimeStep = MainSimLoop->GetMacroTimeStep();
  279. int NSteps = 1000*(SecondsPerParameter/dt)/MacroTimeStep;
  280. bool UseInputInterval = InputInterval.isValid();
  281. int InputStartStep = static_cast<int>(InputInterval.LowBound()/dt);
  282. int InputStopStep = static_cast<int>(InputInterval.HighBound()/dt);
  283. TiXmlDocument XmlDoc((MainSimLoop->GetDataDirectory()
  284. +"/parameter.xml").c_str());
  285. TiXmlElement XmlRoot("ScanTagsAndParameters");
  286. XmlDoc.InsertEndChild(XmlRoot);
  287. TiXmlNode* xroot=XmlDoc.FirstChild();
  288. TestStopWatch.start();
  289. do {
  290. SetPara();
  291. MainSimLoop->showMemoryConsumption();
  292. MainSimLoop->SaveSimInfo();
  293. string SimTag = string("TEST")+stringify(LoopCount);
  294. MainSimLoop->SetSimTag(SimTag.c_str());
  295. TiXmlElement p("Para");
  296. p.SetAttribute("SimTag", SimTag.c_str());
  297. WriteXmlAttributes(&p);
  298. xroot->InsertEndChild(p);
  299. XmlDoc.SaveFile();
  300. MainSimLoop->reset(0);
  301. if (UseInputInterval) {
  302. TestInput->setSilent(true);
  303. Dout(dc::para, "Turn Input off.");
  304. }
  305. int TotalTimeStep;
  306. for (step=0;step<NSteps;++step) {
  307. int TotalStep = (step+LoopCount*NSteps);
  308. cout << "Loop" << LoopCount << " Step=" << step
  309. << " sec= " << dt*(sec++) << "\n";
  310. // simulation of one MacroTimeStep
  311. for (t=0;t<MacroTimeStep;t++) {
  312. TotalTimeStep=MacroTimeStep*step+t;
  313. if (UseInputInterval) {
  314. if (TotalTimeStep==InputStartStep) {
  315. Dout(dc::para, "Turn Input on. TotalTimeStep=" << TotalTimeStep);
  316. TestInput->setSilent(false);
  317. }
  318. if (TotalTimeStep==InputStopStep) {
  319. Dout(dc::para, "Turn Input off. TotalTimeStep=" << TotalTimeStep);
  320. TestInput->setSilent(true);
  321. }
  322. }
  323. MainSimLoop->proceede(TotalTimeStep);
  324. }
  325. Dout(dc::para, "prepare(step)");
  326. TestStopWatch.stopRound();
  327. MainSimLoop->prepare(step);
  328. Dout(dc::para, "prepared");
  329. }
  330. ++LoopCount;
  331. } while (!NextPara());
  332. XmlDoc.SaveFile();
  333. }