/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.math.impl.interpolation;
import static org.testng.AssertJUnit.assertEquals;
import java.util.List;
import java.util.function.Function;
import org.testng.annotations.Test;
import com.opengamma.strata.math.impl.FunctionUtils;
/**
* Test.
*/
@Test
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 Function<Double, Double> func = GENERATOR.generate(knots, 4);
assertEquals(0.0, func.apply(3.5), 0.0);
assertEquals(1.0, func.apply(4.78), 0.0);
assertEquals(1.0, func.apply(4.0), 0.0);
assertEquals(0.0, func.apply(5.0), 0.0);
}
@Test
public void testFirstOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 1);
final Function<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.apply(1.76), 0.0);
assertEquals(1.0, func.apply(3.0), 0.0);
assertEquals(0, func.apply(4.0), 0.0);
assertEquals(0.5, func.apply(2.5), 0.0);
}
@Test
public void testSecondOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 2);
final Function<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.apply(0.76), 0.0);
assertEquals(0.125, func.apply(1.5), 0.0);
assertEquals(0.5, func.apply(2.0), 0.0);
assertEquals(0.75, func.apply(2.5), 0.0);
assertEquals(0.0, func.apply(4.0), 0.0);
}
@Test
public void testThirdOrder() {
BasisFunctionKnots knots = BasisFunctionKnots.fromInternalKnots(KNOTS, 3);
final Function<Double, Double> func = GENERATOR.generate(knots, 3);
assertEquals(0.0, func.apply(-0.1), 0.0);
assertEquals(1. / 6., func.apply(1.0), 0.0);
assertEquals(2. / 3., func.apply(2.0), 0.0);
assertEquals(1 / 48., func.apply(3.5), 0.0);
assertEquals(0.0, func.apply(4.0), 0.0);
}
@Test
public void testTwoD() {
BasisFunctionKnots knots1 = BasisFunctionKnots.fromInternalKnots(KNOTS, 2);
BasisFunctionKnots knots2 = BasisFunctionKnots.fromInternalKnots(KNOTS, 3);
List<Function<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() });
Function<double[], Double> func = set.get(index);
assertEquals(1. / 3., func.apply(new double[] {2.0, 2.0 }), 0.0);
assertEquals(1. / 2., func.apply(new double[] {2.5, 2.0 }), 0.0);
assertEquals(1. / 8. / 48., func.apply(new double[] {1.5, 3.5 }), 0.0);
assertEquals(0.0, func.apply(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<Function<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() });
Function<double[], Double> func = set.get(index);
assertEquals(1. / 3., func.apply(new double[] {2.0, 2.0, 3.0 }), 0.0);
}
}