void VectorExpression::analyzeExpression(const ParsedExpression& expression) { parsed = expression.optimize(); program = parsed.createProgram(); stack.resize(program.getStackSize()+1); for (int i = 0; i < program.getNumOperations(); i++) { const Operation& op = program.getOperation(i); if (op.getId() == Operation::VARIABLE) operations.push_back(new Variable(op.getName())); else if (op.getId() == Operation::CONSTANT) operations.push_back(new Constant(dynamic_cast<const Operation::Constant&>(op).getValue())); else if (op.getName() == "dot") operations.push_back(new Dot()); else if (op.getName() == "cross") operations.push_back(new Cross()); else if (op.getName() == "_x") operations.push_back(new Component(0)); else if (op.getName() == "_y") operations.push_back(new Component(1)); else if (op.getName() == "_z") operations.push_back(new Component(2)); else if (op.getName() == "vector") operations.push_back(new Vector()); else if (op.getNumArguments() == 1) operations.push_back(new OpWrapper1(op)); else if (op.getNumArguments() == 2) operations.push_back(new OpWrapper2(op)); else if (op.getNumArguments() == 3) operations.push_back(new OpWrapper3(op)); else throw OpenMMException("Unsupported operator in vector expression: "+op.getName()); } }
void verifyEvaluation(const string& expression, double x, double y, double expectedValue) { map<string, double> variables; variables["x"] = x; variables["y"] = y; ParsedExpression parsed = Parser::parse(expression); double value = parsed.evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Try optimizing it and make sure the result is still correct. value = parsed.optimize().evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Try optimizing with predefined values for the variables. value = parsed.optimize(variables).evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create an ExpressionProgram and see if that also gives the same result. ExpressionProgram program = parsed.createProgram(); value = program.evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create a CompiledExpression and see if that also gives the same result. CompiledExpression compiled = parsed.createCompiledExpression(); if (compiled.getVariables().find("x") != compiled.getVariables().end()) compiled.getVariableReference("x") = x; if (compiled.getVariables().find("y") != compiled.getVariables().end()) compiled.getVariableReference("y") = y; value = compiled.evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Make sure that variable renaming works. variables.clear(); variables["w"] = x; variables["y"] = y; map<string, string> replacements; replacements["x"] = "w"; value = parsed.renameVariables(replacements).evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); }
CompiledExpression::CompiledExpression(const ParsedExpression& expression) : jitCode(NULL) { ParsedExpression expr = expression.optimize(); // Just in case it wasn't already optimized. vector<pair<ExpressionTreeNode, int> > temps; compileExpression(expr.getRootNode(), temps); int maxArguments = 1; for (int i = 0; i < (int) operation.size(); i++) if (operation[i]->getNumArguments() > maxArguments) maxArguments = operation[i]->getNumArguments(); argValues.resize(maxArguments); #ifdef LEPTON_USE_JIT generateJitCode(); #endif }
void verifyEvaluation(const string& expression, double expectedValue) { map<string, CustomFunction*> customFunctions; ParsedExpression parsed = Parser::parse(expression, customFunctions); double value = parsed.evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Try optimizing it and make sure the result is still correct. value = parsed.optimize().evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create an ExpressionProgram and see if that also gives the same result. ExpressionProgram program = parsed.createProgram(); value = program.evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create a CompiledExpression and see if that also gives the same result. CompiledExpression compiled = parsed.createCompiledExpression(); value = compiled.evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); }
CompiledExpression::CompiledExpression(const ParsedExpression& expression) { ParsedExpression expr = expression.optimize(); // Just in case it wasn't already optimized. vector<pair<ExpressionTreeNode, int> > temps; compileExpression(expr.getRootNode(), temps); }