diff options
Diffstat (limited to 'impl/MaxStrategy.hpp')
-rw-r--r-- | impl/MaxStrategy.hpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/impl/MaxStrategy.hpp b/impl/MaxStrategy.hpp index 2be9f4c..9fa7768 100644 --- a/impl/MaxStrategy.hpp +++ b/impl/MaxStrategy.hpp @@ -3,6 +3,7 @@ #include "Expression.hpp" #include "EquationSystem.hpp" +#include "IdSet.hpp" template<typename Domain> struct MaxStrategyExpression : public Expression<Domain> { @@ -105,14 +106,24 @@ struct MaxStrategy : public EquationSystem<Domain> { struct ImprovementOperator { virtual ~ImprovementOperator() { } - virtual bool improve(MaxStrategy<Domain>&, const VariableAssignment<Domain>&) const = 0; + virtual bool improve( + MaxStrategy<Domain>& strat, + const VariableAssignment<Domain>& rho, + const IdSet<Variable<Domain> >& changedIn, + IdSet<Variable<Domain> >& changedOut + ) const = 0; }; - bool improve(const ImprovementOperator& op, const VariableAssignment<Domain>& rho) { - return op.improve(*this, rho); + bool improve(const ImprovementOperator& op, const VariableAssignment<Domain>& rho, const IdSet<Variable<Domain> >& changedIn, IdSet<Variable<Domain> >& changedOut) { + return op.improve(*this, rho, changedIn, changedOut); } struct NaiveImprovementOperator : public ImprovementOperator { - bool improve(MaxStrategy<Domain>& strat, const VariableAssignment<Domain>& rho) const { + bool improve( + MaxStrategy<Domain>& strat, + const VariableAssignment<Domain>& rho, + const IdSet<Variable<Domain> >& changedIn, + IdSet<Variable<Domain> >& changedOut + ) const { bool changed = false; for (unsigned int i = 0, length = strat._system.maxExpressionCount(); i < length; @@ -146,10 +157,16 @@ struct MaxStrategy : public EquationSystem<Domain> { struct RepeatedImprovementOperator : public ImprovementOperator { RepeatedImprovementOperator(const ImprovementOperator& op) : _subImprovement(op) { } - bool improve(MaxStrategy<Domain>& strat, const VariableAssignment<Domain>& rho) const { - if (_subImprovement.improve(strat, rho)) { + + bool improve( + MaxStrategy<Domain>& strat, + const VariableAssignment<Domain>& rho, + const IdSet<Variable<Domain> >& changedIn, + IdSet<Variable<Domain> >& changedOut + ) const { + if (_subImprovement.improve(strat, rho, changedIn, changedOut)) { VariableAssignment<Domain>* rho2 = strat.eval(rho); - improve(strat, *rho2); + improve(strat, *rho2, changedIn, changedOut); delete rho2; return true; } @@ -159,6 +176,9 @@ struct MaxStrategy : public EquationSystem<Domain> { const ImprovementOperator& _subImprovement; }; + struct DependencyImprovementOperator : public ImprovementOperator { + }; + void print(std::ostream& cout) const { cout << _system << std::endl; } |