/**
* 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.inflation;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.ObjectUtils;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivityUtils;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.DoublesPair;
/**
* Class describing a present value curve sensitivity for inflation and multi-curves framework.
*/
public class InflationSensitivity {
/**
* The multi-curves sensitivity object.
*/
private final MulticurveSensitivity _multicurveSensitivity;
/**
* The map containing the sensitivity to the price index.
* The map linked the curve (String) to a list of pairs (cash flow time, sensitivity value).
*/
private final Map<String, List<DoublesPair>> _sensitivityPriceCurve;
/**
* Default constructor, creating an empty HashMap for the sensitivity.
*/
public InflationSensitivity() {
_multicurveSensitivity = new MulticurveSensitivity();
_sensitivityPriceCurve = new HashMap<>();
}
private InflationSensitivity(final MulticurveSensitivity multicurveSensitivity, final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
_multicurveSensitivity = multicurveSensitivity;
_sensitivityPriceCurve = sensitivityPriceCurve;
}
/**
* Constructor from a yield discounting map, a forward map and a price index curve of sensitivity. The maps are used directly.
* @param sensitivityYieldDiscounting The map.
* @param sensitivityForward The map.
* @param sensitivityPriceCurve The map.
*/
private InflationSensitivity(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting, final Map<String, List<ForwardSensitivity>> sensitivityForward,
final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
_multicurveSensitivity = MulticurveSensitivity.of(sensitivityYieldDiscounting, sensitivityForward);
_sensitivityPriceCurve = sensitivityPriceCurve;
}
/**
* Constructor from a multicurveSensitivity and a sensitivityPriceCurve. The maps are used directly.
* @param multicurveSensitivity The multicurveSensitivity.
* @param sensitivityPriceCurve The map.
* @return The sensitivity.
*/
public static InflationSensitivity of(final MulticurveSensitivity multicurveSensitivity, final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
ArgumentChecker.notNull(multicurveSensitivity, "multicurve sensitivity");
ArgumentChecker.notNull(sensitivityPriceCurve, "Sensitivity price index curve");
return new InflationSensitivity(multicurveSensitivity, sensitivityPriceCurve);
}
/**
* Constructor from a multicurveSensitivity and a sensitivityPriceCurve. The maps are used directly.
* @param multicurveSensitivity The multicurveSensitivity.
* @return The sensitivity.
*/
public static InflationSensitivity of(final MulticurveSensitivity multicurveSensitivity) {
ArgumentChecker.notNull(multicurveSensitivity, "multicurve sensitivity");
return new InflationSensitivity(multicurveSensitivity, new HashMap<String, List<DoublesPair>>());
}
/**
* Constructor from a yield discounting map of sensitivity. The maps are used directly.
* @param sensitivityYieldDiscounting The map.
* @param sensitivityForward The map.
* @param sensitivityPriceCurve The map.
* @return The sensitivity.
*/
public static InflationSensitivity of(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting, final Map<String, List<ForwardSensitivity>> sensitivityForward,
final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
ArgumentChecker.notNull(sensitivityForward, "Sensitivity forward");
ArgumentChecker.notNull(sensitivityPriceCurve, "Sensitivity price index curve");
return new InflationSensitivity(sensitivityYieldDiscounting, sensitivityForward, sensitivityPriceCurve);
}
/**
* Constructor from a yield discounting map of sensitivity. The map is used directly.
* @param sensitivityYieldDiscounting The map.
* @return The sensitivity.
*/
public static InflationSensitivity ofYieldDiscounting(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
return new InflationSensitivity(sensitivityYieldDiscounting, new HashMap<String, List<ForwardSensitivity>>(), new HashMap<String, List<DoublesPair>>());
}
/**
* Constructor from a yield discounting map and a price map. The maps are used directly.
* @param sensitivityYieldDiscounting The map.
* @param sensitivityPriceCurve The map.
* @return The sensitivity.
*/
public static InflationSensitivity ofYieldDiscountingAndPriceIndex(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting, final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
ArgumentChecker.notNull(sensitivityPriceCurve, "Sensitivity price index curve");
return new InflationSensitivity(sensitivityYieldDiscounting, new HashMap<String, List<ForwardSensitivity>>(), sensitivityPriceCurve);
}
/**
* Constructor from a yield discounting map of sensitivity. The map is used directly.
* @param sensitivityPriceCurve The map.
* @return The sensitivity.
*/
public static InflationSensitivity ofPriceIndex(final Map<String, List<DoublesPair>> sensitivityPriceCurve) {
ArgumentChecker.notNull(sensitivityPriceCurve, "Sensitivity price index");
return new InflationSensitivity(new HashMap<String, List<DoublesPair>>(), new HashMap<String, List<ForwardSensitivity>>(), sensitivityPriceCurve);
}
/**
* Gets the MulticurveSensitivity.
* @return The sensitivity map
*/
public MulticurveSensitivity getMulticurveSensitivity() {
return _multicurveSensitivity;
}
/**
* Gets the discounting curve sensitivities.
* @return The sensitivity map
*/
public Map<String, List<DoublesPair>> getYieldDiscountingSensitivities() {
return _multicurveSensitivity.getYieldDiscountingSensitivities();
}
/**
* Gets the forward curve sensitivity map.
* @return The sensitivity map
*/
public Map<String, List<ForwardSensitivity>> getForwardSensitivities() {
return _multicurveSensitivity.getForwardSensitivities();
}
/**
* Gets the price index curve sensitivity map.
* @return The sensitivity map wrapped in an unmodifiable map
*/
public Map<String, List<DoublesPair>> getPriceCurveSensitivities() {
return Collections.unmodifiableMap(_sensitivityPriceCurve);
}
/**
* Gets the price index curve sensitivity map.
* @return The sensitivity map wrapped in an unmodifiable map
*/
public Map<String, List<DoublesPair>> getDiscountAndPriceIndexSensitivities() {
final Map<String, List<DoublesPair>> sensi = _sensitivityPriceCurve;
sensi.putAll(getYieldDiscountingSensitivities());
return Collections.unmodifiableMap(sensi);
}
/**
* Create a copy of the sensitivity and add a given sensitivity to it.
* @param other The sensitivity to add.
* @return The total sensitivity.
*/
public InflationSensitivity plus(final InflationSensitivity other) {
ArgumentChecker.notNull(other, "sensitivity");
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.plus(other._multicurveSensitivity);
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.plus(_sensitivityPriceCurve, other._sensitivityPriceCurve);
return new InflationSensitivity(resultMulticurve, resultPrice);
}
/**
* Create a new sensitivity object containing the original sensitivity multiplied by a common factor.
* @param factor The multiplicative factor.
* @return The multiplied sensitivity.
*/
public InflationSensitivity multipliedBy(final double factor) {
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.multipliedBy(factor);
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.multipliedBy(_sensitivityPriceCurve, factor);
return new InflationSensitivity(resultMulticurve, resultPrice);
}
/**
* Return a new sensitivity by sorting the times and adding the values at duplicated times.
* @return The cleaned sensitivity.
*/
public InflationSensitivity cleaned() {
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.cleaned();
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.cleaned(_sensitivityPriceCurve);
return new InflationSensitivity(resultMulticurve, resultPrice);
}
/**
* Gets the multicurve sensitivities
* @return The multicurve sensitivities
*/
public MulticurveSensitivity getMulticurveSensitivities() {
return _multicurveSensitivity;
}
@Override
public String toString() {
return _multicurveSensitivity.toString() + "\n" + "\n" + _sensitivityPriceCurve.toString();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + _multicurveSensitivity.hashCode();
result = prime * result + _sensitivityPriceCurve.hashCode();
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final InflationSensitivity other = (InflationSensitivity) obj;
if (!ObjectUtils.equals(_multicurveSensitivity, other._multicurveSensitivity)) {
return false;
}
if (!ObjectUtils.equals(_sensitivityPriceCurve, other._sensitivityPriceCurve)) {
return false;
}
return true;
}
}