public MultipleCurrencyAmount presentValue(final SwaptionCashFixedIbor swaption, final SABRSwaptionProviderInterface sabrData) {
ArgumentChecker.notNull(swaption, "Swaption");
ArgumentChecker.notNull(sabrData, "SABR swaption provider");
MulticurveProviderInterface multicurves = sabrData.getMulticurveProvider();
Currency ccy = swaption.getCurrency();
final AnnuityCouponFixed annuityFixed = swaption.getUnderlyingSwap().getFixedLeg();
final double nominal = Math.abs(annuityFixed.getNthPayment(0).getNotional());
final double discountFactorSettle = multicurves.getDiscountFactor(ccy, swaption.getSettlementTime());
final double annuityPhysical = METHOD_SWAP.presentValueBasisPoint(swaption.getUnderlyingSwap(), multicurves) / nominal;
final double strike = swaption.getStrike();
final double forward = swaption.getUnderlyingSwap().accept(PRDC, multicurves);
// Linear approximation
final double[] alpha = new double[2];
for (int loopcpn = 0; loopcpn < annuityFixed.getNumberOfPayments(); loopcpn++) {
alpha[1] += annuityFixed.getNthPayment(loopcpn).getPaymentYearFraction();
}
alpha[1] = 1 / alpha[1];
alpha[0] = (discountFactorSettle / annuityPhysical - alpha[1]) / forward;
final LinearTSRIntegrant integrant = new LinearTSRIntegrant(swaption, sabrData.getSABRParameter(), forward, alpha);