Skip to content
Snippets Groups Projects
Commit b5531ffa authored by Giovanni Bussi's avatar Giovanni Bussi
Browse files

cleanup MATHEVAL

parent 3ea42c64
No related branches found
No related tags found
No related merge requests found
...@@ -189,6 +189,8 @@ class Matheval : ...@@ -189,6 +189,8 @@ class Matheval :
public Function public Function
{ {
const bool use_lepton; const bool use_lepton;
lepton::CompiledExpression expression;
std::vector<lepton::CompiledExpression> expression_deriv;
void* evaluator; void* evaluator;
vector<void*> evaluator_deriv; vector<void*> evaluator_deriv;
vector<string> var; vector<string> var;
...@@ -215,7 +217,9 @@ Matheval::Matheval(const ActionOptions&ao): ...@@ -215,7 +217,9 @@ Matheval::Matheval(const ActionOptions&ao):
Action(ao), Action(ao),
Function(ao), Function(ao),
use_lepton(std::getenv("PLUMED_USE_LEPTON")), use_lepton(std::getenv("PLUMED_USE_LEPTON")),
evaluator_deriv(getNumberOfArguments()), expression_deriv(getNumberOfArguments()),
evaluator(NULL),
evaluator_deriv(getNumberOfArguments(),NULL),
values(getNumberOfArguments()), values(getNumberOfArguments()),
names(getNumberOfArguments()) names(getNumberOfArguments())
{ {
...@@ -234,26 +238,31 @@ Matheval::Matheval(const ActionOptions&ao): ...@@ -234,26 +238,31 @@ Matheval::Matheval(const ActionOptions&ao):
addValueWithDerivatives(); addValueWithDerivatives();
checkRead(); checkRead();
log.printf(" with function : %s\n",func.c_str());
log.printf(" with variables :");
for(unsigned i=0; i<var.size(); i++) log.printf(" %s",var[i].c_str());
log.printf("\n");
if(use_lepton) { if(use_lepton) {
func=func;
log<<" WARNING: you are using lepton as a replacement for libmatheval\n"; log<<" WARNING: you are using lepton as a replacement for libmatheval\n";
evaluator=new lepton::CompiledExpression(lepton::Parser::parse(func).optimize(leptonConstants).createCompiledExpression()); lepton::ParsedExpression pe=lepton::Parser::parse(func).optimize(leptonConstants);
log<<" function as parsed by lepton: "<<pe<<"\n";
expression=pe.createCompiledExpression();
for(auto &p: expression.getVariables()) {
if(std::find(var.begin(),var.end(),p)==var.end()) {
error("variable " + p + " is not defined");
}
}
log<<" derivatives as computed by lepton:\n";
for(unsigned i=0; i<getNumberOfArguments(); i++) {
lepton::ParsedExpression pe=lepton::Parser::parse(func).differentiate(var[i]).optimize(leptonConstants);
log<<" "<<pe<<"\n";
expression_deriv[i]=pe.createCompiledExpression();
}
} else { } else {
#ifdef __PLUMED_HAS_MATHEVAL #ifdef __PLUMED_HAS_MATHEVAL
evaluator=evaluator_create(const_cast<char*>(func.c_str())); evaluator=evaluator_create(const_cast<char*>(func.c_str()));
#else if(!evaluator) error("There was some problem in parsing matheval formula "+func);
error("MATHEVAL not available, please export PLUMED_USE_LEPTON=yes");
#endif
}
if(!evaluator) error("There was some problem in parsing matheval formula "+func);
if(use_lepton) {
for(unsigned i=0; i<getNumberOfArguments(); i++)
evaluator_deriv[i]=new
lepton::CompiledExpression(lepton::Parser::parse(func).differentiate(var[i]).optimize(leptonConstants).createCompiledExpression());
} else {
#ifdef __PLUMED_HAS_MATHEVAL
char **check_names; char **check_names;
int check_count; int check_count;
evaluator_get_variables(evaluator,&check_names,&check_count); evaluator_get_variables(evaluator,&check_names,&check_count);
...@@ -272,21 +281,6 @@ Matheval::Matheval(const ActionOptions&ao): ...@@ -272,21 +281,6 @@ Matheval::Matheval(const ActionOptions&ao):
} }
for(unsigned i=0; i<getNumberOfArguments(); i++) for(unsigned i=0; i<getNumberOfArguments(); i++)
evaluator_deriv[i]=evaluator_derivative(evaluator,const_cast<char*>(var[i].c_str())); evaluator_deriv[i]=evaluator_derivative(evaluator,const_cast<char*>(var[i].c_str()));
#else
error("MATHEVAL not available, please export PLUMED_USE_LEPTON=yes");
#endif
}
log.printf(" with function : %s\n",func.c_str());
log.printf(" with variables :");
for(unsigned i=0; i<var.size(); i++) log.printf(" %s",var[i].c_str());
log.printf("\n");
if(use_lepton) {
log<<" function as parsed by lepton: "<<lepton::Parser::parse(func).optimize(leptonConstants)<<"\n";
log<<" derivatives as computed by lepton:\n";
for(unsigned i=0; i<var.size(); i++) log<<" "<<lepton::Parser::parse(func).differentiate(var[i]).optimize(leptonConstants)<<"\n";
} else {
#ifdef __PLUMED_HAS_MATHEVAL
log.printf(" function as parsed by matheval: %s\n", evaluator_get_string(evaluator)); log.printf(" function as parsed by matheval: %s\n", evaluator_get_string(evaluator));
log.printf(" derivatives as computed by matheval:\n"); log.printf(" derivatives as computed by matheval:\n");
for(unsigned i=0; i<var.size(); i++) log.printf(" %s\n",evaluator_get_string(evaluator_deriv[i])); for(unsigned i=0; i<var.size(); i++) log.printf(" %s\n",evaluator_get_string(evaluator_deriv[i]));
...@@ -300,23 +294,23 @@ void Matheval::calculate() { ...@@ -300,23 +294,23 @@ void Matheval::calculate() {
if(use_lepton) { if(use_lepton) {
for(unsigned i=0; i<getNumberOfArguments(); i++) { for(unsigned i=0; i<getNumberOfArguments(); i++) {
try { try {
static_cast<lepton::CompiledExpression*>(evaluator)->getVariableReference(var[i])=getArgument(i); expression.getVariableReference(var[i])=getArgument(i);
} catch(PLMD::lepton::Exception& exc) { } catch(PLMD::lepton::Exception& exc) {
// this is necessary since in some cases lepton things a variable is not present even though it is present // this is necessary since in some cases lepton things a variable is not present even though it is present
// e.g. func=0*x // e.g. func=0*x
} }
} }
setValue(static_cast<lepton::CompiledExpression*>(evaluator)->evaluate()); setValue(expression.evaluate());
for(unsigned i=0; i<getNumberOfArguments(); i++) { for(unsigned i=0; i<getNumberOfArguments(); i++) {
for(unsigned j=0; j<getNumberOfArguments(); j++) { for(unsigned j=0; j<getNumberOfArguments(); j++) {
try { try {
static_cast<lepton::CompiledExpression*>(evaluator_deriv[i])->getVariableReference(var[j])=getArgument(j); expression_deriv[i].getVariableReference(var[j])=getArgument(j);
} catch(PLMD::lepton::Exception& exc) { } catch(PLMD::lepton::Exception& exc) {
// this is necessary since in some cases lepton things a variable is not present even though it is present // this is necessary since in some cases lepton things a variable is not present even though it is present
// e.g. func=0*x // e.g. func=0*x
} }
} }
setDerivative(i,static_cast<lepton::CompiledExpression*>(evaluator_deriv[i])->evaluate()); setDerivative(i,expression_deriv[i].evaluate());
} }
} else { } else {
#ifdef __PLUMED_HAS_MATHEVAL #ifdef __PLUMED_HAS_MATHEVAL
...@@ -333,12 +327,7 @@ void Matheval::calculate() { ...@@ -333,12 +327,7 @@ void Matheval::calculate() {
} }
Matheval::~Matheval() { Matheval::~Matheval() {
if(use_lepton) { if(evaluator){
for(unsigned i=0; i<evaluator_deriv.size(); i++) {
delete static_cast<lepton::CompiledExpression*>(evaluator_deriv[i]);
}
delete static_cast<lepton::CompiledExpression*>(evaluator);
} else {
#ifdef __PLUMED_HAS_MATHEVAL #ifdef __PLUMED_HAS_MATHEVAL
evaluator_destroy(evaluator); evaluator_destroy(evaluator);
for(unsigned i=0; i<evaluator_deriv.size(); i++)evaluator_destroy(evaluator_deriv[i]); for(unsigned i=0; i<evaluator_deriv.size(); i++)evaluator_destroy(evaluator_deriv[i]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment