class SABRExtrapolationRightFunction extends SABRExtrapolationLeftRightFunction {

  public double priceDerivativeForward(final EuropeanVanillaOption option) {
    double[] pA;
    double priceDerivative;
    final double k = option.getStrike();
    if (k <= _cutOffStrike) { // Uses Hagan et al SABR function.
      final double[] volatilityA = getVolatilityAdjoint(option, _forward, _sabrData);
      final BlackFunctionData dataBlack = new BlackFunctionData(_forward, 1.0, volatilityA[0]);
      pA = BLACK_FUNCTION.getPriceAdjoint(option, dataBlack);
      priceDerivative = pA[1] + pA[2] * volatilityA[1];
    } else { // Uses extrapolation for call.
      if (!_parameterDerivativeForwardComputed) {
        _parameterDerivativeForward = computesParametersDerivativeForward();
        _parameterDerivativeForwardComputed = true;
      }
      final double f = extrapolation(k);
      final double fDa = f;
      final double fDb = f / k;
      final double fDc = fDb / k;
      priceDerivative = fDa * _parameterDerivativeForward[0] + fDb * _parameterDerivativeForward[1] + fDc * _parameterDerivativeForward[2];
      if (!option.isCall()) { // Put by call/put parity
        priceDerivative -= 1;
      }
      //TODO: check put
    }
    return priceDerivative;
  }

  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);

}