/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.math.impl.function; import static org.testng.Assert.assertEquals; import org.testng.annotations.Test; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.collect.array.DoubleMatrix; import com.opengamma.strata.math.impl.interpolation.PiecewisePolynomialResult2D; /** * Test. */ @Test public class PiecewisePolynomialFunction2DTest { private static final double EPS = 1e-14; private static final double INF = 1. / 0.; private static final DoubleArray knots0 = DoubleArray.of(1., 2., 3., 4.); private static final DoubleArray knots1 = DoubleArray.of(2., 3., 4.); private static final int nKnots0 = 4; private static final int nKnots1 = 3; private static DoubleMatrix[][] coefs; static { coefs = new DoubleMatrix[nKnots0 - 1][nKnots1 - 1]; coefs[0][0] = DoubleMatrix.copyOf( new double[][] { {1d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}}); coefs[1][0] = DoubleMatrix.copyOf( new double[][] { {1d, 0d, 0d, 0d}, {4d, 0d, 0d, 0d}, {6d, 0d, 0d, 0d}, {4d, 0d, 0d, 0d}, {1d, 0d, 0d, 0d}}); coefs[2][0] = DoubleMatrix.copyOf( new double[][] { {1d, 0d, 0d, 0d}, {8d, 0d, 0d, 0d}, {24d, 0d, 0d, 0d}, {32d, 0d, 0d, 0d}, {16d, 0d, 0d, 0d}}); coefs[0][1] = DoubleMatrix.copyOf( new double[][] { {1d, 3d, 3d, 1d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}, {0d, 0d, 0d, 0d}}); coefs[1][1] = DoubleMatrix.copyOf( new double[][] { {1d, 3d, 3d, 1d}, {4. * 1d, 4. * 3d, 4. * 3d, 4. * 1d}, {6. * 1d, 6. * 3d, 6. * 3d, 6. * 1d}, {4. * 1d, 4. * 3d, 4. * 3d, 4. * 1d}, {1d, 3d, 3d, 1d}}); coefs[2][1] = DoubleMatrix.copyOf( new double[][] { {1d, 3d, 3d, 1d}, {8. * 1d, 8. * 3d, 8. * 3d, 8. * 1d}, {24. * 1d, 24. * 3d, 24. * 3d, 24. * 1d}, {32. * 1d, 32. * 3d, 32. * 3d, 32. * 1d}, {16. * 1d, 16. * 3d, 16. * 3d, 16. * 1d} }); } private static DoubleMatrix[][] coefsConst; static { coefsConst = new DoubleMatrix[nKnots0 - 1][nKnots1 - 1]; coefsConst[0][0] = DoubleMatrix.of(1, 1, 4d); coefsConst[1][0] = DoubleMatrix.of(1, 1, 4d); coefsConst[2][0] = DoubleMatrix.of(1, 1, 4d); coefsConst[0][1] = DoubleMatrix.of(1, 1, 4d); coefsConst[1][1] = DoubleMatrix.of(1, 1, 4d); coefsConst[2][1] = DoubleMatrix.of(1, 1, 4d); } private static DoubleMatrix[][] coefsLin; static { coefsLin = new DoubleMatrix[nKnots0 - 1][nKnots1 - 1]; coefsLin[0][0] = DoubleMatrix.of(2, 2, 1d, 2d, 2d, 4d); coefsLin[1][0] = DoubleMatrix.of(2, 2, 1d, 2d, 2d, 4d); coefsLin[2][0] = DoubleMatrix.of(2, 2, 1d, 2d, 2d, 4d); coefsLin[0][1] = DoubleMatrix.of(2, 2, 1d, 3d, 3d, 9d); coefsLin[1][1] = DoubleMatrix.of(2, 2, 1d, 3d, 3d, 9d); coefsLin[2][1] = DoubleMatrix.of(2, 2, 1d, 3d, 3d, 9d); } /** * Sample function is f(x,y) = (x-1)^4 * (y-2)^3 */ @Test public void sampleFunctionTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } /* * "Evaluate" test */ double[][] valuesExp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesExp[i][j] = Math.pow(x0Keys[i] - 1., 4.) * Math.pow(x1Keys[j] - 2., 3.); } } final double[][] values = function.evaluate(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesExp[i][j] == 0. ? 1. : Math.abs(valuesExp[i][j]); assertEquals(values[i][j], valuesExp[i][j], ref * EPS); } } { final double value = function.evaluate(result, x0Keys[1], x1Keys[1]); final double ref = valuesExp[1][1] == 0. ? 1. : Math.abs(valuesExp[1][1]); assertEquals(value, valuesExp[1][1], ref * EPS); } { final double value = function.evaluate(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesExp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesExp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesExp[n0Keys - 2][n1Keys - 2], ref * EPS); } /* * First derivative test */ double[][] valuesDiffX0Exp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesDiffX0Exp[i][j] = 4. * Math.pow(x0Keys[i] - 1., 3.) * Math.pow(x1Keys[j] - 2., 3.); } } final double[][] valuesDiffX0 = function.differentiateX0(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesDiffX0Exp[i][j] == 0. ? 1. : Math.abs(valuesDiffX0Exp[i][j]); assertEquals(valuesDiffX0[i][j], valuesDiffX0Exp[i][j], ref * EPS); } } { final double value = function.differentiateX0(result, x0Keys[1], x1Keys[1]); final double ref = valuesDiffX0Exp[1][1] == 0. ? 1. : Math.abs(valuesDiffX0Exp[1][1]); assertEquals(value, valuesDiffX0Exp[1][1], ref * EPS); } { final double value = function.differentiateX0(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesDiffX0Exp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesDiffX0Exp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesDiffX0Exp[n0Keys - 2][n1Keys - 2], ref * EPS); } double[][] valuesDiffX1Exp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesDiffX1Exp[i][j] = Math.pow(x0Keys[i] - 1., 4.) * Math.pow(x1Keys[j] - 2., 2.) * 3.; } } final double[][] valuesDiffX1 = function.differentiateX1(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesDiffX1Exp[i][j] == 0. ? 1. : Math.abs(valuesDiffX1Exp[i][j]); assertEquals(valuesDiffX1[i][j], valuesDiffX1Exp[i][j], ref * EPS); } } { final double value = function.differentiateX1(result, x0Keys[1], x1Keys[1]); final double ref = valuesDiffX1Exp[1][1] == 0. ? 1. : Math.abs(valuesDiffX1Exp[1][1]); assertEquals(value, valuesDiffX1Exp[1][1], ref * EPS); } { final double value = function.differentiateX1(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesDiffX1Exp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesDiffX1Exp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesDiffX1Exp[n0Keys - 2][n1Keys - 2], ref * EPS); } /* * Second derivative test */ double[][] valuesDiffCrossExp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesDiffCrossExp[i][j] = 4. * Math.pow(x0Keys[i] - 1., 3.) * 3. * Math.pow(x1Keys[j] - 2., 2.); } } final double[][] valuesDiffCross = function.differentiateCross(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesDiffCrossExp[i][j] == 0. ? 1. : Math.abs(valuesDiffCrossExp[i][j]); assertEquals(valuesDiffCross[i][j], valuesDiffCrossExp[i][j], ref * EPS); } } { final double value = function.differentiateCross(result, x0Keys[1], x1Keys[1]); final double ref = valuesDiffCrossExp[1][1] == 0. ? 1. : Math.abs(valuesDiffCrossExp[1][1]); assertEquals(value, valuesDiffCrossExp[1][1], ref * EPS); } { final double value = function.differentiateCross(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesDiffCrossExp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesDiffCrossExp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesDiffCrossExp[n0Keys - 2][n1Keys - 2], ref * EPS); } double[][] valuesDiffTwiceX0Exp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesDiffTwiceX0Exp[i][j] = 4. * 3. * Math.pow(x0Keys[i] - 1., 2.) * Math.pow(x1Keys[j] - 2., 3.); } } final double[][] valuesDiffTwiceX0 = function.differentiateTwiceX0(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesDiffTwiceX0Exp[i][j] == 0. ? 1. : Math.abs(valuesDiffTwiceX0Exp[i][j]); assertEquals(valuesDiffTwiceX0[i][j], valuesDiffTwiceX0Exp[i][j], ref * EPS); } } { final double value = function.differentiateTwiceX0(result, x0Keys[1], x1Keys[1]); final double ref = valuesDiffTwiceX0Exp[1][1] == 0. ? 1. : Math.abs(valuesDiffTwiceX0Exp[1][1]); assertEquals(value, valuesDiffTwiceX0Exp[1][1], ref * EPS); } { final double value = function.differentiateTwiceX0(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesDiffTwiceX0Exp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesDiffTwiceX0Exp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesDiffTwiceX0Exp[n0Keys - 2][n1Keys - 2], ref * EPS); } double[][] valuesDiffTwiceX1Exp = new double[n0Keys][n1Keys]; for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { valuesDiffTwiceX1Exp[i][j] = Math.pow(x0Keys[i] - 1., 4.) * Math.pow(x1Keys[j] - 2., 1.) * 3. * 2.; } } final double[][] valuesDiffTwiceX1 = function.differentiateTwiceX1(result, x0Keys, x1Keys).toArray(); for (int i = 0; i < n0Keys; ++i) { for (int j = 0; j < n1Keys; ++j) { final double ref = valuesDiffTwiceX1Exp[i][j] == 0. ? 1. : Math.abs(valuesDiffTwiceX1Exp[i][j]); assertEquals(valuesDiffTwiceX1[i][j], valuesDiffTwiceX1Exp[i][j], ref * EPS); } } { final double value = function.differentiateTwiceX1(result, x0Keys[1], x1Keys[1]); final double ref = valuesDiffTwiceX1Exp[1][1] == 0. ? 1. : Math.abs(valuesDiffTwiceX1Exp[1][1]); assertEquals(value, valuesDiffTwiceX1Exp[1][1], ref * EPS); } { final double value = function.differentiateTwiceX1(result, x0Keys[n0Keys - 2], x1Keys[n1Keys - 2]); final double ref = valuesDiffTwiceX1Exp[n0Keys - 2][n1Keys - 2] == 0. ? 1. : Math.abs(valuesDiffTwiceX1Exp[n0Keys - 2][n1Keys - 2]); assertEquals(value, valuesDiffTwiceX1Exp[n0Keys - 2][n1Keys - 2], ref * EPS); } } /* * PiecewisePolynomialResult2D is null */ /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpEvaluateTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.evaluate(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpEvaluateMultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.evaluate(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateX0(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateX0(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateX1(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateX1(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffCrossTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateCross(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffCrossMultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateCross(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffTwiceX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateTwiceX0(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffTwiceX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateTwiceX0(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffTwiceX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateTwiceX1(result, x0Keys[1], x1Keys[1]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nullPpDiffTwiceX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } result = null; function.differentiateTwiceX1(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void infX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x0Keys[2] = INF; function.evaluate(result, x0Keys[2], x1Keys[2]); } /* * Input contains NaN or infinity */ /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nanX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x0Keys[3] = Double.NaN; function.evaluate(result, x0Keys[3], x1Keys[3]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void infX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x1Keys[2] = INF; function.evaluate(result, x0Keys[2], x1Keys[2]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nanX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x1Keys[3] = Double.NaN; function.evaluate(result, x0Keys[3], x1Keys[3]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void infX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x0Keys[2] = INF; function.evaluate(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nanX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x0Keys[3] = Double.NaN; function.evaluate(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void infX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x1Keys[2] = INF; function.evaluate(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void nanX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefs, new int[] {5, 4 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } x1Keys[3] = Double.NaN; function.evaluate(result, x0Keys, x1Keys); } /* * Polynomial degree is too low */ /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateX0(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateX0(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateX1(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateX1(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linearDiffTwiceX0Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLin, new int[] {2, 2 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateTwiceX0(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linearDiffTwiceX0MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLin, new int[] {2, 2 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateTwiceX0(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linearDiffTwiceX1Test() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLin, new int[] {2, 2 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateTwiceX1(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linearDiffTwiceX1MultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLin, new int[] {2, 2 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateTwiceX1(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffCrossTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateCross(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linConstDiffCrossTest() { DoubleMatrix[][] coefsLinConst; coefsLinConst = new DoubleMatrix[nKnots0 - 1][nKnots1 - 1]; coefsLinConst[0][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[1][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[2][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[0][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); coefsLinConst[1][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); coefsLinConst[2][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLinConst, new int[] {2, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateCross(result, x0Keys[0], x1Keys[0]); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void constDiffCrossMultiTest() { PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsConst, new int[] {1, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateCross(result, x0Keys, x1Keys); } /** * */ @Test(expectedExceptions = IllegalArgumentException.class) public void linConstDiffCrossMultiTest() { DoubleMatrix[][] coefsLinConst; coefsLinConst = new DoubleMatrix[nKnots0 - 1][nKnots1 - 1]; coefsLinConst[0][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[1][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[2][0] = DoubleMatrix.copyOf(new double[][] { {2.}, {2. * 2.}}); coefsLinConst[0][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); coefsLinConst[1][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); coefsLinConst[2][1] = DoubleMatrix.copyOf(new double[][] { {2.}, {3. * 2.}}); PiecewisePolynomialResult2D result = new PiecewisePolynomialResult2D(knots0, knots1, coefsLinConst, new int[] {2, 1 }); PiecewisePolynomialFunction2D function = new PiecewisePolynomialFunction2D(); final int n0Keys = 21; final int n1Keys = 31; double[] x0Keys = new double[n0Keys]; double[] x1Keys = new double[n1Keys]; for (int i = 0; i < n0Keys; ++i) { x0Keys[i] = 0. + 4. / (n0Keys - 1) * i; } for (int i = 0; i < n1Keys; ++i) { x1Keys[i] = 1. + 3. / (n1Keys - 1) * i; } function.differentiateCross(result, x0Keys, x1Keys); } }