/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.interpolation;
import static org.testng.AssertJUnit.assertEquals;
import java.util.List;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.FunctionUtils;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class BasisFunctionGeneratorTest {
private static final BasisFunctionGenerator GENERATOR = new BasisFunctionGenerator();
private static final double[] KNOTS;
static {
final int n = 10;
KNOTS = new double[n + 1];
for (int i = 0; i < n + 1; i++) {
KNOTS[i] = 0 + i * 1.0;
}
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testFunctionIndexOutOfRange1() {
BasisFunctionKnots k = BasisFunctionKnots.fromKnots(KNOTS, 2);
GENERATOR.generate(k, -1);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testFunctionIndexOutOfRange2() {
BasisFunctionKnots k = BasisFunctionKnots.fromKnots(KNOTS, 5);
int nS = k.getNumSplines();
GENERATOR.generate(k,nS);
}
@Test
public void testZeroOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 0);
final Function1D<Double, Double> func = GENERATOR.generate(knots, 4);
assertEquals(0.0, func.evaluate(3.5), 0.0);
assertEquals(1.0, func.evaluate(4.78), 0.0);
assertEquals(1.0, func.evaluate(4.0), 0.0);
assertEquals(0.0, func.evaluate(5.0), 0.0);
}
@Test
public void testFirstOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 1);
final Function1D<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.evaluate(1.76), 0.0);
assertEquals(1.0, func.evaluate(3.0), 0.0);
assertEquals(0, func.evaluate(4.0), 0.0);
assertEquals(0.5, func.evaluate(2.5), 0.0);
}
@Test
public void testSecondOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 2);
final Function1D<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.evaluate(0.76), 0.0);
assertEquals(0.125, func.evaluate(1.5), 0.0);
assertEquals(0.5, func.evaluate(2.0), 0.0);
assertEquals(0.75, func.evaluate(2.5), 0.0);
assertEquals(0.0, func.evaluate(4.0), 0.0);
}
@Test
public void testThirdOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 3);
final Function1D<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.evaluate(-0.1), 0.0);
assertEquals(1. / 6., func.evaluate(1.0), 0.0);
assertEquals(2. / 3., func.evaluate(2.0), 0.0);
assertEquals(1 / 48., func.evaluate(3.5), 0.0);
assertEquals(0.0, func.evaluate(4.0), 0.0);
}
@Test
public void testTwoD() {
BasisFunctionKnots knots1 = BasisFunctionKnots.fromInternalKnots(KNOTS, 2);
BasisFunctionKnots knots2 = BasisFunctionKnots.fromInternalKnots(KNOTS, 3);
List<Function1D<double[], Double>> set = GENERATOR.generateSet(new BasisFunctionKnots[] {knots1,knots2});
//pick of one of the basis functions for testing
int index = FunctionUtils.toTensorIndex(new int[] {3,3}, new int[] {knots1.getNumSplines(),knots2.getNumSplines()});
Function1D<double[], Double> func = set.get(index);
assertEquals(1. / 3., func.evaluate(new double[] {2.0,2.0}), 0.0);
assertEquals(1. / 2., func.evaluate(new double[] {2.5,2.0}), 0.0);
assertEquals(1. / 8./48., func.evaluate(new double[] {1.5,3.5}), 0.0);
assertEquals(0.0, func.evaluate(new double[] {4.0,2.5}), 0.0);
}
@Test
public void testThreeD() {
BasisFunctionKnots knots1 = BasisFunctionKnots.fromInternalKnots(KNOTS, 2);
BasisFunctionKnots knots2 = BasisFunctionKnots.fromInternalKnots(KNOTS, 3);
BasisFunctionKnots knots3 = BasisFunctionKnots.fromInternalKnots(KNOTS, 1);
List<Function1D<double[], Double>> set = GENERATOR.generateSet(new BasisFunctionKnots[] {knots1,knots2,knots3});
//pick of one of the basis functions for testing
int index = FunctionUtils.toTensorIndex(new int[] {3,3,3}, new int[] {knots1.getNumSplines(),knots2.getNumSplines(),
knots3.getNumSplines()});
Function1D<double[], Double> func = set.get(index);
assertEquals(1. / 3., func.evaluate(new double[] {2.0,2.0,3.0}), 0.0);
}
}