/**
* 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.internal.junit.ArrayAsserts.assertArrayEquals;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.interpolation.data.ArrayInterpolator1DDataBundle;
import com.opengamma.analytics.math.interpolation.data.Interpolator1DDataBundle;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class CombinedInterpolatorExtrapolatorNodeSensitivityCalculatorTest {
private static final LinearInterpolator1D LINEAR = new LinearInterpolator1D();
private static final FlatExtrapolator1D LEFT = new FlatExtrapolator1D();
private static final LinearExtrapolator1D RIGHT = new LinearExtrapolator1D(LINEAR);
private static final double[] X;
private static final double[] Y;
private static final Interpolator1DDataBundle DATA;
private static final CombinedInterpolatorExtrapolator COMBINED1 = new CombinedInterpolatorExtrapolator(LINEAR);
private static final CombinedInterpolatorExtrapolator COMBINED2 = new CombinedInterpolatorExtrapolator(LINEAR, LEFT);
private static final CombinedInterpolatorExtrapolator COMBINED3 = new CombinedInterpolatorExtrapolator(LINEAR, LEFT, RIGHT);
private static final Function1D<Double, Double> F = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double x) {
return 3 * x + 11;
}
};
static {
final int n = 10;
X = new double[n];
Y = new double[n];
for (int i = 0; i < n; i++) {
X[i] = i;
Y[i] = F.evaluate(X[i]);
}
DATA = new ArrayInterpolator1DDataBundle(X, Y);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator1() {
new CombinedInterpolatorExtrapolator(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator2() {
new CombinedInterpolatorExtrapolator(null, LEFT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator3() {
new CombinedInterpolatorExtrapolator(null, LEFT, RIGHT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullExtrapolator() {
new CombinedInterpolatorExtrapolator(LINEAR, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullLeftExtrapolator() {
new CombinedInterpolatorExtrapolator(LINEAR, null, RIGHT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullRightExtrapolator() {
new CombinedInterpolatorExtrapolator(LINEAR, LEFT, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullData() {
COMBINED1.getNodeSensitivitiesForValue(null, 2.3);
}
@Test
public void testInterpolatorOnly() {
final double x = 6.7;
assertArrayEquals(COMBINED1.getNodeSensitivitiesForValue(DATA, x), LINEAR.getNodeSensitivitiesForValue(DATA, x), 1e-15);
try {
COMBINED1.getNodeSensitivitiesForValue(DATA, x - 100);
Assert.fail();
} catch (final IllegalArgumentException e) {
}
try {
COMBINED1.getNodeSensitivitiesForValue(DATA, x + 100);
Assert.fail();
} catch (final IllegalArgumentException e) {
}
}
@Test
public void testOneExtrapolator() {
final double x = 3.6;
assertArrayEquals(COMBINED2.getNodeSensitivitiesForValue(DATA, x), LINEAR.getNodeSensitivitiesForValue(DATA, x), 1e-15);
assertArrayEquals(COMBINED2.getNodeSensitivitiesForValue(DATA, x - 100), LEFT.getNodeSensitivitiesForValue(DATA, x - 100), 1e-15);
assertArrayEquals(COMBINED2.getNodeSensitivitiesForValue(DATA, x + 100), LEFT.getNodeSensitivitiesForValue(DATA, x + 100), 1e-15);
}
@Test
public void testTwoExtrapolators() {
final double x = 3.6;
assertArrayEquals(COMBINED3.getNodeSensitivitiesForValue(DATA, x), LINEAR.getNodeSensitivitiesForValue(DATA, x), 1e-15);
assertArrayEquals(COMBINED3.getNodeSensitivitiesForValue(DATA, x - 100), LEFT.getNodeSensitivitiesForValue(DATA, x - 100), 1e-15);
assertArrayEquals(COMBINED3.getNodeSensitivitiesForValue(DATA, x + 100), RIGHT.getNodeSensitivitiesForValue(DATA, x + 100), 1e-5);
}
}