diff options
Diffstat (limited to 'impl/VariableAssignment.hpp')
-rw-r--r-- | impl/VariableAssignment.hpp | 53 |
1 files changed, 15 insertions, 38 deletions
diff --git a/impl/VariableAssignment.hpp b/impl/VariableAssignment.hpp index e074f6f..2e081e6 100644 --- a/impl/VariableAssignment.hpp +++ b/impl/VariableAssignment.hpp @@ -26,54 +26,31 @@ struct DynamicVariableAssignment : public VariableAssignment<Domain> { _values(system.variableCount(), value), _unstable(system.variableCount()), _influence(system.variableCount(), - IdSet<Variable<Domain> >(system.variableCount())), - _frozen(false), - _changed(false) - { - } - - void freeze() { - _frozen = true; - } - - void thaw() { - _frozen = false; - } - - bool is_frozen() const { - return _frozen; - } - - void has_changed(bool c) { - _changed = c; - } - - bool has_changed() const { - return _changed; - } + IdSet<Variable<Domain> >(system.variableCount())) + { } const Domain operator[](const Variable<Domain>& var) { - if (!_frozen) - solve(var); + solve(var); return _values[var]; } - void stabilise() { + /*void stabilise() { if (!_unstable.empty()) { Variable<Domain>& var = _system.variable(*_unstable.begin()); solve(var); } - } + }*/ void invalidate(const Variable<Domain>& x) { - log::fixpoint << indent() << "Invalidating " << x << std::endl; if (!_unstable.contains(x)) { + log::fixpoint << indent() << "Invalidating " << x << std::endl; + _unstable.insert(x); _values[x] = infinity<Domain>(); - _changed = true; - + IdSet<Variable<Domain> > infl = _influence[x]; _influence[x].clear(); + for (typename IdSet<Variable<Domain> >::iterator it = infl.begin(), ei = infl.end(); @@ -92,19 +69,21 @@ private: log::fixpoint << indent() << "Stabilise " << x << std::endl; stack_depth++; + // we don't want the assignment to affect the strategy, so we're + // going to use a const reference here + const DynamicMaxStrategy<Domain>& const_strat = _strategy; DependencyAssignment assignment(*this, x); - Domain val = _system[x]->eval(assignment, _strategy); + Domain val = _system[x]->eval(assignment, const_strat); stack_depth--; if (val != _values[x]) { log::fixpoint << x << " = " << val << std::endl; + + _strategy.invalidate(x); IdSet<Variable<Domain> > oldInfluence = _influence[x]; _influence[x].clear(); _values[x] = val; - _changed = true; - - _strategy.invalidate(x); _unstable.absorb(oldInfluence); @@ -141,8 +120,6 @@ private: IdMap<Variable<Domain>, Domain> _values; IdSet<Variable<Domain> > _unstable; IdMap<Variable<Domain>,IdSet<Variable<Domain> > > _influence; - bool _frozen; - bool _changed; }; #endif |