/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.commodity.multicurvecommodity.calculator;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.AgricultureFutureTransaction;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.CouponCommodityCashSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.CouponCommodityPhysicalSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.EnergyFutureTransaction;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.ForwardCommodityCashSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.ForwardCommodityPhysicalSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.MetalFutureTransaction;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.provider.CommodityFutureTransactionForwardMethod;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.provider.CouponCommodityCashSettleSecurityForwardMethod;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.provider.CouponCommodityPhysicalSettleSecurityForwardMethod;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.provider.ForwardCommodityCashSettleSecurityForwardMethod;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.provider.ForwardCommodityPhysicalSettleSecurityForwardMethod;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.interestrate.payments.provider.CouponFixedDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.payments.provider.PaymentFixedDiscountingMethod;
import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapMultileg;
import com.opengamma.analytics.financial.provider.description.commodity.CommodityProviderInterface;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.MultipleCurrencyAmount;
/**
* Calculator of the present value as a multiple currency amount.
*/
public final class PresentValueCommodityDiscountingCalculator extends InstrumentDerivativeVisitorAdapter<CommodityProviderInterface, MultipleCurrencyAmount> {
/**
* The unique instance of the calculator.
*/
private static final PresentValueCommodityDiscountingCalculator INSTANCE = new PresentValueCommodityDiscountingCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static PresentValueCommodityDiscountingCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private PresentValueCommodityDiscountingCalculator() {
}
private static final CommodityFutureTransactionForwardMethod METHOD_COMMODITY_FUTURE = CommodityFutureTransactionForwardMethod.getInstance();
private static final CouponCommodityCashSettleSecurityForwardMethod METHOD_COUPON_COMMODITY_CASH_COUPON = CouponCommodityCashSettleSecurityForwardMethod.getInstance();
private static final CouponCommodityPhysicalSettleSecurityForwardMethod METHOD_COUPON_COMMODITY_PHYSICAL_COUPON = CouponCommodityPhysicalSettleSecurityForwardMethod.getInstance();
private static final ForwardCommodityCashSettleSecurityForwardMethod METHOD_FWD_COMMODITY_CASH_COUPON = ForwardCommodityCashSettleSecurityForwardMethod.getInstance();
private static final ForwardCommodityPhysicalSettleSecurityForwardMethod METHOD_FWD_COMMODITY_PHYSICAL_COUPON = ForwardCommodityPhysicalSettleSecurityForwardMethod.getInstance();
private static final PaymentFixedDiscountingMethod METHOD_PAY_FIXED = PaymentFixedDiscountingMethod.getInstance();
private static final CouponFixedDiscountingMethod METHOD_CPN_FIXED = CouponFixedDiscountingMethod.getInstance();
//----- Payment/Coupon ------
@Override
public MultipleCurrencyAmount visitCouponCommodityCashSettle(final CouponCommodityCashSettle payment, final CommodityProviderInterface multicurve) {
return METHOD_COUPON_COMMODITY_CASH_COUPON.presentValue(payment, multicurve);
}
@Override
public MultipleCurrencyAmount visitCouponCommodityPhysicalSettle(final CouponCommodityPhysicalSettle payment, final CommodityProviderInterface multicurve) {
return METHOD_COUPON_COMMODITY_PHYSICAL_COUPON.presentValue(payment, multicurve);
}
@Override
public MultipleCurrencyAmount visitForwardCommodityCashSettle(final ForwardCommodityCashSettle payment, final CommodityProviderInterface multicurve) {
return METHOD_FWD_COMMODITY_CASH_COUPON.presentValue(payment, multicurve);
}
@Override
public MultipleCurrencyAmount visitForwardCommodityPhysicalSettle(final ForwardCommodityPhysicalSettle payment, final CommodityProviderInterface multicurve) {
return METHOD_FWD_COMMODITY_PHYSICAL_COUPON.presentValue(payment, multicurve);
}
//----- Annuity ------
@Override
public MultipleCurrencyAmount visitGenericAnnuity(final Annuity<? extends Payment> annuity, final CommodityProviderInterface multicurve) {
ArgumentChecker.notNull(annuity, "Annuity");
ArgumentChecker.notNull(multicurve, "multicurve");
MultipleCurrencyAmount pv = annuity.getNthPayment(0).accept(this, multicurve);
for (int loopp = 1; loopp < annuity.getNumberOfPayments(); loopp++) {
pv = pv.plus(annuity.getNthPayment(loopp).accept(this, multicurve));
}
return pv;
}
@Override
public MultipleCurrencyAmount visitFixedCouponAnnuity(final AnnuityCouponFixed annuity, final CommodityProviderInterface multicurve) {
return visitGenericAnnuity(annuity, multicurve);
}
// ----- Swap ------
@Override
public MultipleCurrencyAmount visitSwap(final Swap<?, ?> swap, final CommodityProviderInterface multicurve) {
final MultipleCurrencyAmount pv1 = swap.getFirstLeg().accept(this, multicurve);
final MultipleCurrencyAmount pv2 = swap.getSecondLeg().accept(this, multicurve);
return pv1.plus(pv2);
}
@Override
public MultipleCurrencyAmount visitFixedCouponSwap(final SwapFixedCoupon<?> swap, final CommodityProviderInterface multicurves) {
return visitSwap(swap, multicurves);
}
@Override
public MultipleCurrencyAmount visitSwapMultileg(final SwapMultileg swap, final CommodityProviderInterface multicurve) {
final int nbLegs = swap.getLegs().length;
MultipleCurrencyAmount pv = swap.getLegs()[0].accept(this, multicurve);
for (int loopleg = 1; loopleg < nbLegs; loopleg++) {
pv = pv.plus(swap.getLegs()[loopleg].accept(this, multicurve));
}
return pv;
}
// ----- Futures ------
@Override
public MultipleCurrencyAmount visitAgricultureFutureTransaction(final AgricultureFutureTransaction futures, final CommodityProviderInterface multicurves) {
return METHOD_COMMODITY_FUTURE.presentValue(futures, multicurves);
}
@Override
public MultipleCurrencyAmount visitEnergyFutureTransaction(final EnergyFutureTransaction futures, final CommodityProviderInterface multicurves) {
return METHOD_COMMODITY_FUTURE.presentValue(futures, multicurves);
}
@Override
public MultipleCurrencyAmount visitMetalFutureTransaction(final MetalFutureTransaction futures, final CommodityProviderInterface multicurves) {
return METHOD_COMMODITY_FUTURE.presentValue(futures, multicurves);
}
}