Program Listing for File ExpectedEvolutionMode.h¶
↰ Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/unit_tests/testEvolve/ExpectedEvolutionMode.h)
#ifndef __EXPECTED_EVOLUTION_MODE_H
#define __EXPECTED_EVOLUTION_MODE_H
#include "../shared/Common.h"
#include <list>
namespace Evolve {
template<typename MODE_TYPE>
class ExpectedEvolutionMode {
private:
std::list<double> __age_breaks;
std::list<MODE_TYPE> __expected_mode;
double __break_precision;
public:
ExpectedEvolutionMode(double break_precision = 1e-5) :
__break_precision(break_precision)
{}
void add_break(double age, MODE_TYPE mode)
{__age_breaks.push_back(age); __expected_mode.push_back(mode);}
bool near_break(double age) const
{
for(
std::list<double>::const_iterator
break_i = __age_breaks.begin();
break_i != __age_breaks.end();
++break_i
)
if(check_diff(age, *break_i, 0.0, __break_precision))
return true;
return false;
}
MODE_TYPE operator()(double age) const
{
typename std::list<MODE_TYPE>::const_iterator
mode_i = __expected_mode.begin();
for(
std::list<double>::const_iterator age_i = __age_breaks.begin();
age_i != __age_breaks.end();
age_i++
) {
std::list<double>::const_iterator next_age_i=age_i;
++next_age_i;
if(
*age_i <= age
&&
(next_age_i == __age_breaks.end() || *next_age_i > age)
)
return *mode_i;
++mode_i;
}
std::ostringstream msg;
msg << "Age "
<< age
<< " outside the range for which expected evolution modes "
<< "are defined.";
throw Core::Error::BadFunctionArguments(msg.str());
}
};
}//End Evolve namespace.
#endif