/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.sensitivity; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.util.LinkedHashMap; import java.util.Map; import org.testng.annotations.Test; import com.google.common.collect.Maps; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimpleParameterSensitivity; import com.opengamma.analytics.financial.util.AssertSensitivityObjects; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; import com.opengamma.analytics.math.matrix.MatrixAlgebraFactory; import com.opengamma.analytics.math.matrix.OGMatrixAlgebra; import com.opengamma.util.test.TestGroup; /** * Tests related to ParameterSensitivity manipulations. */ @Test(groups = TestGroup.UNIT) public class SimpleParameterSensitivityTest { private static final OGMatrixAlgebra MATRIX = MatrixAlgebraFactory.OG_ALGEBRA; private static final DoubleMatrix1D SENSITIVITY_1_1 = new DoubleMatrix1D(4.0, 2.0, 5.0, 1.5); private static final DoubleMatrix1D SENSITIVITY_1_2 = new DoubleMatrix1D(4.0, 3.0, 5.0, 2.5); private static final DoubleMatrix1D SENSITIVITY_2_1 = new DoubleMatrix1D(5.0, 1.0, 2.0, 5.0, 1.5); private static final String NAME_1 = "Name1"; private static final String NAME_2 = "Name2"; private static final double TOLERANCE = 1.0E-5; @Test(expectedExceptions = IllegalArgumentException.class) public void testNullMap1() { new SimpleParameterSensitivity(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testPlusNullPair() { new SimpleParameterSensitivity().plus(null, SENSITIVITY_1_1); } @Test(expectedExceptions = IllegalArgumentException.class) public void testPlusNullMatrix() { new SimpleParameterSensitivity().plus(NAME_1, null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testPlusNullSensitivities() { new SimpleParameterSensitivity().plus(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testGetSensitivityNullName() { new SimpleParameterSensitivity().getSensitivity(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void addWrongSize() { SimpleParameterSensitivity sensitivity1 = new SimpleParameterSensitivity(); sensitivity1 = sensitivity1.plus(NAME_1, SENSITIVITY_1_1); sensitivity1.plus(NAME_1, SENSITIVITY_2_1); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testAddToUnmodifiableMap() { final LinkedHashMap<String, DoubleMatrix1D> map = new LinkedHashMap<>(); map.put(NAME_1, SENSITIVITY_1_1); final SimpleParameterSensitivity sensitivities = new SimpleParameterSensitivity(map); final Map<String, DoubleMatrix1D> unmodifiable = sensitivities.getSensitivities(); unmodifiable.put(NAME_1, SENSITIVITY_1_2); } @Test public void testObject() { LinkedHashMap<String, DoubleMatrix1D> map = new LinkedHashMap<>(); map.put(NAME_1, SENSITIVITY_1_1); final SimpleParameterSensitivity sensitivity = new SimpleParameterSensitivity(map); assertFalse(sensitivity.getSensitivities() == map); assertEquals(map, sensitivity.getSensitivities()); assertEquals(map.keySet(), sensitivity.getAllNames()); assertEquals(SENSITIVITY_1_1, sensitivity.getSensitivity(NAME_1)); SimpleParameterSensitivity other = new SimpleParameterSensitivity(map); assertEquals(sensitivity, other); assertEquals(sensitivity.hashCode(), other.hashCode()); map = new LinkedHashMap<>(); assertFalse(sensitivity.getSensitivities().equals(map)); map.put(NAME_1, SENSITIVITY_1_1); other = new SimpleParameterSensitivity(map); assertEquals(sensitivity, other); map.put(NAME_1, SENSITIVITY_1_2); map.put(NAME_2, SENSITIVITY_2_1); other = new SimpleParameterSensitivity(map); assertFalse(sensitivity.equals(other)); other = new SimpleParameterSensitivity(); assertTrue(other.getSensitivities().isEmpty()); } @Test public void plus() { SimpleParameterSensitivity sensitivity1 = new SimpleParameterSensitivity(); sensitivity1 = sensitivity1.plus(NAME_1, SENSITIVITY_1_1); sensitivity1 = sensitivity1.plus(NAME_1, SENSITIVITY_1_2); assertEquals("Add same currency, different sensitivities: ", MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2), sensitivity1.getSensitivity(NAME_1)); SimpleParameterSensitivity sensitivity2 = new SimpleParameterSensitivity(); sensitivity2 = sensitivity2.plus(NAME_1, SENSITIVITY_1_1); sensitivity2 = sensitivity2.plus(sensitivity1); sensitivity2 = new SimpleParameterSensitivity(); sensitivity2 = sensitivity2.plus(NAME_1, SENSITIVITY_1_1); sensitivity2 = sensitivity2.plus(sensitivity1); assertEquals("Add same currency, test sensitivities: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1)); sensitivity2 = sensitivity2.plus(NAME_2, SENSITIVITY_2_1); assertEquals("Add different currency, test sensitivities of first name: ", SENSITIVITY_2_1, sensitivity2.getSensitivity(NAME_2)); assertEquals("Add different currency, test sensitivities of second name: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1)); sensitivity2 = sensitivity2.plus(NAME_2, SENSITIVITY_2_1); assertEquals("Test add same sensitivities: ", MATRIX.scale(SENSITIVITY_2_1, 2.0), sensitivity2.getSensitivity(NAME_2)); assertEquals("Test other currency: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1)); sensitivity2 = sensitivity2.plus(NAME_1, SENSITIVITY_1_1); assertEquals("SimpleParameterSensitivity: plus", MATRIX.scale(SENSITIVITY_2_1, 2.0), sensitivity2.getSensitivity(NAME_2)); SimpleParameterSensitivity sensitivity3 = new SimpleParameterSensitivity(); sensitivity3 = sensitivity3.plus("New name", SENSITIVITY_1_1); sensitivity3 = sensitivity3.plus(NAME_1, SENSITIVITY_1_1); SimpleParameterSensitivity sensitivity4 = new SimpleParameterSensitivity(); sensitivity4 = sensitivity4.plus("New name", SENSITIVITY_1_1); SimpleParameterSensitivity sensitivity5 = new SimpleParameterSensitivity(); sensitivity5 = sensitivity5.plus(NAME_1, SENSITIVITY_1_1); sensitivity4 = sensitivity4.plus(sensitivity5); AssertSensitivityObjects.assertEquals("SimpleParameterSensitivity: plus", sensitivity3, sensitivity4, TOLERANCE); } @Test public void multiplyBy() { final double factor = 5.8; SimpleParameterSensitivity sensitivity = new SimpleParameterSensitivity(); sensitivity = sensitivity.plus(NAME_1, SENSITIVITY_1_1); sensitivity = sensitivity.multipliedBy(factor); assertEquals("Test multiplyBy, single name / currency pair: ", MATRIX.scale(SENSITIVITY_1_1, factor), sensitivity.getSensitivity(NAME_1)); SimpleParameterSensitivity sensi2 = new SimpleParameterSensitivity(); sensi2 = sensi2.plus(NAME_1, SENSITIVITY_1_1); sensi2 = sensi2.plus(NAME_2, SENSITIVITY_2_1); sensi2 = sensi2.multipliedBy(factor); assertEquals("Test multiplyBy, first name / currency pair: ", MATRIX.scale(SENSITIVITY_1_1, factor), sensi2.getSensitivity(NAME_1)); assertEquals("Test multiplyBy, second name / currency pair: ", MATRIX.scale(SENSITIVITY_2_1, factor), sensi2.getSensitivity(NAME_2)); } @Test public void compare() { SimpleParameterSensitivity sensitivity1 = new SimpleParameterSensitivity(); sensitivity1 = sensitivity1.plus(NAME_1, SENSITIVITY_1_1); sensitivity1 = sensitivity1.plus(NAME_2, SENSITIVITY_2_1); SimpleParameterSensitivity sensitivity2 = new SimpleParameterSensitivity(); sensitivity2 = sensitivity2.plus(NAME_1, SENSITIVITY_1_1); sensitivity2 = sensitivity2.plus(NAME_2, SENSITIVITY_2_1); AssertSensitivityObjects.assertEquals("ParameterSensitivity: compare same data", sensitivity1, sensitivity2, TOLERANCE); AssertSensitivityObjects.assertDoesNotEqual("ParameterSensitivity: compare different data outside tolerance", sensitivity1.multipliedBy(2.0), sensitivity2, TOLERANCE); AssertSensitivityObjects.assertEquals("ParameterSensitivity: compare different data inside tolerance", sensitivity1.multipliedBy(1 + TOLERANCE / 10), sensitivity2, TOLERANCE); SimpleParameterSensitivity sensitivity3 = new SimpleParameterSensitivity(); sensitivity3 = sensitivity3.plus(NAME_1, SENSITIVITY_1_1); AssertSensitivityObjects.assertDoesNotEqual("ParameterSensitivity: compare data with different name / currency pairs", sensitivity1, sensitivity3, TOLERANCE); } @Test public void getAllNamesCurrency() { final LinkedHashMap<String, DoubleMatrix1D> map1 = Maps.newLinkedHashMap(); map1.put(NAME_1, SENSITIVITY_1_1); map1.put(NAME_2, SENSITIVITY_1_2); final SimpleParameterSensitivity sensitivity1 = new SimpleParameterSensitivity(map1); assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getAllNames(), sensitivity1.getSensitivities().keySet()); assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getSensitivity(NAME_1), sensitivity1.getSensitivity(NAME_1)); assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getSensitivity(NAME_2), sensitivity1.getSensitivity(NAME_2)); } @Test public void equalHash() { SimpleParameterSensitivity sensitivity = new SimpleParameterSensitivity(); sensitivity = sensitivity.plus(NAME_1, SENSITIVITY_1_1); sensitivity = sensitivity.plus(NAME_2, SENSITIVITY_2_1); SimpleParameterSensitivity modified = new SimpleParameterSensitivity(); modified = modified.plus(NAME_2, SENSITIVITY_2_1); modified = modified.plus(NAME_2, SENSITIVITY_2_1); assertEquals("ParameterSensitivity: equalHash", sensitivity, sensitivity); assertEquals("ParameterSensitivity: equalHash", sensitivity.hashCode(), sensitivity.hashCode()); assertFalse("ParameterSensitivity: equalHash", sensitivity.equals(SENSITIVITY_1_1)); assertFalse("ParameterSensitivity: equalHash", sensitivity.equals(modified)); } }