/**
* Copyright (C) 2011 - 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.InstrumentDerivativeVisitorDelegate;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearInterpolationWithMargin;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearMonthlyWithMargin;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolationGearing;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthlyGearing;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationYearOnYearInterpolationDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationYearOnYearInterpolationWithMarginDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationYearOnYearMonthlyDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationYearOnYearMonthlyWithMarginDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationZeroCouponInterpolationDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationZeroCouponInterpolationGearingDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationZeroCouponMonthlyDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.inflation.provider.CouponInflationZeroCouponMonthlyGearingDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon;
import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueDiscountingCalculator;
import com.opengamma.analytics.financial.provider.description.inflation.ParameterInflationProviderInterface;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.MultipleCurrencyAmount;
/**
* Calculates the present value of an inflation instruments by discounting for a given MarketBundle
*/
public final class PresentValueDiscountingInflationCalculator extends
InstrumentDerivativeVisitorDelegate<ParameterInflationProviderInterface, MultipleCurrencyAmount> {
/**
* The unique instance of the calculator.
*/
private static final PresentValueDiscountingInflationCalculator INSTANCE = new PresentValueDiscountingInflationCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static PresentValueDiscountingInflationCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private PresentValueDiscountingInflationCalculator() {
super(new InflationProviderAdapter<>(PresentValueDiscountingCalculator.getInstance()));
}
/**
* Pricing method for zero-coupon with monthly reference index.
*/
private static final CouponInflationZeroCouponMonthlyDiscountingMethod METHOD_ZC_MONTHLY = new CouponInflationZeroCouponMonthlyDiscountingMethod();
/**
* Pricing method for zero-coupon with interpolated reference index.
*/
private static final CouponInflationZeroCouponInterpolationDiscountingMethod METHOD_ZC_INTERPOLATION = new CouponInflationZeroCouponInterpolationDiscountingMethod();
/**
* Pricing method for zero-coupon with monthly reference index.
*/
private static final CouponInflationZeroCouponMonthlyGearingDiscountingMethod METHOD_ZC_MONTHLY_GEARING = new CouponInflationZeroCouponMonthlyGearingDiscountingMethod();
/**
* Pricing method for zero-coupon with interpolated reference index.
*/
private static final CouponInflationZeroCouponInterpolationGearingDiscountingMethod METHOD_ZC_INTERPOLATION_GEARING = new CouponInflationZeroCouponInterpolationGearingDiscountingMethod();
/**
* Pricing method for year on year coupon with monthly reference index.
*/
private static final CouponInflationYearOnYearMonthlyDiscountingMethod METHOD_YEAR_ON_YEAR_MONTHLY = new CouponInflationYearOnYearMonthlyDiscountingMethod();
/**
* Pricing method for year on year coupon with interpolated reference index.
*/
private static final CouponInflationYearOnYearInterpolationDiscountingMethod METHOD_YEAR_ON_YEAR_INTERPOLATION = new CouponInflationYearOnYearInterpolationDiscountingMethod();
/**
* Pricing method for year on year coupon with monthly and with margin reference index.
*/
private static final CouponInflationYearOnYearMonthlyWithMarginDiscountingMethod METHOD_YEAR_ON_YEAR_MONTHLY_WITH_MARGIN = new CouponInflationYearOnYearMonthlyWithMarginDiscountingMethod();
/**
* Pricing method for year on year coupon with interpolated and with margin reference index.
*/
private static final CouponInflationYearOnYearInterpolationWithMarginDiscountingMethod METHOD_YEAR_ON_YEAR_INTERPOLATION_WITH_MARGIN =
new CouponInflationYearOnYearInterpolationWithMarginDiscountingMethod();
@Override
public MultipleCurrencyAmount visitCouponInflationZeroCouponMonthly(final CouponInflationZeroCouponMonthly coupon, final ParameterInflationProviderInterface market) {
return METHOD_ZC_MONTHLY.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationZeroCouponInterpolation(final CouponInflationZeroCouponInterpolation coupon, final ParameterInflationProviderInterface market) {
return METHOD_ZC_INTERPOLATION.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationZeroCouponMonthlyGearing(final CouponInflationZeroCouponMonthlyGearing coupon, final ParameterInflationProviderInterface market) {
return METHOD_ZC_MONTHLY_GEARING.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationZeroCouponInterpolationGearing(final CouponInflationZeroCouponInterpolationGearing coupon, final ParameterInflationProviderInterface market) {
return METHOD_ZC_INTERPOLATION_GEARING.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationYearOnYearMonthly(final CouponInflationYearOnYearMonthly coupon, final ParameterInflationProviderInterface market) {
return METHOD_YEAR_ON_YEAR_MONTHLY.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationYearOnYearInterpolation(final CouponInflationYearOnYearInterpolation coupon, final ParameterInflationProviderInterface market) {
return METHOD_YEAR_ON_YEAR_INTERPOLATION.presentValue(coupon, market.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationYearOnYearMonthlyWithMargin(final CouponInflationYearOnYearMonthlyWithMargin coupon, final ParameterInflationProviderInterface inflation) {
return METHOD_YEAR_ON_YEAR_MONTHLY_WITH_MARGIN.presentValue(coupon, inflation.getInflationProvider());
}
@Override
public MultipleCurrencyAmount visitCouponInflationYearOnYearInterpolationWithMargin(final CouponInflationYearOnYearInterpolationWithMargin coupon,
final ParameterInflationProviderInterface inflation) {
return METHOD_YEAR_ON_YEAR_INTERPOLATION_WITH_MARGIN.presentValue(coupon, inflation.getInflationProvider());
}
// ----- Annuity ------
@Override
public MultipleCurrencyAmount visitGenericAnnuity(final Annuity<? extends Payment> annuity, final ParameterInflationProviderInterface market) {
ArgumentChecker.notNull(annuity, "Annuity");
ArgumentChecker.notNull(market, "market");
MultipleCurrencyAmount pv = annuity.getNthPayment(0).accept(this, market);
for (int loopp = 1; loopp < annuity.getNumberOfPayments(); loopp++) {
pv = pv.plus(annuity.getNthPayment(loopp).accept(this, market));
}
return pv;
}
@Override
public MultipleCurrencyAmount visitFixedCouponAnnuity(final AnnuityCouponFixed annuity, final ParameterInflationProviderInterface multicurve) {
return visitGenericAnnuity(annuity, multicurve);
}
// ----- Swap ------
@Override
public MultipleCurrencyAmount visitSwap(final Swap<?, ?> swap, final ParameterInflationProviderInterface market) {
final MultipleCurrencyAmount pv1 = swap.getFirstLeg().accept(this, market);
final MultipleCurrencyAmount pv2 = swap.getSecondLeg().accept(this, market);
return pv1.plus(pv2);
}
@Override
public MultipleCurrencyAmount visitFixedCouponSwap(final SwapFixedCoupon<?> swap, final ParameterInflationProviderInterface market) {
return visitSwap(swap, market);
}
}