From 8c7de1fc64e2ef1994b558f223e0e77fb1395539 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Fri, 2 Nov 2012 16:11:39 +1100 Subject: Change to using "touched" sets, and some writing. --- impl/VariableAssignment.hpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'impl/VariableAssignment.hpp') 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 { ) : _system(system), _strategy(strat), _values(system.variableCount(), value), + _old_values(system.variableCount(), value), _unstable(system.variableCount()), _influence(system.variableCount(), - IdSet >(system.variableCount())) + IdSet >(system.variableCount())), + _touched(system.variableCount()) { } const Domain operator[](const Variable& var) { @@ -39,6 +41,8 @@ struct DynamicVariableAssignment : public VariableAssignment { log::fixpoint << indent() << "Invalidating " << x << std::endl; _unstable.insert(x); + _old_values[x] = _values[x]; + _touched.insert(x); _values[x] = infinity(); IdSet > infl = _influence[x]; @@ -54,6 +58,27 @@ struct DynamicVariableAssignment : public VariableAssignment { } } + IdSet > get_changed() { + IdSet > changed; + for (typename IdSet >::iterator + it = _touched.begin(), + ei = _touched.end(); + it != ei; + ++it) { + Variable& var = _system.variable(*it); + //if (_old_values[var] != _values[var]) { + changed.insert(var); + _touched.remove(var); + //} + } + //_touched.clear(); + return changed; + } + + const IdMap, Domain> get_old_values() const { + return _old_values; + } + private: void solve(const Variable& x) { @@ -72,8 +97,6 @@ private: if (val != _values[x]) { log::fixpoint << x << " = " << val << std::endl; - _strategy.invalidate(x); - IdSet > oldInfluence = _influence[x]; _influence[x].clear(); _values[x] = val; @@ -111,8 +134,10 @@ private: const EquationSystem& _system; DynamicMaxStrategy& _strategy; IdMap, Domain> _values; + IdMap, Domain> _old_values; IdSet > _unstable; IdMap,IdSet > > _influence; + IdSet > _touched; }; #endif -- cgit v1.2.3