@Test(enabled = false)
  /** Tests of performance. "enabled = false" for the standard testing. */
  public void performance() {
    long startTime, endTime;
    final int nbTest = 1000;
    CurrencyAmount pvPayerLongExplicit = CurrencyAmount.of(CUR, 0.0);
    CurrencyAmount pvPayerLongIntegration = CurrencyAmount.of(CUR, 0.0);
    startTime = System.currentTimeMillis();
    for (int looptest = 0; looptest < nbTest; looptest++) {
      pvPayerLongExplicit = METHOD_HW_APPROXIMATION.presentValue(SWAPTION_PAYER_LONG, BUNDLE_HW);
    }
    endTime = System.currentTimeMillis();
    System.out.println(
        nbTest + " pv swaption Hull-White approximation method: " + (endTime - startTime) + " ms");
    // Performance note: HW price: 8-Jul-11: On Mac Pro 3.2 GHz Quad-Core Intel Xeon: 330 ms for
    // 10000 swaptions.
    startTime = System.currentTimeMillis();
    for (int looptest = 0; looptest < nbTest; looptest++) {
      METHOD_HW_APPROXIMATION.presentValueHullWhiteSensitivity(SWAPTION_PAYER_LONG, BUNDLE_HW);
    }
    endTime = System.currentTimeMillis();
    System.out.println(
        nbTest
            + " HW sensitivity swaption Hull-White approximation method: "
            + (endTime - startTime)
            + " ms");
    // Performance note: HW parameters sensitivity: 8-Jul-11: On Mac Pro 3.2 GHz Quad-Core Intel
    // Xeon: 525 ms for 10000 swaptions.
    startTime = System.currentTimeMillis();
    for (int looptest = 0; looptest < nbTest; looptest++) {
      METHOD_HW_APPROXIMATION.presentValueCurveSensitivity(SWAPTION_PAYER_LONG, BUNDLE_HW);
    }
    endTime = System.currentTimeMillis();
    System.out.println(
        nbTest
            + " curve sensitivity swaption Hull-White approximation method: "
            + (endTime - startTime)
            + " ms");
    // Performance note: HW curve sensitivity: 8-Jul-11: On Mac Pro 3.2 GHz Quad-Core Intel Xeon:
    // 550 ms for 10000 swaptions.
    startTime = System.currentTimeMillis();
    for (int looptest = 0; looptest < nbTest; looptest++) {
      pvPayerLongIntegration = METHOD_HW_INTEGRATION.presentValue(SWAPTION_PAYER_LONG, BUNDLE_HW);
    }
    endTime = System.currentTimeMillis();
    System.out.println(
        nbTest
            + " cash swaption Hull-White numerical integration method: "
            + (endTime - startTime)
            + " ms");
    // Performance note: HW numerical integration: 8-Jul-11: On Mac Pro 3.2 GHz Quad-Core Intel
    // Xeon: 1300 ms for 10000 swaptions.

    double difference = 0.0;
    difference = pvPayerLongExplicit.getAmount() - pvPayerLongIntegration.getAmount();
    System.out.println("Difference: " + difference);
  }
 @Test
 /** Tests the curve sensitivity. */
 public void presentValueCurveSensitivity() {
   InterestRateCurveSensitivity pvsSwaption =
       METHOD_HW_APPROXIMATION.presentValueCurveSensitivity(SWAPTION_PAYER_LONG, BUNDLE_HW);
   pvsSwaption = pvsSwaption.cleaned();
   final double deltaTolerancePrice = 1.0E+4;
   // Testing note: Sensitivity is for a movement of 1. 1E+2 = 1 cent for a 1 bp move. Tolerance
   // increased to cope with numerical imprecision of finite difference.
   final double deltaShift = 1.0E-6;
   // 1. Forward curve sensitivity
   final String bumpedCurveName = "Bumped Curve";
   final SwaptionCashFixedIbor swptBumpedForward =
       SWAPTION_PAYER_LONG_DEFINITION.toDerivative(
           REFERENCE_DATE, new String[] {CURVES_NAME[0], bumpedCurveName});
   DoubleAVLTreeSet forwardTime = new DoubleAVLTreeSet();
   for (int loopcpn = 0;
       loopcpn < SWAPTION_PAYER_LONG.getUnderlyingSwap().getSecondLeg().getNumberOfPayments();
       loopcpn++) {
     CouponIbor cpn =
         (CouponIbor)
             SWAPTION_PAYER_LONG.getUnderlyingSwap().getSecondLeg().getNthPayment(loopcpn);
     forwardTime.add(cpn.getFixingPeriodStartTime());
     forwardTime.add(cpn.getFixingPeriodEndTime());
   }
   double[] nodeTimesForward = forwardTime.toDoubleArray();
   final double[] sensiForwardMethod =
       SensitivityFiniteDifference.curveSensitivity(
           swptBumpedForward,
           BUNDLE_HW,
           CURVES_NAME[1],
           bumpedCurveName,
           nodeTimesForward,
           deltaShift,
           METHOD_HW_APPROXIMATION);
   final List<DoublesPair> sensiPvForward = pvsSwaption.getSensitivities().get(CURVES_NAME[1]);
   for (int loopnode = 0; loopnode < sensiForwardMethod.length; loopnode++) {
     final DoublesPair pairPv = sensiPvForward.get(loopnode);
     assertEquals(
         "Sensitivity swaption pv to forward curve: Node " + loopnode,
         nodeTimesForward[loopnode],
         pairPv.getFirst(),
         1E-8);
     assertEquals(
         "Sensitivity finite difference method: node sensitivity " + loopnode,
         sensiForwardMethod[loopnode],
         pairPv.second,
         deltaTolerancePrice);
   }
   // 2. Discounting curve sensitivity
   final SwaptionCashFixedIbor swptBumpedDisc =
       SWAPTION_PAYER_LONG_DEFINITION.toDerivative(
           REFERENCE_DATE, new String[] {bumpedCurveName, CURVES_NAME[1]});
   DoubleAVLTreeSet discTime = new DoubleAVLTreeSet();
   discTime.add(SWAPTION_PAYER_LONG.getSettlementTime());
   for (int loopcpn = 0;
       loopcpn < SWAPTION_PAYER_LONG.getUnderlyingSwap().getSecondLeg().getNumberOfPayments();
       loopcpn++) {
     CouponIbor cpn =
         (CouponIbor)
             SWAPTION_PAYER_LONG.getUnderlyingSwap().getSecondLeg().getNthPayment(loopcpn);
     discTime.add(cpn.getPaymentTime());
   }
   double[] nodeTimesDisc = discTime.toDoubleArray();
   final double[] sensiDiscMethod =
       SensitivityFiniteDifference.curveSensitivity(
           swptBumpedDisc,
           BUNDLE_HW,
           CURVES_NAME[0],
           bumpedCurveName,
           nodeTimesDisc,
           deltaShift,
           METHOD_HW_APPROXIMATION);
   assertEquals(
       "Sensitivity finite difference method: number of node", 11, sensiDiscMethod.length);
   final List<DoublesPair> sensiPvDisc = pvsSwaption.getSensitivities().get(CURVES_NAME[0]);
   for (int loopnode = 0; loopnode < sensiDiscMethod.length; loopnode++) {
     final DoublesPair pairPv = sensiPvDisc.get(loopnode);
     assertEquals(
         "Sensitivity swaption pv to forward curve: Node " + loopnode,
         nodeTimesDisc[loopnode],
         pairPv.getFirst(),
         1E-8);
     assertEquals(
         "Sensitivity finite difference method: node sensitivity",
         sensiDiscMethod[loopnode],
         pairPv.second,
         deltaTolerancePrice);
   }
 }