/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.sensitivity; import java.util.Map; import org.apache.commons.lang.ObjectUtils; import com.opengamma.analytics.financial.instrument.index.GeneratorAttributeIR; import com.opengamma.analytics.financial.instrument.index.GeneratorInstrument; import com.opengamma.analytics.util.amount.SurfaceValue; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.DoublesPair; /** * Class describing the present value Black volatility sensitivity. */ public class PresentValueSwaptionSurfaceSensitivity { /** * The object containing the volatility sensitivity. The sensitivity is in the currency of the swap generator. Not null. */ private final SurfaceValue _sensitivity; /** * The standard swap generator (in particular fixed leg convention and floating leg tenor) for which the * volatility surface is valid. Not null. */ private final GeneratorInstrument<GeneratorAttributeIR> _generatorSwap; /** * Constructor with empty sensitivity. * @param generatorSwap The standard swap generator for which the volatility surface is valid. */ public PresentValueSwaptionSurfaceSensitivity(final GeneratorInstrument<GeneratorAttributeIR> generatorSwap) { ArgumentChecker.notNull(generatorSwap, "Swap generator"); _sensitivity = new SurfaceValue(); _generatorSwap = generatorSwap; } /** * Constructor from parameter sensitivities. * @param sensitivity The volatility sensitivity as a map. * @param generatorSwap The standard swap generator for which the volatility surface is valid. */ public PresentValueSwaptionSurfaceSensitivity(final Map<DoublesPair, Double> sensitivity, final GeneratorInstrument<GeneratorAttributeIR> generatorSwap) { ArgumentChecker.notNull(sensitivity, "Sensitivity"); ArgumentChecker.notNull(generatorSwap, "Swap generator"); _sensitivity = SurfaceValue.from(sensitivity); _generatorSwap = generatorSwap; } /** * Constructor from parameter sensitivities. The SurfaceValue are not copied but used directly. * @param sensitivity The volatility sensitivity as a SurfaceValue. * @param generatorSwap The standard swap generator for which the volatility surface is valid. */ public PresentValueSwaptionSurfaceSensitivity(final SurfaceValue sensitivity, final GeneratorInstrument<GeneratorAttributeIR> generatorSwap) { ArgumentChecker.notNull(sensitivity, "Sensitivity"); ArgumentChecker.notNull(generatorSwap, "Swap generator"); _sensitivity = sensitivity; _generatorSwap = generatorSwap; } /** * Add one sensitivity to the volatility sensitivity. The existing object is modified. If the point is not in the existing points of the sensitivity, it is put in the map. * If a point is already in the existing points of the object, the value is added to the existing value. * @param expiryMaturity The expiration time/maturity pair. * @param sensitivity The sensitivity. */ public void addSensitivity(final DoublesPair expiryMaturity, final double sensitivity) { _sensitivity.add(expiryMaturity, sensitivity); } /** * Create a new sensitivity object with all the sensitivities multiplied by a common factor. * @param sensi The Black sensitivity. * @param factor The multiplicative factor. * @return The multiplied sensitivity. */ public static PresentValueSwaptionSurfaceSensitivity multiplyBy(final PresentValueSwaptionSurfaceSensitivity sensi, final double factor) { return new PresentValueSwaptionSurfaceSensitivity(SurfaceValue.multiplyBy(sensi._sensitivity, factor), sensi._generatorSwap); } /** * Return the sum of to sensitivities in a new one. The original sensitivities are unchanged. The associated swap generators should be identical. * @param sensi1 The first Black sensitivity. * @param sensi2 The second Black sensitivity. * @return The sum sensitivity. */ public static PresentValueSwaptionSurfaceSensitivity plus(final PresentValueSwaptionSurfaceSensitivity sensi1, final PresentValueSwaptionSurfaceSensitivity sensi2) { ArgumentChecker.isTrue(sensi1._generatorSwap.equals(sensi2._generatorSwap), "Swap generators should be equal to add sensitivities"); return new PresentValueSwaptionSurfaceSensitivity(SurfaceValue.plus(sensi1._sensitivity, sensi2._sensitivity), sensi1._generatorSwap); } /** * Gets the volatility sensitivity. * @return The sensitivity. */ public SurfaceValue getSensitivity() { return _sensitivity; } /** * Gets the standard swap generator for which the volatility surface is valid. * @return The generator. */ public GeneratorInstrument<GeneratorAttributeIR> getGeneratorSwap() { return _generatorSwap; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _generatorSwap.hashCode(); result = prime * result + _sensitivity.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 PresentValueSwaptionSurfaceSensitivity other = (PresentValueSwaptionSurfaceSensitivity) obj; if (!ObjectUtils.equals(_generatorSwap, other._generatorSwap)) { return false; } if (!ObjectUtils.equals(_sensitivity, other._sensitivity)) { return false; } return true; } }