/**
* 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 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 CombinedInterpolatorExtrapolatorTest {
private static final LinearInterpolator1D INTERPOLATOR = new LinearInterpolator1D();
private static final FlatExtrapolator1D LEFT_EXTRAPOLATOR = new FlatExtrapolator1D();
private static final LinearExtrapolator1D RIGHT_EXTRAPOLATOR = new LinearExtrapolator1D(INTERPOLATOR);
private static final double[] X;
private static final double[] Y;
private static final Interpolator1DDataBundle DATA;
private static final CombinedInterpolatorExtrapolator COMBINED1 = new CombinedInterpolatorExtrapolator(INTERPOLATOR);
private static final CombinedInterpolatorExtrapolator COMBINED2 = new CombinedInterpolatorExtrapolator(INTERPOLATOR, LEFT_EXTRAPOLATOR);
private static final CombinedInterpolatorExtrapolator COMBINED3 = new CombinedInterpolatorExtrapolator(INTERPOLATOR, LEFT_EXTRAPOLATOR, RIGHT_EXTRAPOLATOR);
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 = INTERPOLATOR.getDataBundleFromSortedArrays(X, Y);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator1() {
new CombinedInterpolatorExtrapolator(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator2() {
new CombinedInterpolatorExtrapolator(null, LEFT_EXTRAPOLATOR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullInterpolator3() {
new CombinedInterpolatorExtrapolator(null, LEFT_EXTRAPOLATOR, RIGHT_EXTRAPOLATOR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullExtrapolator() {
new CombinedInterpolatorExtrapolator(INTERPOLATOR, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullLeftExtrapolator() {
new CombinedInterpolatorExtrapolator(INTERPOLATOR, null, RIGHT_EXTRAPOLATOR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullRightExtrapolator() {
new CombinedInterpolatorExtrapolator(INTERPOLATOR, LEFT_EXTRAPOLATOR, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullData() {
COMBINED1.interpolate(null, 2.3);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullValue() {
COMBINED1.interpolate(DATA, null);
}
@Test
public void testInterpolatorOnly() {
final double x = 6.7;
assertEquals(COMBINED1.interpolate(DATA, x), F.evaluate(x), 1e-15);
try {
COMBINED1.interpolate(DATA, x - 100);
Assert.fail();
} catch (final IllegalArgumentException e) {
}
try {
COMBINED1.interpolate(DATA, x + 100);
Assert.fail();
} catch (final IllegalArgumentException e) {
}
}
@Test
public void testDataBundleType1() {
assertEquals(INTERPOLATOR.getDataBundle(X, Y).getClass(), ArrayInterpolator1DDataBundle.class);
}
@Test
public void testDataBundleType2() {
assertEquals(INTERPOLATOR.getDataBundleFromSortedArrays(X, Y).getClass(), ArrayInterpolator1DDataBundle.class);
}
@Test
public void testGetters() {
assertEquals(COMBINED3.getInterpolator().getClass(), INTERPOLATOR.getClass());
assertEquals(COMBINED3.getLeftExtrapolator().getClass(), LEFT_EXTRAPOLATOR.getClass());
assertEquals(COMBINED3.getRightExtrapolator().getClass(), RIGHT_EXTRAPOLATOR.getClass());
}
@Test
public void testOneExtrapolator() {
final double x = 3.6;
assertEquals(COMBINED2.interpolate(DATA, x), F.evaluate(x), 1e-15);
assertEquals(COMBINED2.interpolate(DATA, x - 100), F.evaluate(0.), 1e-15);
assertEquals(COMBINED2.interpolate(DATA, x + 100), F.evaluate(9.), 1e-15);
}
@Test
public void testTwoExtrapolators() {
final double x = 3.6;
assertEquals(COMBINED3.interpolate(DATA, x), F.evaluate(x), 1e-15);
assertEquals(COMBINED3.interpolate(DATA, x - 100), F.evaluate(0.), 1e-15);
assertEquals(COMBINED3.interpolate(DATA, x + 100), F.evaluate(x + 100), 1e-5);
}
@Test
public void testBoundary() {
for (final double value : X) {
assertEquals("dy/dx at " + value, 3d, COMBINED3.firstDerivative(DATA, value), 1e-4);
}
}
}