From 785d762d4f5d69e3c89855f68cb0654aace4608d Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Mon, 2 Jul 2012 17:44:17 +1000 Subject: Dependency-aware smart fixpoint. Slows it down *heaps* for the moment. Still need to add the MaxStrategy part, which should speed it up a fair bit. At the moment it has to do a fair bit more work for no benefit. --- impl/MaxStrategy.hpp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'impl/MaxStrategy.hpp') diff --git a/impl/MaxStrategy.hpp b/impl/MaxStrategy.hpp index 2be9f4c..9fa7768 100644 --- a/impl/MaxStrategy.hpp +++ b/impl/MaxStrategy.hpp @@ -3,6 +3,7 @@ #include "Expression.hpp" #include "EquationSystem.hpp" +#include "IdSet.hpp" template struct MaxStrategyExpression : public Expression { @@ -105,14 +106,24 @@ struct MaxStrategy : public EquationSystem { struct ImprovementOperator { virtual ~ImprovementOperator() { } - virtual bool improve(MaxStrategy&, const VariableAssignment&) const = 0; + virtual bool improve( + MaxStrategy& strat, + const VariableAssignment& rho, + const IdSet >& changedIn, + IdSet >& changedOut + ) const = 0; }; - bool improve(const ImprovementOperator& op, const VariableAssignment& rho) { - return op.improve(*this, rho); + bool improve(const ImprovementOperator& op, const VariableAssignment& rho, const IdSet >& changedIn, IdSet >& changedOut) { + return op.improve(*this, rho, changedIn, changedOut); } struct NaiveImprovementOperator : public ImprovementOperator { - bool improve(MaxStrategy& strat, const VariableAssignment& rho) const { + bool improve( + MaxStrategy& strat, + const VariableAssignment& rho, + const IdSet >& changedIn, + IdSet >& changedOut + ) const { bool changed = false; for (unsigned int i = 0, length = strat._system.maxExpressionCount(); i < length; @@ -146,10 +157,16 @@ struct MaxStrategy : public EquationSystem { struct RepeatedImprovementOperator : public ImprovementOperator { RepeatedImprovementOperator(const ImprovementOperator& op) : _subImprovement(op) { } - bool improve(MaxStrategy& strat, const VariableAssignment& rho) const { - if (_subImprovement.improve(strat, rho)) { + + bool improve( + MaxStrategy& strat, + const VariableAssignment& rho, + const IdSet >& changedIn, + IdSet >& changedOut + ) const { + if (_subImprovement.improve(strat, rho, changedIn, changedOut)) { VariableAssignment* rho2 = strat.eval(rho); - improve(strat, *rho2); + improve(strat, *rho2, changedIn, changedOut); delete rho2; return true; } @@ -159,6 +176,9 @@ struct MaxStrategy : public EquationSystem { const ImprovementOperator& _subImprovement; }; + struct DependencyImprovementOperator : public ImprovementOperator { + }; + void print(std::ostream& cout) const { cout << _system << std::endl; } -- cgit v1.2.3