/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.function;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.differentiation.ScalarFieldFirstOrderDifferentiator;
import com.opengamma.analytics.math.differentiation.ScalarFirstOrderDifferentiator;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class ParameterizedFunctionTest {
private static ParameterizedFunction<Double, double[], Double> ARRAY_PARAMS = new ParameterizedFunction<Double, double[], Double>() {
@Override
public Double evaluate(final Double x, final double[] a) {
final int n = a.length;
double sum = 0.0;
for (int i = n - 1; i > 0; i--) {
sum += a[i];
sum *= x;
}
sum += a[0];
return sum;
}
@Override
public int getNumberOfParameters() {
return 0;
}
};
private static ParameterizedFunction<Double, DoubleMatrix1D, Double> VECTOR_PARAMS = new ParameterizedFunction<Double, DoubleMatrix1D, Double>() {
@Override
public Double evaluate(final Double x, final DoubleMatrix1D a) {
ArgumentChecker.notNull(a, "parameters");
if (a.getNumberOfElements() != 2) {
throw new IllegalArgumentException("wrong number of parameters");
}
return a.getEntry(0) * Math.sin(a.getEntry(1) * x);
}
@Override
public int getNumberOfParameters() {
return 0;
}
};
@Test
public void testCubic() {
final double[] parms = new double[] {3.0, -1.0, 1.0, 1.0 };
assertEquals(13.0, ARRAY_PARAMS.evaluate(2.0, parms), 0.0);
final Function1D<Double, Double> func = ARRAY_PARAMS.asFunctionOfArguments(parms);
assertEquals(4.0, func.evaluate(-1.0), 0.0);
final Function1D<double[], Double> param_func = ARRAY_PARAMS.asFunctionOfParameters(0.0);
assertEquals(10.0, param_func.evaluate(new double[] {10, 312, 423, 534 }), 0.0);
}
@Test
public void testSin() {
final DoubleMatrix1D parms = new DoubleMatrix1D(new double[] {-1.0, 0.5 });
assertEquals(-Math.sin(1.0), VECTOR_PARAMS.evaluate(2.0, parms), 0.0);
final Function1D<Double, Double> func = VECTOR_PARAMS.asFunctionOfArguments(parms);
assertEquals(1.0, func.evaluate(-Math.PI), 0.0);
final ScalarFirstOrderDifferentiator diff = new ScalarFirstOrderDifferentiator();
final Function1D<Double, Double> grad = diff.differentiate(func);
assertEquals(-0.5, grad.evaluate(0.0), 1e-8);
final Function1D<DoubleMatrix1D, Double> params_func = VECTOR_PARAMS.asFunctionOfParameters(1.0);
final ScalarFieldFirstOrderDifferentiator vdiff = new ScalarFieldFirstOrderDifferentiator();
final Function1D<DoubleMatrix1D, DoubleMatrix1D> vgrad = vdiff.differentiate(params_func);
final DoubleMatrix1D res = vgrad.evaluate(new DoubleMatrix1D(new double[] {Math.PI, 0 }));
assertEquals(0.0, res.getEntry(0), 1e-8);
assertEquals(Math.PI, res.getEntry(1), 1e-8);
}
}