/*
* JELBaseModelFunction.java
*
* Created on September 16, 2002, 3:27 PM
*/
package hep.aida.ref.function;
import hep.aida.ref.AidaUtils;
import java.util.StringTokenizer;
/**
*
* @author serbo
*/
public class JELBaseModelFunction extends BaseModelFunction {
private JELBaseModelFunction() {}
public JELBaseModelFunction(String treeName, int dim, String valexpr, String parameters, String description, String gradexpr) {
//System.out.println("JELBaseModelFunction:: valexpr="+valexpr+", parameters="+parameters+
// ", description="+description+", gradexpr="+gradexpr);
setName(treeName);
FunctionCore f = createJELFunctionCore(dim, valexpr, parameters, gradexpr);
init(description, f , f);
}
public JELFunctionCore createJELFunctionCore(int dim, String valexpr, String parameters, String gradexpr) {
JELFunctionCore core = null;
// Reformat parameters String into String[]
String[] parNames = null;
int nPar = 0;
if (parameters != null && !parameters.equals("")) {
StringTokenizer st = new StringTokenizer(parameters, ",;");
nPar = st.countTokens();
if (nPar >0 ) parNames = new String[nPar];
int i =0;
while (st.hasMoreTokens()) {
String token = st.nextToken().trim();
checkParameterName(token);
parNames[i] = token;
//System.out.println(i+"\t"+parNames[i]);
i++;
}
}
// Reformat gradient expression String into String[]
String[] gr = null;
int nGr = 0;
if (gradexpr != null && !gradexpr.equals("") && !gradexpr.trim().toLowerCase().equals("null")) {
String[] array = AidaUtils.parseString(gradexpr);
nGr = array.length;
if (nGr != dim )
throw new IllegalArgumentException("Dimension of the gradient ("+nGr+") is not equal to the dimension of the function ("+dim+")");
gr = new String[dim];
int i =0;
for (int j=0; j<dim; j++) {
String token = array[j].trim();
gr[j] = token;
//System.out.println(i+"\t"+gr[i]);
}
}
/*
if (gradexpr != null && !gradexpr.equals("") && !gradexpr.trim().toLowerCase().equals("null")) {
String[] array = AidaUtils.parseString(gradexpr);
nGr = array.length;
if (nGr != nPar )
throw new IllegalArgumentException("Dimension of the gradient ("+nGr+") is not equal to the number of parameters ("+nPar+")");
gr = new String[nPar];
int i =0;
for (int j=0; j<nGr; j++) {
String token = array[j].trim();
gr[j] = token;
//System.out.println(i+"\t"+gr[i]);
}
}
*/
core = new JELFunctionCore(dim, nPar, valexpr, parNames, gr );
return core;
}
private void checkParameterName(String token) {
if (token.startsWith("x") || token.startsWith("X")) {
String tmp = token.substring(1);
try {
int i = Integer.parseInt(tmp);
} catch (NumberFormatException e) {
return;
}
String mess = "Illegal parameter name: \""+token+"\".\nNames like x0, x1, x2, ..., are reserved. Please rename this parameter..";
throw new IllegalArgumentException(mess);
}
return;
}
}