diff options
Diffstat (limited to 'impl/main.cpp')
-rw-r--r-- | impl/main.cpp | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/impl/main.cpp b/impl/main.cpp index 21be64b..2006565 100644 --- a/impl/main.cpp +++ b/impl/main.cpp @@ -26,9 +26,21 @@ std::pair<Expression<T>*, Expression<T>*> treeToExpression(pANTLR3_BASE_TREE nod // leaf node - variable if (num == 0) { - return std::pair<Expression<T>*, Expression<T>*>( - system.newExpression(system.newVariable(name + "_l")), - system.newExpression(system.newVariable(name + "_u"))); + if (negative) { + vector<Expression<T>*> firstArgs; + firstArgs.push_back(system.newExpression(system.newVariable(name + "_u"))); + vector<Expression<T>*> secondArgs; + secondArgs.push_back(system.newExpression(system.newVariable(name + "_l"))); + return std::pair<Expression<T>*, Expression<T>*>( + system.newExpression(new Negate<T>(), + firstArgs), + system.newExpression(new Negate<T>(), + secondArgs)); + } else { + return std::pair<Expression<T>*, Expression<T>*>( + system.newExpression(system.newVariable(name + "_l")), + system.newExpression(system.newVariable(name + "_u"))); + } } // a range itself @@ -43,7 +55,7 @@ std::pair<Expression<T>*, Expression<T>*> treeToExpression(pANTLR3_BASE_TREE nod if (!(firstStream >> firstValue)) { throw "Invalid number."; } - if (negative) firstValue = -firstValue; + string firstChildName = childName; childNode = (pANTLR3_BASE_TREE) node->getChild(node, 1); childName = (char*) childNode->getText(childNode)->chars; @@ -51,11 +63,22 @@ std::pair<Expression<T>*, Expression<T>*> treeToExpression(pANTLR3_BASE_TREE nod if (!(secondStream >> secondValue)) { throw "Invalid number."; } - if (negative) secondValue = -secondValue; + string secondChildName = childName; + + if (negative) { + T temp = firstValue; + string tempname = firstChildName; + + firstValue = -secondValue; + firstChildName = "-" + secondChildName; + + secondValue = -temp; + secondChildName = "-" + tempname; + } return std::pair<Expression<T>*, Expression<T>*>( - system.newExpression(new Constant<T>(firstValue)), - system.newExpression(new Constant<T>(secondValue))); + system.newExpression(new Constant<T>(firstChildName, firstValue)), + system.newExpression(new Constant<T>(secondChildName, secondValue))); } if (name == "-") { @@ -77,8 +100,8 @@ std::pair<Expression<T>*, Expression<T>*> treeToExpression(pANTLR3_BASE_TREE nod if (name == "-") { //if (firstArgs.size() == 1) { // secondArgs.size() == firstArgs.size() return std::pair<Expression<T>*, Expression<T>*>( - secondArgs[0], - firstArgs[0]); + firstArgs[0], + secondArgs[0]); } if (name == "max") { @@ -132,15 +155,17 @@ void treeToSystem(pANTLR3_BASE_TREE node, EquationSystem<T>& system) { std::pair<Expression<T>*, Expression<T>*> exprs = treeToExpression(exprNode, system); var = system.newVariable(varName + "_l"); - args.push_back(system.newExpression(new Constant<T>(-infinity<T>()))); + args.push_back(system.newExpression(new Constant<T>("-inf", -infinity<T>()))); args.push_back(exprs.first); system[*var] = system.newMaxExpression(args); + std::cout << var->op_name << " = " << *system[*var] << std::endl; args.clear(); var = system.newVariable(varName + "_u"); - args.push_back(system.newExpression(new Constant<T>(-infinity<T>()))); + args.push_back(system.newExpression(new Constant<T>("-inf", -infinity<T>()))); args.push_back(exprs.second); system[*var] = system.newMaxExpression(args); + std::cout << var->op_name << " = " << *system[*var] << std::endl; } } |