/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
/**
*
*/
@Test(groups = TestGroup.UNIT)
public class DoubleLabelledMatrix2DTest {
private static final Double[] SORTED_X_KEYS = new Double[] {1., 2., 3., 4., 5.};
private static final Double[] SORTED_Y_KEYS = new Double[] {1., 2., 3.};
private static final Object[] SORTED_X_LABELS1 = new String[] {"1.0", "2.0", "3.0", "4.0", "5.0"};
private static final Object[] SORTED_Y_LABELS1 = new String[] {"1.0", "2.0", "3.0"};
private static final Object[] SORTED_X_LABELS2 = new String[] {"A", "B", "C", "D", "E"};
private static final Object[] SORTED_Y_LABELS2 = new String[] {"A", "B", "C"};
private static final double[][] SORTED_VALUES = new double[][] {new double[] {1, 2, 3, 4, 5}, new double[] {2, 4, 6, 8, 10}, new double[] {3, 6, 9, 12, 15}};
private static final Double[] X_KEYS = new Double[] {2., 1., 3., 5., 4.};
private static final String X_TITLE = "x";
private static final Double[] Y_KEYS = new Double[] {2., 3., 1.};
private static final String Y_TITLE = "y";
private static final Object[] X_LABELS1 = new Object[] {"2.0", "1.0", "3.0", "5.0", "4.0"};
private static final Object[] Y_LABELS1 = new Object[] {"2.0", "3.0", "1.0"};
private static final Object[] X_LABELS2 = new Object[] {"B", "A", "C", "E", "D"};
private static final Object[] Y_LABELS2 = new Object[] {"B", "C", "A"};
private static final double[][] VALUES = new double[][] {new double[] {4, 2, 6, 10, 8}, new double[] {6, 3, 9, 15, 12}, new double[] {2, 1, 3, 5, 4}};
private static final String VALUES_TITLE = "values";
@Test
public void test() {
DoubleLabelledMatrix2D result = new DoubleLabelledMatrix2D(X_KEYS, Y_KEYS, VALUES);
testResult(result, SORTED_X_LABELS1, SORTED_Y_LABELS1);
result = new DoubleLabelledMatrix2D(X_KEYS, X_LABELS1, Y_KEYS, Y_LABELS1, VALUES);
testResult(result, SORTED_X_LABELS1, SORTED_Y_LABELS1);
result = new DoubleLabelledMatrix2D(X_KEYS, X_LABELS2, Y_KEYS, Y_LABELS2, VALUES);
testResult(result, SORTED_X_LABELS2, SORTED_Y_LABELS2);
}
@Test
public void testTitles() {
DoubleLabelledMatrix2D withTitles = new DoubleLabelledMatrix2D(X_KEYS, X_LABELS1, X_TITLE, Y_KEYS, Y_LABELS1, Y_TITLE, VALUES, VALUES_TITLE);
assertEquals(X_TITLE, withTitles.getXTitle());
assertEquals(Y_TITLE, withTitles.getYTitle());
assertEquals(VALUES_TITLE, withTitles.getValuesTitle());
DoubleLabelledMatrix2D withoutTitles = new DoubleLabelledMatrix2D(X_KEYS, X_LABELS1, Y_KEYS, Y_LABELS1, VALUES);
assertFalse(withTitles.equals(withoutTitles));
}
@Test
public void testAdd() {
Double[] otherX = new Double[] {6., 7.};
Double[] otherY = new Double[] {4., 5., 6., 7., 8.};
Object[] otherXLabels = new Object[] {"F", "G"};
Object[] otherYLabels = new Object[] {"D", "E", "F", "G", "H"};
double[][] values = new double[][] {new double[] {24, 28}, new double[] {30, 35}, new double[] {36, 42}, new double[] {42, 49}, new double[] {48, 56}};
final DoubleLabelledMatrix2D originalMatrix = new DoubleLabelledMatrix2D(SORTED_X_KEYS, SORTED_X_LABELS2, SORTED_Y_KEYS, SORTED_Y_LABELS2, SORTED_VALUES);
DoubleLabelledMatrix2D otherMatrix = new DoubleLabelledMatrix2D(otherX, otherXLabels, otherY, otherYLabels, values);
LabelledMatrix2D<Double, Double> sum = originalMatrix.add(otherMatrix, 0.0001, 0.0001);
double[][] expectedValues = new double[][] {new double[] {1, 2, 3, 4, 5, 0, 0},
new double[] {2, 4, 6, 8, 10, 0, 0},
new double[] {3, 6, 9, 12, 15, 0, 0},
new double[] {0, 0, 0, 0, 0, 24, 28},
new double[] {0, 0, 0, 0, 0, 30, 35},
new double[] {0, 0, 0, 0, 0, 36, 42},
new double[] {0, 0, 0, 0, 0, 42, 49},
new double[] {0, 0, 0, 0, 0, 48, 56}};
LabelledMatrix2D<Double, Double> expectedSum = new DoubleLabelledMatrix2D(new Double[] {1., 2., 3., 4., 5., 6., 7.},
new Object[] {"A", "B", "C", "D", "E", "F", "G"},
new Double[] {1., 2., 3., 4., 5., 6., 7., 8.},
new Object[] {"A", "B", "C", "D", "E", "F", "G", "H"},
expectedValues);
assertArrayEquals(expectedSum.getXKeys(), sum.getXKeys());
assertArrayEquals(expectedSum.getXLabels(), sum.getXLabels());
assertArrayEquals(expectedSum.getYKeys(), sum.getYKeys());
assertArrayEquals(expectedSum.getYLabels(), sum.getYLabels());
for (int i = 0; i < expectedValues.length; i++) {
for (int j = 0; j < expectedValues[0].length; j++) {
assertEquals(expectedValues[i][j], sum.getValues()[i][j]);
}
}
otherX = new Double[] {1., 2.};
otherY = new Double[] {1., 2., 3., 4., 5.};
otherXLabels = new Object[] {"A", "B"};
otherYLabels = new Object[] {"A", "B", "C", "D", "E"};
values = new double[][] {new double[] {10, 100}, new double[] {20, 200}, new double[] {30, 300}, new double[] {40, 400}, new double[] {50, 500}};
otherMatrix = new DoubleLabelledMatrix2D(otherX, otherXLabels, otherY, otherYLabels, values);
sum = originalMatrix.add(otherMatrix, 0.0001, 0.0001);
expectedValues = new double[][] {new double[] {11, 102, 3, 4, 5},
new double[] {22, 204, 6, 8, 10},
new double[] {33, 306, 9, 12, 15},
new double[] {40, 400, 0, 0, 0},
new double[] {50, 500, 0, 0, 0}};
expectedSum = new DoubleLabelledMatrix2D(new Double[] {1., 2., 3., 4., 5.},
new Object[] {"A", "B", "C", "D", "E"},
new Double[] {1., 2., 3., 4., 5.},
new Object[] {"A", "B", "C", "D", "E"},
expectedValues);
assertArrayEquals(expectedSum.getXKeys(), sum.getXKeys());
assertArrayEquals(expectedSum.getXLabels(), sum.getXLabels());
assertArrayEquals(expectedSum.getYKeys(), sum.getYKeys());
assertArrayEquals(expectedSum.getYLabels(), sum.getYLabels());
for (int i = 0; i < expectedValues.length; i++) {
for (int j = 0; j < expectedValues[0].length; j++) {
assertEquals(expectedValues[i][j], sum.getValues()[i][j]);
}
}
}
@Test
public void testAddWithTolerance() {
final Double[] otherX = new Double[] {1.2, 6.1, 7.1};
final Double[] otherY = new Double[] {0.9, 1.8, 2.3, 6.9, 8.1};
final Object[] otherXLabels = new Object[] {"X", "F", "G"};
final Object[] otherYLabels = new Object[] {"H", "I", "J", "K", "L"};
final double[][] values = new double[][] {new double[] {-10, 10, 100}, new double[] {-20, 20, 200}, new double[] {-30, 31, 301}, new double[] {-40, 40, 400}, new double[] {-50, 50, 500}};
final DoubleLabelledMatrix2D originalMatrix = new DoubleLabelledMatrix2D(SORTED_X_KEYS, SORTED_X_LABELS2, SORTED_Y_KEYS, SORTED_Y_LABELS2, SORTED_VALUES);
final DoubleLabelledMatrix2D otherMatrix = new DoubleLabelledMatrix2D(otherX, otherXLabels, otherY, otherYLabels, values);
LabelledMatrix2D<Double, Double> sum = originalMatrix.add(otherMatrix, 0.0001, 0.0001);
double[][] expectedValues = new double[][] {new double[] {0, -10, 0, 0, 0, 0, 10, 100},
new double[] {1, 0, 2, 3, 4, 5, 0, 0},
new double[] {0, -20, 0, 0, 0, 0, 20, 200},
new double[] {2, 0, 4, 6, 8, 10, 0, 0},
new double[] {0, -30, 0, 0, 0, 0, 31, 301},
new double[] {3, 0, 6, 9, 12, 15, 0, 0},
new double[] {0, -40, 0, 0, 0, 0, 40, 400},
new double[] {0, -50, 0, 0, 0, 0, 50, 500}};
LabelledMatrix2D<Double, Double> expectedSum = new DoubleLabelledMatrix2D(new Double[] {1., 1.2, 2., 3., 4., 5., 6.1, 7.1},
new Object[] {"A", "X", "B", "C", "D", "E", "F", "G"},
new Double[] {0.9, 1., 1.8, 2., 2.3, 3., 6.9, 8.1},
new Object[] {"H", "A", "I", "B", "J", "C", "K", "L"},
expectedValues);
assertArrayEquals(expectedSum.getXKeys(), sum.getXKeys());
assertArrayEquals(expectedSum.getXLabels(), sum.getXLabels());
assertArrayEquals(expectedSum.getYKeys(), sum.getYKeys());
assertArrayEquals(expectedSum.getYLabels(), sum.getYLabels());
for (int i = 0; i < expectedValues.length; i++) {
for (int j = 0; j < expectedValues[0].length; j++) {
assertEquals(expectedValues[i][j], sum.getValues()[i][j]);
}
}
sum = originalMatrix.add(otherMatrix, 0.4, 0.4);
expectedValues = new double[][] {new double[] {-9, 2, 3, 4, 5, 10, 100},
new double[] {-48, 4, 6, 8, 10, 51, 501},
new double[] {3, 6, 9, 12, 15, 0, 0},
new double[] {-40, 0, 0, 0, 0, 40, 400},
new double[] {-50, 0, 0, 0, 0, 50, 500}};
expectedSum = new DoubleLabelledMatrix2D(new Double[] {1., 2., 3., 4., 5., 6.1, 7.1},
new Object[] {"A", "B", "C", "D", "E", "F", "G"},
new Double[] {1., 2., 3., 6.9, 8.1},
new Object[] {"A", "B", "C", "K", "L"},
expectedValues);
assertArrayEquals(expectedSum.getXKeys(), sum.getXKeys());
assertArrayEquals(expectedSum.getXLabels(), sum.getXLabels());
assertArrayEquals(expectedSum.getYKeys(), sum.getYKeys());
assertArrayEquals(expectedSum.getYLabels(), sum.getYLabels());
for (int i = 0; i < expectedValues.length; i++) {
for (int j = 0; j < expectedValues[0].length; j++) {
assertEquals(expectedValues[i][j], sum.getValues()[i][j]);
}
}
}
@Test
public void testAddTitlesPreserved() {
DoubleLabelledMatrix2D base = new DoubleLabelledMatrix2D(X_KEYS, X_LABELS1, X_TITLE, Y_KEYS, Y_LABELS1, Y_TITLE, VALUES, VALUES_TITLE);
DoubleLabelledMatrix2D operand = new DoubleLabelledMatrix2D(X_KEYS, Y_KEYS, VALUES);
LabelledMatrix2D<Double, Double> result = base.add(operand, 0.0001, 0.0001);
assertEquals(X_TITLE, result.getXTitle());
assertEquals(Y_TITLE, result.getYTitle());
assertEquals(VALUES_TITLE, result.getValuesTitle());
}
private void testResult(final DoubleLabelledMatrix2D result, final Object[] xLabels, final Object[] yLabels) {
final Double[] xKeysResult = result.getXKeys();
assertArrayEquals(SORTED_X_KEYS, xKeysResult);
final Object[] xLabelsResult = result.getXLabels();
assertArrayEquals(xLabels, xLabelsResult);
final Double[] yKeysResult = result.getYKeys();
assertArrayEquals(SORTED_Y_KEYS, yKeysResult);
final Object[] yLabelsResult = result.getYLabels();
assertArrayEquals(yLabels, yLabelsResult);
final double[][] valuesResult = result.getValues();
for (int i = 0; i < yKeysResult.length; i++) {
for (int j = 0; j < xKeysResult.length; j++) {
assertEquals(valuesResult[i][j], SORTED_VALUES[i][j]);
}
}
}
}