summaryrefslogtreecommitdiff
path: root/impl/VariableAssignment.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'impl/VariableAssignment.hpp')
-rw-r--r--impl/VariableAssignment.hpp53
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