Program Listing for File TransformedSolution.cpp

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/unit_tests/testEvolve/TransformedSolution.cpp)

#include "TransformedSolution.h"

namespace Evolve {

    void TransformedSolution::add_transformation(
        const std::vector<const Core::OneArgumentDiffFunction *> &transforms,
        double change_age
    )
    {
        for(unsigned q = 0; q < NUM_REAL_QUANTITIES - 1; ++q)
            __transforms[q].push_back(transforms[q]);

        __change_ages.push_back(change_age);
    }

    const std::vector< const std::list<double> * > &
        TransformedSolution::operator()(
            const std::vector< const std::list<double> * > &solution
        )
    {
        if(__transformed_orbit[AGE]) delete __transformed_orbit[AGE];
        __transformed_orbit[AGE] = solution[AGE];

        for(unsigned q = 0; q < NUM_REAL_QUANTITIES - 1; ++q) {

            if(__transformed_orbit[q]) delete __transformed_orbit[q];

            if(solution[q]) {
                std::list<double>::const_iterator
                    change_i = __change_ages.begin();
                change_i++;
                std::list<const Core::OneArgumentDiffFunction *>::const_iterator
                    transform_i = __transforms[q].begin();

                std::list<double> *transformed_quantity = new std::list<double>();
                for(
                    std::list<double>::const_iterator
                        var_i = solution[q]->begin(),
    //                    deriv_i = deriv->begin(),
                        t_i = solution[AGE]->begin();
                    var_i != solution[q]->end();
                    ++var_i,
    //                ++deriv_i,
                    ++t_i
                ) {
                    if(change_i != __change_ages.end() && *t_i >= *change_i) {
                        ++transform_i;
                        ++change_i;
                    }
                    transformed_quantity->push_back((**transform_i)(*var_i));
    /*                const FunctionDerivatives *dvar = (*transform_i)->deriv(*var_i);
                    __transformed_orbit[var_type].push_back(dvar->order(0));
                    __transformed_deriv[var_type].push_back(dvar->order(1)
                                                            *
                                                            (*deriv_i));*/
                }
                __transformed_orbit[q] = transformed_quantity;
            } else {
                __transformed_orbit[q] = NULL;
            }
        }
        return __transformed_orbit;
    }

    TransformedSolution::~TransformedSolution()
    {
        for(unsigned q = 0; q < NUM_REAL_QUANTITIES - 1; ++q)
            if(__transformed_orbit[q]) delete __transformed_orbit[q];
    }

}//End Evolve namespace.