diff options
Diffstat (limited to 'impl/MaxStrategy.hpp')
-rw-r--r-- | impl/MaxStrategy.hpp | 73 |
1 files changed, 54 insertions, 19 deletions
diff --git a/impl/MaxStrategy.hpp b/impl/MaxStrategy.hpp index f4026dd..ba7cc11 100644 --- a/impl/MaxStrategy.hpp +++ b/impl/MaxStrategy.hpp @@ -34,7 +34,8 @@ template<typename Domain> struct DynamicMaxStrategy : public MaxStrategy<Domain> { DynamicMaxStrategy( const EquationSystem<Domain>& system - ) : _system(system), + ) : _frozen(false), + _system(system), _rho(NULL), _values(system.maxExpressionCount(), 0), _stable(system.maxExpressionCount()), @@ -62,28 +63,26 @@ struct DynamicMaxStrategy : public MaxStrategy<Domain> { } unsigned int get(const MaxExpression<Domain>& e) const { - return _values[e]; - } - - unsigned int get(const MaxExpression<Domain>& e) { if (!_frozen) solve(e); return _values[e]; } - void invalidate(const Variable<Domain>& v) { - log::strategy << indent() << "Invalidating " << v << " - " << *_system[v] << std::endl; - _stable.filter(_var_influence[v]); - - IdSet<MaxExpression<Domain> > infl = _var_influence[v]; - _var_influence[v].clear(); - - for (typename IdSet<MaxExpression<Domain> >::iterator - it = infl.begin(), - end = infl.end(); - it != end; - ++it) { - solve(_system.maxExpression(*it)); + void invalidate(const Variable<Domain>& v) const { + log::strategy << indent() << "Invalidating " << v << " - " << *_system[v] << std::endl; + if (_system[v] && _stable.contains(*_system[v])) { + _stable.remove(*_system[v]); + _stable.filter(_var_influence[v]); + + IdSet<MaxExpression<Domain> > infl = _var_influence[v]; + _var_influence[v].clear(); + for (typename IdSet<MaxExpression<Domain> >::iterator + it = infl.begin(), + end = infl.end(); + it != end; + ++it) { + solve(_system.maxExpression(*it)); + } } } @@ -99,6 +98,7 @@ private: stack_depth--; if (val != _values[x]) { + log::strategy << x << " => " << *x.arguments()[val] << std::endl; IdSet<MaxExpression<Domain> > oldInfluence = _influence[x]; @@ -126,6 +126,16 @@ private: } } + const DynamicMaxStrategy& freeze() const { + _frozen = true; + return *this; + } + + const DynamicMaxStrategy& thaw() const { + _frozen = false; + return *this; + } + struct DependencyAssignment : public VariableAssignment<Domain>{ DependencyAssignment(DynamicMaxStrategy& strat, VariableAssignment<Domain>& rho, @@ -144,6 +154,30 @@ private: const MaxExpression<Domain>& _expr; }; + struct InvalidatingAssignment : public VariableAssignment<Domain>{ + InvalidatingAssignment(DynamicVariableAssignment<Domain>& rho) + : _rho(rho) { + } + ~InvalidatingAssignment() { + for (typename std::set<const Variable<Domain>*>::iterator + it = seen.begin(), + ei = seen.end(); + it != ei; + ++it) { + if (!_old_stable.contains(**it)) + _rho.invalidate(**it); + } + } + const Domain& operator[](const Variable<Domain>& var) const { + seen.insert(&var); + return _rho[var]; + } + private: + DynamicVariableAssignment<Domain>& _rho; + IdSet<Variable<Domain> > _old_stable; + mutable std::set<const Variable<Domain>*> seen; + }; + struct DependencyStrategy : public MaxStrategy<Domain> { DependencyStrategy(DynamicMaxStrategy& strat, const MaxExpression<Domain>& expr) : _strat(strat), @@ -161,7 +195,8 @@ private: const MaxExpression<Domain>& _expr; }; -private: +private: + mutable bool _frozen; const EquationSystem<Domain>& _system; DynamicVariableAssignment<Domain>* _rho; IdMap<MaxExpression<Domain>,unsigned int> _values; |