public static Map<String, List<ForwardSensitivity>> cleanedFwd(
     final Map<String, List<ForwardSensitivity>> map) {
   // TODO: improve the sorting algorithm.
   final Map<String, List<ForwardSensitivity>> result = new HashMap<>();
   for (final Map.Entry<String, List<ForwardSensitivity>> entry : map.entrySet()) {
     final List<ForwardSensitivity> list = entry.getValue();
     final List<ForwardSensitivity> listClean = new ArrayList<>();
     final Set<Triple<Double, Double, Double>> set = new TreeSet<>();
     for (final ForwardSensitivity pair : list) {
       set.add(new Triple<>(pair.getStartTime(), pair.getEndTime(), pair.getAccrualFactor()));
     }
     for (final Triple<Double, Double, Double> time : set) {
       double sensi = 0;
       for (int looplist = 0; looplist < list.size(); looplist++) {
         final ForwardSensitivity fwdSensitivity = list.get(looplist);
         final Triple<Double, Double, Double> triple =
             new Triple<>(
                 fwdSensitivity.getStartTime(),
                 fwdSensitivity.getEndTime(),
                 fwdSensitivity.getAccrualFactor());
         if (triple.equals(time)) {
           sensi += list.get(looplist).getValue();
         }
       }
       listClean.add(
           new ForwardSensitivity(time.getFirst(), time.getSecond(), time.getThird(), sensi));
     }
     result.put(entry.getKey(), listClean);
   }
   return result;
 }
 public static Map<String, List<ForwardSensitivity>> multipliedByFwd(
     final Map<String, List<ForwardSensitivity>> map, final double factor) {
   final Map<String, List<ForwardSensitivity>> result = new HashMap<>();
   for (final Map.Entry<String, List<ForwardSensitivity>> entry : map.entrySet()) {
     final List<ForwardSensitivity> curveSensi = new ArrayList<>();
     for (final ForwardSensitivity pair : entry.getValue()) {
       curveSensi.add(
           new ForwardSensitivity(
               pair.getStartTime(),
               pair.getEndTime(),
               pair.getAccrualFactor(),
               pair.getValue() * factor));
     }
     result.put(entry.getKey(), curveSensi);
   }
   return result;
 }
 /**
  * Product of two sensitivities
  *
  * @param map1 the original sensitivity
  * @param map2 the other sensitivity
  * @return the new sensitivity
  */
 public static Map<String, List<ForwardSensitivity>> productOfFwd(
     final Map<String, List<ForwardSensitivity>> map1,
     final Map<String, List<ForwardSensitivity>> map2) {
   final Map<String, List<ForwardSensitivity>> result = new HashMap<>();
   for (final Map.Entry<String, List<ForwardSensitivity>> entry : map1.entrySet()) {
     final List<ForwardSensitivity> curveSensi = new ArrayList<>();
     final String name = entry.getKey();
     if (map2.containsKey(name)) {
       final int length2 = map2.size();
       for (final ForwardSensitivity pair1 : entry.getValue()) {
         for (int i = 0; i < length2; ++i) {
           if (pair1.getStartTime() == map2.get(name).get(i).getStartTime()
               && pair1.getEndTime() == map2.get(name).get(i).getEndTime()) {
             curveSensi.add(
                 new ForwardSensitivity(
                     pair1.getStartTime(),
                     pair1.getEndTime(),
                     pair1.getAccrualFactor(),
                     pair1.getValue() * map2.get(name).get(i).getValue()));
           }
         }
       }
     }
     result.put(entry.getKey(), curveSensi);
   }
   return result;
 }