@Test
 public void testPlusMultiCurve() {
   // Add multi-curve
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final InterestRateCurveSensitivity sensitivity3 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final InterestRateCurveSensitivity sensitivity4 =
       new InterestRateCurveSensitivity(SENSITIVITY_33);
   final List<DoublesPair> list = new ArrayList<>();
   list.addAll(SENSITIVITY_DATA_1);
   list.addAll(SENSITIVITY_DATA_2);
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, list);
   map.put(CURVE_NAME_2, SENSITIVITY_DATA_2);
   map.put(CURVE_NAME_3, SENSITIVITY_DATA_3);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   InterestRateCurveSensitivity actual =
       sensitivity1.plus(sensitivity2).plus(sensitivity3).plus(sensitivity4);
   assertEquals(expected, actual);
   actual =
       sensitivity1
           .plus(CURVE_NAME_1, SENSITIVITY_DATA_2)
           .plus(CURVE_NAME_2, SENSITIVITY_DATA_2)
           .plus(CURVE_NAME_3, SENSITIVITY_DATA_3);
   assertEquals(expected, actual);
 }
 @Test
 public void testPlusDifferentCurves() {
   // Simple add
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, SENSITIVITY_DATA_1);
   map.put(CURVE_NAME_2, SENSITIVITY_DATA_2);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   InterestRateCurveSensitivity actual = sensitivity1.plus(sensitivity2);
   assertFalse(sensitivity1 == actual);
   assertFalse(sensitivity2 == actual);
   assertEquals(expected, actual);
   actual = sensitivity1.plus(CURVE_NAME_2, SENSITIVITY_DATA_2);
   assertEquals(expected, actual);
 }
 @Test
 public void testPlusSameCurves() {
   // Add on the same curve
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final List<DoublesPair> data = new ArrayList<>();
   data.addAll(SENSITIVITY_DATA_1);
   data.addAll(SENSITIVITY_DATA_2);
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, data);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   InterestRateCurveSensitivity actual = sensitivity1.plus(sensitivity2);
   assertFalse(sensitivity1 == actual);
   assertFalse(sensitivity2 == actual);
   assertEquals(expected, actual);
   actual = sensitivity1.plus(CURVE_NAME_1, SENSITIVITY_DATA_2);
   assertEquals(expected, actual);
 }
 @Test
 public void testTotalSensitivity() {
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final InterestRateCurveSensitivity sensitivity3 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final InterestRateCurveSensitivity sensitivity4 =
       new InterestRateCurveSensitivity(SENSITIVITY_33);
   final double actual =
       sensitivity1.plus(sensitivity2).plus(sensitivity3).plus(sensitivity4).totalSensitivity();
   final double expected = 400;
   assertEquals(expected, actual);
 }
 @Test
 public void testCleanDifferentCurves() {
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, SENSITIVITY_DATA_1);
   map.put(CURVE_NAME_2, SENSITIVITY_DATA_2);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   final InterestRateCurveSensitivity actualUncleaned = sensitivity1.plus(sensitivity2);
   final InterestRateCurveSensitivity actual = actualUncleaned.cleaned();
   assertFalse(actualUncleaned == actual);
   assertFalse(actualUncleaned.getSensitivities() == actual.getSensitivities());
   assertEquals(expected, actual);
   assertEquals(actualUncleaned, actual);
 }
 @Test
 public void testMultiply() {
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final InterestRateCurveSensitivity sensitivity3 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final InterestRateCurveSensitivity sensitivity4 =
       new InterestRateCurveSensitivity(SENSITIVITY_33);
   final double factor = Math.random() - 1;
   final List<DoublesPair> list1 = new ArrayList<>();
   final List<DoublesPair> list2 = new ArrayList<>();
   final List<DoublesPair> list3 = new ArrayList<>();
   for (final DoublesPair pair : SENSITIVITY_DATA_1) {
     list1.add(DoublesPair.of(pair.getFirst(), pair.getSecond() * factor));
   }
   for (final DoublesPair pair : SENSITIVITY_DATA_2) {
     final DoublesPair scaledPair = DoublesPair.of(pair.getFirst(), pair.getSecond() * factor);
     list1.add(scaledPair);
     list2.add(scaledPair);
   }
   for (final DoublesPair pair : SENSITIVITY_DATA_3) {
     list3.add(DoublesPair.of(pair.getFirst(), pair.getSecond() * factor));
   }
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, list1);
   map.put(CURVE_NAME_2, list2);
   map.put(CURVE_NAME_3, list3);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   final InterestRateCurveSensitivity actualUnscaled =
       sensitivity1.plus(sensitivity2).plus(sensitivity3).plus(sensitivity4);
   InterestRateCurveSensitivity actual = actualUnscaled.multipliedBy(factor);
   assertFalse(actualUnscaled == actual);
   assertFalse(actualUnscaled.getSensitivities() == actual.getSensitivities());
   assertEquals(expected, actual);
   actual =
       sensitivity1
           .multipliedBy(factor)
           .plus(sensitivity2.multipliedBy(factor))
           .plus(sensitivity3.multipliedBy(factor))
           .plus(sensitivity4.multipliedBy(factor));
   assertEquals(expected, actual);
 }
 @Test
 public void testCleanSameCurvesWithRelativeTolerance1() {
   final double eps = 1e-3;
   final double eps2 = 5e-4;
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final List<DoublesPair> fuzzyList =
       Arrays.asList(
           new DoublesPair[] {
             DoublesPair.of(1d, -10d - 10 * eps2),
             DoublesPair.of(2d, 30d),
             DoublesPair.of(3d, -30d + 30 * eps2),
             DoublesPair.of(4d, 10d)
           });
   List<DoublesPair> expectedList =
       Arrays.asList(new DoublesPair[] {DoublesPair.of(2d, 50d), DoublesPair.of(4d, 50d)});
   Map<String, List<DoublesPair>> expectedMap = new HashMap<>();
   expectedMap.put(CURVE_NAME_1, expectedList);
   final Map<String, List<DoublesPair>> fuzzyMap = new HashMap<>();
   fuzzyMap.put(CURVE_NAME_1, fuzzyList);
   final InterestRateCurveSensitivity fuzzySensitivity =
       new InterestRateCurveSensitivity(fuzzyMap);
   InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(expectedMap);
   final InterestRateCurveSensitivity actualUncleaned = sensitivity1.plus(fuzzySensitivity);
   InterestRateCurveSensitivity actual = actualUncleaned.cleaned(eps, eps / 10);
   assertFalse(actualUncleaned == actual);
   assertFalse(actualUncleaned.getSensitivities() == actual.getSensitivities());
   assertEquals(expected, actual);
   expectedList =
       Arrays.asList(
           new DoublesPair[] {
             DoublesPair.of(1d, -10d * eps2),
             DoublesPair.of(2d, 50d),
             DoublesPair.of(3d, 30d * eps2),
             DoublesPair.of(4d, 50d)
           });
   expectedMap = new HashMap<>();
   expectedMap.put(CURVE_NAME_1, expectedList);
   expected = new InterestRateCurveSensitivity(expectedMap);
   actual = actualUncleaned.cleaned(eps / 100, eps / 10);
   assertEquals(expected.getSensitivities().size(), actual.getSensitivities().size());
   assertIRCSEquals(expected, actual);
 }
 @Test
 public void testTotalSensitivityByCurve() {
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final InterestRateCurveSensitivity sensitivity3 =
       new InterestRateCurveSensitivity(SENSITIVITY_22);
   final InterestRateCurveSensitivity sensitivity4 =
       new InterestRateCurveSensitivity(SENSITIVITY_33);
   final Map<String, Double> actual =
       sensitivity1
           .plus(sensitivity2)
           .plus(sensitivity3)
           .plus(sensitivity4)
           .totalSensitivityByCurve();
   final Map<String, Double> expected = new HashMap<>();
   expected.put(CURVE_NAME_1, 200.);
   expected.put(CURVE_NAME_2, 100.);
   expected.put(CURVE_NAME_3, 100.);
   assertEquals(expected, actual);
 }
 @Test
 public void testCleanSameCurves() {
   final InterestRateCurveSensitivity sensitivity1 =
       new InterestRateCurveSensitivity(SENSITIVITY_11);
   final InterestRateCurveSensitivity sensitivity2 =
       new InterestRateCurveSensitivity(SENSITIVITY_12);
   final List<DoublesPair> list =
       Arrays.asList(
           new DoublesPair[] {
             DoublesPair.of(1d, 50d),
             DoublesPair.of(2d, 50d),
             DoublesPair.of(3d, 50d),
             DoublesPair.of(4d, 50d)
           });
   final Map<String, List<DoublesPair>> map = new HashMap<>();
   map.put(CURVE_NAME_1, list);
   final InterestRateCurveSensitivity expected = new InterestRateCurveSensitivity(map);
   final InterestRateCurveSensitivity actualUncleaned = sensitivity1.plus(sensitivity2);
   final InterestRateCurveSensitivity actual = actualUncleaned.cleaned();
   assertFalse(actualUncleaned == actual);
   assertFalse(actualUncleaned.getSensitivities() == actual.getSensitivities());
   assertEquals(expected, actual);
 }