#ifndef IMPROVEMENT_OPERATOR_HPP #define IMPROVEMENT_OPERATOR_HPP #include "IdSet.hpp" #include "MaxStrategy.hpp" template struct ImprovementOperator { virtual ~ImprovementOperator() { } virtual bool improve( EquationSystem& system, ConcreteMaxStrategy& strat, StableVariableAssignment& rho, IdSet >& changedIn, IdSet >& changedOut ) const = 0; }; template struct NaiveImprovementOperator : public ImprovementOperator { bool improve( EquationSystem& system, ConcreteMaxStrategy& strat, StableVariableAssignment& rho, IdSet >&, IdSet >& ) const { bool changed = false; for (unsigned int i = 0, length = system.maxExpressionCount(); i < length; ++i) { MaxExpression& expr = system.maxExpression(i); // this relies on the fact that an expression will only be proessed after the expressions // it depends on (which should always be true, as they form a DAG) unsigned int index = expr.bestStrategy(rho, strat); if (index != strat.get(expr)) { changed = true; strat.set(expr, index); } } //log::strategy << strat << std::endl; return changed; } }; template struct RepeatedImprovementOperator : public ImprovementOperator { RepeatedImprovementOperator(const ImprovementOperator& op) : _subImprovement(op) { } bool improve( EquationSystem& system, ConcreteMaxStrategy& strat, StableVariableAssignment& rho, IdSet >& changedIn, IdSet >& changedOut ) const { if (_subImprovement.improve(system, strat, rho, changedIn, changedOut)) { StableVariableAssignment* rho2 = system.eval(rho, strat); improve(system, strat, *rho2, changedIn, changedOut); delete rho2; return true; } return false; } private: const ImprovementOperator& _subImprovement; }; #endif