You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Guillaume CHAUVET <gu...@qualiformed.com> on 2012/08/17 11:26:12 UTC

Re: [math] Expression evaluator

> Hi
> [...]
> Could you provide a few small examples of what the usage would look like?
> Also, some use-cases in "real" applications would be welcome in order to
> figure out whether this functionality would fit in Commons Math.
> Thanks,
> Gilles

Hello,
I apologize for not having replied earlier, due to a lack of time :/
We develop softwares solutions for automatic analyses and traceability of quality controls in radiation therapy and medical imaging : radiotherapy machines treatment (linacs), scanners, gamma-cameras, Digitalized radiology installations, and MRI. We need to provide mathematical formulas used in software and allow medical physicists to customize theses formulas, for legal reasons.

Below, my first sketch of using this potential feature:

Expression.java : Interface
=======================================================
public void addExpression(ExpressionInsertion ei, TerminalExpression te);
public void addExpression(ExpressionInsertion ei, NonTerminalExpression nte);
public void addExpression(ExpressionInsertion ei, FunctionExpression nte, Expression... args);
public void addExpression(FunctionExpression nte, Expression... args);
public void setVariable(String name, double value);
public void removeVariable(String name);

Snippet :
=======================================================
ExpressionBuilder eb = ExpressionBuilderFactory.getInstance().create();

// Creating a custom function with 2 parameters to our ExpressionBuilder
Operator testFunction = new FunctionExpression("test", new FunctionAdapter(new BivariateFunction() {
    double value(double x, double y) {
       return (x + x) * (y + y) + 5; 
    }
});

// Create a new Expression :
Expression exp = eb.createExpression(new ConstantExpression(22));	
// exp = "22"
exp.setVariable("var1", 1.0);
exp.addExpression(ExpressionInsertion.RIGHT, new AddExpression(20));
// exp = "22 + 20"  
exp.addExpression(ExpressionInsertion.RIGHT, new MulExpression(exp.getVariable("var1")));
// exp = "(22 + 20) * ${var1}"
exp.addExpression(new SqrtExpression());
// exp = " sqrt((22 + 20) * ${var1})"
exp.addExpression(ExpressionInsertion.LEFT, new ConstantExpression(20));
// exp = "20 + sqrt((22 + 20) * ${var1})"
exp.addExpression(testFunction, 10, exp.getCurrentExpression);
// exp = "test(10, 20 + sqrt((22 + 20) * ${var1}))" 

// We can connect to another expression, builded separatly :
Expression exp2 = eb.createExpression(new testFunction, 1, 2);
//exp2 = " test(1, 2)" 
exp2.setVariable("var2", 5.0);
exp2.addExpression(ExpressionInsertion.LEFT, new AddOperation(exp2.getVariable("var2"));
// exp2 = "${var2} + test(1, 2)" 
exp.addExpression(ExpressionInsertion.LEFT, exp2);
// exp2 = "(${var2} + test(1, 2)) + test(10, 20 + sqrt((22 + 20) * ${var1}))"

// Custom visitor who build a string representation of this expression
ExpressionVisitor sev = new StringExpressionVisitor();
exp.accept(exp);
try {
System.out.println("result for expression '" + exp.toString() + "' = " + exp.evaluate());
} catch (MathParseException ex) {
// [...]
}

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: [math] Expression evaluator

Posted by Ted Dunning <te...@gmail.com>.
Why not just use the scripting language support that is built into Java?

For instance, you can use Rhino to evaluate javascript expressions in a
controlled environment.  Other options include jython, groovy, beanshell,
jruby, BSF, and many, many others.

http://java-source.net/open-source/scripting-languages/sics

Why re-implement this all again?

On Fri, Aug 17, 2012 at 2:26 AM, Guillaume CHAUVET <
guillaume.chauvet@qualiformed.com> wrote:

> > Hi
> > [...]
> > Could you provide a few small examples of what the usage would look like?
> > Also, some use-cases in "real" applications would be welcome in order to
> > figure out whether this functionality would fit in Commons Math.
> > Thanks,
> > Gilles
>
> Hello,
> I apologize for not having replied earlier, due to a lack of time :/
> We develop softwares solutions for automatic analyses and traceability of
> quality controls in radiation therapy and medical imaging : radiotherapy
> machines treatment (linacs), scanners, gamma-cameras, Digitalized radiology
> installations, and MRI. We need to provide mathematical formulas used in
> software and allow medical physicists to customize theses formulas, for
> legal reasons.
>
> Below, my first sketch of using this potential feature:
>
> Expression.java : Interface
> =======================================================
> public void addExpression(ExpressionInsertion ei, TerminalExpression te);
> public void addExpression(ExpressionInsertion ei, NonTerminalExpression
> nte);
> public void addExpression(ExpressionInsertion ei, FunctionExpression nte,
> Expression... args);
> public void addExpression(FunctionExpression nte, Expression... args);
> public void setVariable(String name, double value);
> public void removeVariable(String name);
>
> Snippet :
> =======================================================
> ExpressionBuilder eb = ExpressionBuilderFactory.getInstance().create();
>
> // Creating a custom function with 2 parameters to our ExpressionBuilder
> Operator testFunction = new FunctionExpression("test", new
> FunctionAdapter(new BivariateFunction() {
>     double value(double x, double y) {
>        return (x + x) * (y + y) + 5;
>     }
> });
>
> // Create a new Expression :
> Expression exp = eb.createExpression(new ConstantExpression(22));
> // exp = "22"
> exp.setVariable("var1", 1.0);
> exp.addExpression(ExpressionInsertion.RIGHT, new AddExpression(20));
> // exp = "22 + 20"
> exp.addExpression(ExpressionInsertion.RIGHT, new
> MulExpression(exp.getVariable("var1")));
> // exp = "(22 + 20) * ${var1}"
> exp.addExpression(new SqrtExpression());
> // exp = " sqrt((22 + 20) * ${var1})"
> exp.addExpression(ExpressionInsertion.LEFT, new ConstantExpression(20));
> // exp = "20 + sqrt((22 + 20) * ${var1})"
> exp.addExpression(testFunction, 10, exp.getCurrentExpression);
> // exp = "test(10, 20 + sqrt((22 + 20) * ${var1}))"
>
> // We can connect to another expression, builded separatly :
> Expression exp2 = eb.createExpression(new testFunction, 1, 2);
> //exp2 = " test(1, 2)"
> exp2.setVariable("var2", 5.0);
> exp2.addExpression(ExpressionInsertion.LEFT, new
> AddOperation(exp2.getVariable("var2"));
> // exp2 = "${var2} + test(1, 2)"
> exp.addExpression(ExpressionInsertion.LEFT, exp2);
> // exp2 = "(${var2} + test(1, 2)) + test(10, 20 + sqrt((22 + 20) *
> ${var1}))"
>
> // Custom visitor who build a string representation of this expression
> ExpressionVisitor sev = new StringExpressionVisitor();
> exp.accept(exp);
> try {
> System.out.println("result for expression '" + exp.toString() + "' = " +
> exp.evaluate());
> } catch (MathParseException ex) {
> // [...]
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>