diff options
Diffstat (limited to 'impl')
-rw-r--r-- | impl/MaxStrategy.hpp | 18 | ||||
-rw-r--r-- | impl/VariableAssignment.hpp | 31 |
2 files changed, 43 insertions, 6 deletions
diff --git a/impl/MaxStrategy.hpp b/impl/MaxStrategy.hpp index 6fee921..1b471e0 100644 --- a/impl/MaxStrategy.hpp +++ b/impl/MaxStrategy.hpp @@ -132,7 +132,7 @@ private: struct DependencyAssignment : public VariableAssignment<Domain>{ DependencyAssignment(DynamicMaxStrategy& strat, - VariableAssignment<Domain>& rho, + DynamicVariableAssignment<Domain>& rho, const MaxExpression<Domain>& expr) : _strat(strat), _rho(rho), @@ -144,11 +144,23 @@ private: // recursive magic! _strat.solve(*_strat._system[var]); _strat._influence[*_strat._system[var]].insert(_expr); - return _rho[var]; + + // force evaluation to get touched variables + Domain value = _rho[var]; + // invalidate touched variables + IdSet<Variable<Domain> > changed = _rho.get_changed(); + for (typename IdSet<Variable<Domain> >::iterator + it = changed.begin(), + ei = changed.end(); + it != ei; + ++it) { + _strat.invalidate(_strat._system.variable(*it)); + } + return value; } private: DynamicMaxStrategy& _strat; - VariableAssignment<Domain>& _rho; + DynamicVariableAssignment<Domain>& _rho; const MaxExpression<Domain>& _expr; IdSet<Variable<Domain> > _current; }; diff --git a/impl/VariableAssignment.hpp b/impl/VariableAssignment.hpp index e575d60..fff00b5 100644 --- a/impl/VariableAssignment.hpp +++ b/impl/VariableAssignment.hpp @@ -24,9 +24,11 @@ struct DynamicVariableAssignment : public VariableAssignment<Domain> { ) : _system(system), _strategy(strat), _values(system.variableCount(), value), + _old_values(system.variableCount(), value), _unstable(system.variableCount()), _influence(system.variableCount(), - IdSet<Variable<Domain> >(system.variableCount())) + IdSet<Variable<Domain> >(system.variableCount())), + _touched(system.variableCount()) { } const Domain operator[](const Variable<Domain>& var) { @@ -39,6 +41,8 @@ struct DynamicVariableAssignment : public VariableAssignment<Domain> { log::fixpoint << indent() << "Invalidating " << x << std::endl; _unstable.insert(x); + _old_values[x] = _values[x]; + _touched.insert(x); _values[x] = infinity<Domain>(); IdSet<Variable<Domain> > infl = _influence[x]; @@ -54,6 +58,27 @@ struct DynamicVariableAssignment : public VariableAssignment<Domain> { } } + IdSet<Variable<Domain> > get_changed() { + IdSet<Variable<Domain> > changed; + for (typename IdSet<Variable<Domain> >::iterator + it = _touched.begin(), + ei = _touched.end(); + it != ei; + ++it) { + Variable<Domain>& var = _system.variable(*it); + //if (_old_values[var] != _values[var]) { + changed.insert(var); + _touched.remove(var); + //} + } + //_touched.clear(); + return changed; + } + + const IdMap<Variable<Domain>, Domain> get_old_values() const { + return _old_values; + } + private: void solve(const Variable<Domain>& x) { @@ -72,8 +97,6 @@ private: 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; @@ -111,8 +134,10 @@ private: const EquationSystem<Domain>& _system; DynamicMaxStrategy<Domain>& _strategy; IdMap<Variable<Domain>, Domain> _values; + IdMap<Variable<Domain>, Domain> _old_values; IdSet<Variable<Domain> > _unstable; IdMap<Variable<Domain>,IdSet<Variable<Domain> > > _influence; + IdSet<Variable<Domain> > _touched; }; #endif |