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); }
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); }
void ReferenceCustomDynamics::computePerDof(int numberOfAtoms, vector<RealVec>& results, const vector<RealVec>& atomCoordinates, const vector<RealVec>& velocities, const vector<RealVec>& forces, const vector<RealOpenMM>& masses, const vector<vector<RealVec> >& perDof, const CompiledExpression& expression) { // Loop over all degrees of freedom. for (int i = 0; i < numberOfAtoms; i++) { if (masses[i] != 0.0) { m = masses[i]; for (int j = 0; j < 3; j++) { // Compute the expression. x = atomCoordinates[i][j]; v = velocities[i][j]; f = forces[i][j]; uniform = SimTKOpenMMUtilities::getUniformlyDistributedRandomNumber(); gaussian = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber(); for (int k = 0; k < (int) perDof.size(); k++) perDofVariable[k] = perDof[k][i][j]; results[i][j] = expression.evaluate(); } } } }