/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.volatility.local; import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption; import com.opengamma.analytics.math.interpolation.Interpolator1D; import com.opengamma.analytics.math.interpolation.data.Interpolator1DDataBundle; /** * */ public class LocalVolatilityBackwardPDEPriceCalculator implements PDELocalVolatilityCalculator<Double> { private final LocalVolatilityBackwardPDEPriceGridCalculator _priceCalculator; private final Interpolator1D _interpolator; public LocalVolatilityBackwardPDEPriceCalculator(final LocalVolatilityBackwardPDEPriceGridCalculator priceCalculator, final Interpolator1D interpolator) { _priceCalculator = priceCalculator; _interpolator = new NearestNPointsInterpolator(interpolator, 4); } @Override public Double getResult(final LocalVolatilitySurfaceMoneyness localVolatility, final ForwardCurve forwardCurve, final EuropeanVanillaOption option, final YieldAndDiscountCurve discountingCurve) { final double expiry = option.getTimeToExpiry(); final double forward = forwardCurve.getForward(expiry); final Interpolator1DDataBundle data = _priceCalculator.getResult(localVolatility, forwardCurve, option, discountingCurve); return _interpolator.interpolate(data, forward); } @Override public Double getResult(final LocalVolatilitySurfaceStrike localVolatility, final ForwardCurve forwardCurve, final EuropeanVanillaOption option, final YieldAndDiscountCurve discountingCurve) { final double expiry = option.getTimeToExpiry(); final double forward = forwardCurve.getForward(expiry); final Interpolator1DDataBundle data = _priceCalculator.getResult(localVolatility, forwardCurve, option, discountingCurve); return _interpolator.interpolate(data, forward); } }