@Test
  public void Test() {
    final boolean print = false;
    if (print) {
      System.out.println("AnalyticCDV01Test set print =false before push");
    }

    final double dealSpread = DEAL_SPREAD / 10000;
    final double[] mrkSpreads = new double[NUM_MARKET_CDS];
    for (int i = 0; i < NUM_MARKET_CDS; i++) {
      mrkSpreads[i] = PAR_SPREADS[i] / 10000;
    }
    final ISDACompliantCreditCurve creditCurve =
        BUILDER.calibrateCreditCurve(MARKET_CDS, mrkSpreads, YIELD_CURVE);
    final int n = creditCurve.getNumberOfKnots();
    final double[][] jacA = new double[n][n];
    for (int j = 0; j < n; j++) {
      final CDSAnalytic cds = MARKET_CDS[j];
      for (int i = 0; i < n; i++) {
        final double dDdH = PRICER.parSpreadCreditSensitivity(cds, YIELD_CURVE, creditCurve, i);
        jacA[i][j] = dDdH;
      }
    }
    final DoubleMatrix2D jac = new DoubleMatrix2D(jacA);
    if (print) {
      System.out.println(jac);
      System.out.println();
    }

    final double[] temp = new double[n];
    for (int i = 0; i < n; i++) {
      temp[i] = PRICER.pvCreditSensitivity(CDS, YIELD_CURVE, creditCurve, dealSpread, i);
    }
    final DoubleMatrix1D dVdH = new DoubleMatrix1D(temp);
    if (print) {
      System.out.println(dVdH);
      System.out.println();
    }

    final LUDecompositionCommons decomp = new LUDecompositionCommons();
    final LUDecompositionResult res = decomp.evaluate(jac);
    final DoubleMatrix1D dVdS = res.solve(dVdH);

    // compare with bump and reprice
    final SpreadSensitivityCalculator bumpCal = new SpreadSensitivityCalculator();
    final double[] fd =
        bumpCal.bucketedCS01FromParSpreads(
            CDS, dealSpread, YIELD_CURVE, MARKET_CDS, mrkSpreads, 1e-7, BumpType.ADDITIVE);
    final DoubleMatrix1D fd_dVdS = new DoubleMatrix1D(fd);
    if (print) {
      System.out.println(dVdS);
      System.out.println(fd_dVdS);
    }
    for (int i = 0; i < n; i++) {
      assertEquals(
          fd_dVdS.getEntry(i),
          dVdS.getEntry(i),
          1e-6); // the fd is only forward difference - so accuracy is not great
    }
  }
 private double[] priceDiff(
     final CDSAnalytic cds,
     final ISDACompliantCreditCurve creditCurve,
     final double coupon,
     final ISDACompliantYieldCurve[] bumpedYC,
     final ISDACompliantYieldCurve baseYC) {
   final double basePV = _pricer.pv(cds, baseYC, creditCurve, coupon, PriceType.DIRTY);
   final int n = bumpedYC.length;
   final double[] res = new double[n];
   for (int i = 0; i < n; i++) {
     final double pv = _pricer.pv(cds, bumpedYC[i], creditCurve, coupon, PriceType.DIRTY);
     res[i] = pv - basePV;
   }
   return res;
 }
  @Test
  public void test() {
    final ISDACompliantCreditCurveBuilder curveBuilder =
        new FastCreditCurveBuilder(MARKIT_FIX, ArbitrageHandling.ZeroHazardRate);
    final AnalyticCDSPricer pricer = new AnalyticCDSPricer(MARKIT_FIX);

    final int nPillars = PILLAR_DATES.length;
    final CDSAnalytic[] pillarCDSS = new CDSAnalytic[nPillars];
    for (int i = 0; i < nPillars; i++) {
      pillarCDSS[i] =
          new CDSAnalytic(
              TODAY,
              EFFECTIVE_DATE,
              CASH_SETTLE_DATE,
              STARTDATE,
              PILLAR_DATES[i],
              PAY_ACC_ON_DEFAULT,
              PAYMENT_INTERVAL,
              STUB,
              PROCTECTION_START,
              RECOVERY_RATE);
    }

    final ISDACompliantCreditCurve creditCurve =
        curveBuilder.calibrateCreditCurve(pillarCDSS, SPREADS, YIELD_CURVE);

    final int nMat = MATURITIES.length;
    for (int i = 0; i < nMat; i++) {
      final CDSAnalytic cds =
          new CDSAnalytic(
              TODAY,
              EFFECTIVE_DATE,
              CASH_SETTLE_DATE,
              STARTDATE,
              MATURITIES[i],
              PAY_ACC_ON_DEFAULT,
              PAYMENT_INTERVAL,
              STUB,
              PROCTECTION_START,
              RECOVERY_RATE);
      final double dPV = pricer.pv(cds, YIELD_CURVE, creditCurve, COUPON, PriceType.DIRTY);
      //  System.out.println(MATURITIES[i] + "\t" + dPV);
      assertEquals(MATURITIES[i].toString(), EXPECTED_UPFRONT_CHARGE[i], dPV, 1e-15);
    }
  }
 private double priceDiff(
     final CDSAnalytic cds,
     final ISDACompliantCreditCurve creditCurve,
     final double coupon,
     final ISDACompliantYieldCurve yc1,
     final ISDACompliantYieldCurve yc2) {
   final double pv1 = _pricer.pv(cds, yc1, creditCurve, coupon, PriceType.DIRTY);
   final double pv2 = _pricer.pv(cds, yc2, creditCurve, coupon, PriceType.DIRTY);
   return pv1 - pv2;
 }