/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.inflation;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorSameMethodAdapter;
import com.opengamma.analytics.financial.provider.description.inflation.ParameterInflationProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.inflation.MultipleCurrencyInflationSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.inflation.ParameterSensitivityInflationParameterCalculator;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.util.amount.ReferenceAmount;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.Pair;
/**
* Returns the change in present value of an instrument due to a parallel move of all the curve's parameters, scaled so that the move is one basis point (0.0001).
* @param <T> The type of the multi-curve provider
*/
public final class PV01CurveParametersInflationCalculator<T extends ParameterInflationProviderInterface> extends
InstrumentDerivativeVisitorSameMethodAdapter<T, ReferenceAmount<Pair<String, Currency>>> {
/**
* The size of the scaling: 1 basis point.
*/
private static final double BP1 = 1.0E-4;
/**
* The present value curve sensitivity calculator.
*/
private final ParameterSensitivityInflationParameterCalculator<T> _parameterSensitivityCalculator;
/**
* Constructs a PV01 calculator that uses a particular sensitivity calculator.
* @param curveSensitivityCalculator The curve sensitivity calculator, not null
*/
public PV01CurveParametersInflationCalculator(final InstrumentDerivativeVisitor<T, MultipleCurrencyInflationSensitivity> curveSensitivityCalculator) {
ArgumentChecker.notNull(curveSensitivityCalculator, "curve sensitivity calculator");
_parameterSensitivityCalculator = new ParameterSensitivityInflationParameterCalculator<>(curveSensitivityCalculator);
}
/**
* Calculates the change in present value of an instrument due to a parallel move of each yield curve the instrument is sensitive to, scaled so that the move is 1bp.
* @param ird The instrument.
* @param multicurves The multi-curves provider.
* @return The scale sensitivity for each curve/currency.
*/
@Override
public ReferenceAmount<Pair<String, Currency>> visit(final InstrumentDerivative ird, final T multicurves) {
final MultipleCurrencyParameterSensitivity sensi = _parameterSensitivityCalculator.calculateSensitivity(ird, multicurves, multicurves.getAllCurveNames());
final ReferenceAmount<Pair<String, Currency>> ref = new ReferenceAmount<>();
for (final Pair<String, Currency> nameCcy : sensi.getAllNamesCurrency()) {
final DoubleMatrix1D vector = sensi.getSensitivity(nameCcy);
double total = 0.0;
for (int loopv = 0; loopv < vector.getNumberOfElements(); loopv++) {
total += vector.getEntry(loopv);
}
ref.add(nameCcy, total * BP1);
}
return ref;
}
@Override
public ReferenceAmount<Pair<String, Currency>> visit(final InstrumentDerivative derivative) {
throw new UnsupportedOperationException("Need curve data");
}
}