From 8040a5fd511912cb2141e46e5ca9eb1ab766133e Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Mon, 9 Jul 2012 14:22:07 +1000 Subject: Fix a few bugs and add a new example system. --- impl/ImprovementOperator.hpp | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) (limited to 'impl/ImprovementOperator.hpp') diff --git a/impl/ImprovementOperator.hpp b/impl/ImprovementOperator.hpp index e6b2ded..716768d 100644 --- a/impl/ImprovementOperator.hpp +++ b/impl/ImprovementOperator.hpp @@ -168,39 +168,26 @@ struct SmartImprovementOperator : public ImprovementOperator { IdMap,IdSet>>& _influence; }; - void invalidateSubexpressions(IdSet>& set, Expression& expr) const { - MaxExpression* maxExpr = dynamic_cast*>(&expr); - if (maxExpr != NULL && maxExpr->id() < _system.maxExpressionCount()) { - if (invalidateAll(set, *maxExpr)) { + void invalidateSubexpressions(IdSet>& set, const Expression* expr) const { + if (!expr) return; + const MaxExpression* maxExpr = dynamic_cast*>(expr); + if (maxExpr != NULL) { + if (!set.contains(*maxExpr)) { + set.insert(*maxExpr); for (auto it = maxExpr->arguments().begin(), - end = maxExpr->arguments().end(); + end = maxExpr->arguments().end(); it != end; ++it) { - invalidateSubexpressions(set, **it); + if (*it) + invalidateSubexpressions(set, *it); } } } } - bool invalidateAll(IdSet>& set, MaxExpression& expr) const { - if (!set.contains(expr)) { - set.insert(expr); - for (auto it = _influence[expr].begin(), - end = _influence[expr].end(); - it != end; - ++it) { - if (!set.contains(_system.maxExpression(*it))) { - set.insert(_system.maxExpression(*it)); - } - //invalidateSubexpressions(set, _system.maxExpression(*it)); - } - return true; - } - return false; - } - void markChanged(IdSet>& set, MaxExpression& expr, IdSet>& seen) const { - if (seen.contains(expr)) return; + if (seen.contains(expr)) + return; seen.insert(expr); auto var = _system.varFromExpr(expr); if (var == NULL || !set.contains(*var)) { @@ -234,7 +221,7 @@ struct SmartImprovementOperator : public ImprovementOperator { end = changedIn.end(); it != end; ++it) { - invalidateSubexpressions(invalidSet, *_system[_system.variable(*it)]); + invalidateSubexpressions(invalidSet, _system[_system.variable(*it)]); } stableSet = invalidSet.inverse(); } -- cgit v1.2.3