001    import org.apache.commons.math3.analysis.MultivariateFunction;
002    
003    /** Wrapper used to pass a method definition to <a target="_blank" href="http://commons.apache.org/math">Commons Math</a> algorithms.
004      * Computes a command given as a String.<br/>
005      * <br/>
006      * See <a target="_top" href="../0_CommonsMath_README.html#examples">JxnMultivariateFunction_Optimization~Demo.jxn</a>
007      * for an example.  
008      */
009    public class JxnMultivariateFunction implements MultivariateFunction
010    {
011       String cmd;
012       KmgFormelInterpreter fi;
013       static final boolean skipInputLogEnabled = true;
014    
015       /** Constructs a {@link org.apache.commons.math3.analysis.MultivariateFunction}
016         * instance to be used by <a target="_blank" href="http://commons.apache.org/math">Commons Math</a> algorithms.<br/>
017         * Example:
018         * <pre>
019         *    mvf = @JxnMultivariateFunction( $this, "( $x[0]^2 + 2.5 $x[1]^2 - $x[1] ) * Math.exp( 1 - $x[0]^2 - $x[1]^2 );" )</pre>
020         * @param fi an internal copy of {@code fi} is used to execute {@code cmd}
021         * @param cmd one or more statements separated by '{@code ;}'. The command {@code cmd} must use the
022         * array {@code double[] $x}
023         * to compute a result of type double. If {@code cmd} ends with '{@code ;}', log output of intermediate steps is suppressed.
024         */
025       public JxnMultivariateFunction( KmgFormelInterpreter fi, String cmd )
026       {
027          this.cmd = cmd;
028          this.fi = new KmgFormelInterpreter( fi );
029       }
030       
031       /** @deprecated replaced by {@link #JxnMultivariateFunction(KmgFormelInterpreter, String)} */
032       public JxnMultivariateFunction( String cmd, KmgFormelInterpreter fi )
033       {
034          this.cmd = cmd;
035          this.fi = new KmgFormelInterpreter( fi );
036       }
037       
038       /** Internally called by Commons Math algorithms: Computes the function value using the given argument {@code x}. */
039       public double value( double [] x )
040       {
041          fi.put( "$x", x );
042          return KmgFormelInterpreter.doubleValue( fi.execute( cmd, skipInputLogEnabled ) );
043       }
044    
045       /** Returns the command {@code cmd} passed to the constructor. */
046       public String toString()
047       {
048          return cmd;
049       }
050    }