Program Listing for File StoppingCondition.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/Evolve/StoppingCondition.h)

#ifndef __STOPPING_CONDITION_H
#define __STOPPING_CONDITION_H

#include "../Core/SharedLibraryExportMacros.h"
#include "../Core/Common.h"

#include <cassert>

namespace Evolve {

    enum StoppingConditionType {
        NO_STOP,

        SYNCHRONIZED,

        BREAK_LOCK,

        PLANET_DEATH,

        WIND_SATURATION,

        LARGE_EXPANSION_ERROR,

        SMALL_EXPANSION_ERROR,

        EXTERNAL
    }; //End StoppingConditionType enumeration.

    LIB_LOCAL std::ostream &operator<<(std::ostream &os,
            const StoppingConditionType &stop_cond_type);

    class LIB_LOCAL StoppingCondition {
    private:
        short __expected_crossing_deriv_sign;
    public:
        StoppingCondition(
            short expected_crossing_deriv_sign = 0
        )
            : __expected_crossing_deriv_sign(expected_crossing_deriv_sign)
        {}

        virtual std::valarray<double> operator()(
            Core::EvolModeType evol_mode,

            const std::valarray<double> &orbit,

            const std::valarray<double> &derivatives,

            std::valarray<double> &stop_deriv
        ) const = 0;

        virtual size_t num_subconditions() const {return 1;}

        virtual StoppingConditionType type(unsigned index=0) const=0;

        virtual void reached(
            short deriv_sign,

            unsigned
#ifndef NDEBUG
            index
#endif
            =0)
        {
            assert(index == 0);
            assert(__expected_crossing_deriv_sign == deriv_sign);

            __expected_crossing_deriv_sign = -deriv_sign;
        }

        virtual short expected_crossing_deriv_sign(
            unsigned
#ifndef NDEBUG
            index
#endif
            =0) const
        {
            assert(index == 0);

            return __expected_crossing_deriv_sign;
        }

        virtual std::string describe(int index = -1) const = 0;

        virtual ~StoppingCondition() {}
    };//End StoppingCondition class.

    class LIB_LOCAL NoStopCondition : public StoppingCondition {
    public:
        std::valarray<double> operator()(
                Core::EvolModeType, const std::valarray<double> &,
                const std::valarray<double> &,
                std::valarray<double> &stop_deriv) const
        {stop_deriv.resize(1, Core::NaN); return std::valarray<double>(1, 1);}

        StoppingConditionType type(unsigned =0) const {return NO_STOP;}

        void reached(short, unsigned=0)
        {assert(false);}
    }; //End NoStopCondition class.

    class LIB_LOCAL ExternalStoppingCondition : public StoppingCondition {
    public:
        StoppingConditionType type(unsigned =0) const {return EXTERNAL;}
    };

}//End Evolve namespace.

#endif