final EuropeanVanillaOption option = new EuropeanVanillaOption(Math.pow(1 + cap.getStrike(), cap.getMaturity()), timeToMaturity, cap.isCap());
final double forward = black.getInflationProvider().getPriceIndex(cap.getPriceIndex(), cap.getReferenceEndTime()) / cap.getIndexStartValue();
final double df = black.getMulticurveProvider().getDiscountFactor(cap.getCurrency(), cap.getPaymentTime());
final Map<String, List<DoublesPair>> resultMapPrice = new HashMap<>();
final List<DoublesPair> listPrice = new ArrayList<>();
listPrice.add(new DoublesPair(cap.getReferenceEndTime(), 1 / cap.getIndexStartValue()));
resultMapPrice.put(inflation.getName(cap.getPriceIndex()), listPrice);
final InflationSensitivity forwardDi = InflationSensitivity.ofPriceIndex(resultMapPrice);
final double dfDr = -cap.getPaymentTime() * df;
final double volatility = black.getBlackParameters().getVolatility(cap.getReferenceEndTime(), cap.getStrike());
final BlackFunctionData dataBlack = new BlackFunctionData(forward, 1.0, volatility);
final double[] bsAdjoint = BLACK_FUNCTION.getPriceAdjoint(option, dataBlack);
final List<DoublesPair> list = new ArrayList<>();
list.add(new DoublesPair(cap.getPaymentTime(), dfDr));
final Map<String, List<DoublesPair>> resultMap = new HashMap<>();
resultMap.put(inflation.getName(cap.getCurrency()), list);
InflationSensitivity result = InflationSensitivity.ofYieldDiscounting(resultMap);
result = result.multipliedBy(bsAdjoint[0]);
result = result.plus(forwardDi.multipliedBy(df * bsAdjoint[1]));