From c26f38114fedde81effb938ffbedfe922d77a322 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Tue, 7 Aug 2012 17:01:57 +1000 Subject: A whole bunch of clean up work around the place. - Make it a bit nicer to use the command-line - Remove the strategies we won't be using - Clean up some code around the place, generally --- impl/VariableAssignment.hpp | 98 +++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 57 deletions(-) (limited to 'impl/VariableAssignment.hpp') diff --git a/impl/VariableAssignment.hpp b/impl/VariableAssignment.hpp index f41dab3..ead7c67 100644 --- a/impl/VariableAssignment.hpp +++ b/impl/VariableAssignment.hpp @@ -10,22 +10,6 @@ struct VariableAssignment { virtual const Domain& operator[](const Variable&) const = 0; }; -template -struct StableVariableAssignment -: public VariableAssignment, public IdMap, Domain> { - StableVariableAssignment(unsigned int length) - : IdMap,Domain>(length, -infinity()) { } - StableVariableAssignment(unsigned int length, const Domain& value) - : IdMap,Domain>(length, value) { } - - const Domain& operator[](const Variable& var) const { - return IdMap,Domain>::operator[](var); - } - Domain& operator[](const Variable& var) { - return IdMap,Domain>::operator[](var); - } -}; - #include "EquationSystem.hpp" template @@ -50,7 +34,7 @@ struct DynamicVariableAssignment : public VariableAssignment { } void invalidate(const Variable& x) const { - log::fixpoint << "invalidating " << x << std::endl; + log::fixpoint << "\tInvalidating " << x << std::endl; _stable.remove(x); _values[x] = infinity(); } @@ -58,53 +42,53 @@ struct DynamicVariableAssignment : public VariableAssignment { private: void solve(const Variable& x) const { - if (!_stable.contains(x)) { - _stable.insert(x); - - Domain val = _system[x]->eval(DependencyAssignment(*this, x), - _strategy); - - if (val != _values[x]) { - log::fixpoint << "Updating value for " << x - << " to " << val << std::endl; - - auto oldInfluence = _influence[x]; - _influence[x].clear(); - _values[x] = val; - - _strategy.invalidate(x); - - _stable.filter(oldInfluence); - - for (auto it = oldInfluence.begin(); - it != oldInfluence.end(); - ++it) { - solve(_system.variable(*it)); - } - } else { - log::fixpoint << x << " did not change" << std::endl; + if (!_stable.contains(x)) { + _stable.insert(x); + log::fixpoint << "\tStabilise " << x << std::endl; + + Domain val = _system[x]->eval(DependencyAssignment(*this, x), + _strategy); + + if (val != _values[x]) { + log::fixpoint << x << " = " << val << std::endl; + + auto oldInfluence = _influence[x]; + _influence[x].clear(); + _values[x] = val; + + _strategy.invalidate(x); + + _stable.filter(oldInfluence); + + for (auto it = oldInfluence.begin(); + it != oldInfluence.end(); + ++it) { + solve(_system.variable(*it)); } } else { - log::fixpoint << x << " is stable" << std::endl; + log::fixpoint << "\t" << x << " did not change" << std::endl; } + } else { + log::fixpoint << "\t" << x << " is stable" << std::endl; } + } + + struct DependencyAssignment : public VariableAssignment { + DependencyAssignment(const DynamicVariableAssignment& assignment, const Variable& var) + : _assignment(assignment), _var(var) { } + const Domain& operator[](const Variable& x) const { + const Domain& result = _assignment[x]; + _assignment._influence[x].insert(_var); + return result; + } + private: + const DynamicVariableAssignment& _assignment; + const Variable& _var; + }; - struct DependencyAssignment : public VariableAssignment { - DependencyAssignment(const DynamicVariableAssignment& assignment, const Variable& var) - : _assignment(assignment), _var(var) { } - const Domain& operator[](const Variable& x) const { - const Domain& result = _assignment[x]; - _assignment._influence[x].insert(_var); - return result; - } - private: - const DynamicVariableAssignment& _assignment; - const Variable& _var; - }; - const EquationSystem& _system; const DynamicMaxStrategy& _strategy; - mutable StableVariableAssignment _values; + mutable IdMap, Domain> _values; mutable IdSet > _stable; mutable IdMap,IdSet > > _influence; }; -- cgit v1.2.3