/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.surface;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import java.util.Map;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.interpolation.GridInterpolator2D;
import com.opengamma.analytics.math.interpolation.LinearInterpolator1D;
import com.opengamma.analytics.math.interpolation.data.Interpolator1DDataBundle;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.DoublesPair;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class InterpolatedSurfaceAdditiveShiftFunctionTest {
private static final double[] X = new double[] {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4 };
private static final double[] Y = new double[] {0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 };
private static final double[] Z = new double[] {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
private static final GridInterpolator2D INTERPOLATOR = new GridInterpolator2D(new LinearInterpolator1D(), new LinearInterpolator1D()) {
@Override
public Double interpolate(Map<Double, Interpolator1DDataBundle> dataBundle, DoublesPair value) {
return value.getFirst() + value.getSecond();
}
};
private static final String NAME = "K";
private static final InterpolatedDoublesSurface SURFACE = InterpolatedDoublesSurface.from(X, Y, Z, INTERPOLATOR, NAME);
private static final InterpolatedSurfaceAdditiveShiftFunction F = new InterpolatedSurfaceAdditiveShiftFunction();
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull1() {
F.evaluate(null, 3);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull2() {
F.evaluate(null, 3, NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull3() {
F.evaluate(null, 3, 4, 5);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull4() {
F.evaluate(null, 3, 4, 5, NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull5() {
F.evaluate(null, new double[] {3 }, new double[] {4 }, new double[] {5 });
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNull6() {
F.evaluate(null, new double[] {3 }, new double[] {4 }, new double[] {5 }, NAME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthY1() {
F.evaluate(SURFACE, new double[] {1 }, new double[] {2, 3 }, new double[] {4 });
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthY2() {
F.evaluate(SURFACE, new double[] {1 }, new double[] {2, 3 }, new double[] {4 }, "M");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthZ1() {
F.evaluate(SURFACE, new double[] {1 }, new double[] {2 }, new double[] {3, 4 });
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testWrongLengthZ2() {
F.evaluate(SURFACE, new double[] {1 }, new double[] {2 }, new double[] {3, 4 }, "L");
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testParallel() {
final double shift = 0.12;
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, shift);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
for (int i = 0; i < Z.length; i++) {
assertEquals(Z[i] + shift, surface.getZDataAsPrimitive()[i], 0);
}
assertEquals(surface.getName(), "PARALLEL_SHIFT_" + NAME);
final String newName = "E";
surface = F.evaluate(SURFACE, shift, newName);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
for (int i = 0; i < Z.length; i++) {
assertEquals(Z[i] + shift, surface.getZDataAsPrimitive()[i], 0);
}
assertEquals(surface.getName(), newName);
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testSingle() {
double x = 2;
double y = 4;
final double shift = 0.34;
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, x, y, shift);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
double[] z = surface.getZDataAsPrimitive();
for (int i = 0; i < z.length; i++) {
if (i == 14) {
assertEquals(Z[i] + shift, z[i], 0);
} else {
assertEquals(Z[i], z[i], 0);
}
}
assertEquals(surface.getName(), "SINGLE_SHIFT_" + NAME);
final String newName = "R";
surface = F.evaluate(SURFACE, x, y, shift, newName);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
z = surface.getZDataAsPrimitive();
for (int i = 0; i < z.length; i++) {
if (i == 14) {
assertEquals(Z[i] + shift, z[i], 0);
} else {
assertEquals(Z[i], z[i], 0);
}
}
assertEquals(surface.getName(), newName);
x = 1.5;
y = 3.;
final int n = X.length + 1;
surface = F.evaluate(SURFACE, x, y, shift);
double[] newX = surface.getXDataAsPrimitive();
double[] newY = surface.getYDataAsPrimitive();
z = surface.getZDataAsPrimitive();
assertEquals(newX.length, n);
assertEquals(newY.length, n);
assertEquals(z.length, n);
for (int i = 0; i < n - 1; i++) {
assertEquals(X[i], newX[i], 0);
assertEquals(Y[i], newY[i], 0);
assertEquals(Z[i], z[i], 0);
}
assertEquals(newX[n - 1], x, 0);
assertEquals(newY[n - 1], y, 0);
assertEquals(z[n - 1], x + y + shift, 0);
assertEquals(surface.getName(), "SINGLE_SHIFT_" + NAME);
surface = F.evaluate(SURFACE, x, y, shift, newName);
newX = surface.getXDataAsPrimitive();
newY = surface.getYDataAsPrimitive();
z = surface.getZDataAsPrimitive();
assertEquals(newX.length, n);
assertEquals(newY.length, n);
assertEquals(z.length, n);
for (int i = 0; i < n - 1; i++) {
assertEquals(X[i], newX[i], 0);
assertEquals(Y[i], newY[i], 0);
assertEquals(Z[i], z[i], 0);
}
assertEquals(newX[n - 1], x, 0);
assertEquals(newY[n - 1], y, 0);
assertEquals(z[n - 1], x + y + shift, 0);
assertEquals(surface.getName(), newName);
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testMultipleNoData() {
final double[] xShift = new double[0];
final double[] yShift = new double[0];
final double[] shift = new double[0];
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, xShift, yShift, shift);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
assertArrayEquals(surface.getZDataAsPrimitive(), Z, 0);
assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME);
surface = F.evaluate(SURFACE, xShift, yShift, shift, "A");
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
assertArrayEquals(surface.getZDataAsPrimitive(), Z, 0);
assertEquals(surface.getName(), "A");
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testMultipleOnPoints() {
final double[] x = new double[] {1, 2 };
final double[] y = new double[] {0, 3 };
final double[] shift = new double[] {0.34, 0.56 };
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, x, y, shift);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
double[] z = surface.getZDataAsPrimitive();
for (int i = 0; i < z.length; i++) {
if (i == 5) {
assertEquals(Z[i] + shift[0], z[i], 0);
} else if (i == 13) {
assertEquals(Z[i] + shift[1], z[i], 0);
} else {
assertEquals(Z[i], z[i], 0);
}
}
assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME);
final String newName = "R";
surface = F.evaluate(SURFACE, x, y, shift, newName);
assertArrayEquals(surface.getXDataAsPrimitive(), X, 0);
assertArrayEquals(surface.getYDataAsPrimitive(), Y, 0);
z = surface.getZDataAsPrimitive();
for (int i = 0; i < z.length; i++) {
if (i == 5) {
assertEquals(Z[i] + shift[0], z[i], 0);
} else if (i == 13) {
assertEquals(Z[i] + shift[1], z[i], 0);
} else {
assertEquals(Z[i], z[i], 0);
}
}
assertEquals(surface.getName(), newName);
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testMultipleOneOnPoint() {
final double[] x = new double[] {1, 2.3 };
final double[] y = new double[] {0, 3.9 };
final double[] shift = new double[] {0.34, 0.56 };
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, x, y, shift);
final int n = X.length + 1;
double[] newX = surface.getXDataAsPrimitive();
double[] newY = surface.getYDataAsPrimitive();
double[] newZ = surface.getZDataAsPrimitive();
assertEquals(surface.size(), newX.length);
assertEquals(surface.size(), newY.length);
assertEquals(surface.size(), newZ.length);
for (int i = 0; i < n - 1; i++) {
if (i == 5) {
assertEquals(Z[i] + shift[0], newZ[i], 0);
} else {
assertEquals(Z[i], newZ[i], 0);
}
}
assertEquals(newX[n - 1], x[1], 0);
assertEquals(newY[n - 1], y[1], 0);
assertEquals(newZ[n - 1], x[1] + y[1] + shift[1], 0);
assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME);
final String newName = "R";
surface = F.evaluate(SURFACE, x, y, shift, newName);
newX = surface.getXDataAsPrimitive();
newY = surface.getYDataAsPrimitive();
newZ = surface.getZDataAsPrimitive();
assertEquals(surface.size(), newX.length);
assertEquals(surface.size(), newY.length);
assertEquals(surface.size(), newZ.length);
for (int i = 0; i < n - 1; i++) {
if (i == 5) {
assertEquals(Z[i] + shift[0], newZ[i], 0);
} else {
assertEquals(Z[i], newZ[i], 0);
}
}
assertEquals(newX[n - 1], x[1], 0);
assertEquals(newY[n - 1], y[1], 0);
assertEquals(newZ[n - 1], x[1] + y[1] + shift[1], 0);
assertEquals(surface.getName(), newName);
}
// Disabled as relies on internal operation of InterpolatedDoublesSurface
@Test(enabled = false)
public void testMultiple() {
final double[] x = new double[] {1.67, 2.3 };
final double[] y = new double[] {0.15, 3.9 };
final double[] shift = new double[] {0.34, 0.56 };
InterpolatedDoublesSurface surface = F.evaluate(SURFACE, x, y, shift);
final int n = X.length + 2;
double[] newX = surface.getXDataAsPrimitive();
double[] newY = surface.getYDataAsPrimitive();
double[] newZ = surface.getZDataAsPrimitive();
assertEquals(surface.size(), newX.length);
assertEquals(surface.size(), newY.length);
assertEquals(surface.size(), newZ.length);
for (int i = 0; i < n - 2; i++) {
assertEquals(Z[i], newZ[i], 0);
}
assertEquals(newX[n - 2], x[0], 0);
assertEquals(newY[n - 2], y[0], 0);
assertEquals(newZ[n - 2], x[0] + y[0] + shift[0], 0);
assertEquals(newX[n - 1], x[1], 0);
assertEquals(newY[n - 1], y[1], 0);
assertEquals(newZ[n - 1], x[1] + y[1] + shift[1], 0);
assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME);
final String newName = "R";
surface = F.evaluate(SURFACE, x, y, shift, newName);
newX = surface.getXDataAsPrimitive();
newY = surface.getYDataAsPrimitive();
newZ = surface.getZDataAsPrimitive();
assertEquals(surface.size(), newX.length);
assertEquals(surface.size(), newY.length);
assertEquals(surface.size(), newZ.length);
for (int i = 0; i < n - 2; i++) {
assertEquals(Z[i], newZ[i], 0);
}
assertEquals(newX[n - 2], x[0], 0);
assertEquals(newY[n - 2], y[0], 0);
assertEquals(newZ[n - 2], x[0] + y[0] + shift[0], 0);
assertEquals(newX[n - 1], x[1], 0);
assertEquals(newY[n - 1], y[1], 0);
assertEquals(newZ[n - 1], x[1] + y[1] + shift[1], 0);
assertEquals(surface.getName(), newName);
}
}