class SABRExtrapolationRightFunction extends SABRExtrapolationLeftRightFunction {

  public double priceDerivativeStrike(final EuropeanVanillaOption option) {
    double pDK = 0.0;
    final double k = option.getStrike();
    if (k <= _cutOffStrike) { // Uses Hagan et al SABR function.
      final BlackPriceFunction blackFunction = new BlackPriceFunction();
      final double[] volatilityAdjoint = getVolatilityAdjoint(option, _forward, _sabrData);
      final BlackFunctionData dataBlack = new BlackFunctionData(_forward, 1.0, volatilityAdjoint[0]);
      final double[] bsAdjoint = blackFunction.getPriceAdjoint(option, dataBlack);
      pDK = bsAdjoint[3] + bsAdjoint[2] * volatilityAdjoint[2];
    } else { // Uses extrapolation for call.
      pDK = extrapolationDerivative(k);
      if (!option.isCall()) { // Put by call/put parity
        pDK += 1.0;
      }
    }
    return pDK;
  }

  public  SABRExtrapolationRightFunction(final double forward, final SABRFormulaData sabrData, final double cutOffStrike, final double timeToExpiry, final double mu);
  public  SABRExtrapolationRightFunction(final double forward, final SABRFormulaData sabrData, final double cutOffStrike, final double timeToExpiry, final double mu,
      final VolatilityFunctionProvider<SABRFormulaData> volatilityFunction);

}