diff options
Diffstat (limited to 'impl/MaxStrategy.hpp')
-rw-r--r-- | impl/MaxStrategy.hpp | 143 |
1 files changed, 4 insertions, 139 deletions
diff --git a/impl/MaxStrategy.hpp b/impl/MaxStrategy.hpp index 977036f..3005ee2 100644 --- a/impl/MaxStrategy.hpp +++ b/impl/MaxStrategy.hpp @@ -6,104 +6,15 @@ #include "IdSet.hpp" template<typename Domain> -struct MaxStrategy : public EquationSystem<Domain> { - MaxStrategy(const EquationSystem<Domain>& sub) - : _sub(sub) { } - +struct MaxStrategy { virtual ~MaxStrategy() { } - virtual const Expression<Domain>* operator[](const Variable<Domain>& var) const { - return _sub[var]; - } - virtual VariableAssignment<Domain>* eval(const VariableAssignment<Domain>& rho) const { - return _sub.eval(rho); - } - virtual unsigned int variableCount() const { - return _sub.variableCount(); - } - virtual Variable<Domain>& variable(unsigned int i) const { - return _sub.variable(i); - } - virtual StableVariableAssignment<Domain>* assignment(const Domain& value) const { - return _sub.assignment(value); - } - virtual bool equalAssignments(const VariableAssignment<Domain>& r1, const VariableAssignment<Domain>& r2) const { - return _sub.equalAssignments(r1, r2); - } - virtual Variable<Domain>* varFromExpr(const Expression<Domain>& expr) const { - return _sub.varFromExpr(expr); - } - virtual void print(std::ostream& cout) const { - return _sub.print(cout); - } - virtual unsigned int get(const MaxExpression<Domain>& e) const = 0; - private: - const EquationSystem<Domain>& _sub; -}; - -template<typename Domain> -struct MaxStrategyExpression : public Expression<Domain> { - MaxStrategyExpression(const Expression<Domain>& expr, const MaxStrategy<Domain>& strategy) - : _expr(expr), _strategy(strategy) { } - - virtual Domain eval(const VariableAssignment<Domain>& rho) const { - // relies on implementation details - BAD BAD BAD, maybe - const OperatorExpression<Domain>* opExpr = dynamic_cast<const OperatorExpression<Domain>*>(&_expr); - if (opExpr) { - const MaxExpression<Domain>* maxExpr = dynamic_cast<const MaxExpression<Domain>*>(opExpr); - const std::vector<Expression<Domain>*> args = opExpr->arguments(); - if (maxExpr) { - unsigned int i = _strategy.get(*maxExpr); - return MaxStrategyExpression(*args[i], _strategy).eval(rho); - } else { - std::vector<Domain> argumentValues; - for (typename std::vector<Expression<Domain>*>::const_iterator it = args.begin(); - it != args.end(); - ++it) { - argumentValues.push_back(MaxStrategyExpression(**it, _strategy).eval(rho)); - } - return opExpr->op().eval(argumentValues); - } - } else { - return _expr.eval(rho); - } - } - - void print(std::ostream& cout) const { - cout << _expr; - } - private: - const Expression<Domain>& _expr; - const MaxStrategy<Domain>& _strategy; }; template<typename Domain> struct ConcreteMaxStrategy : public MaxStrategy<Domain> { - ConcreteMaxStrategy(const ConcreteEquationSystem<Domain>& system) - : MaxStrategy<Domain>(system), - _system(system), - _expressions(system.variableCount(), NULL), - _strategy(system.maxExpressionCount(), 0) { - } - - ~ConcreteMaxStrategy() { - for (int i = 0, length = _system.variableCount(); - i < length; - ++i) { - Expression<Domain>* expr = _expressions[_system.variable(i)]; - if (expr) - delete expr; - } - } - - const Expression<Domain>* operator[](const Variable<Domain>& v) const { - if (_expressions[v] == NULL) { - Expression<Domain>* expression = new MaxStrategyExpression<Domain>(*_system[v], *this); - _expressions[v] = expression; - return expression; - } else { - return _expressions[v]; - } + ConcreteMaxStrategy(const EquationSystem<Domain>& system) + : _strategy(system.maxExpressionCount(), 0) { } unsigned int get(const MaxExpression<Domain>& e) const { @@ -114,57 +25,11 @@ struct ConcreteMaxStrategy : public MaxStrategy<Domain> { return i; } - VariableAssignment<Domain>* eval(const VariableAssignment<Domain>& rho) const { - StableVariableAssignment<Domain>* result = this->assignment(-infinity<Domain>()); - for (unsigned int i = 0, length = _system.variableCount(); - i < length; - ++i) { - const Variable<Domain>& var = _system.variable(i); - const Expression<Domain>& expr = * (*this)[var]; - (*result)[var] = expr.eval(rho); - } - return result; - } - - unsigned int variableCount() const { - return _system.variableCount(); - } - - Variable<Domain>& variable(unsigned int i) const { - return _system.variable(i); - } - - unsigned int maxExpressionCount() const { - return _system.maxExpressionCount(); - } - - MaxExpression<Domain>& maxExpression(unsigned int i) const { - return _system.maxExpression(i); - } - - StableVariableAssignment<Domain>* assignment(const Domain& v) const { - return _system.assignment(v); - } - - bool equalAssignments(const VariableAssignment<Domain>& l, const VariableAssignment<Domain>& r) const { - return _system.equalAssignments(l, r); - } - void print(std::ostream& cout) const { - cout << _system << std::endl; - } - - const ConcreteEquationSystem<Domain>& system() const { - return _system; - } - - const IdMap<MaxExpression<Domain>,unsigned int>& strategy() const { - return _strategy; + cout << _strategy << std::endl; } private: - const ConcreteEquationSystem<Domain>& _system; - mutable IdMap<Variable<Domain>,Expression<Domain>*> _expressions; IdMap<MaxExpression<Domain>,unsigned int> _strategy; }; |