diff options
author | Carlo Zancanaro <carlo@carlo-laptop> | 2012-05-28 13:00:50 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@carlo-laptop> | 2012-05-28 13:00:50 +1000 |
commit | ea05c9c5fa30b8822f618e861d12a09df1f8f017 (patch) | |
tree | cb8717d9773ef77978dc8e1d9093560e3cf26532 /impl/EquationSystem.hpp | |
parent | ee8547cf3c89c51ff10603814e6f745466bc4c79 (diff) |
Fix memory error and x = max(-inf, expr) stuff.
Diffstat (limited to 'impl/EquationSystem.hpp')
-rw-r--r-- | impl/EquationSystem.hpp | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/impl/EquationSystem.hpp b/impl/EquationSystem.hpp index ac0b3b2..772ac37 100644 --- a/impl/EquationSystem.hpp +++ b/impl/EquationSystem.hpp @@ -3,7 +3,13 @@ #include <map> +template<typename T> +struct EquationSystem; + +#include "IdSet.hpp" #include "Expression.hpp" +#include "FixpointAlgorithm.hpp" + template<typename T> struct MaxStrategy; @@ -31,11 +37,14 @@ struct EquationSystem { const std::vector<Variable<T>*> vars() const { return _vars; } + const Variable<T>* getVar(unsigned int i) const { + return _vars[i]; + } unsigned int varCount() const { return _vars.size(); } - Expression<T>* newExpression(Operator<T>* op, const std::vector<Expression<T>*>& args) { + Expression<T>* newExpression(Operator<T>* op, const std::vector<Expression<T>*>& args=std::vector<Expression<T>*>()) { Expression<T>* expr = new Expression<T>(op, args); _expressions.push_back(expr); return expr; @@ -58,7 +67,7 @@ struct EquationSystem { MaxStrategy<T> strategy() const { return MaxStrategy<T>(_max_expressions.size()); } - + VariableAssignment<T> assignment() const { return VariableAssignment<T>(_vars.size()); } @@ -69,7 +78,7 @@ struct EquationSystem { } return _right_expressions[v.id()]; } - const Expression<T>*& operator[] (const Variable<T>& v) const { + const Expression<T>* operator[] (const Variable<T>& v) const { if (_right_expressions.size() <= v.id()) { throw "Out of range"; } @@ -95,38 +104,27 @@ struct EquationSystem { VariableAssignment<T> maxFixpoint() const { unsigned int size = _vars.size(); - VariableAssignment<T> result(size, infinity<T>()); - for (unsigned int i = 0; i < size; ++i) { - result = (*this)(result); - } - result = result.expand((*this)(result), -infinity<T>()); - for (unsigned int i = 0; i < size-1; ++i) { - result = (*this)(result); - } + VariableAssignment<T> newResult(size, infinity<T>()); + VariableAssignment<T> result(0); + do { + result = newResult; + newResult = (*this)(result); + } while (newResult != result); return result; } - VariableAssignment<T> maxFixpoint(const MaxStrategy<T>& strat) const { - unsigned int size = _vars.size(); - VariableAssignment<T> result(size, infinity<T>()); - for (unsigned int i = 0; i < size; ++i) { - result = strat(*this, result); - } - result = result.expand(strat(*this, result), -infinity<T>()); - for (unsigned int i = 0; i < size-1; ++i) { - result = strat(*this, result); - } - return result; + VariableAssignment<T> maxFixpoint(const MaxStrategy<T>& strat, const FixpointAlgorithm<T>& algo) const { + return algo.maxFixpoint(strat, *this); } - VariableAssignment<T> minFixpoint() const { + VariableAssignment<T> minFixpoint(const FixpointAlgorithm<T>& algo) const { VariableAssignment<T> rho = assignment(); VariableAssignment<T> lastRho = assignment(); MaxStrategy<T> strat = strategy(); do { lastRho = rho; strat = strat.improve(*this, rho); - rho = maxFixpoint(strat); + rho = maxFixpoint(strat, algo); } while(lastRho != rho); return rho; } |