ParsedExpression CustomHbondForceImpl::prepareExpression(const CustomHbondForce& force, const map<string, CustomFunction*>& customFunctions, map<string, vector<int> >& distances, map<string, vector<int> >& angles, map<string, vector<int> >& dihedrals) { CustomHbondForceImpl::FunctionPlaceholder custom(1); CustomHbondForceImpl::FunctionPlaceholder distance(2); CustomHbondForceImpl::FunctionPlaceholder angle(3); CustomHbondForceImpl::FunctionPlaceholder dihedral(4); map<string, CustomFunction*> functions = customFunctions; functions["distance"] = &distance; functions["angle"] = ∠ functions["dihedral"] = &dihedral; ParsedExpression expression = Lepton::Parser::parse(force.getEnergyFunction(), functions); map<string, int> atoms; atoms["a1"] = 0; atoms["a2"] = 1; atoms["a3"] = 2; atoms["d1"] = 3; atoms["d2"] = 4; atoms["d3"] = 5; set<string> variables; for (int i = 0; i < force.getNumPerDonorParameters(); i++) variables.insert(force.getPerDonorParameterName(i)); for (int i = 0; i < force.getNumPerAcceptorParameters(); i++) variables.insert(force.getPerAcceptorParameterName(i)); for (int i = 0; i < force.getNumGlobalParameters(); i++) variables.insert(force.getGlobalParameterName(i)); return ParsedExpression(replaceFunctions(expression.getRootNode(), atoms, distances, angles, dihedrals, variables)).optimize(); }
ExpressionProgram::ExpressionProgram(const ParsedExpression& expression) : maxArgs(0), stackSize(0) { buildProgram(expression.getRootNode()); int currentStackSize = 0; for (int i = 0; i < (int) operations.size(); i++) { int args = operations[i]->getNumArguments(); if (args > maxArgs) maxArgs = args; currentStackSize += 1-args; if (currentStackSize > stackSize) stackSize = currentStackSize; } }
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 }
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); }