@Test
@Ignore
public void testEvaluateLightFunction() throws IOException {
SBMLDocument light = libsbml.readSBML(Light.getAbsolutePath());
Model m = light.getModel();
ListOfFunctionDefinitions lofd = m.getListOfFunctionDefinitions();
for (long i = 0; i < lofd.size(); i++) {
FunctionDefinition fd = lofd.get(i);
ASTNode root = convertSBMLMathToJavaMath(fd.getMath());
System.err.println(new FormulaFormatter().formulaToString(root));
// over each timestep
for (double step = 0.1; step < 100; step += 0.5) {
EvaluationContext ec = new EvaluationContext();
for (ASTCi s : root.getIdentifiers()) {
if (!("t".equals(s.getString()))) {
double value = m.getParameter(s.getString()).getValue();
ec.setValueFor(s.getString(), value);
}
}
ec.setValueFor("t", step);
// evaluate 7th child of function math which is the actual formula
ASTNumber num = root.getChildAtIndex(7).evaluate(ec);
// this is the output
System.err.println(step + "\t" + num.getValue());
// now check events
for (long j = 0; j < m.getListOfEvents().size(); j++) {
Event eve = m.getListOfEvents().get(j);
Trigger trig = eve.getTrigger();
// check triggers which we know are just time dependent
ASTNode root3 = convertSBMLMathToJavaMath(trig.getMath());
EvaluationContext e2 = new EvaluationContext();
e2.setValueFor("t", step);
// if triggered
if (root3.evaluate(e2).isTruth()) {
// now do assignments
for (long k = 0; k < eve.getNumEventAssignments(); k++) {
EventAssignment ea = eve.getEventAssignment(k);
String var = ea.getVariable();
ASTNode rootAssign =convertSBMLMathToJavaMath(ea.getMath());
// evaluate assignment statements
EvaluationContext ec3 = new EvaluationContext();
for (ASTCi s : rootAssign.getIdentifiers()) {
// assume we're just using parameters but this may
// not be valid. T is not a parameter so must be defined
// separately.
if (!("t".equals(s.getString()))) {
double value = m
.getParameter(s.getString())
.getValue();
ec3.setValueFor(s.getString(), value);
}
}
ec3.setValueFor("t", step);
// assume we're assigning a parameter value.
if (m.getParameter(var) != null) {
m.getParameter(var).setValue(
rootAssign.evaluate(ec3).getValue());
}
}
}