/**
   * This calculates the sensitivity of the present value (PV) to the continuously-compounded
   * discount rates at the knot points of the funding curve.
   *
   * <p>The return format is a DoubleMatrix1D (i.e. a vector) with length equal to the total number
   * of knots in the curve
   *
   * <p>The change of a curve due to the movement of a single knot is interpolator-dependent, so an
   * instrument can have sensitivity to knots at times beyond its maturity
   *
   * @param swap the VarianceSwap
   * @param market the VarianceSwapDataBundle
   * @return A DoubleMatrix1D containing bucketed delta in order and length of
   *     market.getDiscountCurve(). Currency amount per unit amount change in discount rate
   */
  public DoubleMatrix1D calcDeltaBucketed(
      final VarianceSwap swap, final VarianceSwapDataBundle market) {
    Validate.notNull(swap, "null VarianceSwap");
    Validate.notNull(market, "null VarianceSwapDataBundle");

    // We know that the VarianceSwap only has true sensitivity to one maturity on one curve.
    // A function written for interestRate sensitivities spreads this sensitivity across yield nodes
    // NodeSensitivityCalculator.curveToNodeSensitivities(curveSensitivities, interpolatedCurves)

    // 2nd arg = LinkedHashMap<String, YieldAndDiscountCurve> interpolatedCurves
    final YieldAndDiscountCurve discCrv = market.getDiscountCurve();
    final String discCrvName = discCrv.getCurve().getName();
    final YieldCurveBundle interpolatedCurves = new YieldCurveBundle();
    interpolatedCurves.setCurve(discCrvName, discCrv);

    // 1st arg = Map<String, List<DoublesPair>> curveSensitivities = <curveName,
    // List<(maturity,sensitivity)>>
    final double settlement = swap.getTimeToSettlement();
    final Double sens = calcDiscountRateSensitivity(swap, market);
    final Map<String, List<DoublesPair>> curveSensitivities =
        new HashMap<String, List<DoublesPair>>();
    curveSensitivities.put(discCrvName, Lists.newArrayList(new DoublesPair(settlement, sens)));

    final NodeSensitivityCalculator distributor =
        PresentValueNodeSensitivityCalculator.getDefaultInstance();
    return distributor.curveToNodeSensitivities(curveSensitivities, interpolatedCurves);
  }
 @Override
 protected PresentValueNodeSensitivityCalculator getNodeSensitivityCalculator(
     final ValueRequirement desiredValue) {
   final Double cutoff =
       Double.parseDouble(
           desiredValue.getConstraint(SABRRightExtrapolationFunction.PROPERTY_CUTOFF_STRIKE));
   final Double mu =
       Double.parseDouble(
           desiredValue.getConstraint(
               SABRRightExtrapolationFunction.PROPERTY_TAIL_THICKNESS_PARAMETER));
   return PresentValueNodeSensitivityCalculator.using(
       new PresentValueCurveSensitivitySABRExtrapolationCalculator(cutoff, mu));
 }