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