/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.sensitivity.commodity;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 commodity and multi-curves framework.
*/
public class CommoditySensitivity {
/**
* The multi-curves sensitivity object.
*/
private final MulticurveSensitivity _multicurveSensitivity;
/**
* The map containing the sensitivity to the c.
* The map linked the curve (String) to a list of pairs (cash flow time, sensitivity value).
*/
private final Map<String, List<DoublesPair>> _sensitivityCommodityForwardCurve;
/**
* Default constructor, creating an empty HashMap for the sensitivity.
*/
public CommoditySensitivity() {
_multicurveSensitivity = new MulticurveSensitivity();
_sensitivityCommodityForwardCurve = new HashMap<>();
}
private CommoditySensitivity(final MulticurveSensitivity multicurveSensitivity, final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
_multicurveSensitivity = multicurveSensitivity;
_sensitivityCommodityForwardCurve = sensitivityCommodityForwardCurve;
}
/**
* 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 sensitivityCommodityForwardCurve The map.
*/
private CommoditySensitivity(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting, final Map<String, List<ForwardSensitivity>> sensitivityForward,
final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
_multicurveSensitivity = MulticurveSensitivity.of(sensitivityYieldDiscounting, sensitivityForward);
_sensitivityCommodityForwardCurve = sensitivityCommodityForwardCurve;
}
/**
* Constructor from a multicurveSensitivity and a sensitivityPriceCurve. The maps are used directly.
* @param multicurveSensitivity The multicurveSensitivity.
* @param sensitivityCommodityForwardCurve The map.
* @return The sensitivity.
*/
public static CommoditySensitivity of(final MulticurveSensitivity multicurveSensitivity, final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
ArgumentChecker.notNull(multicurveSensitivity, "multicurve sensitivity");
ArgumentChecker.notNull(sensitivityCommodityForwardCurve, "Sensitivity commodity forward curve");
return new CommoditySensitivity(multicurveSensitivity, sensitivityCommodityForwardCurve);
}
/**
* Constructor from a yield discounting map of sensitivity. The maps are used directly.
* @param sensitivityYieldDiscounting The map.
* @param sensitivityForward The map.
* @param sensitivityCommodityForwardCurve The map.
* @return The sensitivity.
*/
public static CommoditySensitivity of(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting, final Map<String, List<ForwardSensitivity>> sensitivityForward,
final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
ArgumentChecker.notNull(sensitivityForward, "Sensitivity forward");
ArgumentChecker.notNull(sensitivityCommodityForwardCurve, "Sensitivity commodity forward curve");
return new CommoditySensitivity(sensitivityYieldDiscounting, sensitivityForward, sensitivityCommodityForwardCurve);
}
/**
* Constructor from a yield discounting map of sensitivity. The map is used directly.
* @param sensitivityYieldDiscounting The map.
* @return The sensitivity.
*/
public static CommoditySensitivity ofYieldDiscounting(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
return new CommoditySensitivity(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 sensitivityCommodityForwardCurve The map.
* @return The sensitivity.
*/
public static CommoditySensitivity of(final Map<String, List<DoublesPair>> sensitivityYieldDiscounting,
final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
ArgumentChecker.notNull(sensitivityYieldDiscounting, "Sensitivity yield curve");
ArgumentChecker.notNull(sensitivityCommodityForwardCurve, "Sensitivity commodity forward curve");
return new CommoditySensitivity(sensitivityYieldDiscounting, new HashMap<String, List<ForwardSensitivity>>(), sensitivityCommodityForwardCurve);
}
/**
* Constructor from a yield discounting map of sensitivity. The map is used directly.
* @param sensitivityCommodityForwardCurve The map.
* @return The sensitivity.
*/
public static CommoditySensitivity ofCommodityForwardValue(final Map<String, List<DoublesPair>> sensitivityCommodityForwardCurve) {
ArgumentChecker.notNull(sensitivityCommodityForwardCurve, "Sensitivity commodity forward index");
return new CommoditySensitivity(new HashMap<String, List<DoublesPair>>(), new HashMap<String, List<ForwardSensitivity>>(), sensitivityCommodityForwardCurve);
}
/**
* 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 commodity forward curve sensitivity map.
* @return The sensitivity map wrapped in an unmodifiable map
*/
public Map<String, List<DoublesPair>> getCommodityForwardCurveSensitivities() {
return Collections.unmodifiableMap(_sensitivityCommodityForwardCurve);
}
/**
* Create a copy of the sensitivity and add a given sensitivity to it.
* @param other The sensitivity to add.
* @return The total sensitivity.
*/
public CommoditySensitivity plus(final CommoditySensitivity other) {
ArgumentChecker.notNull(other, "sensitivity");
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.plus(other._multicurveSensitivity);
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.plus(_sensitivityCommodityForwardCurve, other._sensitivityCommodityForwardCurve);
return new CommoditySensitivity(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 CommoditySensitivity multipliedBy(final double factor) {
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.multipliedBy(factor);
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.multipliedBy(_sensitivityCommodityForwardCurve, factor);
return new CommoditySensitivity(resultMulticurve, resultPrice);
}
/**
* Return a new sensitivity by sorting the times and adding the values at duplicated times.
* @return The cleaned sensitivity.
*/
public CommoditySensitivity cleaned() {
final MulticurveSensitivity resultMulticurve = _multicurveSensitivity.cleaned();
final Map<String, List<DoublesPair>> resultPrice = MulticurveSensitivityUtils.cleaned(_sensitivityCommodityForwardCurve);
return new CommoditySensitivity(resultMulticurve, resultPrice);
}
/**
* Gets the multicurve sensitivities
* @return The multicurve sensitivities
*/
public MulticurveSensitivity getMulticurveSensitivities() {
return _multicurveSensitivity;
}
}