Computational Embodied Neuroscience Simulator  1.1
3D simulation library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
cens_parameter_manager.h
Go to the documentation of this file.
1 #ifndef CENS_PARAMETER_MANAGER_H
2 #define CENS_PARAMETER_MANAGER_H
3 
4 #include <iostream>
5 #include <fstream>
6 #include <string>
7 #include <sstream>
8 #include <map>
9 #include <boost/regex.hpp>
10 #include <boost/filesystem.hpp>
11 
12 // linear algebra
13 #include <Eigen/Core>
14 #include <Eigen/Geometry>
15 using namespace Eigen;
16 
17 
18 class CENSParameterDirException: public std::runtime_error
19 {
20 
21  public:
22 
23  CENSParameterDirException(std::string const& msg = "parameter directory (\"./params\") not present!"):
24  std::runtime_error(msg)
25  {}
26 };
27 
28 class CENSParameterException: public std::runtime_error
29 {
30 
31  public:
32 
33  CENSParameterException(std::string const& msg = "parameter file not present ... initialized!"):
34  std::runtime_error(msg)
35  {}
36 };
37 
42 {
43 
44  public:
45 
46  typedef std::map<std::string,std::string *> strvalues;
47  typedef strvalues::iterator striter;
48  typedef std::map<std::string,Vector4f *> v4values;
49  typedef v4values::iterator v4iter;
50  typedef std::map<std::string,Vector3f *> v3values;
51  typedef v3values::iterator v3iter;
52  typedef std::map<std::string,double *> dvalues;
53  typedef dvalues::iterator diter;
54  typedef std::map<std::string,float *> fvalues;
55  typedef fvalues::iterator fiter;
56  typedef std::map<std::string,int *> ivalues;
57  typedef ivalues::iterator iiter;
58  typedef std::map<int, std::string> labels;
59  typedef labels::iterator liter;
60 
63  std::string _filename,
64  const char *sep="-------",
65  const char *vsep=";",
66  const char *filedir="parameters/") :
67  filename(std::string(filedir).append(_filename)),
68  separator(sep),
69  vseparator(vsep),
70  added(0)
71  {
72  if (not boost::filesystem::exists(filedir))
73  if(not boost::filesystem::create_directory(filedir))
75  }
76 
78  {
79  separator = copy.separator;
80  separator = copy.vseparator;
81  filename = copy.filename;
82  strparlist = copy.strparlist;
83  v4parlist = copy.v4parlist;
84  v3parlist = copy.v3parlist;
85  dparlist = copy.dparlist;
86  fparlist = copy.fparlist;
87  iparlist = copy.iparlist;
88  order = copy.order;
89  added = copy.added;
90  }
91 
92 
94  void addParameter(std::string parname, std::string &par)
95  {
96  strparlist[parname] = &par;
97  order[added++]=parname;
98  }
99 
101  void addParameter(std::string parname, Vector4f &par)
102  {
103  v4parlist[parname] = &par;
104  order[added++]=parname;
105  }
106 
108  void addParameter(std::string parname, Vector3f &par)
109  {
110  v3parlist[parname] = &par;
111  order[added++]=parname;
112  }
113 
115  void addParameter(std::string parname, double &par)
116  {
117  dparlist[parname] = &par;
118  order[added++]=parname;
119  }
120 
122  void addParameter(std::string parname, float &par)
123  {
124  fparlist[parname] = &par;
125  order[added++]=parname;
126  }
127 
129  void addParameter(std::string parname, int &par)
130  {
131  iparlist[parname] = &par;
132  order[added++]=parname;
133  }
134 
136  bool loadParameters() {
137 
138  // load parameter file
139  std::ifstream loadstr(
140  filename.c_str());
141  if(!loadstr.is_open())
142  {
143  return false;
144  }
145 
146  // Load all strings from the file of parameters
147  std::vector<std::string> paramfile_strings;
148  std::string line("");
149  while( std::getline( loadstr, line ) )
150  {
151  paramfile_strings.push_back( line );
152  }
153  paramfile_strings.push_back( line );
154 
155 
158  for(
159  striter iter = strparlist.begin();
160  iter != strparlist.end();
161  ++iter )
162  {
163 
164  // built regex pattern representing the parameter label
165  std::string pattern =
166  std::string("\\s*")
167  .append(separator)
168  .append("\\s*\\<")
169  .append(iter->first )
170  .append("\\>\\s*$");
171 
172 
173  boost::regex re( pattern );
174 
175  // extract value from param line
176  for(
177  unsigned i=0;
178  i<paramfile_strings.size();
179  i++ )
180  {
181  if ( boost::regex_search(
182  paramfile_strings[i],
183  re ) )
184  {
185 
186  std::string rep =
187  boost::regex_replace(
188  paramfile_strings[i] ,
189  re, "" );
190 
191  *(iter->second) = rep;
192 
193  }
194  }
195  }
196 
197 
200  for(
201  v4iter iter = v4parlist.begin();
202  iter != v4parlist.end();
203  ++iter )
204  {
205 
206  // built regex pattern representing the parameter label
207  std::string pattern =
208  std::string("\\s*")
209  .append(separator)
210  .append("\\s*\\<")
211  .append(iter->first )
212  .append("\\>\\s*$");
213 
214 
215  boost::regex re( pattern );
216 
217  // extract value from param line
218  for(
219  unsigned i=0;
220  i<paramfile_strings.size();
221  i++ )
222  {
223  if ( boost::regex_search(
224  paramfile_strings[i],
225  re ) )
226  {
227 
228  Vector4f &v4 = *(iter->second);
229 
230  std::string rep =
231  boost::regex_replace(
232  paramfile_strings[i] ,
233  re, "" );
234 
235  boost::sregex_token_iterator i(
236  rep.begin(),
237  rep.end(),
238  boost::regex(vseparator), -1);
239 
240  std::stringstream(*i++) >> v4[0];
241  std::stringstream(*i++) >> v4[1];
242  std::stringstream(*i++) >> v4[2];
243  std::stringstream(*i++) >> v4[3];
244 
245  }
246  }
247  }
248 
249 
252  for(
253  v3iter iter = v3parlist.begin();
254  iter != v3parlist.end();
255  ++iter )
256  {
257 
258  // built regex pattern representing the parameter label
259  std::string pattern =
260  std::string("\\s*")
261  .append(separator)
262  .append("\\s*\\<")
263  .append(iter->first )
264  .append("\\>\\s*$");
265 
266 
267  boost::regex re( pattern );
268 
269  // extract value from param line
270  for(
271  unsigned i=0;
272  i<paramfile_strings.size();
273  i++ )
274  {
275  if ( boost::regex_search(
276  paramfile_strings[i],
277  re ) )
278  {
279 
280  Vector3f &v3 = *(iter->second);
281 
282  std::string rep =
283  boost::regex_replace(
284  paramfile_strings[i] ,
285  re, "" );
286 
287  boost::sregex_token_iterator i(
288  rep.begin(),
289  rep.end(),
290  boost::regex(vseparator), -1);
291 
292  std::stringstream(*i++) >> v3[0];
293  std::stringstream(*i++) >> v3[1];
294  std::stringstream(*i++) >> v3[2];
295 
296  }
297  }
298  }
299 
300 
303  for(
304  diter iter = dparlist.begin();
305  iter != dparlist.end();
306  ++iter )
307  {
308 
309  // built regex pattern representing the parameter label
310  std::string pattern =
311  std::string("\\s*")
312  .append(separator)
313  .append("\\s*\\<")
314  .append(iter->first )
315  .append("\\>\\s*$");
316 
317 
318  boost::regex re( pattern );
319 
320  // extract value from param line
321  for(
322  unsigned i=0;
323  i<paramfile_strings.size();
324  i++ )
325  {
326  if ( boost::regex_search(
327  paramfile_strings[i],
328  re ) )
329  {
330  std::string rep =
331  boost::regex_replace(
332  paramfile_strings[i] ,
333  re, "" );
334  std::stringstream(rep) >> *(iter->second);
335  }
336  }
337  }
338 
341  for(
342  fiter iter = fparlist.begin();
343  iter != fparlist.end();
344  ++iter )
345  {
346 
347  // built regex pattern representing the parameter label
348  std::string pattern =
349  std::string("\\s*")
350  .append(separator)
351  .append("\\s*\\<")
352  .append(iter->first )
353  .append("\\>\\s*$");
354 
355 
356  boost::regex re( pattern );
357 
358  // extract value from param line
359  for(
360  unsigned i=0;
361  i<paramfile_strings.size();
362  i++ )
363  {
364  if ( boost::regex_search(
365  paramfile_strings[i],
366  re ) )
367  {
368  std::string rep =
369  boost::regex_replace(
370  paramfile_strings[i] ,
371  re, "" );
372  std::stringstream(rep) >> *(iter->second);
373  }
374  }
375  }
376 
379  for(
380  iiter iter = iparlist.begin();
381  iter != iparlist.end();
382  ++iter )
383  {
384 
385  // built regex pattern representing the parameter label
386  std::string pattern =
387  std::string("\\s*")
388  .append(separator)
389  .append("\\s*\\<")
390  .append(iter->first )
391  .append("\\>\\s*$");
392  boost::regex re( pattern );
393 
394 
395  // extract value from param line
396  for(
397  unsigned i=0;
398  i<paramfile_strings.size();
399  i++ )
400  {
401  if ( boost::regex_search(
402  paramfile_strings[i],
403  re ) )
404  {
405  std::string rep =
406  boost::regex_replace(
407  paramfile_strings[i] ,
408  re, "" );
409  std::stringstream(rep) >> *(iter->second);
410  }
411  }
412  }
413 
414  return true;
415 
416  }
417 
420  {
421 
422  std::ofstream file(filename.c_str());
423 
424  for(
425  liter iter = order.begin();
426  iter != order.end();
427  ++iter )
428  {
429 
430  std::string name = iter->second;
431 
432  if (iparlist.find(name) != iparlist.end())
433  file << *iparlist[name]
434  << " " << separator << " " << name << std::endl;
435  else if (fparlist.find(name) != fparlist.end())
436  file << *fparlist[name]
437  << " " << separator << " " << name << std::endl;
438  else if (dparlist.find(name) != dparlist.end())
439  file << *dparlist[name]
440  << " " << separator << " " << name << std::endl;
441  else if (strparlist.find(name) != strparlist.end())
442  file << *strparlist[name]
443  << " " << separator << " " << name << std::endl;
444  else if (v3parlist.find(name) != v3parlist.end())
445  file << (*v3parlist[name])[0] << vseparator
446  << (*v3parlist[name])[1] << vseparator
447  << (*v3parlist[name])[2]
448  << " " << separator << " " << name << std::endl;
449  else if (v4parlist.find(name) != v4parlist.end())
450  file << (*v4parlist[name])[0] << vseparator
451  << (*v4parlist[name])[1] << vseparator
452  << (*v4parlist[name])[2] << vseparator
453  << (*v4parlist[name])[3]
454  << " " << separator << " " << name << std::endl;
455  }
456  }
457 
458  protected:
459 
460 
462  std::string filename;
463 
464  const char *separator;
465  const char *vseparator;
466 
470  strvalues strparlist;
471 
475  v4values v4parlist;
476 
480  v3values v3parlist;
481 
485  dvalues dparlist;
486 
490  fvalues fparlist;
491 
495  ivalues iparlist;
496 
500  labels order;
501 
505  int added;
506 };
507 #endif //CENS_PARAMETER_MANAGER_H
std::map< int, std::string > labels
void addParameter(std::string parname, int &par)
std::map< std::string, double * > dvalues
void addParameter(std::string parname, Vector3f &par)
void addParameter(std::string parname, std::string &par)
void addParameter(std::string parname, Vector4f &par)
std::map< std::string, float * > fvalues
std::map< std::string, std::string * > strvalues
std::map< std::string, int * > ivalues
CENSParameterManager(std::string _filename, const char *sep="-------", const char *vsep=";", const char *filedir="parameters/")
v4values::iterator v4iter
CENSParameterDirException(std::string const &msg="parameter directory (\"./params\") not present!")
Manager of parameters' initializarion.
strvalues::iterator striter
void addParameter(std::string parname, double &par)
CENSParameterManager(const CENSParameterManager &copy)
v3values::iterator v3iter
void addParameter(std::string parname, float &par)
std::map< std::string, Vector3f * > v3values
std::map< std::string, Vector4f * > v4values
CENSParameterException(std::string const &msg="parameter file not present ... initialized!")