From 76a4f0fcf3a9bf54ef910cdb2c0bebea37182391 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Thu, 26 Apr 2012 22:32:35 +1000 Subject: A new attempt. Better strategies implementation. Still lacking: - Factories (to set the ids) - Solver - Systems of equations --- impl/main.cpp | 188 +++++++++------------------------------------------------- 1 file changed, 28 insertions(+), 160 deletions(-) (limited to 'impl/main.cpp') diff --git a/impl/main.cpp b/impl/main.cpp index 5b73068..589a1e7 100644 --- a/impl/main.cpp +++ b/impl/main.cpp @@ -1,172 +1,40 @@ #include #include #include -#include "Expression.hpp" + #include "Operator.hpp" -#include "EquationSystem.hpp" -#include "ExpressionFactory.hpp" +#include "Expression.hpp" +#include "MaxStrategy.hpp" using namespace std; -struct Variable : public Operator { - Variable(const std::string& x) - : _value(x) { } - const float eval(const vector >& v, const map& m) const { - //assert(v.size() == 0); - return m.find(_value)->second; - } - virtual std::string output() const { - return "var"; - } - private: - std::string _value; -}; - -struct Const : public Operator { - Const(const float& x) - : _value(x) { } - const float eval(const vector >& v, const map& m) const { - //assert(v.size() == 0); - return _value; - } - virtual std::string output() const { - return "const"; - } - private: - float _value; -}; - -struct Plus : public Operator { - Plus(const float& x) - : _value(x) { } - const float eval(const vector >& v, const map& m) const { - //assert(v.size() == 1); - return _value + v[0].eval(m); - } - virtual std::string output() const { - return "+()"; - } - private: - float _value; -}; - -struct Mult : public Operator { - Mult(const float& x) - : _value(x) { } - const float eval(const vector >& v, const map& m) const { - //assert(v.size() == 1); - return _value * v[0].eval(m); - } - virtual std::string output() const { - return "*()"; - } +/*template +struct Complete { + Complete(const T& value) + : _value(value) { } private: - float _value; -}; - -ExpressionFactory f; - -Expression constant(float x) { - return f.createExpression(new Const(x), vector >()); -} -Expression variable(string x) { - return f.createExpression(new Variable(x), vector >()); -} -Expression add(float a, Expression b) { - vector > args; - args.push_back(b); - return f.createExpression(new Plus(a), args); -} -Expression Max(Expression a, Expression b) { - vector > args; - args.push_back(a); - args.push_back(b); - return f.createExpression(new Maximum(), args); -} -Expression Min(Expression a, Expression b) { - vector > args; - args.push_back(a); - args.push_back(b); - return f.createExpression(new Minimum(), args); -} - - -void tests() { - map assignment; - assignment["x"] = -INFINITY; - - EquationSystem test; - test.add("x", Max(constant(0), - Min(add(1, variable("x")), - constant(100)))); - - test = test.maxStrategy(assignment); - cout << test.output(); - assignment = test.solveBF(-INFINITY); - cout << assignment["x"] << endl; - - test = test.maxStrategy(assignment); - cout << test.output(); - assignment = test.solveBF(-INFINITY); - cout << assignment["x"] << endl; - -} + bool _infinity; + T _value; +};*/ +std::vector< Expression* > empty; int main () { - tests(); - /*typedef Expression E; - typedef vector Args; - Args empty; - - EquationSystem test; - - // problem: - // x = max(y, 10) - // y = 10 * x - - test.add("x1", Max(constant(0), - Min(add(-1, variable("x1")), - variable("x2")))); - test.add("x2", Max(constant(0), - Max(add(5, variable("x1")), - variable("x1")))); - test.add("x3", Max(constant(0), - Max(add(1, variable("x3")), - add(0, variable("x1"))))); - - map m = test.solveBF(-INFINITY); - cout << m["x1"] << endl; - cout << m["x2"] << endl; - cout << m["x3"] << endl; - - m = test.maxStrategy(m).solveBF(-INFINITY); - cout << m["x1"] << endl; - cout << m["x2"] << endl; - cout << m["x3"] << endl;*/ - - - /*Args xArgs; - xArgs.push_back(E(new Variable("x"), empty)); - xArgs.push_back(E(new Const(10), empty)); - test.add("x", E(new Maximum(), xArgs)); - - Args yArgs; - yArgs.push_back(E(new Variable("x"), empty)); - test.add("y", E(new Mult(10), yArgs)); - - map m = test.solveBF(-INFINITY); - cout << m["x"] << endl; - cout << m["y"] << endl; - - map assignment; - assignment["x"] = -INFINITY; - assignment["y"] = -INFINITY; - map result = test.maxStrategy(assignment).solveBF(INFINITY); - cout << result["x"] << endl; - cout << result["y"] << endl; - - - assignment["x"] = 12; - cout << E(new Maximum(), xArgs).maxStrategyEager(assignment).eval(assignment) << endl;*/ + Variable x; + x.id(0); + Variable y; + y.id(1); + VariableAssignment rho(2); + rho[x] = 12; + rho[y] = 10; + Expression expr(&x, empty); + + std::vector*> args; + args.push_back(new Expression(&x, empty)); + args.push_back(new Expression(&y, empty)); + MaxExpression maxExpr(args); + maxExpr.id(0); + MaxStrategy strat(1); + strat[maxExpr] = 0; + cout << strat(maxExpr,rho) << endl; return 0; } -- cgit v1.2.3