bpp-core3  3.0.0
ParameterList.cpp
Go to the documentation of this file.
1 //
2 // File: ParameterList.cpp
3 // Authors:
4 // Julien Dutheil
5 // Created: 2003-10-15 18:17:29
6 //
7 
8 /*
9  Copyright or © or Copr. Bio++ Development Team, (November 19, 2004)
10 
11  This software is a computer program whose purpose is to provide classes
12  for numerical calculus.
13 
14  This software is governed by the CeCILL license under French law and
15  abiding by the rules of distribution of free software. You can use,
16  modify and/ or redistribute the software under the terms of the CeCILL
17  license as circulated by CEA, CNRS and INRIA at the following URL
18  "http://www.cecill.info".
19 
20  As a counterpart to the access to the source code and rights to copy,
21  modify and redistribute granted by the license, users are provided only
22  with a limited warranty and the software's author, the holder of the
23  economic rights, and the successive licensors have only limited
24  liability.
25 
26  In this respect, the user's attention is drawn to the risks associated
27  with loading, using, modifying and/or developing or reproducing the
28  software by the user in light of its specific status of free software,
29  that may mean that it is complicated to manipulate, and that also
30  therefore means that it is reserved for developers and experienced
31  professionals having in-depth computer knowledge. Users are therefore
32  encouraged to load and test the software's suitability as regards their
33  requirements in conditions enabling the security of their systems and/or
34  data to be ensured and, more generally, to use and operate it in the
35  same conditions as regards security.
36 
37  The fact that you are presently reading this means that you have had
38  knowledge of the CeCILL license and that you accept its terms.
39 */
40 
41 
42 #include "../Text/StringTokenizer.h"
43 #include "ParameterList.h"
44 
45 using namespace bpp;
46 
47 #include <iostream>
48 #include <algorithm>
49 using namespace std;
50 
54  parameters_(pl.size())
55 {
56  // Now copy all parameters:
57  for (size_t i = 0; i < size(); i++)
58  {
59  parameters_[i] = shared_ptr<Parameter>(pl.parameters_[i]->clone());
60  }
61 }
62 
66 {
67  // Then resize the vector:
68  parameters_.resize(pl.size());
69 
70  // Now copy all parameters:
71  for (size_t i = 0; i < pl.size(); i++)
72  {
73  parameters_[i] = shared_ptr<Parameter>(pl.parameters_[i]->clone());
74  }
75 
76  return *this;
77 }
78 
82 {
83  // Delete all parameter objects.
84  reset();
85 }
86 
87 /******************************************************************************/
88 
89 const Parameter& ParameterList::getParameter(const std::string& name) const
90 {
91  for (size_t i = 0; i < size(); i++)
92  {
93  const Parameter* p = parameters_[i].get();
94  if (p->getName() == name)
95  return *p;
96  }
97  throw ParameterNotFoundException("ParameterList::getParameter('name').", name);
98 }
99 
100 /******************************************************************************/
101 
102 const shared_ptr<Parameter>& ParameterList::getSharedParameter(const std::string& name) const
103 {
104  for (size_t i = 0; i < size(); i++)
105  {
106  const shared_ptr<Parameter>& p = parameters_[i];
107  if (p->getName() == name)
108  return p;
109  }
110  throw ParameterNotFoundException("ParameterList::getSharedParameter('name').", name);
111 }
112 
113 
114 /******************************************************************************/
115 
116 double ParameterList::getParameterValue(const std::string& name) const
117 {
118  for (size_t i = 0; i < size(); i++)
119  {
120  const Parameter* p = parameters_[i].get();
121  if (p->getName() == name)
122  return p->getValue();
123  }
124  throw ParameterNotFoundException("ParameterList::getParameterValue('name').", name);
125 }
126 
127 /******************************************************************************/
128 
129 Parameter& ParameterList::getParameter(const std::string& name)
130 {
131  for (size_t i = 0; i < size(); i++)
132  {
133  Parameter* p = parameters_[i].get();
134  if (p->getName() == name)
135  return *p;
136  }
137  throw ParameterNotFoundException("ParameterList::getParameter('name').", name);
138 }
139 
140 /******************************************************************************/
141 
142 shared_ptr<Parameter>& ParameterList::getSharedParameter(const std::string& name)
143 {
144  for (size_t i = 0; i < size(); i++)
145  {
146  shared_ptr<Parameter>& p = parameters_[i];
147  if (p->getName() == name)
148  return p;
149  }
150  throw ParameterNotFoundException("ParameterList::getSharedParameter('name').", name);
151 }
152 
153 
154 /******************************************************************************/
155 
156 ParameterList ParameterList::createSubList(const std::vector<std::string>& names) const
157 {
158  ParameterList pl;
159  for (size_t i = 0; i < names.size(); i++)
160  {
161  Parameter param = getParameter(names[i]);
162  pl.addParameter(param);
163  }
164  return pl;
165 }
166 
167 /******************************************************************************/
168 
169 ParameterList ParameterList::shareSubList(const std::vector<std::string>& names) const
170 {
171  ParameterList pl;
172  for (const auto& name:names)
173  {
175  }
176 
177  return pl;
178 }
179 
180 /******************************************************************************/
181 
182 ParameterList ParameterList::createSubList(const std::string& name) const
183 {
184  ParameterList pl;
185  Parameter param = getParameter(name);
186  pl.addParameter(param);
187  return pl;
188 }
189 
190 /******************************************************************************/
191 
192 ParameterList ParameterList::createSubList(const std::vector<size_t>& parameters) const
193 {
194  ParameterList pl;
195  for (auto iparam : parameters)
196  {
197  if (iparam < size())
198  pl.parameters_.push_back(shared_ptr<Parameter>(parameters_[iparam]->clone()));
199  }
200  return pl;
201 }
202 
203 /******************************************************************************/
204 
205 ParameterList ParameterList::shareSubList(const std::vector<size_t>& parameters) const
206 {
207  ParameterList pl;
208  for (auto iparam : parameters)
209  {
210  if (iparam < size())
211  pl.shareParameter(parameters_[iparam]);
212  }
213 
214  return pl;
215 }
216 
217 /******************************************************************************/
218 
220 {
221  ParameterList pl;
222  if (parameter < size())
223  pl.parameters_.push_back(shared_ptr<Parameter>(parameters_[parameter]->clone()));
224  return pl;
225 }
226 
227 /******************************************************************************/
228 
230 {
231  ParameterList pl;
232  for (size_t i = 0; i < params.size(); i++)
233  {
234  const Parameter& p = params[i];
235  if (hasParameter(p.getName()))
236  pl.parameters_.push_back(shared_ptr<Parameter>(p.clone()));
237  // We use push_back instead of addParameter because we are sure the name is not duplicated.
238  }
239 
240  return pl;
241 }
242 
243 /******************************************************************************/
244 
245 std::vector<std::string> ParameterList::getParameterNames() const
246 {
247  vector<string> pNames(size());
248  for (size_t i = 0; i < size(); i++)
249  {
250  pNames[i] = parameters_[i]->getName();
251  }
252  return pNames;
253 }
254 
255 /****************************************************************************/
256 
257 vector<string> ParameterList::getMatchingParameterNames(const string& pattern) const
258 {
259  vector<string> pNames;
260  for (size_t i = 0; i < size(); i++)
261  {
262  string name = parameters_[i]->getName();
263 
264  StringTokenizer stj(pattern, "*", true, false);
265  size_t pos1, pos2;
266  bool flag(true);
267  string g = stj.nextToken();
268  pos1 = name.find(g);
269  if (pos1 != 0)
270  flag = false;
271  pos1 += g.length();
272  while (flag && stj.hasMoreToken())
273  {
274  g = stj.nextToken();
275  pos2 = name.find(g, pos1);
276  if (pos2 == string::npos)
277  {
278  flag = false;
279  break;
280  }
281  pos1 = pos2 + g.length();
282  }
283  if (flag &&
284  ((g.length() == 0) || (pos1 == name.length()) || (name.rfind(g) == name.length() - g.length())))
285  pNames.push_back(name);
286  }
287 
288  return pNames;
289 }
290 
291 /******************************************************************************/
292 
294 {
295  if (hasParameter(param.getName()))
296  throw ParameterException("ParameterList::addParameter. Parameter with name '" + param.getName() + "' already exists.", &param);
297  parameters_.push_back(shared_ptr<Parameter>(param.clone()));
298 }
299 
300 /******************************************************************************/
301 
303 {
304  if (hasParameter(param->getName()))
305  throw ParameterException("ParameterList::addParameter. Parameter with name '" + param->getName() + "' already exists.", param);
306  parameters_.push_back(shared_ptr<Parameter>(param));
307 }
308 
309 /******************************************************************************/
310 
311 void ParameterList::shareParameter(const std::shared_ptr<Parameter>& param)
312 {
313  if (hasParameter(param->getName()))
314  setParameterValue(param->getName(), param->getValue());
315  else
316  parameters_.push_back(param);
317 }
318 
319 
320 /******************************************************************************/
321 
322 void ParameterList::setParameter(size_t index, const Parameter& param)
323 {
324  if (index >= size())
325  throw IndexOutOfBoundsException("ParameterList::setParameter.", index, 0, size());
326  parameters_[index] = shared_ptr<Parameter>(param.clone());
327 }
328 
329 
330 /******************************************************************************/
331 
333 {
334  for (size_t i = 0; i < params.size(); i++)
335  {
336  if (hasParameter(params[i].getName()))
337  setParameterValue(params[i].getName(), params[i].getValue());
338  else
339  parameters_.push_back(shared_ptr<Parameter>(params[i].clone()));
340  }
341 }
342 
343 /******************************************************************************/
344 
346 {
347  for (size_t i = 0; i < params.size(); i++)
348  {
349  addParameter(params[i]);
350  }
351 }
352 
353 /******************************************************************************/
354 
356 {
357  for (size_t i = 0; i < params.size(); i++)
358  {
360  }
361 }
362 
363 /******************************************************************************/
364 
365 void ParameterList::setParameterValue(const string& name, double value)
366 {
367  Parameter* p = &getParameter(name);
368  p->setValue(value);
369 }
370 
371 /******************************************************************************/
372 
374 {
375  // First we check if all values are correct:
376  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
377  {
378  const Parameter* p = &params.getParameter((*it)->getName());
379  if ((*it)->hasConstraint() && !(*it)->getConstraint()->isCorrect(p->getValue()))
380  throw ConstraintException("ParameterList::setParametersValues()", (*it).get(), p->getValue());
381  }
382 
383  // If all values are ok, we set them:
384  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
385  {
386  const Parameter* p = &params.getParameter((*it)->getName());
387  (*it)->setValue(p->getValue());
388  }
389 }
390 
391 /******************************************************************************/
392 
394 {
395  // First we check if all values are correct:
396  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
397  {
398  if (hasParameter((*it)->getName()))
399  {
400  Parameter* p = &getParameter((*it)->getName());
401  if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
402  throw ConstraintException("ParameterList::setParametersValues()", p, (*it)->getValue());
403  }
404  }
405 
406  // If all values are ok, we set them:
407  {
408  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
409  {
410  if (hasParameter((*it)->getName()))
411  {
412  Parameter* p = &getParameter((*it)->getName());
413  p->setValue((*it)->getValue());
414  }
415  }
416  }
417 }
418 
419 /******************************************************************************/
420 
422 {
423  // First we check if all values are correct:
424  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
425  {
426  if (hasParameter((*it)->getName()))
427  {
428  const Parameter* p = &getParameter((*it)->getName());
429  if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
430  throw ConstraintException("ParameterList::testParametersValues()", p, (*it)->getValue());
431  }
432  }
433 
434  // If all values are ok, we test them:
435  bool ch = 0;
436 
437  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
438  {
439  if (hasParameter((*it)->getName()))
440  {
441  const Parameter* p = &getParameter((*it)->getName());
442  if (p->getValue() != (*it)->getValue())
443  ch |= 1;
444  }
445  }
446  return ch;
447 }
448 
449 /******************************************************************************/
450 
451 bool ParameterList::matchParametersValues(const ParameterList& params, vector<size_t>* updatedParameters)
452 {
453  // First we check if all values are correct:
454  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
455  {
456  if (hasParameter((*it)->getName()))
457  {
458  Parameter* p = &getParameter((*it)->getName());
459  if (p->hasConstraint() && !p->getConstraint()->isCorrect((*it)->getValue()))
460  throw ConstraintException("ParameterList::matchParametersValues()", p, (*it)->getValue());
461  }
462  }
463 
464  // If all values are ok, we set them:
465  bool ch = 0;
466 
467  size_t pos = 0;
468  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
469  {
470  if (hasParameter((*it)->getName()))
471  {
472  Parameter* p = &getParameter((*it)->getName());
473  if (p->getValue() != (*it)->getValue())
474  {
475  ch |= 1;
476  p->setValue((*it)->getValue());
477  if (updatedParameters)
478  updatedParameters->push_back(pos);
479  }
480  }
481  pos++;
482  }
483  return ch;
484 }
485 
486 /******************************************************************************/
488 {
489  for (vector<shared_ptr<Parameter> >::iterator it = parameters_.begin(); it < parameters_.end(); it++)
490  {
491  const Parameter* p = &params.getParameter((*it)->getName());
492  **it = *p;
493  }
494 }
495 
496 /******************************************************************************/
498 {
499  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
500  {
501  Parameter* p = &getParameter((*it)->getName());
502  *p = **it;
503  }
504 }
505 
506 /******************************************************************************/
507 bool ParameterList::hasParameter(const std::string& name) const
508 {
509  for (unsigned int i = 0; i < size(); i++)
510  {
511  const Parameter* p = parameters_[i].get();
512  if (p->getName() == name)
513  return true;
514  }
515  return false;
516 }
517 
518 /******************************************************************************/
520 {
521  for (vector<shared_ptr<Parameter> >::const_iterator it = params.parameters_.begin(); it < params.parameters_.end(); it++)
522  {
523  if (hasParameter((*it)->getName()))
524  {
525  Parameter* p = &getParameter((*it)->getName());
526  *p = **it;
527  }
528  }
529 }
530 
531 /******************************************************************************/
532 void ParameterList::deleteParameter(const std::string& name)
533 {
534  for (auto it = parameters_.begin(); it != parameters_.end(); ++it)
535  {
536  if ((*it)->getName() == name)
537  {
538  it = parameters_.erase(it);
539  return;
540  }
541  }
542  throw ParameterNotFoundException("ParameterList::deleteParameter", name);
543 }
544 
545 /******************************************************************************/
546 void ParameterList::deleteParameters(const std::vector<std::string>& names, bool mustExist)
547 {
548  for (auto it = names.begin(); it != names.end(); ++it)
549  {
550  try
551  {
552  deleteParameter(*it);
553  }
554  catch (ParameterNotFoundException& e)
555  {
556  if (mustExist)
558  else
559  continue;
560  }
561  }
562 }
563 
564 /******************************************************************************/
566 {
567  if (index >= size())
568  throw IndexOutOfBoundsException("ParameterList::deleteParameter.", index, 0, size());
569  parameters_.erase(parameters_.begin() + static_cast<ptrdiff_t>(index));
570 }
571 
572 /******************************************************************************/
573 void ParameterList::deleteParameters(const std::vector<size_t>& indices)
574 {
575  vector<size_t> tmp(indices);
576  sort(tmp.begin(), tmp.end());
577  for (vector<size_t>::reverse_iterator i = tmp.rbegin(); i != tmp.rend(); i++)
578  {
579  size_t index = *i;
580  if (index >= size())
581  throw IndexOutOfBoundsException("ParameterList::deleteParameter.", index, 0, size());
582 // Parameter* p = parameters_[index].get();
583 // delete p;
584  parameters_.erase(parameters_.begin() + static_cast<ptrdiff_t>(index));
585  }
586 }
587 
588 /******************************************************************************/
589 size_t ParameterList::whichParameterHasName(const std::string& name) const
590 {
591  for (size_t i = 0; i < size(); i++)
592  {
593  if (parameters_[i]->getName() == name)
594  return i;
595  }
596  throw ParameterNotFoundException("ParameterList::whichParameterHasName.", name);
597 }
598 
599 /******************************************************************************/
601 {
602  (out << "Name:\tValue:\tConstraint:").endLine();
603  (out << "_________________________________________________").endLine();
604  for (unsigned int i = 0; i < size(); i++)
605  {
606  out << parameters_[i]->getName();
607  out << "\t" << parameters_[i]->getValue();
608  out << (parameters_[i]->hasConstraint() ? "\t" + parameters_[i]->getConstraint()->getDescription() : string(""));
609  out.endLine();
610  }
611 }
612 
613 /******************************************************************************/
615 {
616  parameters_.resize(0);
617 }
618 
619 /******************************************************************************/
Exception thrown when a value do not match a given constraint.
Index out of bounds exception class.
Definition: Exceptions.h:170
OutputStream interface.
Definition: OutputStream.h:67
virtual OutputStream & endLine()=0
The parameter exception base class.
The parameter list object.
Definition: ParameterList.h:65
virtual bool hasParameter(const std::string &name) const
virtual const Parameter & getParameter(const std::string &name) const
Get the parameter with name name.
ParameterList()
Build a new ParameterList object.
Definition: ParameterList.h:73
virtual void addParameters(const ParameterList &params)
Add new parameters at the end of the list.
size_t size() const
Definition: ParameterList.h:92
virtual ParameterList getCommonParametersWith(const ParameterList &params) const
Get the sublist containing all common parameter between this list and pl.
virtual std::vector< std::string > getMatchingParameterNames(const std::string &pattern) const
Get all parameter names matching with the given name. Up to now, only "*" jokers are available.
virtual void matchParameters(const ParameterList &params)
Update the parameters from params.
virtual ParameterList shareSubList(const std::vector< std::string > &names) const
Share given parameters as a sublist.
virtual void setParameters(const ParameterList &params)
Update the parameters from params.
virtual std::vector< std::string > getParameterNames() const
Get all parameter names in the list.
virtual void setParameterValue(const std::string &name, double value)
Set the value of parameter with name name to be equal to value.
virtual double getParameterValue(const std::string &name) const
Get the value of the parameter with name name.
virtual void addParameter(const Parameter &param)
Add a new parameter at the end of the list.
ParameterList * clone() const
Create a copy of this object and send a pointer to it.
Definition: ParameterList.h:84
virtual void shareParameter(const std::shared_ptr< Parameter > &param)
Share a parameter at the end of the list.
virtual void includeParameters(const ParameterList &params)
Add parameters to the list. If the parameter already exists, only the value is updated,...
virtual void deleteParameter(const std::string &name)
Delete a parameter from the list.
virtual void setParametersValues(const ParameterList &params)
Update the parameters from the ones in params that have matching names.
virtual void reset()
Reset the list: delete all parameters.
virtual bool matchParametersValues(const ParameterList &params, std::vector< size_t > *updatedParameters=0)
Update the parameters from params.
virtual bool testParametersValues(const ParameterList &params) const
Tests the parameters from params.
virtual void shareParameters(const ParameterList &params)
Share parameters with a given list. They are added the end of this list.
ParameterList & operator=(const ParameterList &pl)
virtual void deleteParameters(const std::vector< std::string > &names, bool mustExist=true)
Delete several parameters from the list.
virtual void setAllParameters(const ParameterList &params)
Set the parameters to be equals to params.
virtual const std::shared_ptr< Parameter > & getSharedParameter(size_t i) const
virtual void setParameter(size_t index, const Parameter &param)
Change given parameter.
virtual void printParameters(OutputStream &out) const
Print all parameters.
virtual ~ParameterList()
virtual size_t whichParameterHasName(const std::string &name) const
Get the position of a given parameter according to its name.
virtual ParameterList createSubList(const std::vector< std::string > &names) const
Get given parameters as a sublist.
virtual void setAllParametersValues(const ParameterList &params)
Set the parameters to be equals to params.
std::vector< std::shared_ptr< Parameter > > parameters_
Definition: ParameterList.h:67
Exception thrown when a parameter is not found, for instance in a ParameterList.
This class is designed to facilitate the manipulation of parameters.
Definition: Parameter.h:135
virtual void setValue(double value)
Set the value of this parameter.
Definition: Parameter.cpp:110
virtual const std::shared_ptr< Constraint > getConstraint() const
Return the constraint associated to this parameter if there is one.
Definition: Parameter.h:233
virtual double getValue() const
Get the value of this parameter.
Definition: Parameter.h:218
Parameter * clone() const
Create a copy of this object and send a pointer to it.
Definition: Parameter.h:177
virtual const std::string & getName() const
Get the name of this parameter.
Definition: Parameter.h:211
virtual bool hasConstraint() const
Tells if this parameter has a constraint.
Definition: Parameter.h:249
A tokenizer for strings.
const std::string & nextToken()
Get the next available token. If no token is availbale, throw an Exception.
bool hasMoreToken() const
Tell if some tokens are still available.