@Override
  public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> value(
      final org.drip.param.valuation.ValuationParams valParams,
      final org.drip.param.pricer.PricerParams pricerParams,
      final org.drip.param.definition.ComponentMarketParams mktParams,
      final org.drip.param.valuation.QuotingParams quotingParams) {
    if (null == valParams || valParams._dblValue >= _dblMaturity || null == mktParams) return null;

    org.drip.analytics.definition.DiscountCurve dc = mktParams.getDiscountCurve();

    if (null == dc) return null;

    long lStart = System.nanoTime();

    org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapResult =
        new org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double>();

    try {
      double dblCashSettle =
          null == _settleParams
              ? valParams._dblCashPay
              : _settleParams.cashSettleDate(valParams._dblValue);

      double dblUnadjustedAnnuity =
          dc.getDF(_dblMaturity) / dc.getDF(_dblEffective) / dc.getDF(dblCashSettle);

      double dblAdjustedAnnuity = dblUnadjustedAnnuity / dc.getDF(dblCashSettle);

      mapResult.put(
          "pv",
          dblAdjustedAnnuity * _dblNotional * 0.01 * getNotional(_dblEffective, _dblMaturity));

      mapResult.put("price", 100. * dblAdjustedAnnuity);

      mapResult.put(
          "rate",
          ((1. / dblUnadjustedAnnuity) - 1.)
              / org.drip.analytics.daycount.Convention.YearFraction(
                  _dblEffective, _dblMaturity, _strDC, false, _dblMaturity, null, _strCalendar));
    } catch (java.lang.Exception e) {
      e.printStackTrace();
    }

    mapResult.put("calctime", (System.nanoTime() - lStart) * 1.e-09);

    return mapResult;
  }
  @Override
  public org.drip.math.calculus.WengertJacobian calcQuoteDFMicroJack(
      final java.lang.String strQuote,
      final org.drip.param.valuation.ValuationParams valParams,
      final org.drip.param.pricer.PricerParams pricerParams,
      final org.drip.param.definition.ComponentMarketParams mktParams,
      final org.drip.param.valuation.QuotingParams quotingParams) {
    if (null == valParams
        || valParams._dblValue >= _dblMaturity
        || null == strQuote
        || null == mktParams
        || null == mktParams.getDiscountCurve()) return null;

    if ("Rate".equalsIgnoreCase(strQuote)) {
      try {
        org.drip.analytics.definition.DiscountCurve dc = mktParams.getDiscountCurve();

        org.drip.math.calculus.WengertJacobian wjDF = dc.getDFJacobian(_dblMaturity);

        if (null == wjDF) return null;

        org.drip.math.calculus.WengertJacobian wjDFMicroJack =
            new org.drip.math.calculus.WengertJacobian(1, wjDF.numParameters());

        for (int k = 0; k < wjDF.numParameters(); ++k) {
          if (!wjDFMicroJack.accumulatePartialFirstDerivative(
              0,
              k,
              -365.25
                  / (_dblMaturity - _dblEffective)
                  / dc.getDF(_dblMaturity)
                  * wjDF.getFirstDerivative(0, k))) return null;
        }

        return wjDFMicroJack;
      } catch (java.lang.Exception e) {
        e.printStackTrace();
      }
    }

    return null;
  }
  @Override
  public org.drip.math.calculus.WengertJacobian calcPVDFMicroJack(
      final org.drip.param.valuation.ValuationParams valParams,
      final org.drip.param.pricer.PricerParams pricerParams,
      final org.drip.param.definition.ComponentMarketParams mktParams,
      final org.drip.param.valuation.QuotingParams quotingParams) {
    if (null == valParams
        || valParams._dblValue >= _dblMaturity
        || null == mktParams
        || null == mktParams.getDiscountCurve()) return null;

    try {
      org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures =
          value(valParams, pricerParams, mktParams, quotingParams);

      if (null == mapMeasures) return null;

      double dblPV = mapMeasures.get("PV");

      org.drip.analytics.definition.DiscountCurve dc = mktParams.getDiscountCurve();

      org.drip.math.calculus.WengertJacobian wjDFDF = dc.getDFJacobian(_dblMaturity);

      if (null == wjDFDF) return null;

      org.drip.math.calculus.WengertJacobian wjPVDFMicroJack =
          new org.drip.math.calculus.WengertJacobian(1, wjDFDF.numParameters());

      for (int k = 0; k < wjDFDF.numParameters(); ++k) {
        if (!wjPVDFMicroJack.accumulatePartialFirstDerivative(
            0, k, wjDFDF.getFirstDerivative(0, k))) return null;
      }

      return adjustPVDFMicroJackForCashSettle(valParams._dblCashPay, dblPV, dc, wjPVDFMicroJack)
          ? wjPVDFMicroJack
          : null;
    } catch (java.lang.Exception e) {
      e.printStackTrace();
    }

    return null;
  }