summaryrefslogtreecommitdiff
path: root/impl/MaxStrategy.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'impl/MaxStrategy.hpp')
-rw-r--r--impl/MaxStrategy.hpp34
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;
}