BondComponent.java

  1. package org.drip.product.credit;

  2. /*
  3.  * -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  4.  */

  5. /*!
  6.  * Copyright (C) 2020 Lakshmi Krishnamurthy
  7.  * Copyright (C) 2019 Lakshmi Krishnamurthy
  8.  * Copyright (C) 2018 Lakshmi Krishnamurthy
  9.  * Copyright (C) 2017 Lakshmi Krishnamurthy
  10.  * Copyright (C) 2016 Lakshmi Krishnamurthy
  11.  * Copyright (C) 2015 Lakshmi Krishnamurthy
  12.  * Copyright (C) 2014 Lakshmi Krishnamurthy
  13.  * Copyright (C) 2013 Lakshmi Krishnamurthy
  14.  * Copyright (C) 2012 Lakshmi Krishnamurthy
  15.  * Copyright (C) 2011 Lakshmi Krishnamurthy
  16.  *
  17.  *  This file is part of DROP, an open-source library targeting analytics/risk, transaction cost analytics,
  18.  *      asset liability management analytics, capital, exposure, and margin analytics, valuation adjustment
  19.  *      analytics, and portfolio construction analytics within and across fixed income, credit, commodity,
  20.  *      equity, FX, and structured products. It also includes auxiliary libraries for algorithm support,
  21.  *      numerical analysis, numerical optimization, spline builder, model validation, statistical learning,
  22.  *      and computational support.
  23.  *  
  24.  *      https://lakshmidrip.github.io/DROP/
  25.  *  
  26.  *  DROP is composed of three modules:
  27.  *  
  28.  *  - DROP Product Core - https://lakshmidrip.github.io/DROP-Product-Core/
  29.  *  - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
  30.  *  - DROP Computational Core - https://lakshmidrip.github.io/DROP-Computational-Core/
  31.  *
  32.  *  DROP Product Core implements libraries for the following:
  33.  *  - Fixed Income Analytics
  34.  *  - Loan Analytics
  35.  *  - Transaction Cost Analytics
  36.  *
  37.  *  DROP Portfolio Core implements libraries for the following:
  38.  *  - Asset Allocation Analytics
  39.  *  - Asset Liability Management Analytics
  40.  *  - Capital Estimation Analytics
  41.  *  - Exposure Analytics
  42.  *  - Margin Analytics
  43.  *  - XVA Analytics
  44.  *
  45.  *  DROP Computational Core implements libraries for the following:
  46.  *  - Algorithm Support
  47.  *  - Computation Support
  48.  *  - Function Analysis
  49.  *  - Model Validation
  50.  *  - Numerical Analysis
  51.  *  - Numerical Optimizer
  52.  *  - Spline Builder
  53.  *  - Statistical Learning
  54.  *
  55.  *  Documentation for DROP is Spread Over:
  56.  *
  57.  *  - Main                     => https://lakshmidrip.github.io/DROP/
  58.  *  - Wiki                     => https://github.com/lakshmiDRIP/DROP/wiki
  59.  *  - GitHub                   => https://github.com/lakshmiDRIP/DROP
  60.  *  - Repo Layout Taxonomy     => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
  61.  *  - Javadoc                  => https://lakshmidrip.github.io/DROP/Javadoc/index.html
  62.  *  - Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
  63.  *  - Release Versions         => https://lakshmidrip.github.io/DROP/version.html
  64.  *  - Community Credits        => https://lakshmidrip.github.io/DROP/credits.html
  65.  *  - Issues Catalog           => https://github.com/lakshmiDRIP/DROP/issues
  66.  *  - JUnit                    => https://lakshmidrip.github.io/DROP/junit/index.html
  67.  *  - Jacoco                   => https://lakshmidrip.github.io/DROP/jacoco/index.html
  68.  *
  69.  *  Licensed under the Apache License, Version 2.0 (the "License");
  70.  *      you may not use this file except in compliance with the License.
  71.  *  
  72.  *  You may obtain a copy of the License at
  73.  *      http://www.apache.org/licenses/LICENSE-2.0
  74.  *  
  75.  *  Unless required by applicable law or agreed to in writing, software
  76.  *      distributed under the License is distributed on an "AS IS" BASIS,
  77.  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  78.  *  
  79.  *  See the License for the specific language governing permissions and
  80.  *      limitations under the License.
  81.  */

  82. /**
  83.  * <i>BondComponent</i> is the base class that extends CreditComponent abstract class and implements the
  84.  * functionality behind bonds of all kinds. Bond static data is captured in a set of 11 container classes –
  85.  * BondTSYParams, BondCouponParams, BondNotionalParams, BondFloaterParams, BondCurrencyParams,
  86.  * BondIdentifierParams, CompCRValParams, BondCFTerminationEvent, BondFixedPeriodGenerationParams, and one
  87.  * EmbeddedOptionSchedule object instance each for the call and the put objects. Each of these parameter set
  88.  * can be set separately.
  89.  *
  90.  *  <br><br>
  91.  *  <ul>
  92.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  93.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
  94.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/product/README.md">Product Components/Baskets for Credit, FRA, FX, Govvie, Rates, and Option AssetClasses</a></li>
  95.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/product/credit/README.md">Credit Products - Components and Baskets</a></li>
  96.  *  </ul>
  97.  * <br><br>
  98.  *
  99.  * @author Lakshmi Krishnamurthy
  100.  */

  101. public class BondComponent extends org.drip.product.definition.Bond implements
  102.     org.drip.product.definition.BondProduct
  103. {
  104.     private static final boolean s_bSuppressErrors = true;
  105.     private static final boolean s_bYieldDFOffofCouponAccrualDCF = true;

  106.     /*
  107.      * Width for calculating local forward rate width
  108.      */

  109.     private static final int LOCAL_FORWARD_RATE_WIDTH = 1;

  110.     /*
  111.      * Recovery Period discretization Mode
  112.      */

  113.     private static final int s_iDiscretizationScheme =
  114.         org.drip.param.pricer.CreditPricerParams.PERIOD_DISCRETIZATION_DAY_STEP;

  115.     /*
  116.      * Discount Curve to derive the zero curve off of
  117.      */

  118.     private static final int ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE = 1;
  119.     private static final int ZERO_OFF_OF_TREASURIES_DISCOUNT_CURVE = 2;

  120.     /*
  121.      * Discount Curve to derive Bumped Prices
  122.      */

  123.     private static final int PRICE_OFF_OF_FUNDING_CURVE = 1;
  124.     private static final int PRICE_OFF_OF_TREASURY_CURVE = 2;
  125.     // private static final int PRICE_OFF_OF_OVERNIGHT_CURVE = 3;

  126.     private org.drip.product.params.BondStream _stream = null;
  127.     private org.drip.product.params.IdentifierSet _idParams = null;
  128.     private org.drip.product.params.CouponSetting _couponSetting = null;
  129.     private org.drip.product.params.CreditSetting _creditSetting = null;
  130.     private org.drip.product.params.FloaterSetting _floaterSetting = null;
  131.     private org.drip.product.params.NotionalSetting _notionalSetting = null;
  132.     private org.drip.product.params.QuoteConvention _quoteConvention = null;
  133.     private org.drip.product.params.TerminationSetting _terminationSetting = null;
  134.     private org.drip.product.params.TreasuryBenchmarks _treasuryBenchmarks = null;

  135.     /*
  136.      * Bond EOS Params
  137.      */

  138.     protected org.drip.product.params.EmbeddedOptionSchedule _eosPut = null;
  139.     protected org.drip.product.params.EmbeddedOptionSchedule _eosCall = null;

  140.     private int terminationAdjust (
  141.         final int iDate)
  142.     {
  143.         org.drip.analytics.daycount.DateAdjustParams dap = null == _terminationSetting ? null :
  144.             _terminationSetting.dap();

  145.         try {
  146.             return null == dap ? iDate : dap.roll (iDate);
  147.         } catch (java.lang.Exception e) {
  148.             e.printStackTrace();
  149.         }

  150.         return iDate;
  151.     }

  152.     private double treasuryBenchmarkYield (
  153.         final org.drip.param.valuation.ValuationParams valParams,
  154.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  155.         final int iWorkoutDate)
  156.         throws java.lang.Exception
  157.     {
  158.         if (null == valParams || null == csqc)
  159.             throw new java.lang.Exception ("BondComponent::treasuryBenchmarkYield => Invalid Inputs");

  160.         java.lang.String strTsyBmk = null;
  161.         org.drip.param.definition.ProductQuote pqTsyBmkYield = null;

  162.         if (null != _treasuryBenchmarks) strTsyBmk = _treasuryBenchmarks.primary();

  163.         int iValDate = valParams.valueDate();

  164.         if (null == strTsyBmk || strTsyBmk.isEmpty())
  165.             strTsyBmk = org.drip.analytics.support.Helper.BaseTsyBmk (iValDate, iWorkoutDate);

  166.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.param.definition.ProductQuote> pqMap =
  167.             csqc.quoteMap();

  168.         if (null != pqMap && null != strTsyBmk && !strTsyBmk.isEmpty())
  169.             pqTsyBmkYield = pqMap.get (strTsyBmk);

  170.         if (null != pqTsyBmkYield) {
  171.              org.drip.param.definition.Quote q = pqTsyBmkYield.quote ("Yield");

  172.              if (null != q) return q.value ("mid");
  173.         }

  174.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());

  175.         return null == gc ? java.lang.Double.NaN : gc.yield (terminationAdjust (iWorkoutDate));
  176.     }

  177.     private org.drip.param.valuation.WorkoutInfo exerciseCallYieldFromPrice (
  178.         final org.drip.param.valuation.ValuationParams valParams,
  179.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  180.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  181.         final double dblPrice)
  182.     {
  183.         if (null == valParams || null == csqs || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice) || null
  184.             == _eosCall)
  185.             return null;

  186.         int iValDate = valParams.valueDate();

  187.         int[] aiEOSDate = _eosCall.dates();

  188.         int iMaturityDate = maturityDate().julian();

  189.         double[] adblEOSFactor = _eosCall.factors();

  190.         int iNoticePeriod = _eosCall.exerciseNoticePeriod();

  191.         int iExercise = -1;
  192.         double dblExerciseYield = java.lang.Double.NaN;
  193.         int iNumEOSDate = null == aiEOSDate ? 0 : aiEOSDate.length;

  194.         try {
  195.             dblExerciseYield = yieldFromPrice (valParams, csqs, vcp, iMaturityDate, 1., dblPrice);
  196.         } catch (java.lang.Exception e) {
  197.             if (!s_bSuppressErrors) e.printStackTrace();

  198.             return null;
  199.         }

  200.         for (int i = 0; i < iNumEOSDate; ++i) {
  201.             if (iValDate > aiEOSDate[i] || aiEOSDate[i] - iValDate < iNoticePeriod) continue;

  202.             try {
  203.                 double dblYield = yieldFromPrice (valParams, csqs, vcp, aiEOSDate[i], adblEOSFactor[i],
  204.                     dblPrice);

  205.                 if (dblYield < dblExerciseYield) {
  206.                     iExercise = i;
  207.                     dblExerciseYield = dblYield;
  208.                 }
  209.             } catch (java.lang.Exception e) {
  210.                 if (!s_bSuppressErrors) e.printStackTrace();
  211.             }
  212.         }

  213.         try {
  214.             return -1 == iExercise ? new org.drip.param.valuation.WorkoutInfo (iMaturityDate,
  215.                 dblExerciseYield, 1., org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY) : new
  216.                     org.drip.param.valuation.WorkoutInfo (aiEOSDate[iExercise], dblExerciseYield,
  217.                         adblEOSFactor[iExercise], org.drip.param.valuation.WorkoutInfo.WO_TYPE_CALL);
  218.         } catch (java.lang.Exception e) {
  219.             if (!s_bSuppressErrors) e.printStackTrace();
  220.         }

  221.         return null;
  222.     }

  223.     private org.drip.param.valuation.WorkoutInfo exercisePutYieldFromPrice (
  224.         final org.drip.param.valuation.ValuationParams valParams,
  225.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  226.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  227.         final double dblPrice)
  228.     {
  229.         if (null == valParams || null == csqs || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice) || null
  230.             == _eosPut)
  231.             return null;

  232.         int iValueDate = valParams.valueDate();

  233.         int[] aiEOSDate = _eosPut.dates();

  234.         double[] adblEOSFactor = _eosPut.factors();

  235.         int iNoticePeriod = _eosPut.exerciseNoticePeriod();

  236.         int iMaturityDate = maturityDate().julian();

  237.         int iExercise = -1;
  238.         double dblExerciseYield = java.lang.Double.NaN;
  239.         int iNumEOSDate = null == aiEOSDate ? 0 : aiEOSDate.length;

  240.         try {
  241.             dblExerciseYield = yieldFromPrice (valParams, csqs, vcp, iMaturityDate, 1., dblPrice);
  242.         } catch (java.lang.Exception e) {
  243.             if (!s_bSuppressErrors) e.printStackTrace();

  244.             return null;
  245.         }

  246.         for (int i = 0; i < iNumEOSDate; ++i) {
  247.             if (iValueDate > aiEOSDate[i] || aiEOSDate[i] - iValueDate < iNoticePeriod) continue;

  248.             try {
  249.                 double dblYield = yieldFromPrice (valParams, csqs, vcp, aiEOSDate[i], adblEOSFactor[i],
  250.                     dblPrice);

  251.                 if (dblYield > dblExerciseYield) {
  252.                     iExercise = i;
  253.                     dblExerciseYield = dblYield;
  254.                 }
  255.             } catch (java.lang.Exception e) {
  256.                 if (!s_bSuppressErrors) e.printStackTrace();
  257.             }
  258.         }

  259.         try {
  260.             return -1 == iExercise ? new org.drip.param.valuation.WorkoutInfo (iMaturityDate,
  261.                 dblExerciseYield, 1., org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY) : new
  262.                     org.drip.param.valuation.WorkoutInfo (aiEOSDate[iExercise], dblExerciseYield,
  263.                         adblEOSFactor[iExercise], org.drip.param.valuation.WorkoutInfo.WO_TYPE_PUT);
  264.         } catch (java.lang.Exception e) {
  265.             if (!s_bSuppressErrors) e.printStackTrace();
  266.         }

  267.         return null;
  268.     }

  269.     private double priceFromYield (
  270.         final org.drip.param.valuation.ValuationParams valParams,
  271.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  272.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  273.         final int iWorkoutDate,
  274.         final double dblWorkoutFactor,
  275.         final double dblYield,
  276.         final boolean bApplyCouponExtension)
  277.         throws java.lang.Exception
  278.     {
  279.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  280.             throw new java.lang.Exception ("BondComponent::priceFromYield => Invalid inputs");

  281.         int iValueDate = valParams.valueDate();

  282.         if (iValueDate >= iWorkoutDate)
  283.             throw new java.lang.Exception ("BondComponent::priceFromYield => Invalid inputs");

  284.         boolean bFirstPeriod = true;
  285.         double dblPeriodYearFract = 0.;
  286.         double dblCumulativePeriodPV = 0.;
  287.         boolean bTerminateCouponFlow = false;
  288.         boolean bApplyFlatForwardRate = false;
  289.         int iCashPayDate = java.lang.Integer.MIN_VALUE;
  290.         double dblFlatForwardRate = java.lang.Double.NaN;
  291.         org.drip.analytics.daycount.ActActDCParams aap = null;

  292.         double dblScalingNotional = null != _notionalSetting && _notionalSetting.priceOffOfOriginalNotional()
  293.             ? 1. : notional (iValueDate);

  294.         int iFrequency = freq();

  295.         java.lang.String strDC = couponDC();

  296.         java.lang.String strCalendar = currency();

  297.         boolean bApplyCpnEOMAdj = _stream.couponEOMAdjustment();

  298.         if (null == strCalendar || strCalendar.isEmpty()) strCalendar = redemptionCurrency();

  299.         org.drip.param.valuation.ValuationCustomizationParams vcpQuote = null == _quoteConvention ? null :
  300.             _quoteConvention.valuationCustomizationParams();

  301.         if (null != vcp) {
  302.             strDC = vcp.yieldDayCount();

  303.             iFrequency = vcp.yieldFreq();

  304.             strCalendar = vcp.yieldCalendar();

  305.             bApplyCpnEOMAdj = vcp.applyYieldEOMAdj();

  306.             bApplyFlatForwardRate = vcp.applyFlatForwardRate();
  307.         } else if (null != vcpQuote) {
  308.             strDC = vcpQuote.yieldDayCount();

  309.             iFrequency = vcpQuote.yieldFreq();

  310.             strCalendar = vcpQuote.yieldCalendar();

  311.             bApplyCpnEOMAdj = vcpQuote.applyYieldEOMAdj();

  312.             bApplyFlatForwardRate = vcpQuote.applyFlatForwardRate();
  313.         }

  314.         int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  315.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  316.             int iPeriodPayDate = period.payDate();

  317.             if (iPeriodPayDate < iValueDate) continue;

  318.             if (bFirstPeriod) {
  319.                 bFirstPeriod = false;

  320.                 dblPeriodYearFract = period.couponDCF() - period.accrualDCF (iValueDate);
  321.             } else
  322.                 dblPeriodYearFract += period.couponDCF();

  323.             int iPeriodEndDate = period.endDate();

  324.             int iPeriodStartDate = period.startDate();

  325.             if (iPeriodEndDate >= iWorkoutDate) {
  326.                 iPeriodEndDate = iWorkoutDate;
  327.                 bTerminateCouponFlow = true;
  328.             }

  329.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iPeriodEndDate,
  330.                 valParams, csqc);

  331.             if (null == cpcm)
  332.                 throw new java.lang.Exception ("BondComponent::priceFromYield => No PCM for " + new
  333.                     org.drip.analytics.date.JulianDate (iValueDate) + " | " + effectiveDate());

  334.             if (null != vcp) {
  335.                 if (null == (aap = vcp.yieldAAP()))
  336.                     aap = new org.drip.analytics.daycount.ActActDCParams (vcp.yieldFreq(), iPeriodEndDate -
  337.                         iPeriodStartDate);
  338.             } else if (null != vcpQuote) {
  339.                 if (null == (aap = vcpQuote.yieldAAP()))
  340.                     aap = new org.drip.analytics.daycount.ActActDCParams (vcpQuote.yieldFreq(),
  341.                         iPeriodEndDate - iPeriodStartDate);
  342.             } else
  343.                 aap = new org.drip.analytics.daycount.ActActDCParams (iFrequency, iPeriodEndDate -
  344.                     iPeriodStartDate);

  345.             double dblYieldAnnuity = org.drip.analytics.support.Helper.Yield2DF (iFrequency, dblYield,
  346.                 s_bYieldDFOffofCouponAccrualDCF ? dblPeriodYearFract :
  347.                     org.drip.analytics.daycount.Convention.YearFraction (iValueDate, iPeriodPayDate, strDC,
  348.                         bApplyCpnEOMAdj, aap, strCalendar)) * cpcm.cumulative();

  349.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  350.             double dblPeriodEndNotional = notional (iPeriodEndDate);

  351.             double dblCouponNotional = dblPeriodStartNotional;

  352.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  353.                 dblCouponNotional = dblPeriodStartNotional;
  354.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  355.                 dblCouponNotional = dblPeriodEndNotional;
  356.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  357.                 iPeriodAmortizationMode)
  358.                 dblCouponNotional = notional (iPeriodStartDate, iPeriodEndDate);

  359.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  360.                 dblFlatForwardRate = cpcm.rate();

  361.             dblCumulativePeriodPV += (period.accrualDCF (iPeriodEndDate) * (bApplyFlatForwardRate ?
  362.                 dblFlatForwardRate : cpcm.rate() + (bApplyCouponExtension ?
  363.                     _couponSetting.couponRateExtension() : 0.)) * couponFactor (iPeriodEndDate) *
  364.                         dblCouponNotional + dblPeriodStartNotional - dblPeriodEndNotional) * dblYieldAnnuity;

  365.             if (bTerminateCouponFlow) break;
  366.         }

  367.         try {
  368.             iCashPayDate = null != _quoteConvention ? _quoteConvention.settleDate (valParams) :
  369.                 valParams.cashPayDate();
  370.         } catch (java.lang.Exception e) {
  371.             if (!s_bSuppressErrors) e.printStackTrace();

  372.             iCashPayDate = valParams.cashPayDate();
  373.         }

  374.         double dblCleanPrice = (((dblCumulativePeriodPV + dblWorkoutFactor * org.drip.analytics.support.Helper.Yield2DF (
  375.             iFrequency,
  376.             dblYield,
  377.             s_bYieldDFOffofCouponAccrualDCF ? dblPeriodYearFract :
  378.                 org.drip.analytics.daycount.Convention.YearFraction (
  379.                     iValueDate,
  380.                     terminationAdjust (iWorkoutDate),
  381.                     strDC,
  382.                     bApplyCpnEOMAdj,
  383.                     aap,
  384.                     strCalendar
  385.                 )
  386.             ) * notional (iWorkoutDate)) /
  387.             org.drip.analytics.support.Helper.Yield2DF (
  388.                 iFrequency,
  389.                 dblYield,
  390.                 org.drip.analytics.daycount.Convention.YearFraction (
  391.                     iValueDate,
  392.                     iCashPayDate,
  393.                     strDC,
  394.                     bApplyCpnEOMAdj,
  395.                     aap,
  396.                     strCalendar
  397.                 )
  398.             )
  399.         ) - accrued (
  400.             iValueDate,
  401.             csqc
  402.         )) / dblScalingNotional;

  403.         return dblCleanPrice;
  404.     }

  405.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> calibMeasures (
  406.         final org.drip.param.valuation.ValuationParams valParams,
  407.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  408.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  409.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  410.     {
  411.         double dblCleanPrice = java.lang.Double.NaN;

  412.         org.drip.param.definition.CalibrationParams calibParams = null == pricerParams ? null :
  413.             pricerParams.calibParams();

  414.         if (null == calibParams) return null;

  415.         org.drip.param.valuation.WorkoutInfo wi = calibParams.workout();

  416.         double dblExerciseFactor = null == wi ? 1. : wi.factor();

  417.         int iExerciseDate = null == wi ? maturityDate().julian() : wi.date();

  418.         org.drip.state.credit.CreditCurve cc = csqc.creditState (creditLabel());

  419.         try {
  420.             dblCleanPrice = null == cc ? priceFromFundingCurve (valParams, csqc, iExerciseDate,
  421.                 dblExerciseFactor, 0.) : priceFromCreditCurve (valParams, csqc, iExerciseDate,
  422.                     dblExerciseFactor, 0., false);
  423.         } catch (java.lang.Exception e) {
  424.             if (!s_bSuppressErrors) e.printStackTrace();

  425.             return null;
  426.         }

  427.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblCleanPrice)) return null;

  428.         java.lang.String strCalibMeasure = calibParams.measure();

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

  431.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  432.             {"CleanPrice", "FairCleanPrice", "FairPrice", "Price"}, false)) {
  433.             mapCalibMeasures.put (strCalibMeasure, dblCleanPrice);

  434.             return mapCalibMeasures;
  435.         }

  436.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  437.             {"DirtyPrice", "FairDirtyPrice"}, false)) {
  438.             try {
  439.                 mapCalibMeasures.put (strCalibMeasure, dblCleanPrice + accrued (valParams.valueDate(),
  440.                     csqc));

  441.                 return mapCalibMeasures;
  442.             } catch (java.lang.Exception e) {
  443.                 if (!s_bSuppressErrors) e.printStackTrace();
  444.             }
  445.         }

  446.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  447.             {"Yield", "FairYield"}, false)) {
  448.             try {
  449.                 mapCalibMeasures.put (strCalibMeasure, yieldFromPrice (valParams, csqc, vcp, iExerciseDate,
  450.                     dblExerciseFactor, dblCleanPrice));

  451.                 return mapCalibMeasures;
  452.             } catch (java.lang.Exception e) {
  453.                 if (!s_bSuppressErrors) e.printStackTrace();
  454.             }
  455.         }

  456.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  457.             {"TSYSpread", "FairTSYSpread"}, false)) {
  458.             try {
  459.                 mapCalibMeasures.put (strCalibMeasure, tsySpreadFromPrice (valParams, csqc, vcp,
  460.                     iExerciseDate, dblExerciseFactor, dblCleanPrice));

  461.                 return mapCalibMeasures;
  462.             } catch (java.lang.Exception e) {
  463.                 if (!s_bSuppressErrors) e.printStackTrace();
  464.             }
  465.         }

  466.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  467.             {"OAS", "OASpread", "OptionAdjustedSpread"}, false)) {
  468.             try {
  469.                 mapCalibMeasures.put (strCalibMeasure, oasFromPrice (valParams, csqc, vcp, iExerciseDate,
  470.                     dblExerciseFactor, dblCleanPrice));

  471.                 return mapCalibMeasures;
  472.             } catch (java.lang.Exception e) {
  473.                 if (!s_bSuppressErrors) e.printStackTrace();
  474.             }
  475.         }

  476.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  477.             {"BondBasis", "YieldBasis", "YieldSpread"}, false)) {
  478.             try {
  479.                 mapCalibMeasures.put (strCalibMeasure, bondBasisFromPrice (valParams, csqc, vcp,
  480.                     iExerciseDate, dblExerciseFactor, dblCleanPrice));

  481.                 return mapCalibMeasures;
  482.             } catch (java.lang.Exception e) {
  483.                 if (!s_bSuppressErrors) e.printStackTrace();
  484.             }
  485.         }

  486.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  487.             {"CreditBasis"}, false)) {
  488.             if (null == cc) return null;

  489.             try {
  490.                 mapCalibMeasures.put (strCalibMeasure, creditBasisFromPrice (valParams, csqc, vcp,
  491.                     iExerciseDate, dblExerciseFactor, dblCleanPrice));

  492.                 return mapCalibMeasures;
  493.             } catch (java.lang.Exception e) {
  494.                 if (!s_bSuppressErrors) e.printStackTrace();
  495.             }
  496.         }

  497.         if (org.drip.numerical.common.StringUtil.MatchInStringArray (strCalibMeasure, new java.lang.String[]
  498.             {"PECS", "ParEquivalentCDSSpread"}, false)) {
  499.             if (null == cc) return null;

  500.             try {
  501.                 mapCalibMeasures.put (strCalibMeasure, pecsFromPrice (valParams, csqc, vcp, iExerciseDate,
  502.                     dblExerciseFactor, dblCleanPrice));

  503.                 return mapCalibMeasures;
  504.             } catch (java.lang.Exception e) {
  505.                 if (!s_bSuppressErrors) e.printStackTrace();
  506.             }
  507.         }

  508.         return null;
  509.     }

  510.     @Override public org.drip.param.valuation.WorkoutInfo exerciseYieldFromPrice (
  511.         final org.drip.param.valuation.ValuationParams valParams,
  512.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  513.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  514.         final double dblPrice)
  515.     {
  516.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  517.             return null;

  518.         int iMaturityDate = maturityDate().julian();

  519.         try {
  520.             if (null == _eosCall && null == _eosPut)
  521.                 return new org.drip.param.valuation.WorkoutInfo (iMaturityDate, yieldFromPrice (valParams,
  522.                     csqc, vcp, iMaturityDate, 1., dblPrice), 1.,
  523.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);

  524.             if (null == _eosCall && null != _eosPut)
  525.                 return exercisePutYieldFromPrice (valParams, csqc, vcp, dblPrice);

  526.             if (null != _eosCall && null == _eosPut)
  527.                 return exerciseCallYieldFromPrice (valParams, csqc, vcp, dblPrice);

  528.             org.drip.param.valuation.WorkoutInfo wiPut = exercisePutYieldFromPrice (valParams, csqc, vcp,
  529.                 dblPrice);

  530.             org.drip.param.valuation.WorkoutInfo wiCall = exerciseCallYieldFromPrice (valParams, csqc, vcp,
  531.                 dblPrice);

  532.             if (null == wiPut || null == wiCall) return null;

  533.             return wiPut.date() < wiCall.date() ? wiPut : wiCall;
  534.         } catch (java.lang.Exception e) {
  535.             if (!s_bSuppressErrors) e.printStackTrace();
  536.         }

  537.         return null;
  538.     }

  539.     private double indexRate (
  540.         final int iValueDate,
  541.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  542.         final org.drip.analytics.cashflow.CompositeFloatingPeriod cup)
  543.         throws java.lang.Exception
  544.     {
  545.         org.drip.state.discount.MergedDiscountForwardCurve dc = csqc.fundingState (fundingLabel());

  546.         int iFreq = freq();

  547.         if (null != cup) {
  548.             org.drip.analytics.cashflow.ComposableUnitPeriod cupFirst = cup.periods().get (0);

  549.             if (!(cupFirst instanceof org.drip.analytics.cashflow.ComposableUnitFloatingPeriod))
  550.                 throw new java.lang.Exception ("BondComponent::indexRate => Not a floater");

  551.             return ((org.drip.analytics.cashflow.ComposableUnitFloatingPeriod) cupFirst).baseRate (csqc);
  552.         }

  553.         return dc.libor (iValueDate, 0 != iFreq ? iValueDate + 365 / iFreq : iValueDate +
  554.             LOCAL_FORWARD_RATE_WIDTH);
  555.     }

  556.     private org.drip.analytics.output.BondWorkoutMeasures workoutMeasures (
  557.         final org.drip.param.valuation.ValuationParams valParams,
  558.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  559.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  560.         final int iWorkoutDate,
  561.         final double dblWorkoutFactor)
  562.     {
  563.         if (null == valParams || null == csqc) return null;

  564.         int iValueDate = valParams.valueDate();

  565.         if (iValueDate >= iWorkoutDate) return null;

  566.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  567.         if (null == dcFunding) return null;

  568.         int iLossPayLag = null == _creditSetting ? 0 : _creditSetting.lossPayLag();

  569.         double dblProductRecovery = null == _creditSetting ? java.lang.Double.NaN :
  570.             _creditSetting.recovery();

  571.         boolean bUseCurveRecovery = null == _creditSetting ? false : _creditSetting.useCurveRecovery();

  572.         boolean bAccrualOnDefault = null == _creditSetting ? false : _creditSetting.accrualOnDefault();

  573.         org.drip.state.credit.CreditCurve cc = csqc.creditState (creditLabel());

  574.         double dblAccrued01 = 0.;
  575.         double dblRecoveryPV = 0.;
  576.         boolean bPeriodZero = true;
  577.         double dblExpectedRecovery = 0.;
  578.         double dblCreditRiskyDirtyDV01 = 0.;
  579.         boolean bTerminateCouponFlow = false;
  580.         double dblCreditRiskyPrincipalPV = 0.;
  581.         double dblCreditRisklessDirtyDV01 = 0.;
  582.         double dblCreditRiskyDirtyCouponPV = 0.;
  583.         double dblCreditRisklessPrincipalPV = 0.;
  584.         double dblCreditRisklessDirtyCouponPV = 0.;
  585.         double dblFirstCoupon = java.lang.Double.NaN;
  586.         double dblCreditRiskyDirtyIndexCouponPV = 0.;
  587.         double dblFirstIndexRate = java.lang.Double.NaN;
  588.         double dblCreditRisklessDirtyIndexCouponPV = 0.;
  589.         double dblCreditRiskyParPV = java.lang.Double.NaN;
  590.         double dblFlatForwardCoupon = java.lang.Double.NaN;
  591.         double dblCreditRisklessParPV = java.lang.Double.NaN;

  592.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  593.             _quoteConvention.valuationCustomizationParams();

  594.         boolean bApplyFlatForwardRate = null == vcp ? false : vcp.applyFlatForwardRate();

  595.         try {
  596.             for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  597.                 int iPeriodPayDate = period.payDate();

  598.                 if (iPeriodPayDate < iValueDate) continue;

  599.                 int iPeriodEndDate = period.endDate();

  600.                 int iPeriodStartDate = period.startDate();

  601.                 if (iWorkoutDate <= iPeriodEndDate) {
  602.                     bTerminateCouponFlow = true;
  603.                     iPeriodEndDate = iWorkoutDate;
  604.                 }

  605.                 org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate,
  606.                     valParams, csqc);

  607.                 if (null == cpcm) return null;

  608.                 if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardCoupon))
  609.                     dblFlatForwardCoupon = cpcm.rate();

  610.                 double dblPeriodBaseRate = period.periods().get (0).baseRate (csqc);

  611.                 double dblPeriodAnnuity = dcFunding.df (iPeriodPayDate) * cpcm.cumulative();

  612.                 double dblPeriodCoupon = bApplyFlatForwardRate ? dblFlatForwardCoupon : cpcm.rate();

  613.                 if (bPeriodZero) {
  614.                     bPeriodZero = false;
  615.                     dblFirstCoupon = dblPeriodCoupon;

  616.                     if (iPeriodStartDate < iValueDate)
  617.                         dblAccrued01 = 0.0001 * period.accrualDCF (iValueDate) * notional (iPeriodStartDate,
  618.                             iValueDate);

  619.                     if (null != _floaterSetting) dblFirstIndexRate = dblPeriodBaseRate;
  620.                 }

  621.                 double dblPeriodCreditRisklessDirtyDV01 = 0.0001 * period.accrualDCF (iPeriodEndDate) *
  622.                     dblPeriodAnnuity * notional (iPeriodStartDate);

  623.                 double dblPeriodCreditRiskessPrincipalPV = (notional (iPeriodStartDate) - notional
  624.                     (iPeriodEndDate)) * dblPeriodAnnuity;

  625.                 double dblPeriodCreditRiskyDirtyDV01 = dblPeriodCreditRisklessDirtyDV01;
  626.                 double dblPeriodCreditRiskyPrincipalPV = dblPeriodCreditRiskessPrincipalPV;

  627.                 if (null != cc && null != pricerParams) {
  628.                     double dblSurvProb = cc.survival (pricerParams.survivalToPayDate() ? iPeriodPayDate :
  629.                         iPeriodEndDate);

  630.                     dblPeriodCreditRiskyDirtyDV01 *= dblSurvProb;
  631.                     dblPeriodCreditRiskyPrincipalPV *= dblSurvProb;

  632.                     for (org.drip.analytics.cashflow.LossQuadratureMetrics lqm : period.lossMetrics (this,
  633.                         valParams, pricerParams, terminationAdjust (iWorkoutDate), csqc)) {
  634.                         if (null == lqm) continue;

  635.                         int iSubPeriodEndDate = lqm.endDate();

  636.                         int iSubPeriodStartDate = lqm.startDate();

  637.                         double dblSubPeriodDF = dcFunding.effectiveDF (iSubPeriodStartDate + iLossPayLag,
  638.                             iSubPeriodEndDate + iLossPayLag);

  639.                         double dblSubPeriodNotional = notional (iSubPeriodStartDate, iSubPeriodEndDate);

  640.                         double dblSubPeriodSurvival = cc.survival (iSubPeriodStartDate) - cc.survival
  641.                             (iSubPeriodEndDate);

  642.                         if (bAccrualOnDefault)
  643.                             dblPeriodCreditRiskyDirtyDV01 += 0.0001 * lqm.accrualDCF() * dblSubPeriodSurvival
  644.                                 * dblSubPeriodDF * dblSubPeriodNotional;

  645.                         double dblRecovery = bUseCurveRecovery ? cc.effectiveRecovery (iSubPeriodStartDate,
  646.                             iSubPeriodEndDate) : dblProductRecovery;

  647.                         double dblSubPeriodExpRecovery = dblRecovery * dblSubPeriodSurvival *
  648.                             dblSubPeriodNotional;
  649.                         dblRecoveryPV += dblSubPeriodExpRecovery * dblSubPeriodDF;
  650.                         dblExpectedRecovery += dblSubPeriodExpRecovery;
  651.                     }
  652.                 }

  653.                 dblCreditRiskyDirtyDV01 += dblPeriodCreditRiskyDirtyDV01;
  654.                 dblCreditRiskyPrincipalPV += dblPeriodCreditRiskyPrincipalPV;
  655.                 dblCreditRisklessDirtyDV01 += dblPeriodCreditRisklessDirtyDV01;
  656.                 dblCreditRisklessPrincipalPV += dblPeriodCreditRiskessPrincipalPV;

  657.                 dblCreditRiskyDirtyCouponPV += 10000. * dblPeriodCoupon * couponFactor (iPeriodEndDate) *
  658.                     dblPeriodCreditRiskyDirtyDV01;

  659.                 dblCreditRisklessDirtyCouponPV += 10000. * dblPeriodCoupon * couponFactor (iPeriodEndDate) *
  660.                     dblPeriodCreditRisklessDirtyDV01;

  661.                 dblCreditRiskyDirtyIndexCouponPV += 10000. * dblPeriodBaseRate *
  662.                     dblPeriodCreditRiskyDirtyDV01;
  663.                 dblCreditRisklessDirtyIndexCouponPV += 10000. * dblPeriodBaseRate *
  664.                     dblPeriodCreditRisklessDirtyDV01;

  665.                 if (bTerminateCouponFlow) break;
  666.             }
  667.         } catch (java.lang.Exception e) {
  668.             if (!s_bSuppressErrors) e.printStackTrace();

  669.             return null;
  670.         }

  671.         int iCashPayDate = java.lang.Integer.MIN_VALUE;

  672.         try {
  673.             iCashPayDate = null != _quoteConvention ? _quoteConvention.settleDate (valParams) :
  674.                 valParams.cashPayDate();
  675.         } catch (java.lang.Exception e) {
  676.             if (!s_bSuppressErrors) e.printStackTrace();

  677.             iCashPayDate = valParams.cashPayDate();
  678.         }

  679.         try {
  680.             double dblCashPayDF = dcFunding.df (iCashPayDate);

  681.             int iMaturityDate = maturityDate().julian();

  682.             dblCreditRisklessParPV = dcFunding.df (iMaturityDate) * notional (iMaturityDate) *
  683.                 dblWorkoutFactor;

  684.             if (null != cc && null != pricerParams)
  685.                 dblCreditRiskyParPV = dblCreditRisklessParPV * cc.survival (iMaturityDate);

  686.             org.drip.analytics.output.BondCouponMeasures bcmCreditRisklessDirty = new
  687.                 org.drip.analytics.output.BondCouponMeasures (dblCreditRisklessDirtyDV01,
  688.                     dblCreditRisklessDirtyIndexCouponPV, dblCreditRisklessDirtyCouponPV,
  689.                         dblCreditRisklessDirtyCouponPV + dblCreditRisklessPrincipalPV +
  690.                             dblCreditRisklessParPV);

  691.             double dblDefaultExposure = java.lang.Double.NaN;
  692.             double dblDefaultExposureNoRec = java.lang.Double.NaN;
  693.             double dblLossOnInstantaneousDefault = java.lang.Double.NaN;
  694.             org.drip.analytics.output.BondCouponMeasures bcmCreditRiskyDirty = null;

  695.             if (null != cc && null != pricerParams) {
  696.                 double dblInitialNotional = notional (iValueDate);

  697.                 double dblInitialRecovery = cc.recovery (iValueDate);

  698.                 bcmCreditRiskyDirty = new org.drip.analytics.output.BondCouponMeasures
  699.                     (dblCreditRiskyDirtyDV01, dblCreditRiskyDirtyIndexCouponPV, dblCreditRiskyDirtyCouponPV,
  700.                         dblCreditRiskyDirtyCouponPV + dblCreditRiskyPrincipalPV + dblCreditRiskyParPV);

  701.                 dblDefaultExposure = (dblDefaultExposureNoRec = dblInitialNotional) * dblInitialRecovery;
  702.                 dblLossOnInstantaneousDefault = dblInitialNotional * (1. - dblInitialRecovery);
  703.             }

  704.             return new org.drip.analytics.output.BondWorkoutMeasures (bcmCreditRiskyDirty,
  705.                 bcmCreditRisklessDirty, dblCreditRiskyParPV, dblCreditRisklessParPV,
  706.                     dblCreditRiskyPrincipalPV, dblCreditRisklessPrincipalPV, dblRecoveryPV,
  707.                         dblExpectedRecovery, dblDefaultExposure, dblDefaultExposureNoRec,
  708.                             dblLossOnInstantaneousDefault, dblAccrued01, dblFirstCoupon, dblFirstIndexRate,
  709.                                 dblCashPayDF);
  710.         } catch (java.lang.Exception e) {
  711.             if (!s_bSuppressErrors) e.printStackTrace();
  712.         }

  713.         return null;
  714.     }

  715.     private org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> rvMeasures (
  716.         final org.drip.param.valuation.ValuationParams valParams,
  717.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  718.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  719.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  720.         final org.drip.param.valuation.WorkoutInfo wi,
  721.         final double dblPrice,
  722.         final java.lang.String strPrefix)
  723.     {
  724.         if (null == strPrefix) return null;

  725.         org.drip.analytics.output.BondRVMeasures bmRV = standardMeasures (valParams, pricerParams, csqc, vcp,
  726.             wi, dblPrice);

  727.         return null == bmRV ? null : bmRV.toMap (strPrefix);
  728.     }

  729.     private org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> fairMeasures (
  730.         final org.drip.param.valuation.ValuationParams valParams,
  731.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  732.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  733.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  734.     {
  735.         int iMaturityDate = maturityDate().julian();

  736.         org.drip.analytics.output.BondWorkoutMeasures bwmFair = workoutMeasures (valParams, pricerParams,
  737.             csqc, iMaturityDate, 1.);

  738.         if (null == bwmFair) return null;

  739.         org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures = bwmFair.toMap ("");

  740.         org.drip.analytics.output.BondCouponMeasures bcm = bwmFair.creditRiskyCleanbcm();

  741.         double dblCreditRiskyPV = null == bcm ? java.lang.Double.NaN : bcm.pv();

  742.         double dblPrice = !org.drip.numerical.common.NumberUtil.IsValid (dblCreditRiskyPV) ?
  743.             bwmFair.creditRisklessCleanbcm().pv() : dblCreditRiskyPV;

  744.         try {
  745.             org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMeasures, rvMeasures (valParams,
  746.                 pricerParams, csqc, vcp, new org.drip.param.valuation.WorkoutInfo (iMaturityDate,
  747.                     yieldFromPrice (valParams, csqc, vcp, dblPrice / notional (valParams.valueDate())), 1.,
  748.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY), dblPrice, ""));

  749.             org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMeasures,
  750.                 org.drip.numerical.common.CollectionUtil.PrefixKeys (mapMeasures, "Fair"));

  751.             return mapMeasures;
  752.         } catch (java.lang.Exception e) {
  753.             if (!s_bSuppressErrors) e.printStackTrace();
  754.         }

  755.         return null;
  756.     }

  757.     private org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> marketMeasures (
  758.         final org.drip.param.valuation.ValuationParams valParams,
  759.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  760.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  761.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  762.         final org.drip.param.valuation.WorkoutInfo wiMarket)
  763.     {
  764.         try {
  765.             org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures = rvMeasures
  766.                 (valParams, pricerParams, csqc, vcp, wiMarket, priceFromYield (valParams, csqc, vcp,
  767.                     wiMarket.date(), wiMarket.factor(), wiMarket.yield()), "");

  768.             org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMeasures,
  769.                 org.drip.numerical.common.CollectionUtil.PrefixKeys (mapMeasures, "Market"));

  770.             return mapMeasures;
  771.         } catch (java.lang.Exception e) {
  772.             if (!s_bSuppressErrors) e.printStackTrace();
  773.         }

  774.         return null;
  775.     }

  776.     private org.drip.analytics.cashflow.CompositePeriod currentPeriod (
  777.         final int iDate)
  778.     {
  779.         try {
  780.             return _stream.period (_stream.periodIndex (iDate));
  781.         } catch (java.lang.Exception e) {
  782.             if (!s_bSuppressErrors) e.printStackTrace();
  783.         }

  784.         return null;
  785.     }

  786.     private double priceFromDiscountCurve (
  787.         final org.drip.param.valuation.ValuationParams valParams,
  788.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  789.         final int iWorkoutDate,
  790.         final double dblWorkoutFactor,
  791.         final double dblBump,
  792.         final int iDiscountCurveType)
  793.         throws java.lang.Exception
  794.     {
  795.         if (null == valParams || null == csqc ||!org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor)
  796.             || !org.drip.numerical.common.NumberUtil.IsValid (dblBump))
  797.             throw new java.lang.Exception ("BondComponent::priceFromDiscountCurve => Invalid Inputs");

  798.         org.drip.state.discount.DiscountCurve dc = null;

  799.         if (PRICE_OFF_OF_FUNDING_CURVE == iDiscountCurveType)
  800.             dc = csqc.fundingState (fundingLabel());
  801.         else if (PRICE_OFF_OF_TREASURY_CURVE == iDiscountCurveType)
  802.             dc = csqc.govvieState (govvieLabel());
  803.         /* else if (PRICE_OFF_OF_OVERNIGHT_CURVE == iDiscountCurveType)
  804.             dfe = csqc.overnightState (overnightLabel()); */

  805.         if (null == dc)
  806.             throw new java.lang.Exception ("BondComponent::priceFromDiscountCurve => No Discount Curve");

  807.         int iValueDate = valParams.valueDate();

  808.         if (iValueDate >= iWorkoutDate)
  809.             throw new java.lang.Exception ("BondComponent::priceFromDiscountCurve => Val date " +
  810.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  811.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  812.         double dblPV = 0.;
  813.         boolean bTerminateCouponFlow = false;
  814.         int iCashPayDate = java.lang.Integer.MIN_VALUE;
  815.         double dblFlatForwardRate = java.lang.Double.NaN;

  816.         double dblScalingNotional = null != _notionalSetting && _notionalSetting.priceOffOfOriginalNotional()
  817.             ? 1. : notional (iValueDate);

  818.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  819.             _quoteConvention.valuationCustomizationParams();

  820.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  821.         if (0. != dblBump) {
  822.             if (PRICE_OFF_OF_FUNDING_CURVE == iDiscountCurveType)
  823.                 dc = (org.drip.state.discount.MergedDiscountForwardCurve) dc.parallelShiftManifestMeasure
  824.                     ("SwapRate", dblBump);
  825.             else if (PRICE_OFF_OF_TREASURY_CURVE == iDiscountCurveType)
  826.                 dc = (org.drip.state.govvie.GovvieCurve) dc.parallelShiftManifestMeasure ("Yield", dblBump);
  827.         }

  828.         if (null == dc)
  829.             throw new java.lang.Exception
  830.                 ("BondComponent::priceFromDiscountCurve => Cannot shift Discount Curve");

  831.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  832.             int iPeriodPayDate = period.payDate();

  833.             if (iPeriodPayDate < iValueDate) continue;

  834.             int iPeriodStartDate = period.startDate();

  835.             int iAccrualEndDate = period.endDate();

  836.             int iNotionalEndDate = period.endDate();

  837.             if (iAccrualEndDate >= iWorkoutDate) {
  838.                 bTerminateCouponFlow = true;
  839.                 iAccrualEndDate = iWorkoutDate;
  840.                 iNotionalEndDate = iWorkoutDate;
  841.             }

  842.             org.drip.analytics.output.CompositePeriodCouponMetrics pcm = couponMetrics (iAccrualEndDate,
  843.                 valParams, csqc);

  844.             if (null == pcm)
  845.                 throw new java.lang.Exception ("BondComponent::priceFromDiscountCurve => No PCM");

  846.             double dblPeriodAnnuity = dc.df (iPeriodPayDate) * pcm.cumulative();

  847.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  848.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  849.             double dblCouponNotional = dblPeriodStartNotional;

  850.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  851.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  852.                 dblCouponNotional = dblPeriodStartNotional;
  853.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  854.                 dblCouponNotional = dblPeriodEndNotional;
  855.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  856.                 iPeriodAmortizationMode)
  857.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  858.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  859.                 dblFlatForwardRate = pcm.rate();

  860.             dblPV += period.accrualDCF (iAccrualEndDate) * dblPeriodAnnuity * (bApplyFlatForward ?
  861.                 dblFlatForwardRate : pcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional;

  862.             dblPV += (dblPeriodStartNotional - dblPeriodEndNotional) * dblPeriodAnnuity;

  863.             if (bTerminateCouponFlow) break;
  864.         }

  865.         try {
  866.             iCashPayDate = null != _quoteConvention ? _quoteConvention.settleDate (valParams) :
  867.                 valParams.cashPayDate();
  868.         } catch (java.lang.Exception e) {
  869.             if (!s_bSuppressErrors) e.printStackTrace();

  870.             iCashPayDate = valParams.cashPayDate();
  871.         }

  872.         return ((dblPV + dblWorkoutFactor * dc.df (terminationAdjust (iWorkoutDate)) * notional
  873.             (iWorkoutDate)) / dc.df (iCashPayDate) - accrued (iValueDate, csqc)) / dblScalingNotional;
  874.     }

  875.     /**
  876.      * Constructor: Construct an empty bond object
  877.      */

  878.     public BondComponent()
  879.     {
  880.     }

  881.     @Override public double[] secTreasurySpread (
  882.         final org.drip.param.valuation.ValuationParams valParams,
  883.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  884.     {
  885.         if (null == valParams || null == csqc) return null;

  886.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.param.definition.ProductQuote> mapTSYQuote
  887.             = csqc.quoteMap();

  888.         if (null == mapTSYQuote || 0 == mapTSYQuote.size()) return null;

  889.         java.lang.String[] astrTreasuryBenchmark = null == _treasuryBenchmarks ? null :
  890.             _treasuryBenchmarks.secondary();

  891.         int iNumTreasuryBenchmark = null == astrTreasuryBenchmark ? 0 : astrTreasuryBenchmark.length;
  892.         double[] adblSecTSYSpread = new double[iNumTreasuryBenchmark];

  893.         if (0 == iNumTreasuryBenchmark) return null;

  894.         for (int i = 0; i < iNumTreasuryBenchmark; ++i) {
  895.             org.drip.param.definition.ProductQuote pqTSYBenchmark = mapTSYQuote.get
  896.                 (astrTreasuryBenchmark[i]);

  897.             org.drip.param.definition.Quote q = null == pqTSYBenchmark ? null : pqTSYBenchmark.quote
  898.                 ("Yield");

  899.             adblSecTSYSpread[i] = null == q ? java.lang.Double.NaN : q.value ("mid");
  900.         }

  901.         return adblSecTSYSpread;
  902.     }

  903.     @Override public double effectiveTreasuryBenchmarkYield (
  904.         final org.drip.param.valuation.ValuationParams valParams,
  905.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  906.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  907.         final double dblPrice)
  908.         throws java.lang.Exception
  909.     {
  910.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  911.             throw new java.lang.Exception
  912.                 ("BondComponent::effectiveTreasuryBenchmarkYield => Bad val/mkt Params");

  913.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  914.         if (null == wi)
  915.             throw new java.lang.Exception
  916.                 ("BondComponent::effectiveTreasuryBenchmarkYield => Invalid Work-out!");

  917.         java.lang.String strTreasuryBenchmark = null != _treasuryBenchmarks ? _treasuryBenchmarks.primary() :
  918.             null;

  919.         int iValueDate = valParams.valueDate();

  920.         int iWorkoutDate = wi.date();

  921.         if (null == strTreasuryBenchmark || strTreasuryBenchmark.isEmpty())
  922.             strTreasuryBenchmark = org.drip.analytics.support.Helper.BaseTsyBmk (iValueDate, iWorkoutDate);

  923.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.param.definition.ProductQuote> mapTSYQuote
  924.             = csqc.quoteMap();

  925.         org.drip.param.definition.ProductQuote pqTSYBenchmark = null != mapTSYQuote &&
  926.             mapTSYQuote.containsKey (strTreasuryBenchmark) && !strTreasuryBenchmark.isEmpty() ?
  927.                 mapTSYQuote.get (strTreasuryBenchmark) : null;

  928.         org.drip.param.definition.Quote q = null != pqTSYBenchmark ? pqTSYBenchmark.quote ("Yield") : null;

  929.         if (null != q) return q.value ("mid");

  930.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());;

  931.         return null == gc ? java.lang.Double.NaN : gc.yield (terminationAdjust (iWorkoutDate));
  932.     }

  933.     @Override public boolean setTreasuryBenchmark (
  934.         final org.drip.product.params.TreasuryBenchmarks treasuryBenchmarks)
  935.     {
  936.         return null != (_treasuryBenchmarks = treasuryBenchmarks);
  937.     }

  938.     @Override public org.drip.product.params.TreasuryBenchmarks treasuryBenchmark()
  939.     {
  940.         return _treasuryBenchmarks;
  941.     }

  942.     @Override public boolean setIdentifierSet (
  943.         final org.drip.product.params.IdentifierSet idParams)
  944.     {
  945.         return null != (_idParams = idParams);
  946.     }

  947.     @Override public org.drip.product.params.IdentifierSet identifierSet()
  948.     {
  949.         return _idParams;
  950.     }

  951.     @Override public boolean setCouponSetting (
  952.         final org.drip.product.params.CouponSetting couponSetting)
  953.     {
  954.         return null != (_couponSetting = couponSetting);
  955.     }

  956.     @Override public org.drip.product.params.CouponSetting couponSetting()
  957.     {
  958.         return _couponSetting;
  959.     }

  960.     @Override public boolean setFloaterSetting (
  961.         final org.drip.product.params.FloaterSetting fltParams)
  962.     {
  963.         return null == (_floaterSetting = fltParams);
  964.     }

  965.     @Override public org.drip.product.params.FloaterSetting floaterSetting()
  966.     {
  967.         return _floaterSetting;
  968.     }

  969.     @Override public boolean setMarketConvention (
  970.         final org.drip.product.params.QuoteConvention quoteConvention)
  971.     {
  972.         return null == (_quoteConvention = quoteConvention);
  973.     }

  974.     @Override public org.drip.product.params.QuoteConvention marketConvention()
  975.     {
  976.         return _quoteConvention;
  977.     }

  978.     @Override public boolean setCreditSetting (
  979.         final org.drip.product.params.CreditSetting creditSetting)
  980.     {
  981.         return null == (_creditSetting = creditSetting);
  982.     }

  983.     @Override public org.drip.product.params.CreditSetting creditSetting()
  984.     {
  985.         return _creditSetting;
  986.     }

  987.     @Override public boolean setTerminationSetting (
  988.         final org.drip.product.params.TerminationSetting terminationSetting)
  989.     {
  990.         return null == (_terminationSetting = terminationSetting);
  991.     }

  992.     @Override public org.drip.product.params.TerminationSetting terminationSetting()
  993.     {
  994.         return _terminationSetting;
  995.     }

  996.     @Override public boolean setStream (
  997.         final org.drip.product.params.BondStream stream)
  998.     {
  999.         return null != (_stream = stream);
  1000.     }

  1001.     @Override public org.drip.product.params.BondStream stream()
  1002.     {
  1003.         return _stream;
  1004.     }

  1005.     @Override public boolean setNotionalSetting (
  1006.         final org.drip.product.params.NotionalSetting notionalSetting)
  1007.     {
  1008.         return null == (_notionalSetting = notionalSetting);
  1009.     }

  1010.     @Override public org.drip.product.params.NotionalSetting notionalSetting()
  1011.     {
  1012.         return _notionalSetting;
  1013.     }

  1014.     @Override public java.lang.String primaryCode()
  1015.     {
  1016.         return null == _idParams ? null : "BOND." + _idParams.id();
  1017.     }

  1018.     @Override public void setPrimaryCode (
  1019.         final java.lang.String strCode)
  1020.     {
  1021.         // _strCode = strCode;
  1022.     }

  1023.     @Override public java.lang.String[] secondaryCode()
  1024.     {
  1025.         return new java.lang.String[] {_idParams.id()};
  1026.     }

  1027.     @Override public java.lang.String isin()
  1028.     {
  1029.         return null == _idParams ? null : _idParams.isin();
  1030.     }

  1031.     @Override public java.lang.String cusip()
  1032.     {
  1033.         return null == _idParams ? null : _idParams.cusip();
  1034.     }

  1035.     @Override public java.lang.String name()
  1036.     {
  1037.         return null == _idParams ? null : _idParams.id();
  1038.     }

  1039.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String> couponCurrency()
  1040.     {
  1041.         org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String> mapCouponCurrency = new
  1042.             org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String>();

  1043.         mapCouponCurrency.put (name(), _stream.couponCurrency());

  1044.         return mapCouponCurrency;
  1045.     }

  1046.     @Override public java.lang.String payCurrency()
  1047.     {
  1048.         return _stream.couponCurrency();
  1049.     }

  1050.     @Override public java.lang.String principalCurrency()
  1051.     {
  1052.         return _notionalSetting.denominationCurrency();
  1053.     }

  1054.     @Override public double notional (
  1055.         final int iDate)
  1056.         throws java.lang.Exception
  1057.     {
  1058.         if (null == _notionalSetting || null == _notionalSetting.outstandingFactorSchedule())
  1059.             throw new java.lang.Exception ("BondComponent::notional => Bad state/inputs");

  1060.         return _notionalSetting.outstandingFactorSchedule().y (iDate);
  1061.     }

  1062.     @Override public double notional (
  1063.         final int iStartDate,
  1064.         final int iEndDate)
  1065.         throws java.lang.Exception
  1066.     {
  1067.         if (null == _notionalSetting || null == _notionalSetting.outstandingFactorSchedule())
  1068.             throw new java.lang.Exception ("BondComponent::notional => Bad state/inputs");

  1069.         return _notionalSetting.outstandingFactorSchedule().y (iStartDate, iEndDate);
  1070.     }

  1071.     @Override public double initialNotional()
  1072.         throws java.lang.Exception
  1073.     {
  1074.         if (null == _notionalSetting)
  1075.             throw new java.lang.Exception ("BondComponent::initialNotional => Bad state/inputs");

  1076.         return _notionalSetting.notionalAmount();
  1077.     }

  1078.     public double couponFactor (
  1079.         final int iDate)
  1080.         throws java.lang.Exception
  1081.     {
  1082.         if (null == _couponSetting) return 1.;

  1083.         org.drip.numerical.common.Array2D fsCoupon = _couponSetting.factorSchedule();

  1084.         return null == fsCoupon ? 1. : fsCoupon.y (iDate);
  1085.     }

  1086.     @Override public double recovery (
  1087.         final int iDate,
  1088.         final org.drip.state.credit.CreditCurve cc)
  1089.         throws java.lang.Exception
  1090.     {
  1091.         if (null == cc) throw new java.lang.Exception ("BondComponent::recovery: Bad state/inputs");

  1092.         return _creditSetting.useCurveRecovery() ? cc.recovery (iDate) : _creditSetting.recovery();
  1093.     }

  1094.     @Override public double recovery (
  1095.         final int iStartDate,
  1096.         final int iEndDate,
  1097.         final org.drip.state.credit.CreditCurve cc)
  1098.         throws java.lang.Exception
  1099.     {
  1100.         if (null == cc) throw new java.lang.Exception ("BondComponent::recovery: Bad state/inputs");

  1101.         return _creditSetting.useCurveRecovery() ? cc.effectiveRecovery (iStartDate, iEndDate) :
  1102.             _creditSetting.recovery();
  1103.     }

  1104.     @Override public org.drip.product.params.CreditSetting creditValuationParams()
  1105.     {
  1106.         return _creditSetting;
  1107.     }

  1108.     @Override public org.drip.analytics.output.CompositePeriodCouponMetrics couponMetrics (
  1109.         final int iAccrualEndDate,
  1110.         final org.drip.param.valuation.ValuationParams valParams,
  1111.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1112.     {
  1113.         org.drip.analytics.cashflow.CompositePeriod cp = currentPeriod (iAccrualEndDate);

  1114.         if (null == cp) return null;

  1115.         java.util.List<org.drip.analytics.output.UnitPeriodMetrics> lsUPM = new
  1116.             java.util.ArrayList<org.drip.analytics.output.UnitPeriodMetrics>();

  1117.         try {
  1118.             lsUPM.add (new org.drip.analytics.output.UnitPeriodMetrics (cp.startDate(), cp.endDate(),
  1119.                 cp.couponDCF(), cp.couponMetrics (valParams.valueDate(), csqc).rate(), new
  1120.                     org.drip.analytics.output.ConvexityAdjustment()));
  1121.         } catch (java.lang.Exception e) {
  1122.             e.printStackTrace();

  1123.             return null;
  1124.         }

  1125.         return org.drip.analytics.output.CompositePeriodCouponMetrics.Create (lsUPM);
  1126.     }

  1127.     @Override public int freq()
  1128.     {
  1129.         return couponPeriods().get (0).freq();
  1130.     }

  1131.     @Override public org.drip.state.identifier.EntityCDSLabel creditLabel()
  1132.     {
  1133.         if (null == _creditSetting) return null;

  1134.         java.lang.String strCreditCurveName = _creditSetting.creditCurveName();

  1135.         return null == strCreditCurveName  || strCreditCurveName.isEmpty() ? null :
  1136.             org.drip.state.identifier.EntityCDSLabel.Standard (strCreditCurveName, currency());
  1137.     }

  1138.     @Override public
  1139.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.ForwardLabel>
  1140.             forwardLabel()
  1141.     {
  1142.         if (null == _floaterSetting) return null;

  1143.         org.drip.state.identifier.FloaterLabel floaterLabel = _floaterSetting.fri();

  1144.         if (!(floaterLabel instanceof org.drip.state.identifier.ForwardLabel)) return null;

  1145.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.ForwardLabel>
  1146.             mapForwardLabel = new
  1147.                 org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.ForwardLabel>();

  1148.         mapForwardLabel.put (
  1149.             name(),
  1150.             (org.drip.state.identifier.ForwardLabel) floaterLabel
  1151.         );

  1152.         return mapForwardLabel;
  1153.     }

  1154.     @Override public
  1155.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.OTCFixFloatLabel>
  1156.             otcFixFloatLabel()
  1157.     {
  1158.         if (null == _floaterSetting) return null;

  1159.         org.drip.state.identifier.FloaterLabel floaterLabel = _floaterSetting.fri();

  1160.         if (!(floaterLabel instanceof org.drip.state.identifier.OTCFixFloatLabel)) return null;

  1161.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.OTCFixFloatLabel>
  1162.             mapOTCFixFloatLabel = new
  1163.                 org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.OTCFixFloatLabel>();

  1164.         mapOTCFixFloatLabel.put (
  1165.             name(),
  1166.             (org.drip.state.identifier.OTCFixFloatLabel) floaterLabel
  1167.         );

  1168.         return mapOTCFixFloatLabel;
  1169.     }

  1170.     @Override public org.drip.state.identifier.FundingLabel fundingLabel()
  1171.     {
  1172.         return org.drip.state.identifier.FundingLabel.Standard (payCurrency());
  1173.     }

  1174.     @Override public org.drip.state.identifier.GovvieLabel govvieLabel()
  1175.     {
  1176.         return org.drip.state.identifier.GovvieLabel.Standard
  1177.             (org.drip.market.issue.TreasurySettingContainer.CurrencyBenchmarkCode (payCurrency()));
  1178.     }

  1179.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.FXLabel>
  1180.         fxLabel()
  1181.     {
  1182.         return null;
  1183.     }

  1184.     @Override public
  1185.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.state.identifier.VolatilityLabel>
  1186.             volatilityLabel()
  1187.     {
  1188.         return null;
  1189.     }

  1190.     @Override public org.drip.analytics.date.JulianDate effectiveDate()
  1191.     {
  1192.         return _stream.effective();
  1193.     }

  1194.     @Override public org.drip.analytics.date.JulianDate maturityDate()
  1195.     {
  1196.         return _stream.maturity();
  1197.     }

  1198.     @Override public org.drip.analytics.date.JulianDate maturityPayDate()
  1199.     {
  1200.         return new org.drip.analytics.date.JulianDate (terminationAdjust (maturityDate().julian()));
  1201.     }

  1202.     @Override public org.drip.analytics.date.JulianDate firstCouponDate()
  1203.     {
  1204.         return new org.drip.analytics.date.JulianDate (couponPeriods().get (0).endDate());
  1205.     }

  1206.     @Override public java.util.List<org.drip.analytics.cashflow.CompositePeriod> couponPeriods()
  1207.     {
  1208.         return _stream.periods();
  1209.     }

  1210.     @Override public org.drip.param.valuation.CashSettleParams cashSettleParams()
  1211.     {
  1212.         return null == _quoteConvention ? null : _quoteConvention.cashSettleParams();
  1213.     }

  1214.     @Override public java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> lossFlow (
  1215.         final org.drip.param.valuation.ValuationParams valParams,
  1216.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  1217.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1218.     {
  1219.         if (null == valParams || null == pricerParams || null == csqc) return null;

  1220.         java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> sLP = new
  1221.             java.util.ArrayList<org.drip.analytics.cashflow.LossQuadratureMetrics>();

  1222.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1223.             if (null == period) continue;

  1224.             java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> sLPSub = period.lossMetrics
  1225.                 (this, valParams, pricerParams, period.endDate(), csqc);

  1226.             if (null != sLPSub) sLP.addAll (sLPSub);
  1227.         }

  1228.         return sLP;
  1229.     }

  1230.     @Override public java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> lossFlowFromPrice (
  1231.         final org.drip.param.valuation.ValuationParams valParams,
  1232.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  1233.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1234.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  1235.         final double dblPrice)
  1236.     {
  1237.         if (null == valParams || null == pricerParams || null == csqc ||
  1238.             !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  1239.             return null;

  1240.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  1241.         if (null == wi) return null;

  1242.         int iValueDate = valParams.valueDate();

  1243.         int iWorkoutDate = wi.date();

  1244.         java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> sLP = new
  1245.             java.util.ArrayList<org.drip.analytics.cashflow.LossQuadratureMetrics>();

  1246.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1247.             if (null == period) continue;

  1248.             int iPeriodEndDate = period.endDate();

  1249.             if (null == period || iPeriodEndDate < iValueDate) continue;

  1250.             if (period.startDate() > iWorkoutDate) break;

  1251.             java.util.List<org.drip.analytics.cashflow.LossQuadratureMetrics> sLPSub = period.lossMetrics
  1252.                 (this, valParams, pricerParams, iPeriodEndDate, csqc);

  1253.             if (null != sLPSub) sLP.addAll (sLPSub);
  1254.         }

  1255.         return sLP;
  1256.     }

  1257.     @Override public boolean isFloater()
  1258.     {
  1259.         return null == _floaterSetting ? false : true;
  1260.     }

  1261.     @Override public java.lang.String rateIndex()
  1262.     {
  1263.         return null == _floaterSetting ? "" : _floaterSetting.fri().fullyQualifiedName();
  1264.     }

  1265.     @Override public double currentCoupon()
  1266.     {
  1267.         return null == _floaterSetting ? java.lang.Double.NaN : _floaterSetting.currentFullCoupon();
  1268.     }

  1269.     @Override public double floatSpread()
  1270.     {
  1271.         return null == _floaterSetting ? java.lang.Double.NaN : _floaterSetting.spread();
  1272.     }

  1273.     @Override public java.lang.String ticker()
  1274.     {
  1275.         return null == _idParams ? null : _idParams.ticker();
  1276.     }

  1277.     @Override public void setEmbeddedCallSchedule (
  1278.         final org.drip.product.params.EmbeddedOptionSchedule eos)
  1279.     {
  1280.         if (null == eos || eos.isPut()) return;

  1281.         _eosCall = new org.drip.product.params.EmbeddedOptionSchedule (eos);
  1282.     }

  1283.     @Override public void setEmbeddedPutSchedule (
  1284.         final org.drip.product.params.EmbeddedOptionSchedule eos)
  1285.     {
  1286.         if (null == eos || !eos.isPut()) return;

  1287.         _eosPut = new org.drip.product.params.EmbeddedOptionSchedule (eos);
  1288.     }

  1289.     @Override public boolean callable()
  1290.     {
  1291.         return null != _eosCall;
  1292.     }

  1293.     @Override public boolean putable()
  1294.     {
  1295.         return null != _eosPut;
  1296.     }

  1297.     @Override public boolean sinkable()
  1298.     {
  1299.         return null == _notionalSetting ? false : true;
  1300.     }

  1301.     @Override public boolean variableCoupon()
  1302.     {
  1303.         return null == _couponSetting || null == _couponSetting.couponType() || !"variable".equalsIgnoreCase
  1304.             (_couponSetting.couponType()) ? false : true;
  1305.     }

  1306.     @Override public boolean exercised()
  1307.     {
  1308.         return null == _terminationSetting ? false : _terminationSetting.exercised();
  1309.     }

  1310.     @Override public boolean defaulted()
  1311.     {
  1312.         return null == _terminationSetting ? false : _terminationSetting.defaulted();
  1313.     }

  1314.     @Override public boolean perpetual()
  1315.     {
  1316.         return null == _terminationSetting ? false : _terminationSetting.perpetual();
  1317.     }

  1318.     @Override public boolean tradeable (
  1319.         final org.drip.param.valuation.ValuationParams valParams)
  1320.         throws java.lang.Exception
  1321.     {
  1322.         if (null == valParams) throw new java.lang.Exception ("BondComponent::tradeable => invalid Inputs");

  1323.         return !_terminationSetting.exercised() && !_terminationSetting.defaulted() && valParams.valueDate()
  1324.             < maturityDate().julian();
  1325.     }

  1326.     @Override public org.drip.product.params.EmbeddedOptionSchedule callSchedule()
  1327.     {
  1328.         return _eosCall;
  1329.     }

  1330.     @Override public org.drip.product.params.EmbeddedOptionSchedule putSchedule()
  1331.     {
  1332.         return _eosPut;
  1333.     }

  1334.     @Override public java.lang.String couponType()
  1335.     {
  1336.         return null == _couponSetting ? "" : _couponSetting.couponType();
  1337.     }

  1338.     @Override public java.lang.String couponDC()
  1339.     {
  1340.         return null == _stream ? "" : _stream.couponDC();
  1341.     }

  1342.     @Override public java.lang.String accrualDC()
  1343.     {
  1344.         return null == _stream ? "" : _stream.accrualDC();
  1345.     }

  1346.     @Override public java.lang.String maturityType()
  1347.     {
  1348.         return null == _stream ? "" : maturityType();
  1349.     }

  1350.     @Override public org.drip.analytics.date.JulianDate finalMaturity()
  1351.     {
  1352.         return null == _stream ? null : new org.drip.analytics.date.JulianDate (_stream.finalMaturityDate());
  1353.     }

  1354.     @Override public java.lang.String calculationType()
  1355.     {
  1356.         return null == _quoteConvention ? "" : _quoteConvention.calculationType();
  1357.     }

  1358.     @Override public double redemptionValue()
  1359.     {
  1360.         return null == _quoteConvention ? java.lang.Double.NaN : _quoteConvention.redemptionValue();
  1361.     }

  1362.     @Override public java.lang.String currency()
  1363.     {
  1364.         return _stream.couponCurrency();
  1365.     }

  1366.     @Override public java.lang.String redemptionCurrency()
  1367.     {
  1368.         return _notionalSetting.denominationCurrency();
  1369.     }

  1370.     @Override public boolean inFirstCouponPeriod (
  1371.         final int iDate)
  1372.         throws java.lang.Exception
  1373.     {
  1374.         return _stream.firstPeriod().contains (iDate);
  1375.     }

  1376.     @Override public boolean inLastCouponPeriod (
  1377.         final int iDate)
  1378.         throws java.lang.Exception
  1379.     {
  1380.         return _stream.lastPeriod().contains (iDate);
  1381.     }

  1382.     @Override public java.lang.String floatCouponConvention()
  1383.     {
  1384.         return null == _floaterSetting ? null : _floaterSetting.dayCount();
  1385.     }

  1386.     @Override public org.drip.analytics.date.JulianDate periodFixingDate (
  1387.         final int iValueDate)
  1388.     {
  1389.         if (null == _floaterSetting || iValueDate >= maturityDate().julian()) return null;

  1390.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1391.             if (period.payDate() < iValueDate) continue;

  1392.             org.drip.analytics.cashflow.ComposableUnitPeriod cup = period.periods().get (0);

  1393.             if (!(cup instanceof org.drip.analytics.cashflow.ComposableUnitFloatingPeriod)) continue;

  1394.             try {
  1395.                 return new org.drip.analytics.date.JulianDate
  1396.                     (((org.drip.analytics.cashflow.ComposableUnitFloatingPeriod)
  1397.                         (cup)).referenceIndexPeriod().fixingDate());
  1398.             } catch (java.lang.Exception e) {
  1399.                 if (!s_bSuppressErrors) e.printStackTrace();
  1400.             }
  1401.         }

  1402.         return null;
  1403.     }

  1404.     @Override public org.drip.analytics.date.JulianDate previousCouponDate (
  1405.         final org.drip.analytics.date.JulianDate dt)
  1406.     {
  1407.         if (null == dt || dt.julian() > maturityDate().julian()) return null;

  1408.         try {
  1409.             int iIndex = _stream.periodIndex (dt.julian());

  1410.             if (0 == iIndex) return new org.drip.analytics.date.JulianDate (_stream.period (0).startDate());
  1411.            
  1412.             org.drip.analytics.cashflow.CompositePeriod period = _stream.period (iIndex - 1);

  1413.             return null == period ? null : new org.drip.analytics.date.JulianDate (period.payDate());
  1414.         } catch (java.lang.Exception e) {
  1415.             if (!s_bSuppressErrors) e.printStackTrace();
  1416.         }

  1417.         return null;
  1418.     }

  1419.     @Override public double previousCouponRate (
  1420.         final org.drip.analytics.date.JulianDate dt,
  1421.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1422.         throws java.lang.Exception
  1423.     {
  1424.         if (null == dt)
  1425.             throw new java.lang.Exception ("BondComponent::previousCouponRate => Invalid Inputs");

  1426.         org.drip.analytics.cashflow.CompositePeriod period = _stream.period (_stream.periodIndex
  1427.             (dt.julian()) - 1);

  1428.         if (null == period)
  1429.             throw new java.lang.Exception
  1430.                 ("BondComponent::previousCouponRate => Cannot find previous period!");

  1431.         org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (period.endDate(), new
  1432.             org.drip.param.valuation.ValuationParams (dt, dt, ""), csqc);

  1433.         if (null == cpcm)
  1434.             throw new java.lang.Exception
  1435.                 ("BondComponent::previousCouponRate => Invalid previous period metrics!");

  1436.         return cpcm.rate();
  1437.     }

  1438.     @Override public org.drip.analytics.date.JulianDate currentCouponDate (
  1439.         final org.drip.analytics.date.JulianDate dt)
  1440.     {
  1441.         if (null == dt || dt.julian() > maturityDate().julian()) return null;

  1442.         try {
  1443.             org.drip.analytics.cashflow.CompositePeriod period = _stream.period (_stream.periodIndex
  1444.                 (dt.julian()));

  1445.             return null == period ? null : new org.drip.analytics.date.JulianDate (period.payDate());
  1446.         } catch (java.lang.Exception e) {
  1447.         }

  1448.         return null;
  1449.     }

  1450.     @Override public org.drip.analytics.date.JulianDate nextCouponDate (
  1451.         final org.drip.analytics.date.JulianDate dt)
  1452.     {
  1453.         if (null == dt || dt.julian() > maturityDate().julian()) return null;

  1454.         try {
  1455.             org.drip.analytics.cashflow.CompositePeriod period = _stream.period (_stream.periodIndex
  1456.                 (dt.julian()) + 1);

  1457.             return null == period ? null : new org.drip.analytics.date.JulianDate (period.payDate());
  1458.         } catch (java.lang.Exception e) {
  1459.         }

  1460.         return null;
  1461.     }

  1462.     @Override public org.drip.analytics.output.ExerciseInfo nextValidExerciseDateOfType (
  1463.         final org.drip.analytics.date.JulianDate dt,
  1464.         final boolean bPut)
  1465.     {
  1466.         if (null == dt || (bPut && null == _eosPut) || (!bPut && null == _eosCall)) return null;

  1467.         org.drip.product.params.EmbeddedOptionSchedule eos = bPut ? _eosPut : _eosCall;

  1468.         int[] aiEOSExerciseDates = eos.dates();

  1469.         if (null == eos || null == aiEOSExerciseDates) return null;

  1470.         int iNumExerciseDates = aiEOSExerciseDates.length;

  1471.         if (0 == iNumExerciseDates) return null;

  1472.         for (int i = 0; i < iNumExerciseDates; ++i) {
  1473.             if (aiEOSExerciseDates[i] - dt.julian() < eos.exerciseNoticePeriod())
  1474.                 continue;

  1475.             try {
  1476.                 return new org.drip.analytics.output.ExerciseInfo (aiEOSExerciseDates[i], eos.factor (i),
  1477.                     bPut ? org.drip.param.valuation.WorkoutInfo.WO_TYPE_PUT :
  1478.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_CALL);
  1479.             } catch (java.lang.Exception e) {
  1480.                 if (!s_bSuppressErrors) e.printStackTrace();

  1481.                 return null;
  1482.             }
  1483.         }

  1484.         return null;
  1485.     }

  1486.     @Override public org.drip.analytics.output.ExerciseInfo nextValidExerciseInfo (
  1487.         final org.drip.analytics.date.JulianDate dt)
  1488.     {
  1489.         if (null == dt) return null;

  1490.         org.drip.analytics.output.ExerciseInfo neiNextCall = nextValidExerciseDateOfType (dt, false);

  1491.         org.drip.analytics.output.ExerciseInfo neiNextPut = nextValidExerciseDateOfType (dt, true);

  1492.         if (null == neiNextCall && null == neiNextPut) {
  1493.             try {
  1494.                 return new org.drip.analytics.output.ExerciseInfo (maturityDate().julian(), 1.,
  1495.                     org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  1496.             } catch (java.lang.Exception e) {
  1497.                 if (!s_bSuppressErrors) e.printStackTrace();

  1498.                 return null;
  1499.             }
  1500.         }

  1501.         if (null != neiNextCall && null == neiNextPut) return neiNextCall;

  1502.         if (null == neiNextCall && null != neiNextPut) return neiNextPut;

  1503.         return neiNextCall.date() < neiNextPut.date() ? neiNextCall : neiNextPut;
  1504.     }

  1505.     @Override public double currentCouponRate (
  1506.         final org.drip.analytics.date.JulianDate dt,
  1507.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1508.         throws java.lang.Exception
  1509.     {
  1510.         if (null == dt || null == csqc)
  1511.             throw new java.lang.Exception ("BondComponent::currentCouponRate => Null val/mkt params!");

  1512.         if (null != _floaterSetting) {
  1513.             double dblCurrentFullCoupon = _floaterSetting.currentFullCoupon();

  1514.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblCurrentFullCoupon))
  1515.                 return dblCurrentFullCoupon;
  1516.         }

  1517.         org.drip.analytics.output.CompositePeriodCouponMetrics pcm = couponMetrics (dt.julian(), new
  1518.             org.drip.param.valuation.ValuationParams (dt, dt, ""), csqc);

  1519.         if (null == pcm) throw new java.lang.Exception ("BondComponent::currentCouponRate => Null PCM!");

  1520.         return pcm.rate();
  1521.     }

  1522.     @Override public double nextCouponRate (
  1523.         final org.drip.analytics.date.JulianDate dt,
  1524.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1525.         throws java.lang.Exception
  1526.     {
  1527.         if (null == dt)
  1528.             throw new java.lang.Exception ("BondComponent::nextCouponRate => Null val/mkt params!");

  1529.         int iIndex = _stream.periodIndex (dt.julian());

  1530.         org.drip.analytics.cashflow.CompositePeriod period = _stream.period (iIndex + 1);

  1531.         if (null == period)
  1532.             throw new java.lang.Exception ("BondComponent::nextCouponRate => Cannot find next period!");

  1533.         org.drip.analytics.output.CompositePeriodCouponMetrics pcm = couponMetrics (period.endDate(), new
  1534.             org.drip.param.valuation.ValuationParams (dt, dt, ""), csqc);

  1535.         if (null == pcm) throw new java.lang.Exception ("BondComponent::nextCouponRate => Null PCM!");

  1536.         return pcm.rate();
  1537.     }

  1538.     @Override public double accrued (
  1539.         final int iDate,
  1540.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1541.         throws java.lang.Exception
  1542.     {
  1543.         org.drip.analytics.date.JulianDate dt = new org.drip.analytics.date.JulianDate (iDate);

  1544.         if (iDate >= maturityDate().julian())
  1545.             throw new java.lang.Exception ("BondComponent::accrued => Val date " + dt +
  1546.                 " greater than maturity " + maturityDate());

  1547.         org.drip.param.valuation.ValuationParams valParams = new org.drip.param.valuation.ValuationParams
  1548.             (dt, dt, "");

  1549.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1550.             int iEndDate = period.endDate();

  1551.             int iStartDate = period.startDate();

  1552.             if (iStartDate < iDate && iEndDate >= iDate) {
  1553.                 org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iEndDate,
  1554.                     valParams, csqc);

  1555.                 if (null == cpcm) throw new java.lang.Exception ("BondComponent::accrued => No PCM");

  1556.                 double dblCoupon = cpcm.rate();

  1557.                 if (!org.drip.numerical.common.NumberUtil.IsValid (dblCoupon))
  1558.                     throw new java.lang.Exception ("BondComponent::accrued => Invalid Coupon For " + dt);

  1559.                 return period.accrualDCF (iDate) * dblCoupon * notional (iStartDate) * couponFactor
  1560.                     (iEndDate);
  1561.             }
  1562.         }

  1563.         return 0.;
  1564.     }

  1565.     @Override public int weightedAverageMaturityDate (
  1566.         final org.drip.param.valuation.ValuationParams valParams,
  1567.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1568.         final int iWorkoutDate,
  1569.         final double dblWorkoutFactor)
  1570.         throws java.lang.Exception
  1571.     {
  1572.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1573.             throw new java.lang.Exception ("BondComponent::weightedAverageMaturityDate => Invalid Inputs");

  1574.         int iValueDate = valParams.valueDate();

  1575.         if (iValueDate >= iWorkoutDate)
  1576.             throw new java.lang.Exception ("BondComponent::weightedAverageMaturityDate => Val date " +
  1577.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  1578.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  1579.         int iPeriodEndDate = 0;
  1580.         double dblTotalCashflow = 0.;
  1581.         boolean bTerminateCouponFlow = false;
  1582.         double dblTimeWeightedTotalCashflow = 0.;
  1583.         double dblFlatForwardRate = java.lang.Double.NaN;

  1584.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  1585.             _quoteConvention.valuationCustomizationParams();

  1586.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  1587.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1588.             int iPeriodPayDate = period.payDate();

  1589.             if (iPeriodPayDate < iValueDate) continue;

  1590.             int iNotionalEndDate = period.endDate();

  1591.             int iPeriodStartDate = period.startDate();

  1592.             int iAccrualEndDate = iNotionalEndDate;
  1593.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1594.             if (iAccrualEndDate >= iWorkoutDate) {
  1595.                 bTerminateCouponFlow = true;
  1596.                 iAccrualEndDate = iWorkoutDate;
  1597.                 iNotionalEndDate = iWorkoutDate;
  1598.             }

  1599.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iAccrualEndDate,
  1600.                 valParams, csqc);

  1601.             if (null == cpcm)
  1602.                 throw new java.lang.Exception ("BondComponent::weightedAverageMaturityDate => No CPCM");

  1603.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1604.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1605.             double dblCouponNotional = dblPeriodStartNotional;

  1606.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  1607.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  1608.                 dblCouponNotional = dblPeriodStartNotional;
  1609.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  1610.                 dblCouponNotional = dblPeriodEndNotional;
  1611.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  1612.                 iPeriodAmortizationMode)
  1613.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  1614.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1615.                 (iAccrualStartDate);

  1616.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  1617.                 dblFlatForwardRate = cpcm.rate();

  1618.             double dblPeriodCashflow = dblPeriodTimeWidth * (bApplyFlatForward ? dblFlatForwardRate :
  1619.                 cpcm.rate()) * couponFactor (iPeriodEndDate) * dblCouponNotional + dblPeriodStartNotional -
  1620.                     dblPeriodEndNotional;

  1621.             dblTotalCashflow += dblPeriodCashflow;
  1622.             iPeriodEndDate += (iAccrualEndDate - iAccrualStartDate);
  1623.             dblTimeWeightedTotalCashflow += iPeriodEndDate * dblPeriodCashflow;

  1624.             if (bTerminateCouponFlow) break;
  1625.         }

  1626.         double dblTerminalCashflow = dblWorkoutFactor * notional (iWorkoutDate);

  1627.         dblTotalCashflow += dblTerminalCashflow;
  1628.         dblTimeWeightedTotalCashflow += iPeriodEndDate * dblTerminalCashflow;
  1629.         return (int) (dblTimeWeightedTotalCashflow / dblTotalCashflow);
  1630.     }

  1631.     @Override public int weightedAverageMaturityDate (
  1632.         final org.drip.param.valuation.ValuationParams valParams,
  1633.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1634.         throws java.lang.Exception
  1635.     {
  1636.         return weightedAverageMaturityDate (valParams, csqc, maturityDate().julian(), 1.);
  1637.     }

  1638.     @Override public double weightedAverageLife (
  1639.         final org.drip.param.valuation.ValuationParams valParams,
  1640.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1641.         final int iWorkoutDate,
  1642.         final double dblWorkoutFactor)
  1643.         throws java.lang.Exception
  1644.     {
  1645.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1646.             throw new java.lang.Exception ("BondComponent::weightedAverageLife => Invalid Inputs");

  1647.         int iValueDate = valParams.valueDate();

  1648.         if (iValueDate >= iWorkoutDate)
  1649.             throw new java.lang.Exception ("BondComponent::weightedAverageLife => Val date " +
  1650.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  1651.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  1652.         double dblTotalCashflow = 0.;
  1653.         double dblPeriodEndTime = 0.;
  1654.         boolean bTerminateCouponFlow = false;
  1655.         double dblTimeWeightedTotalCashflow = 0.;
  1656.         double dblFlatForwardRate = java.lang.Double.NaN;

  1657.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  1658.             _quoteConvention.valuationCustomizationParams();

  1659.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  1660.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1661.             int iPeriodPayDate = period.payDate();

  1662.             if (iPeriodPayDate < iValueDate) continue;

  1663.             int iNotionalEndDate = period.endDate();

  1664.             int iPeriodStartDate = period.startDate();

  1665.             int iAccrualEndDate = iNotionalEndDate;
  1666.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1667.             if (iAccrualEndDate >= iWorkoutDate) {
  1668.                 bTerminateCouponFlow = true;
  1669.                 iAccrualEndDate = iWorkoutDate;
  1670.                 iNotionalEndDate = iWorkoutDate;
  1671.             }

  1672.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iAccrualEndDate,
  1673.                 valParams, csqc);

  1674.             if (null == cpcm)
  1675.                 throw new java.lang.Exception ("BondComponent::weightedAverageLife => No CPCM");

  1676.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1677.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1678.             double dblCouponNotional = dblPeriodStartNotional;

  1679.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  1680.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  1681.                 dblCouponNotional = dblPeriodStartNotional;
  1682.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  1683.                 dblCouponNotional = dblPeriodEndNotional;
  1684.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  1685.                 iPeriodAmortizationMode)
  1686.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  1687.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1688.                 (iAccrualStartDate);

  1689.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  1690.                 dblFlatForwardRate = cpcm.rate();

  1691.             double dblPeriodCashflow = dblPeriodTimeWidth * (bApplyFlatForward ? dblFlatForwardRate :
  1692.                 cpcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional + dblPeriodStartNotional -
  1693.                     dblPeriodEndNotional;

  1694.             dblTotalCashflow += dblPeriodCashflow;
  1695.             dblPeriodEndTime += dblPeriodTimeWidth;
  1696.             dblTimeWeightedTotalCashflow += dblPeriodEndTime * dblPeriodCashflow;

  1697.             if (bTerminateCouponFlow) break;
  1698.         }

  1699.         double dblTerminalCashflow = dblWorkoutFactor * notional (iWorkoutDate);

  1700.         dblTotalCashflow += dblTerminalCashflow;
  1701.         dblTimeWeightedTotalCashflow += dblPeriodEndTime * dblTerminalCashflow;
  1702.         return dblTimeWeightedTotalCashflow / dblTotalCashflow;
  1703.     }

  1704.     @Override public double weightedAverageLife (
  1705.         final org.drip.param.valuation.ValuationParams valParams,
  1706.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1707.         throws java.lang.Exception
  1708.     {
  1709.         return weightedAverageLife (valParams, csqc, maturityDate().julian(), 1.);
  1710.     }

  1711.     @Override public double weightedAverageLifePrincipalOnly (
  1712.         final org.drip.param.valuation.ValuationParams valParams,
  1713.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1714.         final int iWorkoutDate,
  1715.         final double dblWorkoutFactor)
  1716.         throws java.lang.Exception
  1717.     {
  1718.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1719.             throw new java.lang.Exception
  1720.                 ("BondComponent::weightedAverageLifePrincipalOnly => Invalid Inputs");

  1721.         int iValueDate = valParams.valueDate();

  1722.         if (iValueDate >= iWorkoutDate)
  1723.             throw new java.lang.Exception ("BondComponent::weightedAverageLifePrincipalOnly => Val date " +
  1724.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  1725.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  1726.         double dblTotalCashflow = 0.;
  1727.         double dblPeriodEndTime = 0.;
  1728.         boolean bTerminateCouponFlow = false;
  1729.         double dblTimeWeightedTotalCashflow = 0.;

  1730.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1731.             int iPeriodPayDate = period.payDate();

  1732.             if (iPeriodPayDate < iValueDate) continue;

  1733.             int iNotionalEndDate = period.endDate();

  1734.             int iPeriodStartDate = period.startDate();

  1735.             int iAccrualEndDate = iNotionalEndDate;
  1736.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1737.             if (iAccrualEndDate >= iWorkoutDate) {
  1738.                 bTerminateCouponFlow = true;
  1739.                 iAccrualEndDate = iWorkoutDate;
  1740.                 iNotionalEndDate = iWorkoutDate;
  1741.             }

  1742.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1743.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1744.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1745.                 (iAccrualStartDate);

  1746.             double dblPeriodCashflow = dblPeriodStartNotional - dblPeriodEndNotional;
  1747.             dblTimeWeightedTotalCashflow += dblPeriodEndTime * dblPeriodCashflow;
  1748.             dblTotalCashflow += dblPeriodCashflow;
  1749.             dblPeriodEndTime += dblPeriodTimeWidth;

  1750.             if (bTerminateCouponFlow) break;
  1751.         }

  1752.         double dblTerminalCashflow = dblWorkoutFactor * notional (iWorkoutDate);

  1753.         dblTotalCashflow += dblTerminalCashflow;
  1754.         dblTimeWeightedTotalCashflow += dblPeriodEndTime * dblTerminalCashflow;
  1755.         return dblTimeWeightedTotalCashflow / dblTotalCashflow;
  1756.     }

  1757.     @Override public double weightedAverageLifePrincipalOnly (
  1758.         final org.drip.param.valuation.ValuationParams valParams,
  1759.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1760.         throws java.lang.Exception
  1761.     {
  1762.         return weightedAverageLifePrincipalOnly (valParams, csqc, maturityDate().julian(), 1.);
  1763.     }

  1764.     @Override public double weightedAverageLifeCouponOnly (
  1765.         final org.drip.param.valuation.ValuationParams valParams,
  1766.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1767.         final int iWorkoutDate,
  1768.         final double dblWorkoutFactor)
  1769.         throws java.lang.Exception
  1770.     {
  1771.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1772.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeCouponOnly => Invalid Inputs");

  1773.         int iValueDate = valParams.valueDate();

  1774.         if (iValueDate >= iWorkoutDate)
  1775.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeCouponOnly => Val date " +
  1776.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  1777.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  1778.         double dblTotalCashflow = 0.;
  1779.         double dblPeriodEndTime = 0.;
  1780.         boolean bTerminateCouponFlow = false;
  1781.         double dblTimeWeightedTotalCashflow = 0.;
  1782.         double dblFlatForwardRate = java.lang.Double.NaN;

  1783.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  1784.             _quoteConvention.valuationCustomizationParams();

  1785.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  1786.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1787.             int iPeriodPayDate = period.payDate();

  1788.             if (iPeriodPayDate < iValueDate) continue;

  1789.             int iNotionalEndDate = period.endDate();

  1790.             int iPeriodStartDate = period.startDate();

  1791.             int iAccrualEndDate = iNotionalEndDate;
  1792.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1793.             if (iAccrualEndDate >= iWorkoutDate) {
  1794.                 bTerminateCouponFlow = true;
  1795.                 iAccrualEndDate = iWorkoutDate;
  1796.                 iNotionalEndDate = iWorkoutDate;
  1797.             }

  1798.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iAccrualEndDate,
  1799.                 valParams, csqc);

  1800.             if (null == cpcm)
  1801.                 throw new java.lang.Exception ("BondComponent::weightedAverageLifeCouponOnly => No CPCM");

  1802.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1803.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1804.             double dblCouponNotional = dblPeriodStartNotional;

  1805.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  1806.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  1807.                 dblCouponNotional = dblPeriodStartNotional;
  1808.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  1809.                 dblCouponNotional = dblPeriodEndNotional;
  1810.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  1811.                 iPeriodAmortizationMode)
  1812.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  1813.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1814.                 (iAccrualStartDate);

  1815.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  1816.                 dblFlatForwardRate = cpcm.rate();

  1817.             double dblPeriodCashflow = dblPeriodTimeWidth * (bApplyFlatForward ? dblFlatForwardRate :
  1818.                 cpcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional;

  1819.             dblTotalCashflow += dblPeriodCashflow;
  1820.             dblPeriodEndTime += dblPeriodTimeWidth;
  1821.             dblTimeWeightedTotalCashflow += dblPeriodEndTime * dblPeriodCashflow;

  1822.             if (bTerminateCouponFlow) break;
  1823.         }

  1824.         return dblTimeWeightedTotalCashflow / dblTotalCashflow;
  1825.     }

  1826.     @Override public double weightedAverageLifeCouponOnly (
  1827.         final org.drip.param.valuation.ValuationParams valParams,
  1828.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1829.         throws java.lang.Exception
  1830.     {
  1831.         return weightedAverageLifeCouponOnly (valParams, csqc, maturityDate().julian(), 1.);
  1832.     }

  1833.     @Override public double weightedAverageLifeLossOnly (
  1834.         final org.drip.param.valuation.ValuationParams valParams,
  1835.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1836.         final int iWorkoutDate,
  1837.         final double dblWorkoutFactor)
  1838.         throws java.lang.Exception
  1839.     {
  1840.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1841.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeLossOnly => Invalid Inputs");

  1842.         int iValueDate = valParams.valueDate();

  1843.         org.drip.state.credit.CreditCurve cc = csqc.creditState (creditLabel());

  1844.         if (iValueDate >= iWorkoutDate || null == cc)
  1845.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeLossOnly => Invalid Inputs");

  1846.         double dblPeriodEndTime = 0.;
  1847.         double dblTotalLossCashflow = 0.;
  1848.         boolean bTerminateCouponFlow = false;
  1849.         double dblTimeWeightedTotalLossCashflow = 0.;
  1850.         double dblFlatForwardRate = java.lang.Double.NaN;

  1851.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  1852.             _quoteConvention.valuationCustomizationParams();

  1853.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  1854.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1855.             int iPeriodPayDate = period.payDate();

  1856.             if (iPeriodPayDate < iValueDate) continue;

  1857.             int iNotionalEndDate = period.endDate();

  1858.             int iPeriodStartDate = period.startDate();

  1859.             int iAccrualEndDate = iNotionalEndDate;
  1860.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1861.             if (iAccrualEndDate >= iWorkoutDate) {
  1862.                 bTerminateCouponFlow = true;
  1863.                 iAccrualEndDate = iWorkoutDate;
  1864.                 iNotionalEndDate = iWorkoutDate;
  1865.             }

  1866.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iAccrualEndDate,
  1867.                 valParams, csqc);

  1868.             if (null == cpcm)
  1869.                 throw new java.lang.Exception ("BondComponent::weightedAverageLifeLossOnly => No CPCM");

  1870.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1871.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1872.             double dblCouponNotional = dblPeriodStartNotional;

  1873.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  1874.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  1875.                 dblCouponNotional = dblPeriodStartNotional;
  1876.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  1877.                 dblCouponNotional = dblPeriodEndNotional;
  1878.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  1879.                 iPeriodAmortizationMode)
  1880.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  1881.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1882.                 (iAccrualStartDate);

  1883.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  1884.                 dblFlatForwardRate = cpcm.rate();

  1885.             double dblPeriodLossCashflow = (dblPeriodTimeWidth * (bApplyFlatForward ? dblFlatForwardRate :
  1886.                 cpcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional + dblPeriodStartNotional -
  1887.                     dblPeriodEndNotional) * cc.survival (iPeriodPayDate) * (1. - cc.effectiveRecovery
  1888.                         (iPeriodStartDate, period.endDate()));

  1889.             dblPeriodEndTime += dblPeriodTimeWidth;
  1890.             dblTotalLossCashflow += dblPeriodLossCashflow;
  1891.             dblTimeWeightedTotalLossCashflow += dblPeriodEndTime * dblPeriodLossCashflow;

  1892.             if (bTerminateCouponFlow) break;
  1893.         }

  1894.         double dblTerminalLossCashflow = dblWorkoutFactor * notional (iWorkoutDate) * cc.survival
  1895.             (iWorkoutDate) * (1. - cc.recovery (iWorkoutDate));

  1896.         dblTotalLossCashflow += dblTerminalLossCashflow;
  1897.         dblTimeWeightedTotalLossCashflow += dblPeriodEndTime * dblTerminalLossCashflow;
  1898.         return dblTimeWeightedTotalLossCashflow / dblTotalLossCashflow;
  1899.     }

  1900.     @Override public double weightedAverageLifeLossOnly (
  1901.         final org.drip.param.valuation.ValuationParams valParams,
  1902.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1903.         throws java.lang.Exception
  1904.     {
  1905.         return weightedAverageLifeLossOnly (valParams, csqc, maturityDate().julian(), 1.);
  1906.     }

  1907.     @Override public double weightedAverageLifeCredit (
  1908.         final org.drip.param.valuation.ValuationParams valParams,
  1909.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1910.         final int iWorkoutDate,
  1911.         final double dblWorkoutFactor)
  1912.         throws java.lang.Exception
  1913.     {
  1914.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  1915.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeCredit => Invalid Inputs");

  1916.         int iValueDate = valParams.valueDate();

  1917.         org.drip.state.credit.CreditCurve cc = csqc.creditState (creditLabel());

  1918.         if (iValueDate >= iWorkoutDate || null == cc)
  1919.             throw new java.lang.Exception ("BondComponent::weightedAverageLifeCredit => Invalid Inputs");

  1920.         double dblPeriodEndTime = 0.;
  1921.         double dblTotalLossCashflow = 0.;
  1922.         boolean bTerminateCouponFlow = false;
  1923.         double dblTimeWeightedTotalLossCashflow = 0.;
  1924.         double dblFlatForwardRate = java.lang.Double.NaN;

  1925.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  1926.             _quoteConvention.valuationCustomizationParams();

  1927.         boolean bApplyFlatForward = null == vcp ? false : vcp.applyFlatForwardRate();

  1928.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  1929.             int iPeriodPayDate = period.payDate();

  1930.             if (iPeriodPayDate < iValueDate) continue;

  1931.             int iNotionalEndDate = period.endDate();

  1932.             int iPeriodStartDate = period.startDate();

  1933.             int iAccrualEndDate = iNotionalEndDate;
  1934.             int iAccrualStartDate = iPeriodStartDate > iValueDate ? iPeriodStartDate : iValueDate;

  1935.             if (iAccrualEndDate >= iWorkoutDate) {
  1936.                 bTerminateCouponFlow = true;
  1937.                 iAccrualEndDate = iWorkoutDate;
  1938.                 iNotionalEndDate = iWorkoutDate;
  1939.             }

  1940.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iAccrualEndDate,
  1941.                 valParams, csqc);

  1942.             if (null == cpcm)
  1943.                 throw new java.lang.Exception ("BondComponent::weightedAverageLifeCredit => No CPCM");

  1944.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  1945.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  1946.             double dblCouponNotional = dblPeriodStartNotional;

  1947.             int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  1948.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  1949.                 dblCouponNotional = dblPeriodStartNotional;
  1950.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  1951.                 dblCouponNotional = dblPeriodEndNotional;
  1952.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  1953.                 iPeriodAmortizationMode)
  1954.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  1955.             double dblPeriodTimeWidth = period.accrualDCF (iAccrualEndDate) - period.accrualDCF
  1956.                 (iAccrualStartDate);

  1957.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  1958.                 dblFlatForwardRate = cpcm.rate();

  1959.             double dblPeriodSurvival = cc.survival (iPeriodPayDate);

  1960.             double dblPeriodLossCashflow = (dblPeriodTimeWidth * (bApplyFlatForward ? dblFlatForwardRate :
  1961.                 cpcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional + dblPeriodStartNotional -
  1962.                     dblPeriodEndNotional) * (dblPeriodSurvival * (1. - cc.effectiveRecovery
  1963.                         (iPeriodStartDate, iNotionalEndDate)) + 1. - dblPeriodSurvival);

  1964.             dblPeriodEndTime += dblPeriodTimeWidth;
  1965.             dblTotalLossCashflow += dblPeriodLossCashflow;
  1966.             dblTimeWeightedTotalLossCashflow += dblPeriodEndTime * dblPeriodLossCashflow;

  1967.             if (bTerminateCouponFlow) break;
  1968.         }

  1969.         double dblTerminalSurvival = cc.survival (iWorkoutDate);

  1970.         double dblTerminalLossCashflow = dblWorkoutFactor * notional (iWorkoutDate) * (dblTerminalSurvival *
  1971.             (1. - cc.recovery (iWorkoutDate)) + 1. - dblTerminalSurvival);

  1972.         dblTotalLossCashflow += dblTerminalLossCashflow;
  1973.         dblTimeWeightedTotalLossCashflow += dblPeriodEndTime * dblTerminalLossCashflow;
  1974.         return dblTimeWeightedTotalLossCashflow / dblTotalLossCashflow;
  1975.     }

  1976.     @Override public double weightedAverageLifeCredit (
  1977.         final org.drip.param.valuation.ValuationParams valParams,
  1978.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc)
  1979.         throws java.lang.Exception
  1980.     {
  1981.         return weightedAverageLifeCredit (valParams, csqc, maturityDate().julian(), 1.);
  1982.     }

  1983.     @Override public double priceFromZeroCurve (
  1984.         final org.drip.param.valuation.ValuationParams valParams,
  1985.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  1986.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  1987.         final int iZeroCurveBaseDC,
  1988.         final int iWorkoutDate,
  1989.         final double dblWorkoutFactor,
  1990.         final double dblBump)
  1991.         throws java.lang.Exception
  1992.     {
  1993.         if (null == valParams)
  1994.             throw new java.lang.Exception ("BondComponent::priceFromZeroCurve => Invalid Inputs");

  1995.         int iValueDate = valParams.valueDate();

  1996.         if (iValueDate >= iWorkoutDate || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid
  1997.             (dblWorkoutFactor) || !org.drip.numerical.common.NumberUtil.IsValid (dblBump))
  1998.             throw new java.lang.Exception ("BondComponent::priceFromZeroCurve => Invalid Inputs " + dblBump);

  1999.         double dblPV = 0.;
  2000.         boolean bTerminateCouponFlow = false;
  2001.         boolean bApplyFlatForwardRate = false;
  2002.         org.drip.state.discount.ZeroCurve zc = null;
  2003.         int iCashPayDate = java.lang.Integer.MIN_VALUE;
  2004.         double dblFlatForwardRate = java.lang.Double.NaN;

  2005.         double dblScalingNotional = null != _notionalSetting && _notionalSetting.priceOffOfOriginalNotional()
  2006.             ? 1. : notional (iValueDate);

  2007.         if (null != vcp)
  2008.             bApplyFlatForwardRate = vcp.applyFlatForwardRate();
  2009.         else {
  2010.             org.drip.param.valuation.ValuationCustomizationParams vcpQuote = null == _quoteConvention ? null
  2011.                 : _quoteConvention.valuationCustomizationParams();

  2012.             if (null != vcpQuote) bApplyFlatForwardRate = vcpQuote.applyFlatForwardRate();
  2013.         }

  2014.         org.drip.state.discount.DiscountCurve dcBase = ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE ==
  2015.             iZeroCurveBaseDC ? csqc.fundingState (fundingLabel()) : csqc.govvieState (govvieLabel());

  2016.         if (null == dcBase)
  2017.             throw new java.lang.Exception ("BondComponent::priceFromZeroCurve => Invalid Discount Curve");

  2018.         try {
  2019.             iCashPayDate = null != _quoteConvention ? _quoteConvention.settleDate (valParams) :
  2020.                 valParams.cashPayDate();
  2021.         } catch (java.lang.Exception e) {
  2022.             if (!s_bSuppressErrors) e.printStackTrace();

  2023.             iCashPayDate = valParams.cashPayDate();
  2024.         }

  2025.         java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsCompositePeriod = couponPeriods();

  2026.         try {
  2027.             zc = org.drip.state.curve.DerivedZeroRate.FromBaseCurve (freq(), couponDC(), currency(),
  2028.                 _stream.couponEOMAdjustment(), lsCompositePeriod, terminationAdjust (iWorkoutDate),
  2029.                     iValueDate, iCashPayDate, dcBase, dblBump, null == vcp ? (null == _quoteConvention ? null
  2030.                         : _quoteConvention.valuationCustomizationParams()) : vcp, new
  2031.                             org.drip.spline.params.SegmentCustomBuilderControl
  2032.                                 (org.drip.spline.stretch.MultiSegmentSequenceBuilder.BASIS_SPLINE_POLYNOMIAL,
  2033.                                     new org.drip.spline.basis.PolynomialFunctionSetParams (2),
  2034.                                         org.drip.spline.params.SegmentInelasticDesignControl.Create (0, 2),
  2035.                                             new org.drip.spline.params.ResponseScalingShapeControl (true, new
  2036.                                                 org.drip.function.r1tor1.QuadraticRationalShapeControl (0.)),
  2037.                                                     null));
  2038.         } catch (java.lang.Exception e) {
  2039.             e.printStackTrace();
  2040.         }

  2041.         if (null == zc)
  2042.             throw new java.lang.Exception ("BondComponent::priceFromZeroCurve => Cannot create shifted ZC");

  2043.         for (org.drip.analytics.cashflow.CompositePeriod period : lsCompositePeriod) {
  2044.             int iPeriodPayDate = period.payDate();

  2045.             if (iPeriodPayDate < iValueDate) continue;

  2046.             int iPeriodStartDate = period.startDate();

  2047.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  2048.             int iAccrualEndDate = period.endDate();

  2049.             int iNotionalEndDate = iAccrualEndDate;
  2050.             double dblCouponNotional = dblPeriodStartNotional;

  2051.             double dblPeriodEndNotional = notional (iNotionalEndDate);

  2052.             if (iAccrualEndDate >= iWorkoutDate) {
  2053.                 bTerminateCouponFlow = true;
  2054.                 iAccrualEndDate = iWorkoutDate;
  2055.                 iNotionalEndDate = iWorkoutDate;
  2056.             }

  2057.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START ==
  2058.                 _notionalSetting.periodAmortizationMode())
  2059.                 dblCouponNotional = dblPeriodStartNotional;
  2060.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END ==
  2061.                 _notionalSetting.periodAmortizationMode())
  2062.                 dblCouponNotional = dblPeriodEndNotional;
  2063.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  2064.                 _notionalSetting.periodAmortizationMode())
  2065.                 dblCouponNotional = notional (iPeriodStartDate, iNotionalEndDate);

  2066.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate,
  2067.                 valParams, csqc);

  2068.             if (null == cpcm) throw new java.lang.Exception ("BondComponent::priceFromZeroCurve => No PCM");

  2069.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  2070.                 dblFlatForwardRate = cpcm.rate();

  2071.             dblPV += (period.accrualDCF (iAccrualEndDate) * (bApplyFlatForwardRate ? dblFlatForwardRate :
  2072.                 cpcm.rate()) * couponFactor (iNotionalEndDate) * dblCouponNotional + dblPeriodStartNotional -
  2073.                     dblPeriodEndNotional) * zc.df (iPeriodPayDate);

  2074.             if (bTerminateCouponFlow) break;
  2075.         }

  2076.         return ((dblPV + dblWorkoutFactor * zc.df (terminationAdjust (iWorkoutDate)) * notional
  2077.             (iWorkoutDate)) / zc.df (iCashPayDate) - accrued (iValueDate, csqc)) / dblScalingNotional;
  2078.     }

  2079.     @Override public double priceFromFundingCurve (
  2080.         final org.drip.param.valuation.ValuationParams valParams,
  2081.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2082.         final int iWorkoutDate,
  2083.         final double dblWorkoutFactor,
  2084.         final double dblBump)
  2085.         throws java.lang.Exception
  2086.     {
  2087.         return priceFromDiscountCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, dblBump,
  2088.             PRICE_OFF_OF_FUNDING_CURVE);
  2089.     }

  2090.     @Override public double priceFromTreasuryCurve (
  2091.         final org.drip.param.valuation.ValuationParams valParams,
  2092.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2093.         final int iWorkoutDate,
  2094.         final double dblWorkoutFactor,
  2095.         final double dblBump)
  2096.         throws java.lang.Exception
  2097.     {
  2098.         return priceFromDiscountCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, dblBump,
  2099.             PRICE_OFF_OF_TREASURY_CURVE);
  2100.     }

  2101.     @Override public double priceFromCreditCurve (
  2102.         final org.drip.param.valuation.ValuationParams valParams,
  2103.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2104.         final int iWorkoutDate,
  2105.         final double dblWorkoutFactor,
  2106.         final double dblCreditBasis,
  2107.         final boolean bFlat)
  2108.         throws java.lang.Exception
  2109.     {
  2110.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor)
  2111.             || !org.drip.numerical.common.NumberUtil.IsValid (dblCreditBasis) || null == _creditSetting)
  2112.             throw new java.lang.Exception ("BondComponent::priceFromCreditCurve => Invalid inputs");

  2113.         org.drip.state.credit.CreditCurve ccIn = csqc.creditState (creditLabel());

  2114.         if (null == ccIn)
  2115.             throw new java.lang.Exception ("BondComponent::priceFromCreditCurve => Invalid inputs");

  2116.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  2117.         if (null == dcFunding)
  2118.             throw new java.lang.Exception ("BondComponent::priceFromCreditCurve => No funding curve");

  2119.         int iValueDate = valParams.valueDate();

  2120.         if (iValueDate >= iWorkoutDate)
  2121.             throw new java.lang.Exception ("BondComponent::priceFromCreditCurve => Val date " +
  2122.                 org.drip.analytics.date.DateUtil.YYYYMMDD (iValueDate) + " greater than Work-out " +
  2123.                     org.drip.analytics.date.DateUtil.YYYYMMDD (iWorkoutDate));

  2124.         double dblRecoveryToUse = !_creditSetting.useCurveRecovery() ? _creditSetting.recovery() :
  2125.             java.lang.Double.NaN;

  2126.         org.drip.state.credit.CreditCurve cc = bFlat ? ccIn.flatCurve (dblCreditBasis, true,
  2127.             dblRecoveryToUse) : (org.drip.state.credit.CreditCurve) ccIn.parallelShiftManifestMeasure
  2128.                 ("SwapRate", dblCreditBasis);

  2129.         if (null == cc)
  2130.             throw new java.lang.Exception
  2131.                 ("BondComponent::priceFromCreditCurve => Cannot create adjusted Curve");

  2132.         double dblPV = 0.;
  2133.         boolean bTerminateCashFlow = false;
  2134.         int iCashPayDate = java.lang.Integer.MIN_VALUE;
  2135.         double dblFlatForwardRate = java.lang.Double.NaN;

  2136.         double dblScalingNotional = null != _notionalSetting && _notionalSetting.priceOffOfOriginalNotional()
  2137.             ? 1. : notional (iValueDate);

  2138.         org.drip.param.valuation.ValuationCustomizationParams vcp = null == _quoteConvention ? null :
  2139.             _quoteConvention.valuationCustomizationParams();

  2140.         boolean bApplyFlatForwardRate = null == vcp ? false : vcp.applyFlatForwardRate();

  2141.         org.drip.param.pricer.CreditPricerParams pricerParams = new org.drip.param.pricer.CreditPricerParams
  2142.             (7, null, false, s_iDiscretizationScheme);

  2143.         int iLossPayLag = _creditSetting.lossPayLag();

  2144.         boolean bAccrualOnDefault = _creditSetting.accrualOnDefault();

  2145.         int iPeriodAmortizationMode = _notionalSetting.periodAmortizationMode();

  2146.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  2147.             if (bTerminateCashFlow) continue;

  2148.             int iPeriodPayDate = period.payDate();

  2149.             if (iPeriodPayDate < iValueDate) continue;

  2150.             int iPeriodEndDate = period.endDate();

  2151.             if (iPeriodEndDate >= iWorkoutDate) {
  2152.                 bTerminateCashFlow = true;
  2153.                 iPeriodEndDate = iWorkoutDate;
  2154.             }

  2155.             int iPeriodStartDate = period.startDate();

  2156.             if (iPeriodStartDate < iValueDate) iPeriodStartDate = iValueDate;

  2157.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iPeriodEndDate,
  2158.                 valParams, csqc);

  2159.             if (null == cpcm)
  2160.                 throw new java.lang.Exception ("BondComponent::priceFromCreditCurve => No PCM");

  2161.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  2162.                 dblFlatForwardRate = cpcm.rate();

  2163.             double dblPeriodCoupon = bApplyFlatForwardRate ? dblFlatForwardRate : cpcm.rate();

  2164.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  2165.             double dblPeriodEndNotional = notional (iPeriodEndDate);

  2166.             double dblCouponNotional = dblPeriodStartNotional;

  2167.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iPeriodAmortizationMode)
  2168.                 dblCouponNotional = notional (iPeriodStartDate);
  2169.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iPeriodAmortizationMode)
  2170.                 dblCouponNotional = notional (iPeriodEndDate);
  2171.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE ==
  2172.                 iPeriodAmortizationMode)
  2173.                 dblCouponNotional = notional (iPeriodStartDate, iPeriodEndDate);

  2174.             dblPV += (period.accrualDCF (iPeriodEndDate) * dblPeriodCoupon * couponFactor (iPeriodEndDate) *
  2175.                 dblCouponNotional + dblPeriodStartNotional - dblPeriodEndNotional) * dcFunding.df
  2176.                     (iPeriodPayDate) * cpcm.cumulative() * cc.survival (iPeriodEndDate);

  2177.             for (org.drip.analytics.cashflow.LossQuadratureMetrics lqm : period.lossMetrics (this, valParams,
  2178.                 pricerParams, iPeriodEndDate, csqc)) {
  2179.                 if (null == lqm) continue;

  2180.                 int iSubPeriodEndDate = lqm.endDate();

  2181.                 int iSubPeriodStartDate = lqm.startDate();

  2182.                 double dblSubPeriodDF = dcFunding.effectiveDF (iSubPeriodStartDate + iLossPayLag,
  2183.                     iSubPeriodEndDate + iLossPayLag);

  2184.                 double dblSubPeriodNotional = notional (iSubPeriodStartDate, iSubPeriodEndDate);

  2185.                 double dblSubPeriodSurvival = cc.survival (iSubPeriodStartDate) - cc.survival
  2186.                     (iSubPeriodEndDate);

  2187.                 if (bAccrualOnDefault)
  2188.                     dblPV += 0.0001 * lqm.accrualDCF() * dblSubPeriodSurvival * dblSubPeriodDF *
  2189.                         dblSubPeriodNotional * dblPeriodCoupon;

  2190.                 dblPV += (_creditSetting.useCurveRecovery() ? cc.effectiveRecovery (iSubPeriodStartDate,
  2191.                     iSubPeriodEndDate) : _creditSetting.recovery()) * dblSubPeriodSurvival *
  2192.                         dblSubPeriodNotional * dblSubPeriodDF;
  2193.             }
  2194.         }

  2195.         try {
  2196.             iCashPayDate = null == _quoteConvention ? valParams.cashPayDate() : _quoteConvention.settleDate
  2197.                 (valParams);
  2198.         } catch (java.lang.Exception e) {
  2199.             if (!s_bSuppressErrors) e.printStackTrace();

  2200.             iCashPayDate = valParams.cashPayDate();
  2201.         }

  2202.         return ((dblPV + dblWorkoutFactor * dcFunding.df (terminationAdjust (iWorkoutDate)) * cc.survival
  2203.             (iWorkoutDate) * notional (iWorkoutDate)) / dcFunding.df (iCashPayDate) - accrued (iValueDate,
  2204.                 csqc)) / dblScalingNotional;
  2205.     }

  2206.     @Override public double aswFromBondBasis (
  2207.         final org.drip.param.valuation.ValuationParams valParams,
  2208.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2209.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2210.         final int iWorkoutDate,
  2211.         final double dblWorkoutFactor,
  2212.         final double dblBondBasis)
  2213.         throws java.lang.Exception
  2214.     {
  2215.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  2216.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  2217.     }

  2218.     @Override public double aswFromBondBasis (
  2219.         final org.drip.param.valuation.ValuationParams valParams,
  2220.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2221.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2222.         final double dblBondBasis)
  2223.         throws java.lang.Exception
  2224.     {
  2225.         return aswFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  2226.     }

  2227.     @Override public double aswFromBondBasisToOptimalExercise (
  2228.         final org.drip.param.valuation.ValuationParams valParams,
  2229.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2230.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2231.         final double dblBondBasis)
  2232.         throws java.lang.Exception
  2233.     {
  2234.         if (null != _eosCall || null != _eosPut)
  2235.             throw new java.lang.Exception ("BondComponent::aswFromBondBasisToOptimalExercise => " +
  2236.                 "Cannot calc ASW from Bond Basis to Optimal Exercise for bonds w emb option");

  2237.         return aswFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  2238.     }

  2239.     @Override public double aswFromCreditBasis (
  2240.         final org.drip.param.valuation.ValuationParams valParams,
  2241.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2242.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2243.         final int iWorkoutDate,
  2244.         final double dblWorkoutFactor,
  2245.         final double dblCreditBasis)
  2246.         throws java.lang.Exception
  2247.     {
  2248.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  2249.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  2250.     }

  2251.     @Override public double aswFromCreditBasis (
  2252.         final org.drip.param.valuation.ValuationParams valParams,
  2253.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2254.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2255.         final double dblCreditBasis)
  2256.         throws java.lang.Exception
  2257.     {
  2258.         return aswFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  2259.     }

  2260.     @Override public double aswFromCreditBasisToOptimalExercise (
  2261.         final org.drip.param.valuation.ValuationParams valParams,
  2262.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2263.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2264.         final double dblCreditBasis)
  2265.         throws java.lang.Exception
  2266.     {
  2267.         if (null != _eosCall || null != _eosPut)
  2268.             throw new java.lang.Exception ("BondComponent::aswFromCreditBasisToOptimalExercise => " +
  2269.                 "Cannot calc ASW from Credit Basis to Optimal Exercise for bonds w emb option");

  2270.         return aswFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  2271.     }

  2272.     @Override public double aswFromDiscountMargin (
  2273.         final org.drip.param.valuation.ValuationParams valParams,
  2274.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2275.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2276.         final int iWorkoutDate,
  2277.         final double dblWorkoutFactor,
  2278.         final double dblDiscountMargin)
  2279.         throws java.lang.Exception
  2280.     {
  2281.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromDiscountMargin
  2282.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblDiscountMargin));
  2283.     }

  2284.     @Override public double aswFromDiscountMargin (
  2285.         final org.drip.param.valuation.ValuationParams valParams,
  2286.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2287.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2288.         final double dblDiscountMargin)
  2289.         throws java.lang.Exception
  2290.     {
  2291.         return aswFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  2292.     }

  2293.     @Override public double aswFromDiscountMarginToOptimalExercise (
  2294.         final org.drip.param.valuation.ValuationParams valParams,
  2295.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2296.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2297.         final double dblDiscountMargin)
  2298.         throws java.lang.Exception
  2299.     {
  2300.         if (null != _eosCall || null != _eosPut)
  2301.             throw new java.lang.Exception ("BondComponent::aswFromDiscountMarginToOptimalExercise => " +
  2302.                 "Cannot calc ASW from Discount Margin to optimal exercise for bonds w emb option");

  2303.         return aswFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  2304.     }

  2305.     @Override public double aswFromESpread (
  2306.         final org.drip.param.valuation.ValuationParams valParams,
  2307.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2308.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2309.         final int iWorkoutDate,
  2310.         final double dblWorkoutFactor,
  2311.         final double dblESpread)
  2312.         throws java.lang.Exception
  2313.     {
  2314.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  2315.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  2316.     }

  2317.     @Override public double aswFromESpread (
  2318.         final org.drip.param.valuation.ValuationParams valParams,
  2319.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2320.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2321.         final double dblESpread)
  2322.         throws java.lang.Exception
  2323.     {
  2324.         return aswFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  2325.     }

  2326.     @Override public double aswFromESpreadToOptimalExercise (
  2327.         final org.drip.param.valuation.ValuationParams valParams,
  2328.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2329.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2330.         final double dblESpread)
  2331.         throws java.lang.Exception
  2332.     {
  2333.         if (null != _eosCall || null != _eosPut)
  2334.             throw new java.lang.Exception ("BondComponent::aswFromESpreadToOptimalExercise => " +
  2335.                 "Cannot calc ASW from E Spread to optimal exercise for bonds w emb option");

  2336.         return aswFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  2337.     }

  2338.     @Override public double aswFromGSpread (
  2339.         final org.drip.param.valuation.ValuationParams valParams,
  2340.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2341.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2342.         final int iWorkoutDate,
  2343.         final double dblWorkoutFactor,
  2344.         final double dblGSpread)
  2345.         throws java.lang.Exception
  2346.     {
  2347.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  2348.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  2349.     }

  2350.     @Override public double aswFromGSpread (
  2351.         final org.drip.param.valuation.ValuationParams valParams,
  2352.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2353.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2354.         final double dblGSpread)
  2355.         throws java.lang.Exception
  2356.     {
  2357.         return aswFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  2358.     }

  2359.     @Override public double aswFromGSpreadToOptimalExercise (
  2360.         final org.drip.param.valuation.ValuationParams valParams,
  2361.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2362.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2363.         final double dblGSpread)
  2364.         throws java.lang.Exception
  2365.     {
  2366.         if (null != _eosCall || null != _eosPut)
  2367.             throw new java.lang.Exception ("BondComponent::aswFromGSpreadToOptimalExercise => " +
  2368.                 "Cannot calc ASW from G Spread to optimal exercise for bonds w emb option");

  2369.         return aswFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  2370.     }

  2371.     @Override public double aswFromISpread (
  2372.         final org.drip.param.valuation.ValuationParams valParams,
  2373.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2374.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2375.         final int iWorkoutDate,
  2376.         final double dblWorkoutFactor,
  2377.         final double dblISpread)
  2378.         throws java.lang.Exception
  2379.     {
  2380.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  2381.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  2382.     }

  2383.     @Override public double aswFromISpread (
  2384.         final org.drip.param.valuation.ValuationParams valParams,
  2385.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2386.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2387.         final double dblISpread)
  2388.         throws java.lang.Exception
  2389.     {
  2390.         return aswFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  2391.     }

  2392.     @Override public double aswFromISpreadToOptimalExercise (
  2393.         final org.drip.param.valuation.ValuationParams valParams,
  2394.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2395.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2396.         final double dblISpread)
  2397.         throws java.lang.Exception
  2398.     {
  2399.         if (null != _eosCall || null != _eosPut)
  2400.             throw new java.lang.Exception ("BondComponent::aswFromISpreadToOptimalExercise => " +
  2401.                 "Cannot calc ASW from I Spread to optimal exercise for bonds w emb option");

  2402.         return aswFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  2403.     }

  2404.     @Override public double aswFromJSpread (
  2405.         final org.drip.param.valuation.ValuationParams valParams,
  2406.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2407.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2408.         final int iWorkoutDate,
  2409.         final double dblWorkoutFactor,
  2410.         final double dblJSpread)
  2411.         throws java.lang.Exception
  2412.     {
  2413.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  2414.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  2415.     }

  2416.     @Override public double aswFromJSpread (
  2417.         final org.drip.param.valuation.ValuationParams valParams,
  2418.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2419.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2420.         final double dblJSpread)
  2421.         throws java.lang.Exception
  2422.     {
  2423.         return aswFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  2424.     }

  2425.     @Override public double aswFromJSpreadToOptimalExercise (
  2426.         final org.drip.param.valuation.ValuationParams valParams,
  2427.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2428.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2429.         final double dblJSpread)
  2430.         throws java.lang.Exception
  2431.     {
  2432.         if (null != _eosCall || null != _eosPut)
  2433.             throw new java.lang.Exception ("BondComponent::aswFromJSpreadToOptimalExercise => " +
  2434.                 "Cannot calc ASW from J Spread to optimal exercise for bonds w emb option");

  2435.         return aswFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  2436.     }

  2437.     @Override public double aswFromNSpread (
  2438.         final org.drip.param.valuation.ValuationParams valParams,
  2439.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2440.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2441.         final int iWorkoutDate,
  2442.         final double dblWorkoutFactor,
  2443.         final double dblNSpread)
  2444.         throws java.lang.Exception
  2445.     {
  2446.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  2447.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  2448.     }

  2449.     @Override public double aswFromNSpread (
  2450.         final org.drip.param.valuation.ValuationParams valParams,
  2451.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2452.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2453.         final double dblNSpread)
  2454.         throws java.lang.Exception
  2455.     {
  2456.         return aswFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  2457.     }

  2458.     @Override public double aswFromNSpreadToOptimalExercise (
  2459.         final org.drip.param.valuation.ValuationParams valParams,
  2460.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2461.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2462.         final double dblNSpread)
  2463.         throws java.lang.Exception
  2464.     {
  2465.         if (null != _eosCall || null != _eosPut)
  2466.             throw new java.lang.Exception ("BondComponent::aswFromNSpreadToOptimalExercise => " +
  2467.                 "Cannot calc ASW from N Spread to optimal exercise for bonds w emb option");

  2468.         return aswFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  2469.     }

  2470.     @Override public double aswFromOAS (
  2471.         final org.drip.param.valuation.ValuationParams valParams,
  2472.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2473.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2474.         final int iWorkoutDate,
  2475.         final double dblWorkoutFactor,
  2476.         final double dblOAS)
  2477.         throws java.lang.Exception
  2478.     {
  2479.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS (valParams,
  2480.             csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  2481.     }

  2482.     @Override public double aswFromOAS (
  2483.         final org.drip.param.valuation.ValuationParams valParams,
  2484.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2485.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2486.         final double dblOAS)
  2487.         throws java.lang.Exception
  2488.     {
  2489.         return aswFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  2490.     }

  2491.     @Override public double aswFromOASToOptimalExercise (
  2492.         final org.drip.param.valuation.ValuationParams valParams,
  2493.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2494.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2495.         final double dblOAS)
  2496.         throws java.lang.Exception
  2497.     {
  2498.         if (null != _eosCall || null != _eosPut)
  2499.             throw new java.lang.Exception ("BondComponent::aswFromOASToOptimalExercise => " +
  2500.                 "Cannot calc ASW from OAS to optimal exercise for bonds w emb option");

  2501.         return aswFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  2502.     }

  2503.     @Override public double aswFromPECS (
  2504.         final org.drip.param.valuation.ValuationParams valParams,
  2505.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2506.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2507.         final int iWorkoutDate,
  2508.         final double dblWorkoutFactor,
  2509.         final double dblPECS)
  2510.         throws java.lang.Exception
  2511.     {
  2512.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  2513.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  2514.     }

  2515.     @Override public double aswFromPECS (
  2516.         final org.drip.param.valuation.ValuationParams valParams,
  2517.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2518.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2519.         final double dblPECS)
  2520.         throws java.lang.Exception
  2521.     {
  2522.         return aswFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  2523.     }

  2524.     @Override public double aswFromPECSToOptimalExercise (
  2525.         final org.drip.param.valuation.ValuationParams valParams,
  2526.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2527.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2528.         final double dblPECS)
  2529.         throws java.lang.Exception
  2530.     {
  2531.         if (null != _eosCall || null != _eosPut)
  2532.             throw new java.lang.Exception ("BondComponent::aswFromPECSToOptimalExercise => " +
  2533.                 "Cannot calc ASW from PECS to optimal exercise for bonds w emb option");

  2534.         return aswFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  2535.     }

  2536.     @Override public double aswFromPrice (
  2537.         final org.drip.param.valuation.ValuationParams valParams,
  2538.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2539.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2540.         final int iWorkoutDate,
  2541.         final double dblWorkoutFactor,
  2542.         final double dblPrice)
  2543.         throws java.lang.Exception
  2544.     {
  2545.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor)
  2546.             || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  2547.             throw new java.lang.Exception ("BondComponent::aswFromPrice => Invalid Inputs");

  2548.         int iValueDate = valParams.valueDate();

  2549.         if (iValueDate >= iWorkoutDate)
  2550.             throw new java.lang.Exception ("BondComponent::aswFromPrice => Invalid Inputs");

  2551.         org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate, valParams,
  2552.             csqc);

  2553.         if (null == cpcm) throw new java.lang.Exception ("BondComponent::aswFromPrice => No CPCM");

  2554.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  2555.         if (null == dcFunding)
  2556.             throw new java.lang.Exception ("BondComponent::aswFromPrice => Invalid Inputs");

  2557.         return cpcm.rate() - dcFunding.estimateManifestMeasure ("SwapRate", iWorkoutDate) + 0.0001 *
  2558.             (dblWorkoutFactor - dblPrice) / dcFunding.parSwapDV01 (iWorkoutDate);
  2559.     }

  2560.     @Override public double aswFromPrice (
  2561.         final org.drip.param.valuation.ValuationParams valParams,
  2562.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2563.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2564.         final double dblPrice)
  2565.         throws java.lang.Exception
  2566.     {
  2567.         return aswFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  2568.     }

  2569.     @Override public double aswFromPriceToOptimalExercise (
  2570.         final org.drip.param.valuation.ValuationParams valParams,
  2571.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2572.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2573.         final double dblPrice)
  2574.         throws java.lang.Exception
  2575.     {
  2576.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  2577.         if (null == wi)
  2578.             throw new java.lang.Exception
  2579.                 ("BondComponent::aswFromPriceToOptimalExercise => Can't determine Optimal Work-out");

  2580.         return aswFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  2581.     }

  2582.     @Override public double aswFromTSYSpread (
  2583.         final org.drip.param.valuation.ValuationParams valParams,
  2584.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2585.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2586.         final int iWorkoutDate,
  2587.         final double dblWorkoutFactor,
  2588.         final double dblTSYSpread)
  2589.         throws java.lang.Exception
  2590.     {
  2591.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  2592.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  2593.     }

  2594.     @Override public double aswFromTSYSpread (
  2595.         final org.drip.param.valuation.ValuationParams valParams,
  2596.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2597.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2598.         final double dblTSYSpread)
  2599.         throws java.lang.Exception
  2600.     {
  2601.         return aswFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  2602.     }

  2603.     @Override public double aswFromTSYSpreadToOptimalExercise (
  2604.         final org.drip.param.valuation.ValuationParams valParams,
  2605.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2606.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2607.         final double dblTSYSpread)
  2608.         throws java.lang.Exception
  2609.     {
  2610.         if (null != _eosCall || null != _eosPut)
  2611.             throw new java.lang.Exception ("BondComponent::aswFromTSYSpreadToOptimalExercise => " +
  2612.                 "Cannot calc ASW from TSY Spread to optimal exercise for bonds w emb option");

  2613.         return aswFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  2614.     }

  2615.     @Override public double aswFromYield (
  2616.         final org.drip.param.valuation.ValuationParams valParams,
  2617.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2618.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2619.         final int iWorkoutDate,
  2620.         final double dblWorkoutFactor,
  2621.         final double dblYield)
  2622.         throws java.lang.Exception
  2623.     {
  2624.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield (valParams,
  2625.             csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  2626.     }

  2627.     @Override public double aswFromYield (
  2628.         final org.drip.param.valuation.ValuationParams valParams,
  2629.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2630.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2631.         final double dblYield)
  2632.         throws java.lang.Exception
  2633.     {
  2634.         return aswFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  2635.     }

  2636.     @Override public double aswFromYieldToOptimalExercise (
  2637.         final org.drip.param.valuation.ValuationParams valParams,
  2638.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2639.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2640.         final double dblYield)
  2641.         throws java.lang.Exception
  2642.     {
  2643.         if (null != _eosCall || null != _eosPut)
  2644.             throw new java.lang.Exception ("BondComponent::aswFromYieldToOptimalExercise => " +
  2645.                 "Cannot calc ASW from Yield to optimal exercise for bonds w emb option");

  2646.         return aswFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  2647.     }

  2648.     @Override public double aswFromYieldSpread (
  2649.         final org.drip.param.valuation.ValuationParams valParams,
  2650.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2651.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2652.         final int iWorkoutDate,
  2653.         final double dblWorkoutFactor,
  2654.         final double dblYieldSpread)
  2655.         throws java.lang.Exception
  2656.     {
  2657.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  2658.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  2659.     }

  2660.     @Override public double aswFromYieldSpread (
  2661.         final org.drip.param.valuation.ValuationParams valParams,
  2662.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2663.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2664.         final double dblYieldSpread)
  2665.         throws java.lang.Exception
  2666.     {
  2667.         return aswFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  2668.     }

  2669.     @Override public double aswFromYieldSpreadToOptimalExercise (
  2670.         final org.drip.param.valuation.ValuationParams valParams,
  2671.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2672.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2673.         final double dblYieldSpread)
  2674.         throws java.lang.Exception
  2675.     {
  2676.         if (null != _eosCall || null != _eosPut)
  2677.             throw new java.lang.Exception ("BondComponent::aswFromYieldSpreadToOptimalExercise => " +
  2678.                 "Cannot calc ASW from Yield Spread to optimal exercise for bonds w emb option");

  2679.         return aswFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  2680.     }

  2681.     @Override public double aswFromZSpread (
  2682.         final org.drip.param.valuation.ValuationParams valParams,
  2683.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2684.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2685.         final int iWorkoutDate,
  2686.         final double dblWorkoutFactor,
  2687.         final double dblZSpread)
  2688.         throws java.lang.Exception
  2689.     {
  2690.         return aswFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  2691.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  2692.     }

  2693.     @Override public double aswFromZSpread (
  2694.         final org.drip.param.valuation.ValuationParams valParams,
  2695.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2696.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2697.         final double dblZSpread)
  2698.         throws java.lang.Exception
  2699.     {
  2700.         return aswFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  2701.     }

  2702.     @Override public double aswFromZSpreadToOptimalExercise (
  2703.         final org.drip.param.valuation.ValuationParams valParams,
  2704.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2705.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2706.         final double dblZSpread)
  2707.         throws java.lang.Exception
  2708.     {
  2709.         if (null != _eosCall || null != _eosPut)
  2710.             throw new java.lang.Exception ("BondComponent::aswFromZSpreadToOptimalExercise => " +
  2711.                 "Cannot calc ASW from Yield Spread to optimal exercise for bonds w emb option");

  2712.         return aswFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  2713.     }

  2714.     @Override public double bondBasisFromASW (
  2715.         final org.drip.param.valuation.ValuationParams valParams,
  2716.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2717.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2718.         final int iWorkoutDate,
  2719.         final double dblWorkoutFactor,
  2720.         final double dblASW)
  2721.         throws java.lang.Exception
  2722.     {
  2723.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  2724.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  2725.     }

  2726.     @Override public double bondBasisFromASW (
  2727.         final org.drip.param.valuation.ValuationParams valParams,
  2728.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2729.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2730.         final double dblASW)
  2731.         throws java.lang.Exception
  2732.     {
  2733.         return bondBasisFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  2734.     }

  2735.     @Override public double bondBasisFromASWToOptimalExercise (
  2736.         final org.drip.param.valuation.ValuationParams valParams,
  2737.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2738.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2739.         final double dblASW)
  2740.         throws java.lang.Exception
  2741.     {
  2742.         if (null != _eosCall || null != _eosPut)
  2743.             throw new java.lang.Exception ("BondComponent::bondBasisFromASWToOptimalExercise => " +
  2744.                 "Cannot calc Bond Basis from ASW to optimal exercise for bonds w emb option");

  2745.         return bondBasisFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  2746.     }

  2747.     @Override public double bondBasisFromCreditBasis (
  2748.         final org.drip.param.valuation.ValuationParams valParams,
  2749.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2750.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2751.         final int iWorkoutDate,
  2752.         final double dblWorkoutFactor,
  2753.         final double dblCreditBasis)
  2754.         throws java.lang.Exception
  2755.     {
  2756.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  2757.             yieldFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  2758.     }

  2759.     @Override public double bondBasisFromCreditBasis (
  2760.         final org.drip.param.valuation.ValuationParams valParams,
  2761.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2762.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2763.         final double dblCreditBasis)
  2764.         throws java.lang.Exception
  2765.     {
  2766.         return bondBasisFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  2767.     }

  2768.     @Override public double bondBasisFromCreditBasisToOptimalExercise (
  2769.         final org.drip.param.valuation.ValuationParams valParams,
  2770.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2771.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2772.         final double dblCreditBasis)
  2773.         throws java.lang.Exception
  2774.     {
  2775.         if (null != _eosCall || null != _eosPut)
  2776.             throw new java.lang.Exception ("BondComponent::bondBasisFromCreditBasisToOptimalExercise => " +
  2777.                 "Cannot calc Bond Basis from Credit Basis to optimal exercise for bonds w emb option");

  2778.         return bondBasisFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  2779.     }

  2780.     @Override public double bondBasisFromDiscountMargin (
  2781.         final org.drip.param.valuation.ValuationParams valParams,
  2782.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2783.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2784.         final int iWorkoutDate,
  2785.         final double dblWorkoutFactor,
  2786.         final double dblDiscountMargin)
  2787.         throws java.lang.Exception
  2788.     {
  2789.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  2790.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  2791.                 dblDiscountMargin));
  2792.     }

  2793.     @Override public double bondBasisFromDiscountMargin (
  2794.         final org.drip.param.valuation.ValuationParams valParams,
  2795.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2796.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2797.         final double dblDiscountMargin)
  2798.         throws java.lang.Exception
  2799.     {
  2800.         return bondBasisFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  2801.             dblDiscountMargin);
  2802.     }

  2803.     @Override public double bondBasisFromDiscountMarginToOptimalExercise (
  2804.         final org.drip.param.valuation.ValuationParams valParams,
  2805.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2806.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2807.         final double dblDiscountMargin)
  2808.         throws java.lang.Exception
  2809.     {
  2810.         if (null != _eosCall || null != _eosPut)
  2811.             throw new java.lang.Exception ("BondComponent::bondBasisFromDiscountMarginToOptimalExercise " +
  2812.                 "=> Cant calc Bond Basis from Discount Margin to optimal exercise for bonds w emb option");

  2813.         return bondBasisFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  2814.             dblDiscountMargin);
  2815.     }

  2816.     @Override public double bondBasisFromESpread (
  2817.         final org.drip.param.valuation.ValuationParams valParams,
  2818.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2819.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2820.         final int iWorkoutDate,
  2821.         final double dblWorkoutFactor,
  2822.         final double dblESpread)
  2823.         throws java.lang.Exception
  2824.     {
  2825.         return bondBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  2826.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  2827.     }

  2828.     @Override public double bondBasisFromESpread (
  2829.         final org.drip.param.valuation.ValuationParams valParams,
  2830.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2831.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2832.         final double dblESpread)
  2833.         throws java.lang.Exception
  2834.     {
  2835.         return bondBasisFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  2836.     }

  2837.     @Override public double bondBasisFromESpreadToOptimalExercise (
  2838.         final org.drip.param.valuation.ValuationParams valParams,
  2839.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2840.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2841.         final double dblESpread)
  2842.         throws java.lang.Exception
  2843.     {
  2844.         if (null != _eosCall || null != _eosPut)
  2845.             throw new java.lang.Exception ("BondComponent::bondBasisFromESpreadToOptimalExercise => " +
  2846.                 "Cant calc Bond Basis from E Spread to optimal exercise for bonds w emb option");

  2847.         return bondBasisFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  2848.     }

  2849.     @Override public double bondBasisFromGSpread (
  2850.         final org.drip.param.valuation.ValuationParams valParams,
  2851.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2852.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2853.         final int iWorkoutDate,
  2854.         final double dblWorkoutFactor,
  2855.         final double dblGSpread)
  2856.         throws java.lang.Exception
  2857.     {
  2858.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  2859.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  2860.     }

  2861.     @Override public double bondBasisFromGSpread (
  2862.         final org.drip.param.valuation.ValuationParams valParams,
  2863.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2864.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2865.         final double dblGSpread)
  2866.         throws java.lang.Exception
  2867.     {
  2868.         return bondBasisFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  2869.     }

  2870.     @Override public double bondBasisFromGSpreadToOptimalExercise (
  2871.         final org.drip.param.valuation.ValuationParams valParams,
  2872.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2873.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2874.         final double dblGSpread)
  2875.         throws java.lang.Exception
  2876.     {
  2877.         if (null != _eosCall || null != _eosPut)
  2878.             throw new java.lang.Exception ("BondComponent::bondBasisFromGSpreadToOptimalExercise => " +
  2879.                 "Cant calc Bond Basis from G Spread to optimal exercise for bonds w emb option");

  2880.         return bondBasisFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  2881.     }

  2882.     @Override public double bondBasisFromISpread (
  2883.         final org.drip.param.valuation.ValuationParams valParams,
  2884.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2885.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2886.         final int iWorkoutDate,
  2887.         final double dblWorkoutFactor,
  2888.         final double dblISpread)
  2889.         throws java.lang.Exception
  2890.     {
  2891.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  2892.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  2893.     }

  2894.     @Override public double bondBasisFromISpread (
  2895.         final org.drip.param.valuation.ValuationParams valParams,
  2896.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2897.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2898.         final double dblISpread)
  2899.         throws java.lang.Exception
  2900.     {
  2901.         return bondBasisFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  2902.     }

  2903.     @Override public double bondBasisFromISpreadToOptimalExercise (
  2904.         final org.drip.param.valuation.ValuationParams valParams,
  2905.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2906.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2907.         final double dblISpread)
  2908.         throws java.lang.Exception
  2909.     {
  2910.         if (null != _eosCall || null != _eosPut)
  2911.             throw new java.lang.Exception ("BondComponent::bondBasisFromISpreadToOptimalExercise => " +
  2912.                 "Cant calc Bond Basis from I Spread to optimal exercise for bonds w emb option");

  2913.         return bondBasisFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  2914.     }

  2915.     @Override public double bondBasisFromJSpread (
  2916.         final org.drip.param.valuation.ValuationParams valParams,
  2917.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2918.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2919.         final int iWorkoutDate,
  2920.         final double dblWorkoutFactor,
  2921.         final double dblJSpread)
  2922.         throws java.lang.Exception
  2923.     {
  2924.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  2925.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  2926.     }

  2927.     @Override public double bondBasisFromJSpread (
  2928.         final org.drip.param.valuation.ValuationParams valParams,
  2929.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2930.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2931.         final double dblJSpread)
  2932.         throws java.lang.Exception
  2933.     {
  2934.         return bondBasisFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  2935.     }

  2936.     @Override public double bondBasisFromJSpreadToOptimalExercise (
  2937.         final org.drip.param.valuation.ValuationParams valParams,
  2938.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2939.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2940.         final double dblJSpread)
  2941.         throws java.lang.Exception
  2942.     {
  2943.         if (null != _eosCall || null != _eosPut)
  2944.             throw new java.lang.Exception ("BondComponent::bondBasisFromJSpreadToOptimalExercise => " +
  2945.                 "Cant calc Bond Basis from J Spread to optimal exercise for bonds w emb option");

  2946.         return bondBasisFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  2947.     }

  2948.     @Override public double bondBasisFromNSpread (
  2949.         final org.drip.param.valuation.ValuationParams valParams,
  2950.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2951.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2952.         final int iWorkoutDate,
  2953.         final double dblWorkoutFactor,
  2954.         final double dblNSpread)
  2955.         throws java.lang.Exception
  2956.     {
  2957.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  2958.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  2959.     }

  2960.     @Override public double bondBasisFromNSpread (
  2961.         final org.drip.param.valuation.ValuationParams valParams,
  2962.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2963.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2964.         final double dblNSpread)
  2965.         throws java.lang.Exception
  2966.     {
  2967.         return bondBasisFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  2968.     }

  2969.     @Override public double bondBasisFromNSpreadToOptimalExercise (
  2970.         final org.drip.param.valuation.ValuationParams valParams,
  2971.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2972.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2973.         final double dblNSpread)
  2974.         throws java.lang.Exception
  2975.     {
  2976.         if (null != _eosCall || null != _eosPut)
  2977.             throw new java.lang.Exception ("BondComponent::bondBasisFromNSpreadToOptimalExercise => " +
  2978.                 "Cant calc Bond Basis from N Spread to optimal exercise for bonds w emb option");

  2979.         return bondBasisFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  2980.     }

  2981.     @Override public double bondBasisFromOAS (
  2982.         final org.drip.param.valuation.ValuationParams valParams,
  2983.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2984.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2985.         final int iWorkoutDate,
  2986.         final double dblWorkoutFactor,
  2987.         final double dblOAS)
  2988.         throws java.lang.Exception
  2989.     {
  2990.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  2991.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  2992.     }

  2993.     @Override public double bondBasisFromOAS (
  2994.         final org.drip.param.valuation.ValuationParams valParams,
  2995.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  2996.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  2997.         final double dblOAS)
  2998.         throws java.lang.Exception
  2999.     {
  3000.         return bondBasisFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  3001.     }

  3002.     @Override public double bondBasisFromOASToOptimalExercise (
  3003.         final org.drip.param.valuation.ValuationParams valParams,
  3004.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3005.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3006.         final double dblOAS)
  3007.         throws java.lang.Exception
  3008.     {
  3009.         if (null != _eosCall || null != _eosPut)
  3010.             throw new java.lang.Exception ("BondComponent::bondBasisFromOASToOptimalExercise => " +
  3011.                 "Cant calc Bond Basis from OAS to optimal exercise for bonds w emb option");

  3012.         return bondBasisFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  3013.     }

  3014.     @Override public double bondBasisFromPECS (
  3015.         final org.drip.param.valuation.ValuationParams valParams,
  3016.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3017.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3018.         final int iWorkoutDate,
  3019.         final double dblWorkoutFactor,
  3020.         final double dblPECS)
  3021.         throws java.lang.Exception
  3022.     {
  3023.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  3024.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  3025.     }

  3026.     @Override public double bondBasisFromPECS (
  3027.         final org.drip.param.valuation.ValuationParams valParams,
  3028.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3029.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3030.         final double dblPECS)
  3031.         throws java.lang.Exception
  3032.     {
  3033.         return bondBasisFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  3034.     }

  3035.     @Override public double bondBasisFromPECSToOptimalExercise (
  3036.         final org.drip.param.valuation.ValuationParams valParams,
  3037.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3038.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3039.         final double dblPECS)
  3040.         throws java.lang.Exception
  3041.     {
  3042.         if (null != _eosCall || null != _eosPut)
  3043.             throw new java.lang.Exception ("BondComponent::bondBasisFromPECSToOptimalExercise => " +
  3044.                 "Cant calc Bond Basis from PECS to optimal exercise for bonds w emb option");

  3045.         return bondBasisFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  3046.     }

  3047.     @Override public double bondBasisFromPrice (
  3048.         final org.drip.param.valuation.ValuationParams valParams,
  3049.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3050.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3051.         final int iWorkoutDate,
  3052.         final double dblWorkoutFactor,
  3053.         final double dblPrice)
  3054.         throws java.lang.Exception
  3055.     {
  3056.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  3057.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  3058.     }

  3059.     @Override public double bondBasisFromPrice (
  3060.         final org.drip.param.valuation.ValuationParams valParams,
  3061.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3062.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3063.         final double dblPrice)
  3064.         throws java.lang.Exception
  3065.     {
  3066.         return bondBasisFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  3067.     }

  3068.     @Override public double bondBasisFromPriceToOptimalExercise (
  3069.         final org.drip.param.valuation.ValuationParams valParams,
  3070.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3071.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3072.         final double dblPrice)
  3073.         throws java.lang.Exception
  3074.     {
  3075.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);
  3076.        
  3077.         if (null == wi)
  3078.             throw new java.lang.Exception
  3079.                 ("BondComponent::bondBasisFromPriceToOptimalExercise => cant calc Work-out info");

  3080.         return bondBasisFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  3081.     }

  3082.     @Override public double bondBasisFromTSYSpread (
  3083.         final org.drip.param.valuation.ValuationParams valParams,
  3084.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3085.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3086.         final int iWorkoutDate,
  3087.         final double dblWorkoutFactor,
  3088.         final double dblTSYSpread)
  3089.         throws java.lang.Exception
  3090.     {
  3091.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  3092.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  3093.     }

  3094.     @Override public double bondBasisFromTSYSpread (
  3095.         final org.drip.param.valuation.ValuationParams valParams,
  3096.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3097.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3098.         final double dblTSYSpread)
  3099.         throws java.lang.Exception
  3100.     {
  3101.         return bondBasisFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  3102.     }

  3103.     @Override public double bondBasisFromTSYSpreadToOptimalExercise (
  3104.         final org.drip.param.valuation.ValuationParams valParams,
  3105.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3106.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3107.         final double dblTSYSpread)
  3108.         throws java.lang.Exception
  3109.     {
  3110.         if (null != _eosCall || null != _eosPut)
  3111.             throw new java.lang.Exception ("BondComponent::bondBasisFromTSYSpreadToOptimalExercise => " +
  3112.                 "Cant calc Bond Basis from TSY Spread to optimal exercise for bonds w emb option");

  3113.         return bondBasisFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  3114.     }

  3115.     @Override public double bondBasisFromYield (
  3116.         final org.drip.param.valuation.ValuationParams valParams,
  3117.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3118.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3119.         final int iWorkoutDate,
  3120.         final double dblWorkoutFactor,
  3121.         final double dblYield)
  3122.         throws java.lang.Exception
  3123.     {
  3124.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  3125.             throw new java.lang.Exception ("BondComponent::bondBasisFromYield => Invalid inputs");

  3126.         return dblYield - yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3127.             priceFromFundingCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, 0.));
  3128.     }

  3129.     @Override public double bondBasisFromYield (
  3130.         final org.drip.param.valuation.ValuationParams valParams,
  3131.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3132.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3133.         final double dblYield)
  3134.         throws java.lang.Exception
  3135.     {
  3136.         return bondBasisFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  3137.     }

  3138.     @Override public double bondBasisFromYieldToOptimalExercise (
  3139.         final org.drip.param.valuation.ValuationParams valParams,
  3140.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3141.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3142.         final double dblYield)
  3143.         throws java.lang.Exception
  3144.     {
  3145.         if (null != _eosCall || null != _eosPut)
  3146.             throw new java.lang.Exception ("BondComponent::bondBasisFromYieldToOptimalExercise => " +
  3147.                 "Cant calc Bond Basis from Yield to optimal exercise for bonds w emb option");

  3148.         return bondBasisFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  3149.     }

  3150.     @Override public double bondBasisFromYieldSpread (
  3151.         final org.drip.param.valuation.ValuationParams valParams,
  3152.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3153.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3154.         final int iWorkoutDate,
  3155.         final double dblWorkoutFactor,
  3156.         final double dblYieldSpread)
  3157.         throws java.lang.Exception
  3158.     {
  3159.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3160.             yieldFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  3161.     }

  3162.     @Override public double bondBasisFromYieldSpread (
  3163.         final org.drip.param.valuation.ValuationParams valParams,
  3164.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3165.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3166.         final double dblYieldSpread)
  3167.         throws java.lang.Exception
  3168.     {
  3169.         return bondBasisFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  3170.     }

  3171.     @Override public double bondBasisFromYieldSpreadToOptimalExercise (
  3172.         final org.drip.param.valuation.ValuationParams valParams,
  3173.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3174.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3175.         final double dblYieldSpread)
  3176.         throws java.lang.Exception
  3177.     {
  3178.         if (null != _eosCall || null != _eosPut)
  3179.             throw new java.lang.Exception ("BondComponent::bondBasisFromYieldSpreadToOptimalExercise " +
  3180.                 "=> Cant calc Bond Basis from Yield Spread to optimal exercise for bonds w emb option");

  3181.         return bondBasisFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  3182.     }

  3183.     @Override public double bondBasisFromZSpread (
  3184.         final org.drip.param.valuation.ValuationParams valParams,
  3185.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3186.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3187.         final int iWorkoutDate,
  3188.         final double dblWorkoutFactor,
  3189.         final double dblZSpread)
  3190.         throws java.lang.Exception
  3191.     {
  3192.         return bondBasisFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  3193.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  3194.     }

  3195.     @Override public double bondBasisFromZSpread (
  3196.         final org.drip.param.valuation.ValuationParams valParams,
  3197.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3198.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3199.         final double dblZSpread)
  3200.         throws java.lang.Exception
  3201.     {
  3202.         return bondBasisFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  3203.     }

  3204.     @Override public double bondBasisFromZSpreadToOptimalExercise (
  3205.         final org.drip.param.valuation.ValuationParams valParams,
  3206.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3207.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3208.         final double dblZSpread)
  3209.         throws java.lang.Exception
  3210.     {
  3211.         if (null != _eosCall || null != _eosPut)
  3212.             throw new java.lang.Exception ("BondComponent::bondBasisFromZSpreadToOptimalExercise => " +
  3213.                 "Cant calc Bond Basis from Z Spread to optimal exercise for bonds w emb option");

  3214.         return bondBasisFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  3215.     }

  3216.     @Override public double convexityFromASW (
  3217.         final org.drip.param.valuation.ValuationParams valParams,
  3218.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3219.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3220.         final int iWorkoutDate,
  3221.         final double dblWorkoutFactor,
  3222.         final double dblASW)
  3223.         throws java.lang.Exception
  3224.     {
  3225.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  3226.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  3227.     }

  3228.     @Override public double convexityFromASW (
  3229.         final org.drip.param.valuation.ValuationParams valParams,
  3230.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3231.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3232.         final double dblASW)
  3233.         throws java.lang.Exception
  3234.     {
  3235.         return convexityFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  3236.     }

  3237.     @Override public double convexityFromASWToOptimalExercise (
  3238.         final org.drip.param.valuation.ValuationParams valParams,
  3239.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3240.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3241.         final double dblASW)
  3242.         throws java.lang.Exception
  3243.     {
  3244.         if (null != _eosCall || null != _eosPut)
  3245.             throw new java.lang.Exception ("BondComponent::convexityFromASWToOptimalExercise => " +
  3246.                 "Cant calc Convexity from ASW to optimal exercise for bonds w emb option");

  3247.         return convexityFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  3248.     }

  3249.     @Override public double convexityFromBondBasis (
  3250.         final org.drip.param.valuation.ValuationParams valParams,
  3251.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3252.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3253.         final int iWorkoutDate,
  3254.         final double dblWorkoutFactor,
  3255.         final double dblBondBasis)
  3256.         throws java.lang.Exception
  3257.     {
  3258.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  3259.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  3260.     }

  3261.     @Override public double convexityFromBondBasis (
  3262.         final org.drip.param.valuation.ValuationParams valParams,
  3263.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3264.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3265.         final double dblBondBasis)
  3266.         throws java.lang.Exception
  3267.     {
  3268.         return convexityFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  3269.     }

  3270.     @Override public double convexityFromBondBasisToOptimalExercise (
  3271.         final org.drip.param.valuation.ValuationParams valParams,
  3272.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3273.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3274.         final double dblBondBasis)
  3275.         throws java.lang.Exception
  3276.     {
  3277.         if (null != _eosCall || null != _eosPut)
  3278.             throw new java.lang.Exception ("BondComponent::convexityFromBondBasisToOptimalExercise => " +
  3279.                 "Cant calc Convexity from Bond Basis to optimal exercise for bonds w emb option");

  3280.         return convexityFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  3281.     }

  3282.     @Override public double convexityFromCreditBasis (
  3283.         final org.drip.param.valuation.ValuationParams valParams,
  3284.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3285.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3286.         final int iWorkoutDate,
  3287.         final double dblWorkoutFactor,
  3288.         final double dblCreditBasis)
  3289.         throws java.lang.Exception
  3290.     {
  3291.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3292.             priceFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  3293.     }

  3294.     @Override public double convexityFromCreditBasis (
  3295.         final org.drip.param.valuation.ValuationParams valParams,
  3296.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3297.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3298.         final double dblCreditBasis)
  3299.         throws java.lang.Exception
  3300.     {
  3301.         return convexityFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  3302.     }

  3303.     @Override public double convexityFromCreditBasisToOptimalExercise (
  3304.         final org.drip.param.valuation.ValuationParams valParams,
  3305.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3306.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3307.         final double dblCreditBasis)
  3308.         throws java.lang.Exception
  3309.     {
  3310.         if (null != _eosCall || null != _eosPut)
  3311.             throw new java.lang.Exception ("BondComponent::convexityFromCreditBasisToOptimalExercise => " +
  3312.                 "Cant calc Convexity from Credit Basis to optimal exercise for bonds w emb option");

  3313.         return convexityFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  3314.     }

  3315.     @Override public double convexityFromDiscountMargin (
  3316.         final org.drip.param.valuation.ValuationParams valParams,
  3317.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3318.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3319.         final int iWorkoutDate,
  3320.         final double dblWorkoutFactor,
  3321.         final double dblDiscountMargin)
  3322.         throws java.lang.Exception
  3323.     {
  3324.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3325.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3326.                 dblDiscountMargin));
  3327.     }

  3328.     @Override public double convexityFromDiscountMargin (
  3329.         final org.drip.param.valuation.ValuationParams valParams,
  3330.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3331.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3332.         final double dblDiscountMargin)
  3333.         throws java.lang.Exception
  3334.     {
  3335.         return convexityFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  3336.             dblDiscountMargin);
  3337.     }

  3338.     @Override public double convexityFromDiscountMarginToOptimalExercise (
  3339.         final org.drip.param.valuation.ValuationParams valParams,
  3340.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3341.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3342.         final double dblDiscountMargin)
  3343.         throws java.lang.Exception
  3344.     {
  3345.         if (null != _eosCall || null != _eosPut)
  3346.             throw new java.lang.Exception ("BondComponent::convexityFromDiscountMarginToOptimalExercise " +
  3347.                 "=> Cant calc Convexity from Discount Margin to optimal exercise for bonds w emb option");

  3348.         return convexityFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  3349.             dblDiscountMargin);
  3350.     }

  3351.     @Override public double convexityFromESpread (
  3352.         final org.drip.param.valuation.ValuationParams valParams,
  3353.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3354.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3355.         final int iWorkoutDate,
  3356.         final double dblWorkoutFactor,
  3357.         final double dblESpread)
  3358.         throws java.lang.Exception
  3359.     {
  3360.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  3361.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  3362.     }

  3363.     @Override public double convexityFromESpread (
  3364.         final org.drip.param.valuation.ValuationParams valParams,
  3365.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3366.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3367.         final double dblESpread)
  3368.         throws java.lang.Exception
  3369.     {
  3370.         return convexityFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  3371.     }

  3372.     @Override public double convexityFromESpreadToOptimalExercise (
  3373.         final org.drip.param.valuation.ValuationParams valParams,
  3374.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3375.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3376.         final double dblESpread)
  3377.         throws java.lang.Exception
  3378.     {
  3379.         if (null != _eosCall || null != _eosPut)
  3380.             throw new java.lang.Exception ("BondComponent::convexityFromESpreadToOptimalExercise => " +
  3381.                 "Cant calc Convexity from E Spread to optimal exercise for bonds w emb option");

  3382.         return convexityFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  3383.     }

  3384.     @Override public double convexityFromGSpread (
  3385.         final org.drip.param.valuation.ValuationParams valParams,
  3386.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3387.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3388.         final int iWorkoutDate,
  3389.         final double dblWorkoutFactor,
  3390.         final double dblGSpread)
  3391.         throws java.lang.Exception
  3392.     {
  3393.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  3394.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  3395.     }

  3396.     @Override public double convexityFromGSpread (
  3397.         final org.drip.param.valuation.ValuationParams valParams,
  3398.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3399.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3400.         final double dblGSpread)
  3401.         throws java.lang.Exception
  3402.     {
  3403.         return convexityFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  3404.     }

  3405.     @Override public double convexityFromGSpreadToOptimalExercise (
  3406.         final org.drip.param.valuation.ValuationParams valParams,
  3407.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3408.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3409.         final double dblGSpread)
  3410.         throws java.lang.Exception
  3411.     {
  3412.         if (null != _eosCall || null != _eosPut)
  3413.             throw new java.lang.Exception ("BondComponent::convexityFromGSpreadToOptimalExercise => " +
  3414.                 "Cant calc Convexity from G Spread to optimal exercise for bonds w emb option");

  3415.         return convexityFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  3416.     }

  3417.     @Override public double convexityFromISpread (
  3418.         final org.drip.param.valuation.ValuationParams valParams,
  3419.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3420.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3421.         final int iWorkoutDate,
  3422.         final double dblWorkoutFactor,
  3423.         final double dblISpread)
  3424.         throws java.lang.Exception
  3425.     {
  3426.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  3427.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  3428.     }

  3429.     @Override public double convexityFromISpread (
  3430.         final org.drip.param.valuation.ValuationParams valParams,
  3431.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3432.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3433.         final double dblISpread)
  3434.         throws java.lang.Exception
  3435.     {
  3436.         return convexityFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  3437.     }

  3438.     @Override public double convexityFromISpreadToOptimalExercise (
  3439.         final org.drip.param.valuation.ValuationParams valParams,
  3440.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3441.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3442.         final double dblISpread)
  3443.         throws java.lang.Exception
  3444.     {
  3445.         if (null != _eosCall || null != _eosPut)
  3446.             throw new java.lang.Exception ("BondComponent::convexityFromISpreadToOptimalExercise => " +
  3447.                 "Cant calc Convexity from I Spread to optimal exercise for bonds w emb option");

  3448.         return convexityFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  3449.     }

  3450.     @Override public double convexityFromJSpread (
  3451.         final org.drip.param.valuation.ValuationParams valParams,
  3452.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3453.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3454.         final int iWorkoutDate,
  3455.         final double dblWorkoutFactor,
  3456.         final double dblJSpread)
  3457.         throws java.lang.Exception
  3458.     {
  3459.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  3460.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  3461.     }

  3462.     @Override public double convexityFromJSpread (
  3463.         final org.drip.param.valuation.ValuationParams valParams,
  3464.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3465.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3466.         final double dblJSpread)
  3467.         throws java.lang.Exception
  3468.     {
  3469.         return convexityFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  3470.     }

  3471.     @Override public double convexityFromJSpreadToOptimalExercise (
  3472.         final org.drip.param.valuation.ValuationParams valParams,
  3473.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3474.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3475.         final double dblJSpread)
  3476.         throws java.lang.Exception
  3477.     {
  3478.         if (null != _eosCall || null != _eosPut)
  3479.             throw new java.lang.Exception ("BondComponent::convexityFromJSpreadToOptimalExercise => " +
  3480.                 "Cant calc Convexity from J Spread to optimal exercise for bonds w emb option");

  3481.         return convexityFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  3482.     }

  3483.     @Override public double convexityFromNSpread (
  3484.         final org.drip.param.valuation.ValuationParams valParams,
  3485.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3486.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3487.         final int iWorkoutDate,
  3488.         final double dblWorkoutFactor,
  3489.         final double dblNSpread)
  3490.         throws java.lang.Exception
  3491.     {
  3492.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  3493.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  3494.     }

  3495.     @Override public double convexityFromNSpread (
  3496.         final org.drip.param.valuation.ValuationParams valParams,
  3497.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3498.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3499.         final double dblNSpread)
  3500.         throws java.lang.Exception
  3501.     {
  3502.         return convexityFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  3503.     }

  3504.     @Override public double convexityFromNSpreadToOptimalExercise (
  3505.         final org.drip.param.valuation.ValuationParams valParams,
  3506.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3507.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3508.         final double dblNSpread)
  3509.         throws java.lang.Exception
  3510.     {
  3511.         if (null != _eosCall || null != _eosPut)
  3512.             throw new java.lang.Exception ("BondComponent::convexityFromNSpreadToOptimalExercise => " +
  3513.                 "Cant calc Convexity from N Spread to optimal exercise for bonds w emb option");

  3514.         return convexityFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  3515.     }

  3516.     @Override public double convexityFromOAS (
  3517.         final org.drip.param.valuation.ValuationParams valParams,
  3518.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3519.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3520.         final int iWorkoutDate,
  3521.         final double dblWorkoutFactor,
  3522.         final double dblOAS)
  3523.         throws java.lang.Exception
  3524.     {
  3525.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  3526.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  3527.     }

  3528.     @Override public double convexityFromOAS (
  3529.         final org.drip.param.valuation.ValuationParams valParams,
  3530.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3531.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3532.         final double dblOAS)
  3533.         throws java.lang.Exception
  3534.     {
  3535.         return convexityFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  3536.     }

  3537.     @Override public double convexityFromOASToOptimalExercise (
  3538.         final org.drip.param.valuation.ValuationParams valParams,
  3539.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3540.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3541.         final double dblOAS)
  3542.         throws java.lang.Exception
  3543.     {
  3544.         if (null != _eosCall || null != _eosPut)
  3545.             throw new java.lang.Exception ("BondComponent::convexityFromOASToOptimalExercise => " +
  3546.                 "Cant calc Convexity from OAS to optimal exercise for bonds w emb option");

  3547.         return convexityFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  3548.     }

  3549.     @Override public double convexityFromPECS (
  3550.         final org.drip.param.valuation.ValuationParams valParams,
  3551.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3552.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3553.         final int iWorkoutDate,
  3554.         final double dblWorkoutFactor,
  3555.         final double dblPECS)
  3556.         throws java.lang.Exception
  3557.     {
  3558.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  3559.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  3560.     }

  3561.     @Override public double convexityFromPECS (
  3562.         final org.drip.param.valuation.ValuationParams valParams,
  3563.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3564.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3565.         final double dblPECS)
  3566.         throws java.lang.Exception
  3567.     {
  3568.         return convexityFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  3569.     }

  3570.     @Override public double convexityFromPECSToOptimalExercise (
  3571.         final org.drip.param.valuation.ValuationParams valParams,
  3572.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3573.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3574.         final double dblPECS)
  3575.         throws java.lang.Exception
  3576.     {
  3577.         if (null != _eosCall || null != _eosPut)
  3578.             throw new java.lang.Exception ("BondComponent::convexityFromPECSToOptimalExercise => " +
  3579.                 "Cant calc Convexity from PECS to optimal exercise for bonds w emb option");

  3580.         return convexityFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  3581.     }

  3582.     @Override public double convexityFromPrice (
  3583.         final org.drip.param.valuation.ValuationParams valParams,
  3584.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3585.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3586.         final int iWorkoutDate,
  3587.         final double dblWorkoutFactor,
  3588.         final double dblPrice)
  3589.         throws java.lang.Exception
  3590.     {
  3591.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  3592.             throw new java.lang.Exception ("BondComponent::convexityFromPrice => Input inputs");

  3593.         double dblYield = yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice);

  3594.         return (priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield - 0.0001) +
  3595.             priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield + 0.0001) - 2. *
  3596.                 dblPrice) / (dblPrice + accrued (valParams.valueDate(), csqc));
  3597.     }

  3598.     @Override public double convexityFromPrice (
  3599.         final org.drip.param.valuation.ValuationParams valParams,
  3600.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3601.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3602.         final double dblPrice)
  3603.         throws java.lang.Exception
  3604.     {
  3605.         return convexityFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  3606.     }

  3607.     @Override public double convexityFromPriceToOptimalExercise (
  3608.         final org.drip.param.valuation.ValuationParams valParams,
  3609.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3610.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3611.         final double dblPrice)
  3612.         throws java.lang.Exception
  3613.     {
  3614.         if (null != _eosCall || null != _eosPut)
  3615.             throw new java.lang.Exception ("BondComponent::calcConvexityFromPriceToOptimalExercise => " +
  3616.                 "Cant calc Convexity from Price to optimal exercise for bonds w emb option");

  3617.         return convexityFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  3618.     }

  3619.     @Override public double convexityFromTSYSpread (
  3620.         final org.drip.param.valuation.ValuationParams valParams,
  3621.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3622.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3623.         final int iWorkoutDate,
  3624.         final double dblWorkoutFactor,
  3625.         final double dblTSYSpread)
  3626.         throws java.lang.Exception
  3627.     {
  3628.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  3629.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  3630.     }

  3631.     @Override public double convexityFromTSYSpread (
  3632.         final org.drip.param.valuation.ValuationParams valParams,
  3633.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3634.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3635.         final double dblTSYSpread)
  3636.         throws java.lang.Exception
  3637.     {
  3638.         return convexityFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  3639.     }

  3640.     @Override public double convexityFromTSYSpreadToOptimalExercise (
  3641.         final org.drip.param.valuation.ValuationParams valParams,
  3642.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3643.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3644.         final double dblTSYSpread)
  3645.         throws java.lang.Exception
  3646.     {
  3647.         if (null != _eosCall || null != _eosPut)
  3648.             throw new java.lang.Exception ("BondComponent::convexityFromTSYSpreadToOptimalExercise => " +
  3649.                 "Cant calc Convexity from TSY Sprd to optimal exercise for bonds w emb option");

  3650.         return convexityFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  3651.     }

  3652.     @Override public double convexityFromYield (
  3653.         final org.drip.param.valuation.ValuationParams valParams,
  3654.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3655.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3656.         final int iWorkoutDate,
  3657.         final double dblWorkoutFactor,
  3658.         final double dblYield)
  3659.         throws java.lang.Exception
  3660.     {
  3661.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  3662.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  3663.     }

  3664.     @Override public double convexityFromYield (
  3665.         final org.drip.param.valuation.ValuationParams valParams,
  3666.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3667.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3668.         final double dblYield)
  3669.         throws java.lang.Exception
  3670.     {
  3671.         return convexityFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  3672.     }

  3673.     @Override public double convexityFromYieldToOptimalExercise (
  3674.         final org.drip.param.valuation.ValuationParams valParams,
  3675.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3676.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3677.         final double dblYield)
  3678.         throws java.lang.Exception
  3679.     {
  3680.         if (null != _eosCall || null != _eosPut)
  3681.             throw new java.lang.Exception ("BondComponent::convexityFromYieldToOptimalExercise => " +
  3682.                 "Cant calc Convexity from Yield to optimal exercise for bonds w emb option");

  3683.         return convexityFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  3684.     }

  3685.     @Override public double convexityFromYieldSpread (
  3686.         final org.drip.param.valuation.ValuationParams valParams,
  3687.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3688.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3689.         final int iWorkoutDate,
  3690.         final double dblWorkoutFactor,
  3691.         final double dblYieldSpread)
  3692.         throws java.lang.Exception
  3693.     {
  3694.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  3695.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  3696.     }

  3697.     @Override public double convexityFromYieldSpread (
  3698.         final org.drip.param.valuation.ValuationParams valParams,
  3699.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3700.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3701.         final double dblYieldSpread)
  3702.         throws java.lang.Exception
  3703.     {
  3704.         return convexityFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  3705.     }

  3706.     @Override public double convexityFromYieldSpreadToOptimalExercise (
  3707.         final org.drip.param.valuation.ValuationParams valParams,
  3708.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3709.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3710.         final double dblYieldSpread)
  3711.         throws java.lang.Exception
  3712.     {
  3713.         if (null != _eosCall || null != _eosPut)
  3714.             throw new java.lang.Exception ("BondComponent::convexityFromYieldSpreadToOptimalExercise => " +
  3715.                 "Cant calc Convexity from Yld Sprd to optimal exercise for bonds w emb option");

  3716.         return convexityFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  3717.     }

  3718.     @Override public double convexityFromZSpread (
  3719.         final org.drip.param.valuation.ValuationParams valParams,
  3720.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3721.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3722.         final int iWorkoutDate,
  3723.         final double dblWorkoutFactor,
  3724.         final double dblZSpread)
  3725.         throws java.lang.Exception
  3726.     {
  3727.         return convexityFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  3728.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  3729.     }

  3730.     @Override public double convexityFromZSpread (
  3731.         final org.drip.param.valuation.ValuationParams valParams,
  3732.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3733.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3734.         final double dblZSpread)
  3735.         throws java.lang.Exception
  3736.     {
  3737.         return convexityFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  3738.     }

  3739.     @Override public double convexityFromZSpreadToOptimalExercise (
  3740.         final org.drip.param.valuation.ValuationParams valParams,
  3741.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3742.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3743.         final double dblZSpread)
  3744.         throws java.lang.Exception
  3745.     {
  3746.         if (null != _eosCall || null != _eosPut)
  3747.             throw new java.lang.Exception ("BondComponent::convexityFromZSpreadToOptimalExercise => " +
  3748.                 "Cant calc Convexity from Z Spread to optimal exercise for bonds w emb option");

  3749.         return convexityFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  3750.     }

  3751.     @Override public double creditBasisFromASW (
  3752.         final org.drip.param.valuation.ValuationParams valParams,
  3753.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3754.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3755.         final int iWorkoutDate,
  3756.         final double dblWorkoutFactor,
  3757.         final double dblASW)
  3758.         throws java.lang.Exception
  3759.     {
  3760.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  3761.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  3762.     }

  3763.     @Override public double creditBasisFromASW (
  3764.         final org.drip.param.valuation.ValuationParams valParams,
  3765.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3766.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3767.         final double dblASW)
  3768.         throws java.lang.Exception
  3769.     {
  3770.         return creditBasisFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  3771.     }

  3772.     @Override public double creditBasisFromASWToOptimalExercise (
  3773.         final org.drip.param.valuation.ValuationParams valParams,
  3774.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3775.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3776.         final double dblASW)
  3777.         throws java.lang.Exception
  3778.     {
  3779.         if (null != _eosCall || null != _eosPut)
  3780.             throw new java.lang.Exception ("BondComponent::creditBasisFromASWToOptimalExercise => " +
  3781.                 "Cannot calc Credit Basis from ASW to optimal exercise for bonds w emb option");

  3782.         return creditBasisFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  3783.     }

  3784.     @Override public double creditBasisFromBondBasis (
  3785.         final org.drip.param.valuation.ValuationParams valParams,
  3786.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3787.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3788.         final int iWorkoutDate,
  3789.         final double dblWorkoutFactor,
  3790.         final double dblBondBasis)
  3791.         throws java.lang.Exception
  3792.     {
  3793.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3794.             priceFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  3795.     }

  3796.     @Override public double creditBasisFromBondBasis (
  3797.         final org.drip.param.valuation.ValuationParams valParams,
  3798.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3799.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3800.         final double dblBondBasis)
  3801.         throws java.lang.Exception
  3802.     {
  3803.         return creditBasisFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  3804.     }

  3805.     @Override public double creditBasisFromBondBasisToOptimalExercise (
  3806.         final org.drip.param.valuation.ValuationParams valParams,
  3807.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3808.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3809.         final double dblBondBasis)
  3810.         throws java.lang.Exception
  3811.     {
  3812.         if (null != _eosCall || null != _eosPut)
  3813.             throw new java.lang.Exception ("BondComponent::creditBasisFromBondBasisToOptimalExercise " +
  3814.                 "=> Cant calc Credit Basis from Bond Basis to optimal exercise for bonds w emb option");

  3815.         return creditBasisFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  3816.     }

  3817.     @Override public double creditBasisFromDiscountMargin (
  3818.         final org.drip.param.valuation.ValuationParams valParams,
  3819.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3820.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3821.         final int iWorkoutDate,
  3822.         final double dblWorkoutFactor,
  3823.         final double dblDiscountMargin)
  3824.         throws java.lang.Exception
  3825.     {
  3826.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3827.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  3828.                 dblDiscountMargin));
  3829.     }

  3830.     @Override public double creditBasisFromDiscountMargin (
  3831.         final org.drip.param.valuation.ValuationParams valParams,
  3832.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3833.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3834.         final double dblDiscountMargin)
  3835.         throws java.lang.Exception
  3836.     {
  3837.         return creditBasisFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  3838.             dblDiscountMargin);
  3839.     }

  3840.     @Override public double creditBasisFromDiscountMarginToOptimalExercise (
  3841.         final org.drip.param.valuation.ValuationParams valParams,
  3842.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3843.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3844.         final double dblDiscountMargin)
  3845.         throws java.lang.Exception
  3846.     {
  3847.         if (null != _eosCall || null != _eosPut)
  3848.             throw new java.lang.Exception
  3849.                 ("BondComponent::creditBasisFromDiscountMarginToOptimalExercise => " +
  3850.                     "Cant calc Credit Basis from Discnt Margin to optimal exercise for bonds w emb option");

  3851.         return creditBasisFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  3852.             dblDiscountMargin);
  3853.     }

  3854.     @Override public double creditBasisFromESpread (
  3855.         final org.drip.param.valuation.ValuationParams valParams,
  3856.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3857.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3858.         final int iWorkoutDate,
  3859.         final double dblWorkoutFactor,
  3860.         final double dblESpread)
  3861.         throws java.lang.Exception
  3862.     {
  3863.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  3864.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  3865.     }

  3866.     @Override public double creditBasisFromESpread (
  3867.         final org.drip.param.valuation.ValuationParams valParams,
  3868.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3869.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3870.         final double dblESpread)
  3871.         throws java.lang.Exception
  3872.     {
  3873.         return creditBasisFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  3874.     }

  3875.     @Override public double creditBasisFromESpreadToOptimalExercise (
  3876.         final org.drip.param.valuation.ValuationParams valParams,
  3877.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3878.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3879.         final double dblESpread)
  3880.         throws java.lang.Exception
  3881.     {
  3882.         if (null != _eosCall || null != _eosPut)
  3883.             throw new java.lang.Exception ("BondComponent::creditBasisFromESpreadToOptimalExercise => " +
  3884.                 "Cant calc Credit Basis from E Spread to optimal exercise for bonds w emb option");

  3885.         return creditBasisFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  3886.     }

  3887.     @Override public double creditBasisFromGSpread (
  3888.         final org.drip.param.valuation.ValuationParams valParams,
  3889.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3890.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3891.         final int iWorkoutDate,
  3892.         final double dblWorkoutFactor,
  3893.         final double dblGSpread)
  3894.         throws java.lang.Exception
  3895.     {
  3896.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  3897.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  3898.     }

  3899.     @Override public double creditBasisFromGSpread (
  3900.         final org.drip.param.valuation.ValuationParams valParams,
  3901.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3902.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3903.         final double dblGSpread)
  3904.         throws java.lang.Exception
  3905.     {
  3906.         return creditBasisFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  3907.     }

  3908.     @Override public double creditBasisFromGSpreadToOptimalExercise (
  3909.         final org.drip.param.valuation.ValuationParams valParams,
  3910.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3911.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3912.         final double dblGSpread)
  3913.         throws java.lang.Exception
  3914.     {
  3915.         if (null != _eosCall || null != _eosPut)
  3916.             throw new java.lang.Exception ("BondComponent::creditBasisFromGSpreadToOptimalExercise => " +
  3917.                 "Cant calc Credit Basis from G Spread to optimal exercise for bonds w emb option");

  3918.         return creditBasisFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  3919.     }

  3920.     @Override public double creditBasisFromISpread (
  3921.         final org.drip.param.valuation.ValuationParams valParams,
  3922.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3923.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3924.         final int iWorkoutDate,
  3925.         final double dblWorkoutFactor,
  3926.         final double dblISpread)
  3927.         throws java.lang.Exception
  3928.     {
  3929.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  3930.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  3931.     }

  3932.     @Override public double creditBasisFromISpread (
  3933.         final org.drip.param.valuation.ValuationParams valParams,
  3934.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3935.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3936.         final double dblISpread)
  3937.         throws java.lang.Exception
  3938.     {
  3939.         return creditBasisFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  3940.     }

  3941.     @Override public double creditBasisFromISpreadToOptimalExercise (
  3942.         final org.drip.param.valuation.ValuationParams valParams,
  3943.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3944.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3945.         final double dblISpread)
  3946.         throws java.lang.Exception
  3947.     {
  3948.         if (null != _eosCall || null != _eosPut)
  3949.             throw new java.lang.Exception ("BondComponent::creditBasisFromISpreadToOptimalExercise => " +
  3950.                 "Cant calc Credit Basis from I Spread to optimal exercise for bonds w emb option");

  3951.         return creditBasisFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  3952.     }

  3953.     @Override public double creditBasisFromJSpread (
  3954.         final org.drip.param.valuation.ValuationParams valParams,
  3955.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3956.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3957.         final int iWorkoutDate,
  3958.         final double dblWorkoutFactor,
  3959.         final double dblJSpread)
  3960.         throws java.lang.Exception
  3961.     {
  3962.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  3963.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  3964.     }

  3965.     @Override public double creditBasisFromJSpread (
  3966.         final org.drip.param.valuation.ValuationParams valParams,
  3967.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3968.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3969.         final double dblJSpread)
  3970.         throws java.lang.Exception
  3971.     {
  3972.         return creditBasisFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  3973.     }

  3974.     @Override public double creditBasisFromJSpreadToOptimalExercise (
  3975.         final org.drip.param.valuation.ValuationParams valParams,
  3976.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3977.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3978.         final double dblJSpread)
  3979.         throws java.lang.Exception
  3980.     {
  3981.         if (null != _eosCall || null != _eosPut)
  3982.             throw new java.lang.Exception ("BondComponent::creditBasisFromJSpreadToOptimalExercise => " +
  3983.                 "Cant calc Credit Basis from J Spread to optimal exercise for bonds w emb option");

  3984.         return creditBasisFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  3985.     }

  3986.     @Override public double creditBasisFromNSpread (
  3987.         final org.drip.param.valuation.ValuationParams valParams,
  3988.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  3989.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  3990.         final int iWorkoutDate,
  3991.         final double dblWorkoutFactor,
  3992.         final double dblNSpread)
  3993.         throws java.lang.Exception
  3994.     {
  3995.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  3996.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  3997.     }

  3998.     @Override public double creditBasisFromNSpread (
  3999.         final org.drip.param.valuation.ValuationParams valParams,
  4000.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4001.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4002.         final double dblNSpread)
  4003.         throws java.lang.Exception
  4004.     {
  4005.         return creditBasisFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  4006.     }

  4007.     @Override public double creditBasisFromNSpreadToOptimalExercise (
  4008.         final org.drip.param.valuation.ValuationParams valParams,
  4009.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4010.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4011.         final double dblNSpread)
  4012.         throws java.lang.Exception
  4013.     {
  4014.         if (null != _eosCall || null != _eosPut)
  4015.             throw new java.lang.Exception ("BondComponent::creditBasisFromNSpreadToOptimalExercise => " +
  4016.                 "Cant calc Credit Basis from N Spread to optimal exercise for bonds w emb option");

  4017.         return creditBasisFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  4018.     }

  4019.     @Override public double creditBasisFromOAS (
  4020.         final org.drip.param.valuation.ValuationParams valParams,
  4021.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4022.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4023.         final int iWorkoutDate,
  4024.         final double dblWorkoutFactor,
  4025.         final double dblOAS)
  4026.         throws java.lang.Exception
  4027.     {
  4028.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  4029.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  4030.     }

  4031.     @Override public double creditBasisFromOAS (
  4032.         final org.drip.param.valuation.ValuationParams valParams,
  4033.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4034.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4035.         final double dblOAS)
  4036.         throws java.lang.Exception
  4037.     {
  4038.         return creditBasisFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  4039.     }

  4040.     @Override public double creditBasisFromOASToOptimalExercise (
  4041.         final org.drip.param.valuation.ValuationParams valParams,
  4042.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4043.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4044.         final double dblOAS)
  4045.         throws java.lang.Exception
  4046.     {
  4047.         if (null != _eosCall || null != _eosPut)
  4048.             throw new java.lang.Exception ("BondComponent::creditBasisFromOASToOptimalExercise => " +
  4049.                 "Cant calc Credit Basis from OAS to optimal exercise for bonds w emb option");

  4050.         return creditBasisFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  4051.     }

  4052.     @Override public double creditBasisFromPECS (
  4053.         final org.drip.param.valuation.ValuationParams valParams,
  4054.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4055.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4056.         final int iWorkoutDate,
  4057.         final double dblWorkoutFactor,
  4058.         final double dblPECS)
  4059.         throws java.lang.Exception
  4060.     {
  4061.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  4062.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  4063.     }

  4064.     @Override public double creditBasisFromPECS (
  4065.         final org.drip.param.valuation.ValuationParams valParams,
  4066.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4067.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4068.         final double dblPECS)
  4069.         throws java.lang.Exception
  4070.     {
  4071.         return creditBasisFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  4072.     }

  4073.     @Override public double creditBasisFromPECSToOptimalExercise (
  4074.         final org.drip.param.valuation.ValuationParams valParams,
  4075.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4076.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4077.         final double dblPECS)
  4078.         throws java.lang.Exception
  4079.     {
  4080.         if (null != _eosCall || null != _eosPut)
  4081.             throw new java.lang.Exception ("BondComponent::creditBasisFromPECSToOptimalExercise => " +
  4082.                 "Cant calc Credit Basis from PECS to optimal exercise for bonds w emb option");

  4083.         return creditBasisFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  4084.     }

  4085.     @Override public double creditBasisFromPrice (
  4086.         final org.drip.param.valuation.ValuationParams valParams,
  4087.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4088.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4089.         final int iWorkoutDate,
  4090.         final double dblWorkoutFactor,
  4091.         final double dblPrice)
  4092.         throws java.lang.Exception
  4093.     {
  4094.         return new BondCalibrator (this, false).calibrateCreditBasisFromPrice (valParams, csqc, iWorkoutDate,
  4095.             dblWorkoutFactor, dblPrice, false);
  4096.     }

  4097.     @Override public double creditBasisFromPrice (
  4098.         final org.drip.param.valuation.ValuationParams valParams,
  4099.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4100.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4101.         final double dblPrice)
  4102.         throws java.lang.Exception
  4103.     {
  4104.         return creditBasisFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  4105.     }

  4106.     @Override public double creditBasisFromPriceToOptimalExercise (
  4107.         final org.drip.param.valuation.ValuationParams valParams,
  4108.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4109.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4110.         final double dblPrice)
  4111.         throws java.lang.Exception
  4112.     {
  4113.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  4114.         if (null == wi)
  4115.             throw new java.lang.Exception
  4116.                 ("BondComponent::creditBasisFromPriceToOptimalExercise => cant calc Work-out");

  4117.         return creditBasisFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  4118.     }

  4119.     @Override public double creditBasisFromTSYSpread (
  4120.         final org.drip.param.valuation.ValuationParams valParams,
  4121.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4122.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4123.         final int iWorkoutDate,
  4124.         final double dblWorkoutFactor,
  4125.         final double dblTSYSpread)
  4126.         throws java.lang.Exception
  4127.     {
  4128.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4129.             priceFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  4130.     }

  4131.     @Override public double creditBasisFromTSYSpread (
  4132.         final org.drip.param.valuation.ValuationParams valParams,
  4133.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4134.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4135.         final double dblTSYSpread)
  4136.         throws java.lang.Exception
  4137.     {
  4138.         return creditBasisFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  4139.     }

  4140.     @Override public double creditBasisFromTSYSpreadToOptimalExercise (
  4141.         final org.drip.param.valuation.ValuationParams valParams,
  4142.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4143.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4144.         final double dblTSYSpread)
  4145.         throws java.lang.Exception
  4146.     {
  4147.         if (null != _eosCall || null != _eosPut)
  4148.             throw new java.lang.Exception ("BondComponent::creditBasisFromTSYSpreadToOptimalExercise => " +
  4149.                 "Cant calc Credit Basis from TSY Spread to optimal exercise for bonds w emb option");

  4150.         return creditBasisFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  4151.     }

  4152.     @Override public double creditBasisFromYield (
  4153.         final org.drip.param.valuation.ValuationParams valParams,
  4154.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4155.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4156.         final int iWorkoutDate,
  4157.         final double dblWorkoutFactor,
  4158.         final double dblYield)
  4159.         throws java.lang.Exception
  4160.     {
  4161.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  4162.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  4163.     }

  4164.     @Override public double creditBasisFromYield (
  4165.         final org.drip.param.valuation.ValuationParams valParams,
  4166.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4167.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4168.         final double dblYield)
  4169.         throws java.lang.Exception
  4170.     {
  4171.         return creditBasisFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  4172.     }

  4173.     @Override public double creditBasisFromYieldToOptimalExercise (
  4174.         final org.drip.param.valuation.ValuationParams valParams,
  4175.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4176.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4177.         final double dblYield)
  4178.         throws java.lang.Exception
  4179.     {
  4180.         if (null != _eosCall || null != _eosPut)
  4181.             throw new java.lang.Exception ("BondComponent::creditBasisFromYieldToOptimalExercise => " +
  4182.                 "Cant calc Credit Basis from Yield to optimal exercise for bonds w emb option");

  4183.         return creditBasisFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  4184.     }

  4185.     @Override public double creditBasisFromYieldSpread (
  4186.         final org.drip.param.valuation.ValuationParams valParams,
  4187.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4188.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4189.         final int iWorkoutDate,
  4190.         final double dblWorkoutFactor,
  4191.         final double dblYieldSpread)
  4192.         throws java.lang.Exception
  4193.     {
  4194.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4195.             priceFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  4196.     }

  4197.     @Override public double creditBasisFromYieldSpread (
  4198.         final org.drip.param.valuation.ValuationParams valParams,
  4199.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4200.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4201.         final double dblYieldSpread)
  4202.         throws java.lang.Exception
  4203.     {
  4204.         return creditBasisFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4205.             dblYieldSpread);
  4206.     }

  4207.     @Override public double creditBasisFromYieldSpreadToOptimalExercise (
  4208.         final org.drip.param.valuation.ValuationParams valParams,
  4209.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4210.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4211.         final double dblYieldSpread)
  4212.         throws  java.lang.Exception
  4213.     {
  4214.         if (null != _eosCall || null != _eosPut)
  4215.             throw new java.lang.Exception ("BondComponent::creditBasisFromYieldSpreadToOptimalExercise " +
  4216.                 "=> Cant calc Credit Basis from Yield Spread to optimal exercise for bonds w emb option");

  4217.         return creditBasisFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4218.             dblYieldSpread);
  4219.     }

  4220.     @Override public double creditBasisFromZSpread (
  4221.         final org.drip.param.valuation.ValuationParams valParams,
  4222.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4223.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4224.         final int iWorkoutDate,
  4225.         final double dblWorkoutFactor,
  4226.         final double dblZSpread)
  4227.         throws java.lang.Exception
  4228.     {
  4229.         return creditBasisFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  4230.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  4231.     }

  4232.     @Override public double creditBasisFromZSpread (
  4233.         final org.drip.param.valuation.ValuationParams valParams,
  4234.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4235.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4236.         final double dblZSpread)
  4237.         throws java.lang.Exception
  4238.     {
  4239.         return creditBasisFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  4240.     }

  4241.     @Override public double creditBasisFromZSpreadToOptimalExercise (
  4242.         final org.drip.param.valuation.ValuationParams valParams,
  4243.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4244.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4245.         final double dblZSpread)
  4246.         throws java.lang.Exception
  4247.     {
  4248.         if (null != _eosCall || null != _eosPut)
  4249.             throw new java.lang.Exception ("BondComponent::creditBasisFromZSpreadToOptimalExercise => " +
  4250.                 "Cant calc Credit Basis from Z Spread to optimal exercise for bonds w emb option");

  4251.         return creditBasisFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  4252.     }

  4253.     @Override public double discountMarginFromASW (
  4254.         final org.drip.param.valuation.ValuationParams valParams,
  4255.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4256.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4257.         final int iWorkoutDate,
  4258.         final double dblWorkoutFactor,
  4259.         final double dblASW)
  4260.         throws java.lang.Exception
  4261.     {
  4262.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  4263.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  4264.     }

  4265.     @Override public double discountMarginFromASW (
  4266.         final org.drip.param.valuation.ValuationParams valParams,
  4267.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4268.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4269.         final double dblASW)
  4270.         throws java.lang.Exception
  4271.     {
  4272.         return discountMarginFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  4273.     }

  4274.     @Override public double discountMarginFromASWToOptimalExercise (
  4275.         final org.drip.param.valuation.ValuationParams valParams,
  4276.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4277.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4278.         final double dblASW)
  4279.         throws java.lang.Exception
  4280.     {
  4281.         if (null != _eosCall || null != _eosPut)
  4282.             throw new java.lang.Exception ("BondComponent::discountMarginFromASWToOptimalExercise => " +
  4283.                 "Cant calc Discount Margin from ASW to optimal exercise for bonds w emb option");

  4284.         return discountMarginFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  4285.     }

  4286.     @Override public double discountMarginFromBondBasis (
  4287.         final org.drip.param.valuation.ValuationParams valParams,
  4288.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4289.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4290.         final int iWorkoutDate,
  4291.         final double dblWorkoutFactor,
  4292.         final double dblBondBasis)
  4293.         throws java.lang.Exception
  4294.     {
  4295.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4296.             yieldFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  4297.     }

  4298.     @Override public double discountMarginFromBondBasis (
  4299.         final org.drip.param.valuation.ValuationParams valParams,
  4300.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4301.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4302.         final double dblBondBasis)
  4303.         throws java.lang.Exception
  4304.     {
  4305.         return discountMarginFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  4306.     }

  4307.     @Override public double discountMarginFromBondBasisToOptimalExercise (
  4308.         final org.drip.param.valuation.ValuationParams valParams,
  4309.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4310.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4311.         final double dblBondBasis)
  4312.         throws java.lang.Exception
  4313.     {
  4314.         if (null != _eosCall || null != _eosPut)
  4315.             throw new java.lang.Exception ("BondComponent::discountMarginFromBondBasisToOptimalExercise " +
  4316.                 "=> Cant calc Discount Margin from Bond Basis to optimal exercise for bonds w emb option");

  4317.         return discountMarginFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  4318.     }

  4319.     @Override public double discountMarginFromCreditBasis (
  4320.         final org.drip.param.valuation.ValuationParams valParams,
  4321.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4322.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4323.         final int iWorkoutDate,
  4324.         final double dblWorkoutFactor,
  4325.         final double dblCreditBasis)
  4326.         throws java.lang.Exception
  4327.     {
  4328.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4329.             yieldFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  4330.     }

  4331.     @Override public double discountMarginFromCreditBasis (
  4332.         final org.drip.param.valuation.ValuationParams valParams,
  4333.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4334.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4335.         final double dblCreditBasis)
  4336.         throws java.lang.Exception
  4337.     {
  4338.         return discountMarginFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4339.             dblCreditBasis);
  4340.     }

  4341.     @Override public double discountMarginFromCreditBasisToOptimalExercise (
  4342.         final org.drip.param.valuation.ValuationParams valParams,
  4343.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4344.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4345.         final double dblCreditBasis)
  4346.         throws java.lang.Exception
  4347.     {
  4348.         if (null != _eosCall || null != _eosPut)
  4349.             throw new java.lang.Exception
  4350.                 ("BondComponent::discountMarginFromCreditBasisToOptimalExercise => " +
  4351.                     "Cant calc Discount Margin from Crdit Basis to optimal exercise for bonds w emb option");

  4352.         return discountMarginFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4353.             dblCreditBasis);
  4354.     }

  4355.     @Override public double discountMarginFromESpread (
  4356.         final org.drip.param.valuation.ValuationParams valParams,
  4357.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4358.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4359.         final int iWorkoutDate,
  4360.         final double dblWorkoutFactor,
  4361.         final double dblESpread)
  4362.         throws java.lang.Exception
  4363.     {
  4364.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4365.             yieldFromESpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  4366.     }

  4367.     @Override public double discountMarginFromESpread (
  4368.         final org.drip.param.valuation.ValuationParams valParams,
  4369.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4370.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4371.         final double dblESpread)
  4372.         throws java.lang.Exception
  4373.     {
  4374.         return discountMarginFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  4375.     }

  4376.     @Override public double discountMarginFromESpreadToOptimalExercise (
  4377.         final org.drip.param.valuation.ValuationParams valParams,
  4378.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4379.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4380.         final double dblESpread)
  4381.         throws java.lang.Exception
  4382.     {
  4383.         if (null != _eosCall || null != _eosPut)
  4384.             throw new java.lang.Exception ("BondComponent::discountMarginFromESpreadToOptimalExercise =>" +
  4385.                 " => Cant calc Discount Margin from E Spread to optimal exercise for bonds w emb option");

  4386.         return discountMarginFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  4387.     }

  4388.     @Override public double discountMarginFromGSpread (
  4389.         final org.drip.param.valuation.ValuationParams valParams,
  4390.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4391.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4392.         final int iWorkoutDate,
  4393.         final double dblWorkoutFactor,
  4394.         final double dblGSpread)
  4395.         throws java.lang.Exception
  4396.     {
  4397.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4398.             yieldFromGSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  4399.     }

  4400.     @Override public double discountMarginFromGSpread (
  4401.         final org.drip.param.valuation.ValuationParams valParams,
  4402.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4403.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4404.         final double dblGSpread)
  4405.         throws java.lang.Exception
  4406.     {
  4407.         return discountMarginFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  4408.     }

  4409.     @Override public double discountMarginFromGSpreadToOptimalExercise (
  4410.         final org.drip.param.valuation.ValuationParams valParams,
  4411.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4412.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4413.         final double dblGSpread)
  4414.         throws java.lang.Exception
  4415.     {
  4416.         if (null != _eosCall || null != _eosPut)
  4417.             throw new java.lang.Exception ("BondComponent::discountMarginFromGSpreadToOptimalExercise =>" +
  4418.                 " => Cant calc Discount Margin from G Spread to optimal exercise for bonds w emb option");

  4419.         return discountMarginFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  4420.     }

  4421.     @Override public double discountMarginFromISpread (
  4422.         final org.drip.param.valuation.ValuationParams valParams,
  4423.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4424.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4425.         final int iWorkoutDate,
  4426.         final double dblWorkoutFactor,
  4427.         final double dblISpread)
  4428.         throws java.lang.Exception
  4429.     {
  4430.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4431.             yieldFromISpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  4432.     }

  4433.     @Override public double discountMarginFromISpread (
  4434.         final org.drip.param.valuation.ValuationParams valParams,
  4435.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4436.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4437.         final double dblISpread)
  4438.         throws java.lang.Exception
  4439.     {
  4440.         return discountMarginFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  4441.     }

  4442.     @Override public double discountMarginFromISpreadToOptimalExercise (
  4443.         final org.drip.param.valuation.ValuationParams valParams,
  4444.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4445.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4446.         final double dblISpread)
  4447.         throws java.lang.Exception
  4448.     {
  4449.         if (null != _eosCall || null != _eosPut)
  4450.             throw new java.lang.Exception ("BondComponent::discountMarginFromISpreadToOptimalExercise " +
  4451.                 "=> Cant calc Discount Margin from I Spread to optimal exercise for bonds w emb option");

  4452.         return discountMarginFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  4453.     }

  4454.     @Override public double discountMarginFromJSpread (
  4455.         final org.drip.param.valuation.ValuationParams valParams,
  4456.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4457.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4458.         final int iWorkoutDate,
  4459.         final double dblWorkoutFactor,
  4460.         final double dblJSpread)
  4461.         throws java.lang.Exception
  4462.     {
  4463.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4464.             yieldFromJSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  4465.     }

  4466.     @Override public double discountMarginFromJSpread (
  4467.         final org.drip.param.valuation.ValuationParams valParams,
  4468.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4469.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4470.         final double dblJSpread)
  4471.         throws java.lang.Exception
  4472.     {
  4473.         return discountMarginFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  4474.     }

  4475.     @Override public double discountMarginFromJSpreadToOptimalExercise (
  4476.         final org.drip.param.valuation.ValuationParams valParams,
  4477.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4478.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4479.         final double dblJSpread)
  4480.         throws java.lang.Exception
  4481.     {
  4482.         if (null != _eosCall || null != _eosPut)
  4483.             throw new java.lang.Exception ("BondComponent::discountMarginFromJSpreadToOptimalExercise " +
  4484.                 "=> Cant calc Discount Margin from J Spread to optimal exercise for bonds w emb option");

  4485.         return discountMarginFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  4486.     }

  4487.     @Override public double discountMarginFromNSpread (
  4488.         final org.drip.param.valuation.ValuationParams valParams,
  4489.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4490.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4491.         final int iWorkoutDate,
  4492.         final double dblWorkoutFactor,
  4493.         final double dblNSpread)
  4494.         throws java.lang.Exception
  4495.     {
  4496.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4497.             yieldFromNSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  4498.     }

  4499.     @Override public double discountMarginFromNSpread (
  4500.         final org.drip.param.valuation.ValuationParams valParams,
  4501.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4502.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4503.         final double dblNSpread)
  4504.         throws java.lang.Exception
  4505.     {
  4506.         return discountMarginFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  4507.     }

  4508.     @Override public double discountMarginFromNSpreadToOptimalExercise (
  4509.         final org.drip.param.valuation.ValuationParams valParams,
  4510.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4511.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4512.         final double dblNSpread)
  4513.         throws java.lang.Exception
  4514.     {
  4515.         if (null != _eosCall || null != _eosPut)
  4516.             throw new java.lang.Exception ("BondComponent::discountMarginFromNSpreadToOptimalExercise " +
  4517.                 "=> Cant calc Discount Margin from N Spread to optimal exercise for bonds w emb option");

  4518.         return discountMarginFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  4519.     }

  4520.     @Override public double discountMarginFromOAS (
  4521.         final org.drip.param.valuation.ValuationParams valParams,
  4522.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4523.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4524.         final int iWorkoutDate,
  4525.         final double dblWorkoutFactor,
  4526.         final double dblOAS)
  4527.         throws java.lang.Exception
  4528.     {
  4529.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  4530.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  4531.     }

  4532.     @Override public double discountMarginFromOAS (
  4533.         final org.drip.param.valuation.ValuationParams valParams,
  4534.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4535.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4536.         final double dblOAS)
  4537.         throws java.lang.Exception
  4538.     {
  4539.         return discountMarginFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  4540.     }

  4541.     @Override public double discountMarginFromOASToOptimalExercise (
  4542.         final org.drip.param.valuation.ValuationParams valParams,
  4543.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4544.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4545.         final double dblOAS)
  4546.         throws java.lang.Exception
  4547.     {
  4548.         if (null != _eosCall || null != _eosPut)
  4549.             throw new java.lang.Exception ("BondComponent::calcDiscountMarginFromOASToOptimalExercise => " +
  4550.                 "Cant calc Discount Margin from OAS to optimal exercise for bonds w emb option");

  4551.         return discountMarginFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  4552.     }

  4553.     @Override public double discountMarginFromPECS (
  4554.         final org.drip.param.valuation.ValuationParams valParams,
  4555.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4556.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4557.         final int iWorkoutDate,
  4558.         final double dblWorkoutFactor,
  4559.         final double dblPECS)
  4560.         throws java.lang.Exception
  4561.     {
  4562.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  4563.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  4564.     }

  4565.     @Override public double discountMarginFromPECS (
  4566.         final org.drip.param.valuation.ValuationParams valParams,
  4567.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4568.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4569.         final double dblPECS)
  4570.         throws java.lang.Exception
  4571.     {
  4572.         return discountMarginFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  4573.     }

  4574.     @Override public double discountMarginFromPECSToOptimalExercise (
  4575.         final org.drip.param.valuation.ValuationParams valParams,
  4576.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4577.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4578.         final double dblPECS)
  4579.         throws java.lang.Exception
  4580.     {
  4581.         if (null != _eosCall || null != _eosPut)
  4582.             throw new java.lang.Exception ("BondComponent::discountMarginFromPECSToOptimalExercise => " +
  4583.                 "Cant calc Discount Margin from PECS to optimal exercise for bonds w emb option");

  4584.         return discountMarginFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  4585.     }

  4586.     @Override public double discountMarginFromPrice (
  4587.         final org.drip.param.valuation.ValuationParams valParams,
  4588.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4589.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4590.         final int iWorkoutDate,
  4591.         final double dblWorkoutFactor,
  4592.         final double dblPrice)
  4593.         throws java.lang.Exception
  4594.     {
  4595.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4596.             yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  4597.     }

  4598.     @Override public double discountMarginFromPrice (
  4599.         final org.drip.param.valuation.ValuationParams valParams,
  4600.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4601.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4602.         final double dblPrice)
  4603.         throws java.lang.Exception
  4604.     {
  4605.         return discountMarginFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  4606.     }

  4607.     @Override public double discountMarginFromPriceToOptimalExercise (
  4608.         final org.drip.param.valuation.ValuationParams valParams,
  4609.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4610.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4611.         final double dblPrice)
  4612.         throws java.lang.Exception
  4613.     {
  4614.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  4615.         if (null == wi)
  4616.             throw new java.lang.Exception
  4617.                 ("BondComponent::discountMarginFromPriceToOptimalExercise => Can't do Work-out");

  4618.         return discountMarginFromYield (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  4619.     }

  4620.     @Override public double discountMarginFromTSYSpread (
  4621.         final org.drip.param.valuation.ValuationParams valParams,
  4622.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4623.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4624.         final int iWorkoutDate,
  4625.         final double dblWorkoutFactor,
  4626.         final double dblTSYSpread)
  4627.         throws java.lang.Exception
  4628.     {
  4629.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4630.             yieldFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  4631.     }

  4632.     @Override public double discountMarginFromTSYSpread (
  4633.         final org.drip.param.valuation.ValuationParams valParams,
  4634.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4635.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4636.         final double dblTSYSpread)
  4637.         throws java.lang.Exception
  4638.     {
  4639.         return discountMarginFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  4640.     }

  4641.     @Override public double discountMarginFromTSYSpreadToOptimalExercise (
  4642.         final org.drip.param.valuation.ValuationParams valParams,
  4643.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4644.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4645.         final double dblTSYSpread)
  4646.         throws java.lang.Exception
  4647.     {
  4648.         if (null != _eosCall || null != _eosPut)
  4649.             throw new java.lang.Exception ("BondComponent::discountMarginFromTSYSpreadToOptimalExercise " +
  4650.                 "=> Cant calc Discount Margin from TSY Spread to optimal exercise for bonds w emb option");

  4651.         return discountMarginFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  4652.     }

  4653.     @Override public double discountMarginFromYield (
  4654.         final org.drip.param.valuation.ValuationParams valParams,
  4655.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4656.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4657.         final int iWorkoutDate,
  4658.         final double dblWorkoutFactor,
  4659.         final double dblYield)
  4660.         throws java.lang.Exception
  4661.     {
  4662.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  4663.             throw new java.lang.Exception ("BondComponent::discountMarginFromYield => Invalid inputs");

  4664.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  4665.         if (null == dcFunding)
  4666.             throw new java.lang.Exception ("BondComponent::discountMarginFromYield => Invalid inputs");

  4667.         int iValueDate = valParams.valueDate();

  4668.         int iFreq = freq();

  4669.         org.drip.analytics.cashflow.CompositePeriod cp = currentPeriod (iValueDate);

  4670.         if (null == cp)
  4671.             throw new java.lang.Exception ("BondComponent::discountMarginFromYield => Invalid inputs");

  4672.         return null == _floaterSetting || !(cp instanceof
  4673.             org.drip.analytics.cashflow.CompositeFloatingPeriod) ? dblYield - dcFunding.libor (iValueDate,
  4674.                 ((int) (12. / (0 == iFreq ? 2 : iFreq))) + "M") : dblYield - indexRate (iValueDate, csqc,
  4675.                     (org.drip.analytics.cashflow.CompositeFloatingPeriod) cp);
  4676.     }

  4677.     @Override public double discountMarginFromYield (
  4678.         final org.drip.param.valuation.ValuationParams valParams,
  4679.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4680.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4681.         final double dblYield)
  4682.         throws java.lang.Exception
  4683.     {
  4684.         return discountMarginFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  4685.     }

  4686.     @Override public double discountMarginFromYieldToOptimalExercise (
  4687.         final org.drip.param.valuation.ValuationParams valParams,
  4688.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4689.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4690.         final double dblYield)
  4691.         throws java.lang.Exception
  4692.     {
  4693.         if (null != _eosCall || null != _eosPut)
  4694.             throw new java.lang.Exception ("BondComponent::discountMarginFromYieldToOptimalExercise =>" +
  4695.                 " Cant calc Discount Margin from Yield to optimal exercise for bonds w emb option");

  4696.         return discountMarginFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  4697.     }

  4698.     @Override public double discountMarginFromYieldSpread (
  4699.         final org.drip.param.valuation.ValuationParams valParams,
  4700.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4701.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4702.         final int iWorkoutDate,
  4703.         final double dblWorkoutFactor,
  4704.         final double dblYieldSpread)
  4705.         throws java.lang.Exception
  4706.     {
  4707.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4708.             yieldFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  4709.     }

  4710.     @Override public double discountMarginFromYieldSpread (
  4711.         final org.drip.param.valuation.ValuationParams valParams,
  4712.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4713.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4714.         final double dblYieldSpread)
  4715.         throws java.lang.Exception
  4716.     {
  4717.         return discountMarginFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4718.             dblYieldSpread);
  4719.     }

  4720.     @Override public double discountMarginFromYieldSpreadToOptimalExercise (
  4721.         final org.drip.param.valuation.ValuationParams valParams,
  4722.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4723.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4724.         final double dblYieldSpread)
  4725.         throws java.lang.Exception
  4726.     {
  4727.         if (null != _eosCall || null != _eosPut)
  4728.             throw new java.lang.Exception
  4729.                 ("BondComponent::discountMarginFromYieldSpreadToOptimalExercise => " +
  4730.                     "Cant calc Discount Margin from Yield Sprd to optimal exercise for bonds w emb option");

  4731.         return discountMarginFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4732.             dblYieldSpread);
  4733.     }

  4734.     @Override public double discountMarginFromZSpread (
  4735.         final org.drip.param.valuation.ValuationParams valParams,
  4736.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4737.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4738.         final int iWorkoutDate,
  4739.         final double dblWorkoutFactor,
  4740.         final double dblZSpread)
  4741.         throws java.lang.Exception
  4742.     {
  4743.         return discountMarginFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4744.             yieldFromZSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  4745.     }

  4746.     @Override public double discountMarginFromZSpread (
  4747.         final org.drip.param.valuation.ValuationParams valParams,
  4748.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4749.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4750.         final double dblZSpread)
  4751.         throws java.lang.Exception
  4752.     {
  4753.         return discountMarginFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  4754.     }

  4755.     @Override public double discountMarginFromZSpreadToOptimalExercise (
  4756.         final org.drip.param.valuation.ValuationParams valParams,
  4757.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4758.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4759.         final double dblZSpread)
  4760.         throws java.lang.Exception
  4761.     {
  4762.         if (null != _eosCall || null != _eosPut)
  4763.             throw new java.lang.Exception ("BondComponent::discountMarginFromZSpreadToOptimalExercise =>" +
  4764.                 " Cant calc Discount Margin from Z Spread to optimal exercise for bonds w emb option");

  4765.         return discountMarginFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  4766.     }

  4767.     @Override public double durationFromASW (
  4768.         final org.drip.param.valuation.ValuationParams valParams,
  4769.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4770.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4771.         final int iWorkoutDate,
  4772.         final double dblWorkoutFactor,
  4773.         final double dblASW)
  4774.         throws java.lang.Exception
  4775.     {
  4776.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  4777.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  4778.     }

  4779.     @Override public double durationFromASW (
  4780.         final org.drip.param.valuation.ValuationParams valParams,
  4781.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4782.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4783.         final double dblASW)
  4784.         throws java.lang.Exception
  4785.     {
  4786.         return durationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  4787.     }

  4788.     @Override public double durationFromASWToOptimalExercise (
  4789.         final org.drip.param.valuation.ValuationParams valParams,
  4790.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4791.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4792.         final double dblASW)
  4793.         throws java.lang.Exception
  4794.     {
  4795.         if (null != _eosCall || null != _eosPut)
  4796.             throw new java.lang.Exception ("BondComponent::durationFromASWToOptimalExercise => " +
  4797.                 "Cant calc Duration from ASW to optimal exercise for bonds w emb option");

  4798.         return durationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  4799.     }

  4800.     @Override public double durationFromBondBasis (
  4801.         final org.drip.param.valuation.ValuationParams valParams,
  4802.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4803.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4804.         final int iWorkoutDate,
  4805.         final double dblWorkoutFactor,
  4806.         final double dblBondBasis)
  4807.         throws java.lang.Exception
  4808.     {
  4809.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  4810.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  4811.     }

  4812.     @Override public double durationFromBondBasis (
  4813.         final org.drip.param.valuation.ValuationParams valParams,
  4814.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4815.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4816.         final double dblBondBasis)
  4817.         throws java.lang.Exception
  4818.     {
  4819.         return durationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  4820.     }

  4821.     @Override public double durationFromBondBasisToOptimalExercise (
  4822.         final org.drip.param.valuation.ValuationParams valParams,
  4823.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4824.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4825.         final double dblBondBasis)
  4826.         throws java.lang.Exception
  4827.     {
  4828.         if (null != _eosCall || null != _eosPut)
  4829.             throw new java.lang.Exception ("BondComponent::durationFromBondBasisToOptimalExercise => " +
  4830.                 "Cant calc Duration from Bond Basis to optimal exercise for bonds w emb option");

  4831.         return durationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  4832.     }

  4833.     @Override public double durationFromCreditBasis (
  4834.         final org.drip.param.valuation.ValuationParams valParams,
  4835.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4836.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4837.         final int iWorkoutDate,
  4838.         final double dblWorkoutFactor,
  4839.         final double dblCreditBasis)
  4840.         throws java.lang.Exception
  4841.     {
  4842.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4843.             priceFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  4844.     }

  4845.     @Override public double durationFromCreditBasis (
  4846.         final org.drip.param.valuation.ValuationParams valParams,
  4847.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4848.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4849.         final double dblCreditBasis)
  4850.         throws java.lang.Exception
  4851.     {
  4852.         return durationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  4853.     }

  4854.     @Override public double durationFromCreditBasisToOptimalExercise (
  4855.         final org.drip.param.valuation.ValuationParams valParams,
  4856.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4857.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4858.         final double dblCreditBasis)
  4859.         throws java.lang.Exception
  4860.     {
  4861.         if (null != _eosCall || null != _eosPut)
  4862.             throw new java.lang.Exception ("BondComponent::durationFromCreditBasisToOptimalExercise => " +
  4863.                 "Cant calc Duration from Credit Basis to optimal exercise for bonds w emb option");

  4864.         return durationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  4865.     }

  4866.     @Override public double durationFromDiscountMargin (
  4867.         final org.drip.param.valuation.ValuationParams valParams,
  4868.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4869.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4870.         final int iWorkoutDate,
  4871.         final double dblWorkoutFactor,
  4872.         final double dblDiscountMargin)
  4873.         throws java.lang.Exception
  4874.     {
  4875.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4876.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  4877.                 dblDiscountMargin));
  4878.     }

  4879.     @Override public double durationFromDiscountMargin (
  4880.         final org.drip.param.valuation.ValuationParams valParams,
  4881.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4882.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4883.         final double dblDiscountMargin)
  4884.         throws java.lang.Exception
  4885.     {
  4886.         return durationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4887.             dblDiscountMargin);
  4888.     }

  4889.     @Override public double durationFromDiscountMarginToOptimalExercise (
  4890.         final org.drip.param.valuation.ValuationParams valParams,
  4891.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4892.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4893.         final double dblDiscountMargin)
  4894.         throws java.lang.Exception
  4895.     {
  4896.         if (null != _eosCall || null != _eosPut)
  4897.             throw new java.lang.Exception ("BondComponent::durationFromDiscountMarginToOptimalExercise " +
  4898.                 "=> Cant calc Duration from Discount Margin to optimal exercise for bonds w emb option");

  4899.         return durationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  4900.             dblDiscountMargin);
  4901.     }

  4902.     @Override public double durationFromESpread (
  4903.         final org.drip.param.valuation.ValuationParams valParams,
  4904.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4905.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4906.         final int iWorkoutDate,
  4907.         final double dblWorkoutFactor,
  4908.         final double dblESpread)
  4909.         throws java.lang.Exception
  4910.     {
  4911.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  4912.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  4913.     }

  4914.     @Override public double durationFromESpread (
  4915.         final org.drip.param.valuation.ValuationParams valParams,
  4916.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4917.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4918.         final double dblESpread)
  4919.         throws java.lang.Exception
  4920.     {
  4921.         return durationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  4922.     }

  4923.     @Override public double durationFromESpreadToOptimalExercise (
  4924.         final org.drip.param.valuation.ValuationParams valParams,
  4925.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4926.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4927.         final double dblESpread)
  4928.         throws java.lang.Exception
  4929.     {
  4930.         if (null != _eosCall || null != _eosPut)
  4931.             throw new java.lang.Exception ("BondComponent::durationFromESpreadToOptimalExercise => " +
  4932.                 "Cant calc Duration from E Spread to optimal exercise for bonds w emb option");

  4933.         return durationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  4934.     }

  4935.     @Override public double durationFromGSpread (
  4936.         final org.drip.param.valuation.ValuationParams valParams,
  4937.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4938.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4939.         final int iWorkoutDate,
  4940.         final double dblWorkoutFactor,
  4941.         final double dblGSpread)
  4942.         throws java.lang.Exception
  4943.     {
  4944.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  4945.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  4946.     }

  4947.     @Override public double durationFromGSpread (
  4948.         final org.drip.param.valuation.ValuationParams valParams,
  4949.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4950.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4951.         final double dblGSpread)
  4952.         throws java.lang.Exception
  4953.     {
  4954.         return durationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  4955.     }

  4956.     @Override public double durationFromGSpreadToOptimalExercise (
  4957.         final org.drip.param.valuation.ValuationParams valParams,
  4958.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4959.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4960.         final double dblGSpread)
  4961.         throws java.lang.Exception
  4962.     {
  4963.         if (null != _eosCall || null != _eosPut)
  4964.             throw new java.lang.Exception ("BondComponent::durationFromGSpreadToOptimalExercise => " +
  4965.                 "Cant calc Duration from G Spread to optimal exercise for bonds w emb option");

  4966.         return durationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  4967.     }

  4968.     @Override public double durationFromISpread (
  4969.         final org.drip.param.valuation.ValuationParams valParams,
  4970.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4971.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4972.         final int iWorkoutDate,
  4973.         final double dblWorkoutFactor,
  4974.         final double dblISpread)
  4975.         throws java.lang.Exception
  4976.     {
  4977.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  4978.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  4979.     }

  4980.     @Override public double durationFromISpread (
  4981.         final org.drip.param.valuation.ValuationParams valParams,
  4982.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4983.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4984.         final double dblISpread)
  4985.         throws java.lang.Exception
  4986.     {
  4987.         return durationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  4988.     }

  4989.     @Override public double durationFromISpreadToOptimalExercise (
  4990.         final org.drip.param.valuation.ValuationParams valParams,
  4991.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  4992.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  4993.         final double dblISpread)
  4994.         throws java.lang.Exception
  4995.     {
  4996.         if (null != _eosCall || null != _eosPut)
  4997.             throw new java.lang.Exception ("BondComponent::durationFromISpreadToOptimalExercise => " +
  4998.                 "Cant calc Duration from I Spread to optimal exercise for bonds w emb option");

  4999.         return durationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  5000.     }

  5001.     @Override public double durationFromJSpread (
  5002.         final org.drip.param.valuation.ValuationParams valParams,
  5003.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5004.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5005.         final int iWorkoutDate,
  5006.         final double dblWorkoutFactor,
  5007.         final double dblJSpread)
  5008.         throws java.lang.Exception
  5009.     {
  5010.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  5011.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  5012.     }

  5013.     @Override public double durationFromJSpread (
  5014.         final org.drip.param.valuation.ValuationParams valParams,
  5015.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5016.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5017.         final double dblJSpread)
  5018.         throws java.lang.Exception
  5019.     {
  5020.         return durationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5021.     }

  5022.     @Override public double durationFromJSpreadToOptimalExercise (
  5023.         final org.drip.param.valuation.ValuationParams valParams,
  5024.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5025.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5026.         final double dblJSpread)
  5027.         throws java.lang.Exception
  5028.     {
  5029.         if (null != _eosCall || null != _eosPut)
  5030.             throw new java.lang.Exception ("BondComponent::durationFromJSpreadToOptimalExercise => " +
  5031.                 "Cant calc Duration from J Spread to optimal exercise for bonds w emb option");

  5032.         return durationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5033.     }

  5034.     @Override public double durationFromNSpread (
  5035.         final org.drip.param.valuation.ValuationParams valParams,
  5036.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5037.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5038.         final int iWorkoutDate,
  5039.         final double dblWorkoutFactor,
  5040.         final double dblNSpread)
  5041.         throws java.lang.Exception
  5042.     {
  5043.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  5044.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  5045.     }

  5046.     @Override public double durationFromNSpread (
  5047.         final org.drip.param.valuation.ValuationParams valParams,
  5048.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5049.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5050.         final double dblNSpread)
  5051.         throws java.lang.Exception
  5052.     {
  5053.         return durationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  5054.     }

  5055.     @Override public double durationFromNSpreadToOptimalExercise (
  5056.         final org.drip.param.valuation.ValuationParams valParams,
  5057.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5058.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5059.         final double dblNSpread)
  5060.         throws java.lang.Exception
  5061.     {
  5062.         if (null != _eosCall || null != _eosPut)
  5063.             throw new java.lang.Exception ("BondComponent::durationFromNSpreadToOptimalExercise => " +
  5064.                 "Cant calc Duration from N Spread to optimal exercise for bonds w emb option");

  5065.         return durationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  5066.     }

  5067.     @Override public double durationFromOAS (
  5068.         final org.drip.param.valuation.ValuationParams valParams,
  5069.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5070.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5071.         final int iWorkoutDate,
  5072.         final double dblWorkoutFactor,
  5073.         final double dblOAS)
  5074.         throws java.lang.Exception
  5075.     {
  5076.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  5077.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  5078.     }

  5079.     @Override public double durationFromOAS (
  5080.         final org.drip.param.valuation.ValuationParams valParams,
  5081.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5082.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5083.         final double dblOAS)
  5084.         throws java.lang.Exception
  5085.     {
  5086.         return durationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  5087.     }

  5088.     @Override public double durationFromOASToOptimalExercise (
  5089.         final org.drip.param.valuation.ValuationParams valParams,
  5090.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5091.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5092.         final double dblOAS)
  5093.         throws java.lang.Exception
  5094.     {
  5095.         if (null != _eosCall || null != _eosPut)
  5096.             throw new java.lang.Exception ("BondComponent::durationFromOASToOptimalExercise => " +
  5097.                 "Cant calc Duration from OAS to optimal exercise for bonds w emb option");

  5098.         return durationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  5099.     }

  5100.     @Override public double durationFromPECS (
  5101.         final org.drip.param.valuation.ValuationParams valParams,
  5102.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5103.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5104.         final int iWorkoutDate,
  5105.         final double dblWorkoutFactor,
  5106.         final double dblPECS)
  5107.         throws java.lang.Exception
  5108.     {
  5109.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  5110.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  5111.     }

  5112.     @Override public double durationFromPECS (
  5113.         final org.drip.param.valuation.ValuationParams valParams,
  5114.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5115.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5116.         final double dblPECS)
  5117.         throws java.lang.Exception
  5118.     {
  5119.         return durationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  5120.     }

  5121.     @Override public double durationFromPECSToOptimalExercise (
  5122.         final org.drip.param.valuation.ValuationParams valParams,
  5123.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5124.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5125.         final double dblPECS)
  5126.         throws java.lang.Exception
  5127.     {
  5128.         if (null != _eosCall || null != _eosPut)
  5129.             throw new java.lang.Exception ("BondComponent::durationFromPECSToOptimalExercise => " +
  5130.                 "Cant calc Duration from PECS to optimal exercise for bonds w emb option");

  5131.         return durationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  5132.     }

  5133.     @Override public double durationFromPrice (
  5134.         final org.drip.param.valuation.ValuationParams valParams,
  5135.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5136.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5137.         final int iWorkoutDate,
  5138.         final double dblWorkoutFactor,
  5139.         final double dblPrice)
  5140.         throws java.lang.Exception
  5141.     {
  5142.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice);
  5143.     }

  5144.     @Override public double durationFromPrice (
  5145.         final org.drip.param.valuation.ValuationParams valParams,
  5146.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5147.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5148.         final double dblPrice)
  5149.         throws java.lang.Exception
  5150.     {
  5151.         return durationFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  5152.     }

  5153.     @Override public double durationFromPriceToOptimalExercise (
  5154.         final org.drip.param.valuation.ValuationParams valParams,
  5155.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5156.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5157.         final double dblPrice)
  5158.         throws java.lang.Exception
  5159.     {
  5160.         if (null != _eosCall || null != _eosPut)
  5161.             throw new java.lang.Exception ("BondComponent::durationFromPriceToOptimalExercise => " +
  5162.                 "Cant calc Duration from Price to optimal exercise for bonds w emb option");

  5163.         return durationFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  5164.     }

  5165.     @Override public double durationFromTSYSpread (
  5166.         final org.drip.param.valuation.ValuationParams valParams,
  5167.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5168.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5169.         final int iWorkoutDate,
  5170.         final double dblWorkoutFactor,
  5171.         final double dblTSYSpread)
  5172.         throws java.lang.Exception
  5173.     {
  5174.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  5175.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  5176.     }

  5177.     @Override public double durationFromTSYSpread (
  5178.         final org.drip.param.valuation.ValuationParams valParams,
  5179.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5180.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5181.         final double dblTSYSpread)
  5182.         throws java.lang.Exception
  5183.     {
  5184.         return durationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  5185.     }

  5186.     @Override public double durationFromTSYSpreadToOptimalExercise (
  5187.         final org.drip.param.valuation.ValuationParams valParams,
  5188.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5189.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5190.         final double dblTSYSpread)
  5191.         throws java.lang.Exception
  5192.     {
  5193.         if (null != _eosCall || null != _eosPut)
  5194.             throw new java.lang.Exception ("BondComponent::durationFromTSYSpreadToOptimalExercise => " +
  5195.                 "Cant calc Duration from TSY Sprd to optimal exercise for bonds w emb option");

  5196.         return durationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  5197.     }

  5198.     @Override public double durationFromYield (
  5199.         final org.drip.param.valuation.ValuationParams valParams,
  5200.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5201.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5202.         final int iWorkoutDate,
  5203.         final double dblWorkoutFactor,
  5204.         final double dblYield)
  5205.         throws java.lang.Exception
  5206.     {
  5207.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  5208.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  5209.     }

  5210.     @Override public double durationFromYield (
  5211.         final org.drip.param.valuation.ValuationParams valParams,
  5212.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5213.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5214.         final double dblYield)
  5215.         throws java.lang.Exception
  5216.     {
  5217.         return durationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  5218.     }

  5219.     @Override public double durationFromYieldToOptimalExercise (
  5220.         final org.drip.param.valuation.ValuationParams valParams,
  5221.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5222.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5223.         final double dblYield)
  5224.         throws java.lang.Exception
  5225.     {
  5226.         if (null != _eosCall || null != _eosPut)
  5227.             throw new java.lang.Exception ("BondComponent::durationFromYieldToOptimalExercise => " +
  5228.                 "Cant calc Duration from Yield to optimal exercise for bonds w emb option");

  5229.         return durationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  5230.     }

  5231.     @Override public double durationFromYieldSpread (
  5232.         final org.drip.param.valuation.ValuationParams valParams,
  5233.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5234.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5235.         final int iWorkoutDate,
  5236.         final double dblWorkoutFactor,
  5237.         final double dblYieldSpread)
  5238.         throws java.lang.Exception
  5239.     {
  5240.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  5241.             priceFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  5242.     }

  5243.     @Override public double durationFromYieldSpread (
  5244.         final org.drip.param.valuation.ValuationParams valParams,
  5245.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5246.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5247.         final double dblYieldSpread)
  5248.         throws java.lang.Exception
  5249.     {
  5250.         return durationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  5251.     }

  5252.     @Override public double durationFromYieldSpreadToOptimalExercise (
  5253.         final org.drip.param.valuation.ValuationParams valParams,
  5254.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5255.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5256.         final double dblYieldSpread)
  5257.         throws java.lang.Exception
  5258.     {
  5259.         if (null != _eosCall || null != _eosPut)
  5260.             throw new java.lang.Exception ("BondComponent::durationFromYieldSpreadToOptimalExercise => " +
  5261.                 "Cant calc Duration from Yield Spread to optimal exercise for bonds w emb option");

  5262.         return durationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  5263.     }

  5264.     @Override public double durationFromZSpread (
  5265.         final org.drip.param.valuation.ValuationParams valParams,
  5266.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5267.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5268.         final int iWorkoutDate,
  5269.         final double dblWorkoutFactor,
  5270.         final double dblZSpread)
  5271.         throws java.lang.Exception
  5272.     {
  5273.         return durationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  5274.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  5275.     }

  5276.     @Override public double durationFromZSpread (
  5277.         final org.drip.param.valuation.ValuationParams valParams,
  5278.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5279.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5280.         final double dblZSpread)
  5281.         throws java.lang.Exception
  5282.     {
  5283.         return durationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  5284.     }

  5285.     @Override public double durationFromZSpreadToOptimalExercise (
  5286.         final org.drip.param.valuation.ValuationParams valParams,
  5287.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5288.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5289.         final double dblZSpread)
  5290.         throws java.lang.Exception
  5291.     {
  5292.         if (null != _eosCall || null != _eosPut)
  5293.             throw new java.lang.Exception ("BondComponent::durationFromZSpreadToOptimalExercise => " +
  5294.                 "Cant calc Duration from Z Spread to optimal exercise for bonds w emb option");

  5295.         return durationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  5296.     }

  5297.     @Override public double eSpreadFromASW (
  5298.         final org.drip.param.valuation.ValuationParams valParams,
  5299.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5300.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5301.         final int iWorkoutDate,
  5302.         final double dblWorkoutFactor,
  5303.         final double dblASW)
  5304.         throws java.lang.Exception
  5305.     {
  5306.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  5307.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  5308.     }

  5309.     @Override public double eSpreadFromASW (
  5310.         final org.drip.param.valuation.ValuationParams valParams,
  5311.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5312.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5313.         final double dblASW)
  5314.         throws java.lang.Exception
  5315.     {
  5316.         return eSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  5317.     }

  5318.     @Override public double eSpreadFromASWToOptimalExercise (
  5319.         final org.drip.param.valuation.ValuationParams valParams,
  5320.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5321.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5322.         final double dblASW)
  5323.         throws java.lang.Exception
  5324.     {
  5325.         if (null != _eosCall || null != _eosPut)
  5326.             throw new java.lang.Exception ("BondComponent::eSpreadFromASWToOptimalExercise => " +
  5327.                 "Cant calc E Spread from ASW to optimal exercise for bonds w emb option");

  5328.         return eSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  5329.     }

  5330.     @Override public double eSpreadFromBondBasis (
  5331.         final org.drip.param.valuation.ValuationParams valParams,
  5332.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5333.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5334.         final int iWorkoutDate,
  5335.         final double dblWorkoutFactor,
  5336.         final double dblBondBasis)
  5337.         throws java.lang.Exception
  5338.     {
  5339.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  5340.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  5341.     }

  5342.     @Override public double eSpreadFromBondBasis (
  5343.         final org.drip.param.valuation.ValuationParams valParams,
  5344.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5345.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5346.         final double dblBondBasis)
  5347.         throws java.lang.Exception
  5348.     {
  5349.         return eSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  5350.     }

  5351.     @Override public double eSpreadFromBondBasisToOptimalExercise (
  5352.         final org.drip.param.valuation.ValuationParams valParams,
  5353.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5354.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5355.         final double dblBondBasis)
  5356.         throws java.lang.Exception
  5357.     {
  5358.         if (null != _eosCall || null != _eosPut)
  5359.             throw new java.lang.Exception ("BondComponent::eSpreadFromBondBasisToOptimalExercise => " +
  5360.                 "Cant calc E Spread from Bond Basis to optimal exercise for bonds w emb option");

  5361.         return eSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  5362.     }

  5363.     @Override public double eSpreadFromCreditBasis (
  5364.         final org.drip.param.valuation.ValuationParams valParams,
  5365.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5366.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5367.         final int iWorkoutDate,
  5368.         final double dblWorkoutFactor,
  5369.         final double dblCreditBasis)
  5370.         throws java.lang.Exception
  5371.     {
  5372.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  5373.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  5374.     }

  5375.     @Override public double eSpreadFromCreditBasis (
  5376.         final org.drip.param.valuation.ValuationParams valParams,
  5377.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5378.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5379.         final double dblCreditBasis)
  5380.         throws java.lang.Exception
  5381.     {
  5382.         return eSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  5383.     }

  5384.     @Override public double eSpreadFromCreditBasisToOptimalExercise (
  5385.         final org.drip.param.valuation.ValuationParams valParams,
  5386.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5387.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5388.         final double dblCreditBasis)
  5389.         throws java.lang.Exception
  5390.     {
  5391.         if (null != _eosCall || null != _eosPut)
  5392.             throw new java.lang.Exception ("BondComponent::eSpreadFromCreditBasisToOptimalExercise => " +
  5393.                 "Cant calc E Spread from Credit Basis to optimal exercise for bonds w emb option");

  5394.         return eSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  5395.     }

  5396.     @Override public double eSpreadFromDiscountMargin (
  5397.         final org.drip.param.valuation.ValuationParams valParams,
  5398.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5399.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5400.         final int iWorkoutDate,
  5401.         final double dblWorkoutFactor,
  5402.         final double dblDiscountMargin)
  5403.         throws java.lang.Exception
  5404.     {
  5405.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  5406.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  5407.                 dblDiscountMargin));
  5408.     }

  5409.     @Override public double eSpreadFromDiscountMargin (
  5410.         final org.drip.param.valuation.ValuationParams valParams,
  5411.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5412.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5413.         final double dblDiscountMargin)
  5414.         throws java.lang.Exception
  5415.     {
  5416.         return eSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  5417.             dblDiscountMargin);
  5418.     }

  5419.     @Override public double eSpreadFromDiscountMarginToOptimalExercise (
  5420.         final org.drip.param.valuation.ValuationParams valParams,
  5421.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5422.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5423.         final double dblDiscountMargin)
  5424.         throws java.lang.Exception
  5425.     {
  5426.         if (null != _eosCall || null != _eosPut)
  5427.             throw new java.lang.Exception
  5428.                 ("BondComponent::eSpreadFromDiscountMarginToOptimalExercise => " +
  5429.                     "Cant calc E Spread from Discount Margin to optimal exercise for bonds w emb option");

  5430.         return eSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  5431.             dblDiscountMargin);
  5432.     }

  5433.     @Override public double eSpreadFromGSpread (
  5434.         final org.drip.param.valuation.ValuationParams valParams,
  5435.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5436.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5437.         final int iWorkoutDate,
  5438.         final double dblWorkoutFactor,
  5439.         final double dblGSpread)
  5440.         throws java.lang.Exception
  5441.     {
  5442.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  5443.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  5444.     }

  5445.     @Override public double eSpreadFromGSpread (
  5446.         final org.drip.param.valuation.ValuationParams valParams,
  5447.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5448.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5449.         final double dblGSpread)
  5450.         throws java.lang.Exception
  5451.     {
  5452.         return eSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  5453.     }

  5454.     @Override public double eSpreadFromGSpreadToOptimalExercise (
  5455.         final org.drip.param.valuation.ValuationParams valParams,
  5456.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5457.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5458.         final double dblGSpread)
  5459.         throws java.lang.Exception
  5460.     {
  5461.         if (null != _eosCall || null != _eosPut)
  5462.             throw new java.lang.Exception ("BondComponent::eSpreadFromGSpreadToOptimalExercise => " +
  5463.                 "Cant calc E Spread from G Spread to optimal exercise for bonds w emb option");

  5464.         return eSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  5465.     }

  5466.     @Override public double eSpreadFromISpread (
  5467.         final org.drip.param.valuation.ValuationParams valParams,
  5468.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5469.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5470.         final int iWorkoutDate,
  5471.         final double dblWorkoutFactor,
  5472.         final double dblISpread)
  5473.         throws java.lang.Exception
  5474.     {
  5475.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  5476.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  5477.     }

  5478.     @Override public double eSpreadFromISpread (
  5479.         final org.drip.param.valuation.ValuationParams valParams,
  5480.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5481.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5482.         final double dblISpread)
  5483.         throws java.lang.Exception
  5484.     {
  5485.         return eSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  5486.     }

  5487.     @Override public double eSpreadFromISpreadToOptimalExercise (
  5488.         final org.drip.param.valuation.ValuationParams valParams,
  5489.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5490.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5491.         final double dblISpread)
  5492.         throws java.lang.Exception
  5493.     {
  5494.         if (null != _eosCall || null != _eosPut)
  5495.             throw new java.lang.Exception ("BondComponent::eSpreadFromISpreadToOptimalExercise => " +
  5496.                 "Cant calc E Spread from I Spread to optimal exercise for bonds w emb option");

  5497.         return eSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  5498.     }

  5499.     @Override public double eSpreadFromJSpread (
  5500.         final org.drip.param.valuation.ValuationParams valParams,
  5501.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5502.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5503.         final int iWorkoutDate,
  5504.         final double dblWorkoutFactor,
  5505.         final double dblJSpread)
  5506.         throws java.lang.Exception
  5507.     {
  5508.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  5509.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  5510.     }

  5511.     @Override public double eSpreadFromJSpread (
  5512.         final org.drip.param.valuation.ValuationParams valParams,
  5513.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5514.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5515.         final double dblJSpread)
  5516.         throws java.lang.Exception
  5517.     {
  5518.         return eSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5519.     }

  5520.     @Override public double eSpreadFromJSpreadToOptimalExercise (
  5521.         final org.drip.param.valuation.ValuationParams valParams,
  5522.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5523.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5524.         final double dblJSpread)
  5525.         throws java.lang.Exception
  5526.     {
  5527.         if (null != _eosCall || null != _eosPut)
  5528.             throw new java.lang.Exception ("BondComponent::eSpreadFromJSpreadToOptimalExercise => " +
  5529.                 "Cant calc E Spread from J Spread to optimal exercise for bonds w emb option");

  5530.         return eSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5531.     }

  5532.     @Override public double eSpreadFromNSpread (
  5533.         final org.drip.param.valuation.ValuationParams valParams,
  5534.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5535.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5536.         final int iWorkoutDate,
  5537.         final double dblWorkoutFactor,
  5538.         final double dblNSpread)
  5539.         throws java.lang.Exception
  5540.     {
  5541.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  5542.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  5543.     }

  5544.     @Override public double eSpreadFromNSpread (
  5545.         final org.drip.param.valuation.ValuationParams valParams,
  5546.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5547.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5548.         final double dblNSpread)
  5549.         throws java.lang.Exception
  5550.     {
  5551.         return eSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  5552.     }

  5553.     @Override public double eSpreadFromNSpreadToOptimalExercise (
  5554.         final org.drip.param.valuation.ValuationParams valParams,
  5555.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5556.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5557.         final double dblNSpread)
  5558.         throws java.lang.Exception
  5559.     {
  5560.         if (null != _eosCall || null != _eosPut)
  5561.             throw new java.lang.Exception ("BondComponent::eSpreadFromNSpreadToOptimalExercise => " +
  5562.                 "Cant calc E Spread from N Spread to optimal exercise for bonds w emb option");

  5563.         return eSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  5564.     }

  5565.     @Override public double eSpreadFromOAS (
  5566.         final org.drip.param.valuation.ValuationParams valParams,
  5567.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5568.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5569.         final int iWorkoutDate,
  5570.         final double dblWorkoutFactor,
  5571.         final double dblOAS)
  5572.         throws java.lang.Exception
  5573.     {
  5574.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  5575.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  5576.     }

  5577.     @Override public double eSpreadFromOAS (
  5578.         final org.drip.param.valuation.ValuationParams valParams,
  5579.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5580.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5581.         final double dblOAS)
  5582.         throws java.lang.Exception
  5583.     {
  5584.         return eSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  5585.     }

  5586.     @Override public double eSpreadFromOASToOptimalExercise (
  5587.         final org.drip.param.valuation.ValuationParams valParams,
  5588.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5589.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5590.         final double dblOAS)
  5591.         throws java.lang.Exception
  5592.     {
  5593.         if (null != _eosCall || null != _eosPut)
  5594.             throw new java.lang.Exception ("BondComponent::eSpreadFromOASToOptimalExercise => " +
  5595.                 "Cant calc E Spread from OAS to optimal exercise for bonds w emb option");

  5596.         return eSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  5597.     }

  5598.     @Override public double eSpreadFromPECS (
  5599.         final org.drip.param.valuation.ValuationParams valParams,
  5600.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5601.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5602.         final int iWorkoutDate,
  5603.         final double dblWorkoutFactor,
  5604.         final double dblPECS)
  5605.         throws java.lang.Exception
  5606.     {
  5607.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  5608.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  5609.     }

  5610.     @Override public double eSpreadFromPECS (
  5611.         final org.drip.param.valuation.ValuationParams valParams,
  5612.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5613.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5614.         final double dblPECS)
  5615.         throws java.lang.Exception
  5616.     {
  5617.         return eSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  5618.     }

  5619.     @Override public double eSpreadFromPECSToOptimalExercise (
  5620.         final org.drip.param.valuation.ValuationParams valParams,
  5621.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5622.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5623.         final double dblPECS)
  5624.         throws java.lang.Exception
  5625.     {
  5626.         if (null != _eosCall || null != _eosPut)
  5627.             throw new java.lang.Exception ("BondComponent::eSpreadFromPECSToOptimalExercise => " +
  5628.                 "Cant calc E Spread from PECS to optimal exercise for bonds w emb option");

  5629.         return eSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  5630.     }

  5631.     @Override public double eSpreadFromPrice (
  5632.         final org.drip.param.valuation.ValuationParams valParams,
  5633.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5634.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5635.         final int iWorkoutDate,
  5636.         final double dblWorkoutFactor,
  5637.         final double dblPrice)
  5638.         throws java.lang.Exception
  5639.     {
  5640.         return new BondCalibrator (this, false).calibrateZSpreadFromPrice (valParams, csqc, vcp,
  5641.             ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE, iWorkoutDate, dblWorkoutFactor, dblPrice);
  5642.     }

  5643.     @Override public double eSpreadFromPrice (
  5644.         final org.drip.param.valuation.ValuationParams valParams,
  5645.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5646.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5647.         final double dblPrice)
  5648.         throws java.lang.Exception
  5649.     {
  5650.         return eSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  5651.     }

  5652.     @Override public double eSpreadFromPriceToOptimalExercise (
  5653.         final org.drip.param.valuation.ValuationParams valParams,
  5654.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5655.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5656.         final double dblPrice)
  5657.         throws java.lang.Exception
  5658.     {
  5659.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  5660.         if (null == wi)
  5661.             throw new java.lang.Exception ("BondComponent::eSpreadFromPriceToOptimalExercise => " +
  5662.                 "Cant calc Workout from Price to optimal exercise for bonds w emb option");

  5663.         return eSpreadFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  5664.     }

  5665.     @Override public double eSpreadFromTSYSpread (
  5666.         final org.drip.param.valuation.ValuationParams valParams,
  5667.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5668.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5669.         final int iWorkoutDate,
  5670.         final double dblWorkoutFactor,
  5671.         final double dblTSYSpread)
  5672.         throws java.lang.Exception
  5673.     {
  5674.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  5675.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  5676.     }

  5677.     @Override public double eSpreadFromTSYSpread (
  5678.         final org.drip.param.valuation.ValuationParams valParams,
  5679.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5680.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5681.         final double dblTSYSpread)
  5682.         throws java.lang.Exception
  5683.     {
  5684.         return eSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  5685.     }

  5686.     @Override public double eSpreadFromTSYSpreadToOptimalExercise (
  5687.         final org.drip.param.valuation.ValuationParams valParams,
  5688.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5689.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5690.         final double dblTSYSpread)
  5691.         throws java.lang.Exception
  5692.     {
  5693.         if (null != _eosCall || null != _eosPut)
  5694.             throw new java.lang.Exception ("BondComponent::eSpreadFromTSYSpreadToOptimalExercise => " +
  5695.                 "Cant calc E Spread from TSY Spread to optimal exercise for bonds w emb option");

  5696.         return eSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  5697.     }

  5698.     @Override public double eSpreadFromYield (
  5699.         final org.drip.param.valuation.ValuationParams valParams,
  5700.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5701.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5702.         final int iWorkoutDate,
  5703.         final double dblWorkoutFactor,
  5704.         final double dblYield)
  5705.         throws java.lang.Exception
  5706.     {
  5707.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  5708.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  5709.     }

  5710.     @Override public double eSpreadFromYield (
  5711.         final org.drip.param.valuation.ValuationParams valParams,
  5712.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5713.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5714.         final double dblYield)
  5715.         throws java.lang.Exception
  5716.     {
  5717.         return eSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  5718.     }

  5719.     @Override public double eSpreadFromYieldToOptimalExercise (
  5720.         final org.drip.param.valuation.ValuationParams valParams,
  5721.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5722.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5723.         final double dblYield)
  5724.         throws java.lang.Exception
  5725.     {
  5726.         if (null != _eosCall || null != _eosPut)
  5727.             throw new java.lang.Exception ("BondComponent::eSpreadFromYieldToOptimalExercise => " +
  5728.                 "Cant calc E Spread from Yield to optimal exercise for bonds w emb option");

  5729.         return eSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  5730.     }

  5731.     @Override public double eSpreadFromYieldSpread (
  5732.         final org.drip.param.valuation.ValuationParams valParams,
  5733.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5734.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5735.         final int iWorkoutDate,
  5736.         final double dblWorkoutFactor,
  5737.         final double dblYieldSpread)
  5738.         throws java.lang.Exception
  5739.     {
  5740.         return eSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  5741.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  5742.     }

  5743.     @Override public double eSpreadFromYieldSpread (
  5744.         final org.drip.param.valuation.ValuationParams valParams,
  5745.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5746.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5747.         final double dblYieldSpread)
  5748.         throws java.lang.Exception
  5749.     {
  5750.         return eSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  5751.     }

  5752.     @Override public double eSpreadFromYieldSpreadToOptimalExercise (
  5753.         final org.drip.param.valuation.ValuationParams valParams,
  5754.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5755.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5756.         final double dblYieldSpread)
  5757.         throws java.lang.Exception
  5758.     {
  5759.         if (null != _eosCall || null != _eosPut)
  5760.             throw new java.lang.Exception ("BondComponent::eSpreadFromYieldSpreadToOptimalExercise => " +
  5761.                 "Cant calc E Spread from Yield Spread to optimal exercise for bonds w emb option");

  5762.         return eSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  5763.     }

  5764.     @Override public double gSpreadFromASW (
  5765.         final org.drip.param.valuation.ValuationParams valParams,
  5766.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  5767.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5768.         final int iWorkoutDate,
  5769.         final double dblWorkoutFactor,
  5770.         final double dblASW)
  5771.         throws java.lang.Exception
  5772.     {
  5773.         return gSpreadFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  5774.             (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  5775.     }

  5776.     @Override public double gSpreadFromASW (
  5777.         final org.drip.param.valuation.ValuationParams valParams,
  5778.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5779.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5780.         final double dblASW)
  5781.         throws java.lang.Exception
  5782.     {
  5783.         return gSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  5784.     }

  5785.     @Override public double gSpreadFromASWToOptimalExercise (
  5786.         final org.drip.param.valuation.ValuationParams valParams,
  5787.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5788.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5789.         final double dblASW)
  5790.         throws java.lang.Exception
  5791.     {
  5792.         if (null != _eosCall || null != _eosPut)
  5793.             throw new java.lang.Exception ("BondComponent::gSpreadFromASWToOptimalExercise => " +
  5794.                 "Cant calc G Spread from ASW to optimal exercise for bonds w emb option");

  5795.         return gSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  5796.     }

  5797.     @Override public double gSpreadFromBondBasis (
  5798.         final org.drip.param.valuation.ValuationParams valParams,
  5799.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5800.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5801.         final int iWorkoutDate,
  5802.         final double dblWorkoutFactor,
  5803.         final double dblBondBasis)
  5804.         throws java.lang.Exception
  5805.     {
  5806.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  5807.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  5808.     }

  5809.     @Override public double gSpreadFromBondBasis (
  5810.         final org.drip.param.valuation.ValuationParams valParams,
  5811.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5812.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5813.         final double dblBondBasis)
  5814.         throws java.lang.Exception
  5815.     {
  5816.         return gSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  5817.     }

  5818.     @Override public double gSpreadFromBondBasisToOptimalExercise (
  5819.         final org.drip.param.valuation.ValuationParams valParams,
  5820.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5821.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5822.         final double dblBondBasis)
  5823.         throws java.lang.Exception
  5824.     {
  5825.         if (null != _eosCall || null != _eosPut)
  5826.             throw new java.lang.Exception ("BondComponent::gSpreadFromBondBasisToOptimalExercise => " +
  5827.                 "Cant calc G Spread from Bond Basis to optimal exercise for bonds w emb option");

  5828.         return gSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  5829.     }

  5830.     @Override public double gSpreadFromCreditBasis (
  5831.         final org.drip.param.valuation.ValuationParams valParams,
  5832.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5833.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5834.         final int iWorkoutDate,
  5835.         final double dblWorkoutFactor,
  5836.         final double dblCreditBasis)
  5837.         throws java.lang.Exception
  5838.     {
  5839.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromCreditBasis
  5840.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  5841.     }

  5842.     @Override public double gSpreadFromCreditBasis (
  5843.         final org.drip.param.valuation.ValuationParams valParams,
  5844.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5845.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5846.         final double dblCreditBasis)
  5847.         throws java.lang.Exception
  5848.     {
  5849.         return gSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  5850.     }

  5851.     @Override public double gSpreadFromCreditBasisToOptimalExercise (
  5852.         final org.drip.param.valuation.ValuationParams valParams,
  5853.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5854.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5855.         final double dblCreditBasis)
  5856.         throws java.lang.Exception
  5857.     {
  5858.         if (null != _eosCall || null != _eosPut)
  5859.             throw new java.lang.Exception ("BondComponent::gSpreadFromCreditBasisToOptimalExercise => " +
  5860.                 "Cant calc G Spread from Credit Basis to optimal exercise for bonds w emb option");

  5861.         return gSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  5862.     }

  5863.     @Override public double gSpreadFromDiscountMargin (
  5864.         final org.drip.param.valuation.ValuationParams valParams,
  5865.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5866.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5867.         final int iWorkoutDate,
  5868.         final double dblWorkoutFactor,
  5869.         final double dblDiscountMargin)
  5870.         throws java.lang.Exception
  5871.     {
  5872.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  5873.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  5874.                 dblDiscountMargin));
  5875.     }

  5876.     @Override public double gSpreadFromDiscountMargin (
  5877.         final org.drip.param.valuation.ValuationParams valParams,
  5878.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5879.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5880.         final double dblDiscountMargin)
  5881.         throws java.lang.Exception
  5882.     {
  5883.         return gSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  5884.             dblDiscountMargin);
  5885.     }

  5886.     @Override public double gSpreadFromDiscountMarginToOptimalExercise (
  5887.         final org.drip.param.valuation.ValuationParams valParams,
  5888.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5889.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5890.         final double dblDiscountMargin)
  5891.         throws java.lang.Exception
  5892.     {
  5893.         if (null != _eosCall || null != _eosPut)
  5894.             throw new java.lang.Exception ("BondComponent::gSpreadFromDiscountMarginToOptimalExercise =>" +
  5895.                 " Cant calc G Spread from Discount Margin to optimal exercise for bonds w emb option");

  5896.         return gSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  5897.             dblDiscountMargin);
  5898.     }

  5899.     @Override public double gSpreadFromESpread (
  5900.         final org.drip.param.valuation.ValuationParams valParams,
  5901.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5902.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5903.         final int iWorkoutDate,
  5904.         final double dblWorkoutFactor,
  5905.         final double dblESpread)
  5906.         throws java.lang.Exception
  5907.     {
  5908.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  5909.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  5910.     }

  5911.     @Override public double gSpreadFromESpread (
  5912.         final org.drip.param.valuation.ValuationParams valParams,
  5913.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5914.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5915.         final double dblESpread)
  5916.         throws java.lang.Exception
  5917.     {
  5918.         return gSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  5919.     }

  5920.     @Override public double gSpreadFromESpreadToOptimalExercise (
  5921.         final org.drip.param.valuation.ValuationParams valParams,
  5922.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5923.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5924.         final double dblESpread)
  5925.         throws java.lang.Exception
  5926.     {
  5927.         if (null != _eosCall || null != _eosPut)
  5928.             throw new java.lang.Exception ("BondComponent::gSpreadFromESpreadToOptimalExercise => " +
  5929.                 "Cant calc G Spread from E Spread to optimal exercise for bonds w emb option");

  5930.         return gSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  5931.     }

  5932.     @Override public double gSpreadFromISpread (
  5933.         final org.drip.param.valuation.ValuationParams valParams,
  5934.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5935.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5936.         final int iWorkoutDate,
  5937.         final double dblWorkoutFactor,
  5938.         final double dblISpread)
  5939.         throws java.lang.Exception
  5940.     {
  5941.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  5942.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  5943.     }

  5944.     @Override public double gSpreadFromISpread (
  5945.         final org.drip.param.valuation.ValuationParams valParams,
  5946.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5947.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5948.         final double dblISpread)
  5949.         throws java.lang.Exception
  5950.     {
  5951.         return gSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  5952.     }

  5953.     @Override public double gSpreadFromISpreadToOptimalExercise (
  5954.         final org.drip.param.valuation.ValuationParams valParams,
  5955.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5956.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5957.         final double dblISpread)
  5958.         throws java.lang.Exception
  5959.     {
  5960.         if (null != _eosCall || null != _eosPut)
  5961.             throw new java.lang.Exception ("BondComponent::gSpreadFromISpreadToOptimalExercise => " +
  5962.                 "Cant calc G Spread from I Spread to optimal exercise for bonds w emb option");

  5963.         return gSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  5964.     }

  5965.     @Override public double gSpreadFromJSpread (
  5966.         final org.drip.param.valuation.ValuationParams valParams,
  5967.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5968.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5969.         final int iWorkoutDate,
  5970.         final double dblWorkoutFactor,
  5971.         final double dblJSpread)
  5972.         throws java.lang.Exception
  5973.     {
  5974.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  5975.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  5976.     }

  5977.     @Override public double gSpreadFromJSpread (
  5978.         final org.drip.param.valuation.ValuationParams valParams,
  5979.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5980.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5981.         final double dblJSpread)
  5982.         throws java.lang.Exception
  5983.     {
  5984.         return gSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5985.     }

  5986.     @Override public double gSpreadFromJSpreadToOptimalExercise (
  5987.         final org.drip.param.valuation.ValuationParams valParams,
  5988.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  5989.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  5990.         final double dblJSpread)
  5991.         throws java.lang.Exception
  5992.     {
  5993.         if (null != _eosCall || null != _eosPut)
  5994.             throw new java.lang.Exception ("BondComponent::gSpreadFromJSpreadToOptimalExercise => " +
  5995.                 "Cant calc G Spread from J Spread to optimal exercise for bonds w emb option");

  5996.         return gSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  5997.     }

  5998.     @Override public double gSpreadFromNSpread (
  5999.         final org.drip.param.valuation.ValuationParams valParams,
  6000.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6001.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6002.         final int iWorkoutDate,
  6003.         final double dblWorkoutFactor,
  6004.         final double dblNSpread)
  6005.         throws java.lang.Exception
  6006.     {
  6007.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  6008.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  6009.     }

  6010.     @Override public double gSpreadFromNSpread (
  6011.         final org.drip.param.valuation.ValuationParams valParams,
  6012.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6013.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6014.         final double dblNSpread)
  6015.         throws java.lang.Exception
  6016.     {
  6017.         return gSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  6018.     }

  6019.     @Override public double gSpreadFromNSpreadToOptimalExercise (
  6020.         final org.drip.param.valuation.ValuationParams valParams,
  6021.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6022.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6023.         final double dblNSpread)
  6024.         throws java.lang.Exception
  6025.     {
  6026.         if (null != _eosCall || null != _eosPut)
  6027.             throw new java.lang.Exception ("BondComponent::gSpreadFromNSpreadToOptimalExercise => " +
  6028.                 "Cant calc G Spread from N Spread to optimal exercise for bonds w emb option");

  6029.         return gSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  6030.     }

  6031.     @Override public double gSpreadFromOAS (
  6032.         final org.drip.param.valuation.ValuationParams valParams,
  6033.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6034.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6035.         final int iWorkoutDate,
  6036.         final double dblWorkoutFactor,
  6037.         final double dblOAS)
  6038.         throws java.lang.Exception
  6039.     {
  6040.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  6041.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  6042.     }

  6043.     @Override public double gSpreadFromOAS (
  6044.         final org.drip.param.valuation.ValuationParams valParams,
  6045.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6046.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6047.         final double dblOAS)
  6048.         throws java.lang.Exception
  6049.     {
  6050.         return gSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  6051.     }

  6052.     @Override public double gSpreadFromOASToOptimalExercise (
  6053.         final org.drip.param.valuation.ValuationParams valParams,
  6054.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6055.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6056.         final double dblOAS)
  6057.         throws java.lang.Exception
  6058.     {
  6059.         if (null != _eosCall || null != _eosPut)
  6060.             throw new java.lang.Exception ("BondComponent::gSpreadFromOASToOptimalExercise => " +
  6061.                 "Cant calc G Spread from OAS to optimal exercise for bonds w emb option");

  6062.         return gSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  6063.     }

  6064.     @Override public double gSpreadFromPECS (
  6065.         final org.drip.param.valuation.ValuationParams valParams,
  6066.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6067.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6068.         final int iWorkoutDate,
  6069.         final double dblWorkoutFactor,
  6070.         final double dblPECS)
  6071.         throws java.lang.Exception
  6072.     {
  6073.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  6074.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  6075.     }

  6076.     @Override public double gSpreadFromPECS (
  6077.         final org.drip.param.valuation.ValuationParams valParams,
  6078.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6079.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6080.         final double dblPECS)
  6081.         throws java.lang.Exception
  6082.     {
  6083.         return gSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  6084.     }

  6085.     @Override public double gSpreadFromPECSToOptimalExercise (
  6086.         final org.drip.param.valuation.ValuationParams valParams,
  6087.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6088.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6089.         final double dblPECS)
  6090.         throws java.lang.Exception
  6091.     {
  6092.         if (null != _eosCall || null != _eosPut)
  6093.             throw new java.lang.Exception ("BondComponent::gSpreadFromPECSToOptimalExercise => " +
  6094.                 "Cant calc G Spread from PECS to optimal exercise for bonds w emb option");

  6095.         return gSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  6096.     }

  6097.     @Override public double gSpreadFromPrice (
  6098.         final org.drip.param.valuation.ValuationParams valParams,
  6099.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6100.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6101.         final int iWorkoutDate,
  6102.         final double dblWorkoutFactor,
  6103.         final double dblPrice)
  6104.         throws java.lang.Exception
  6105.     {
  6106.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  6107.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  6108.     }

  6109.     @Override public double gSpreadFromPrice (
  6110.         final org.drip.param.valuation.ValuationParams valParams,
  6111.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6112.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6113.         final double dblPrice)
  6114.         throws java.lang.Exception
  6115.     {
  6116.         return gSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  6117.     }

  6118.     @Override public double gSpreadFromPriceToOptimalExercise (
  6119.         final org.drip.param.valuation.ValuationParams valParams,
  6120.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6121.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6122.         final double dblPrice)
  6123.         throws java.lang.Exception
  6124.     {
  6125.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  6126.         if (null == wi)
  6127.             throw new java.lang.Exception
  6128.                 ("BondComponent::gSpreadFromPriceToOptimalExercise => Can't do Work-out");

  6129.         return gSpreadFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  6130.     }

  6131.     @Override public double gSpreadFromTSYSpread (
  6132.         final org.drip.param.valuation.ValuationParams valParams,
  6133.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6134.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6135.         final int iWorkoutDate,
  6136.         final double dblWorkoutFactor,
  6137.         final double dblTSYSpread)
  6138.         throws java.lang.Exception
  6139.     {
  6140.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  6141.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  6142.     }

  6143.     @Override public double gSpreadFromTSYSpread (
  6144.         final org.drip.param.valuation.ValuationParams valParams,
  6145.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6146.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6147.         final double dblTSYSpread)
  6148.         throws java.lang.Exception
  6149.     {
  6150.         return gSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  6151.     }

  6152.     @Override public double gSpreadFromTSYSpreadToOptimalExercise (
  6153.         final org.drip.param.valuation.ValuationParams valParams,
  6154.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6155.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6156.         final double dblTSYSpread)
  6157.         throws java.lang.Exception
  6158.     {
  6159.         if (null != _eosCall || null != _eosPut)
  6160.             throw new java.lang.Exception ("BondComponent::gSpreadFromTSYSpreadToOptimalExercise => " +
  6161.                 "Cant calc G Spread from TSY Spread to optimal exercise for bonds w emb option");

  6162.         return gSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  6163.     }

  6164.     @Override public double gSpreadFromYield (
  6165.         final org.drip.param.valuation.ValuationParams valParams,
  6166.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6167.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6168.         final int iWorkoutDate,
  6169.         final double dblWorkoutFactor,
  6170.         final double dblYield)
  6171.         throws java.lang.Exception
  6172.     {
  6173.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblYield) ||
  6174.             valParams.valueDate() >= iWorkoutDate)
  6175.             throw new java.lang.Exception ("BondComponent::gSpreadFromYield => Invalid inputs");

  6176.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());

  6177.         if (null == gc) throw new java.lang.Exception ("BondComponent::gSpreadFromYield => Invalid inputs");

  6178.         return dblYield - gc.yield (iWorkoutDate);
  6179.     }

  6180.     @Override public double gSpreadFromYield (
  6181.         final org.drip.param.valuation.ValuationParams valParams,
  6182.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6183.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6184.         final double dblYield)
  6185.         throws java.lang.Exception
  6186.     {
  6187.         return gSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  6188.     }

  6189.     @Override public double gSpreadFromYieldToOptimalExercise (
  6190.         final org.drip.param.valuation.ValuationParams valParams,
  6191.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6192.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6193.         final double dblYield)
  6194.         throws java.lang.Exception
  6195.     {
  6196.         if (null != _eosCall || null != _eosPut)
  6197.             throw new java.lang.Exception ("BondComponent::gSpreadFromYieldToOptimalExercise => " +
  6198.                 "Cant calc G Spread from Yield to optimal exercise for bonds w emb option");

  6199.         return gSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  6200.     }

  6201.     @Override public double gSpreadFromYieldSpread (
  6202.         final org.drip.param.valuation.ValuationParams valParams,
  6203.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6204.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6205.         final int iWorkoutDate,
  6206.         final double dblWorkoutFactor,
  6207.         final double dblYieldSpread)
  6208.         throws java.lang.Exception
  6209.     {
  6210.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  6211.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  6212.     }

  6213.     @Override public double gSpreadFromYieldSpread (
  6214.         final org.drip.param.valuation.ValuationParams valParams,
  6215.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6216.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6217.         final double dblYieldSpread)
  6218.         throws java.lang.Exception
  6219.     {
  6220.         return gSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  6221.     }

  6222.     @Override public double gSpreadFromYieldSpreadToOptimalExercise (
  6223.         final org.drip.param.valuation.ValuationParams valParams,
  6224.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6225.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6226.         final double dblYieldSpread)
  6227.         throws java.lang.Exception
  6228.     {
  6229.         if (null != _eosCall || null != _eosPut)
  6230.             throw new java.lang.Exception ("BondComponent::gSpreadFromYieldSpreadToOptimalExercise => " +
  6231.                 "Cant calc G Spread from Yield Spread to optimal exercise for bonds w emb option");

  6232.         return gSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  6233.     }

  6234.     @Override public double gSpreadFromZSpread (
  6235.         final org.drip.param.valuation.ValuationParams valParams,
  6236.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6237.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6238.         final int iWorkoutDate,
  6239.         final double dblWorkoutFactor,
  6240.         final double dblZSpread)
  6241.         throws java.lang.Exception
  6242.     {
  6243.         return gSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  6244.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  6245.     }

  6246.     @Override public double gSpreadFromZSpread (
  6247.         final org.drip.param.valuation.ValuationParams valParams,
  6248.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6249.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6250.         final double dblZSpread)
  6251.         throws java.lang.Exception
  6252.     {
  6253.         return gSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  6254.     }

  6255.     @Override public double gSpreadFromZSpreadToOptimalExercise (
  6256.         final org.drip.param.valuation.ValuationParams valParams,
  6257.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6258.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6259.         final double dblZSpread)
  6260.         throws java.lang.Exception
  6261.     {
  6262.         if (null != _eosCall || null != _eosPut)
  6263.             throw new java.lang.Exception ("BondComponent::gSpreadFromZSpreadToOptimalExercise => " +
  6264.                 "Cant calc G Spread from Z Spread to optimal exercise for bonds w emb option");

  6265.         return gSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  6266.     }

  6267.     @Override public double iSpreadFromASW (
  6268.         final org.drip.param.valuation.ValuationParams valParams,
  6269.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6270.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6271.         final int iWorkoutDate,
  6272.         final double dblWorkoutFactor,
  6273.         final double dblASW)
  6274.         throws java.lang.Exception
  6275.     {
  6276.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  6277.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  6278.     }

  6279.     @Override public double iSpreadFromASW (
  6280.         final org.drip.param.valuation.ValuationParams valParams,
  6281.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6282.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6283.         final double dblASW)
  6284.         throws java.lang.Exception
  6285.     {
  6286.         return iSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  6287.     }

  6288.     @Override public double iSpreadFromASWToOptimalExercise (
  6289.         final org.drip.param.valuation.ValuationParams valParams,
  6290.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6291.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6292.         final double dblASW)
  6293.         throws java.lang.Exception
  6294.     {
  6295.         if (null != _eosCall || null != _eosPut)
  6296.             throw new java.lang.Exception ("BondComponent::iSpreadFromASWToOptimalExercise => " +
  6297.                 "Cant calc I Spread from ASW to optimal exercise for bonds w emb option");

  6298.         return iSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  6299.     }

  6300.     @Override public double iSpreadFromBondBasis (
  6301.         final org.drip.param.valuation.ValuationParams valParams,
  6302.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6303.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6304.         final int iWorkoutDate,
  6305.         final double dblWorkoutFactor,
  6306.         final double dblBondBasis)
  6307.         throws java.lang.Exception
  6308.     {
  6309.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  6310.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  6311.     }

  6312.     @Override public double iSpreadFromBondBasis (
  6313.         final org.drip.param.valuation.ValuationParams valParams,
  6314.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6315.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6316.         final double dblBondBasis)
  6317.         throws java.lang.Exception
  6318.     {
  6319.         return iSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  6320.     }

  6321.     @Override public double iSpreadFromBondBasisToOptimalExercise (
  6322.         final org.drip.param.valuation.ValuationParams valParams,
  6323.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6324.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6325.         final double dblBondBasis)
  6326.         throws java.lang.Exception
  6327.     {
  6328.         if (null != _eosCall || null != _eosPut)
  6329.             throw new java.lang.Exception ("BondComponent::iSpreadFromBondBasisToOptimalExercise => " +
  6330.                 "Cant calc I Spread from Bond Basis to optimal exercise for bonds w emb option");

  6331.         return iSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  6332.     }

  6333.     @Override public double iSpreadFromCreditBasis (
  6334.         final org.drip.param.valuation.ValuationParams valParams,
  6335.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6336.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6337.         final int iWorkoutDate,
  6338.         final double dblWorkoutFactor,
  6339.         final double dblCreditBasis)
  6340.         throws java.lang.Exception
  6341.     {
  6342.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromCreditBasis
  6343.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  6344.     }

  6345.     @Override public double iSpreadFromCreditBasis (
  6346.         final org.drip.param.valuation.ValuationParams valParams,
  6347.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6348.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6349.         final double dblCreditBasis)
  6350.         throws java.lang.Exception
  6351.     {
  6352.         return iSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  6353.     }

  6354.     @Override public double iSpreadFromCreditBasisToOptimalExercise (
  6355.         final org.drip.param.valuation.ValuationParams valParams,
  6356.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  6357.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6358.         final double dblCreditBasis)
  6359.         throws java.lang.Exception
  6360.     {
  6361.         if (null != _eosCall || null != _eosPut)
  6362.             throw new java.lang.Exception ("BondComponent::iSpreadFromCreditBasisToOptimalExercise => " +
  6363.                 "Cant calc I Spread from Credit Basis to optimal exercise for bonds w emb option");

  6364.         return iSpreadFromCreditBasis (valParams, csqs, vcp, maturityDate().julian(), 1., dblCreditBasis);
  6365.     }

  6366.     @Override public double iSpreadFromDiscountMargin (
  6367.         final org.drip.param.valuation.ValuationParams valParams,
  6368.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6369.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6370.         final int iWorkoutDate,
  6371.         final double dblWorkoutFactor,
  6372.         final double dblDiscountMargin)
  6373.         throws java.lang.Exception
  6374.     {
  6375.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  6376.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  6377.                 dblDiscountMargin));
  6378.     }

  6379.     @Override public double iSpreadFromDiscountMargin (
  6380.         final org.drip.param.valuation.ValuationParams valParams,
  6381.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6382.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6383.         final double dblDiscountMargin)
  6384.         throws java.lang.Exception
  6385.     {
  6386.         return iSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  6387.             dblDiscountMargin);
  6388.     }

  6389.     @Override public double iSpreadFromDiscountMarginToOptimalExercise (
  6390.         final org.drip.param.valuation.ValuationParams valParams,
  6391.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6392.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6393.         final double dblDiscountMargin)
  6394.         throws java.lang.Exception
  6395.     {
  6396.         if (null != _eosCall || null != _eosPut)
  6397.             throw new java.lang.Exception ("BondComponent::iSpreadFromDiscountMarginToOptimalExercise =>" +
  6398.                 " Cant calc I Spread from Discount Margin to optimal exercise for bonds w emb option");

  6399.         return iSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  6400.             dblDiscountMargin);
  6401.     }

  6402.     @Override public double iSpreadFromESpread (
  6403.         final org.drip.param.valuation.ValuationParams valParams,
  6404.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6405.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6406.         final int iWorkoutDate,
  6407.         final double dblWorkoutFactor,
  6408.         final double dblESpread)
  6409.         throws java.lang.Exception
  6410.     {
  6411.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  6412.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  6413.     }

  6414.     @Override public double iSpreadFromESpread (
  6415.         final org.drip.param.valuation.ValuationParams valParams,
  6416.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6417.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6418.         final double dblESpread)
  6419.         throws java.lang.Exception
  6420.     {
  6421.         return iSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  6422.     }

  6423.     @Override public double iSpreadFromESpreadToOptimalExercise (
  6424.         final org.drip.param.valuation.ValuationParams valParams,
  6425.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6426.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6427.         final double dblESpread)
  6428.         throws java.lang.Exception
  6429.     {
  6430.         if (null != _eosCall || null != _eosPut)
  6431.             throw new java.lang.Exception ("BondComponent::iSpreadFromESpreadToOptimalExercise => " +
  6432.                 "Cant calc I Spread from E Spread to optimal exercise for bonds w emb option");

  6433.         return iSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  6434.     }

  6435.     @Override public double iSpreadFromGSpread (
  6436.         final org.drip.param.valuation.ValuationParams valParams,
  6437.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6438.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6439.         final int iWorkoutDate,
  6440.         final double dblWorkoutFactor,
  6441.         final double dblGSpread)
  6442.         throws java.lang.Exception
  6443.     {
  6444.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  6445.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  6446.     }

  6447.     @Override public double iSpreadFromGSpread (
  6448.         final org.drip.param.valuation.ValuationParams valParams,
  6449.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6450.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6451.         final double dblGSpread)
  6452.         throws java.lang.Exception
  6453.     {
  6454.         return iSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  6455.     }

  6456.     @Override public double iSpreadFromGSpreadToOptimalExercise (
  6457.         final org.drip.param.valuation.ValuationParams valParams,
  6458.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6459.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6460.         final double dblGSpread)
  6461.         throws java.lang.Exception
  6462.     {
  6463.         if (null != _eosCall || null != _eosPut)
  6464.             throw new java.lang.Exception ("BondComponent::iSpreadFromGSpreadToOptimalExercise => " +
  6465.                 "Cant calc I Spread from G Spread to optimal exercise for bonds w emb option");

  6466.         return iSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  6467.     }

  6468.     @Override public double iSpreadFromJSpread (
  6469.         final org.drip.param.valuation.ValuationParams valParams,
  6470.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6471.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6472.         final int iWorkoutDate,
  6473.         final double dblWorkoutFactor,
  6474.         final double dblJSpread)
  6475.         throws java.lang.Exception
  6476.     {
  6477.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  6478.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  6479.     }

  6480.     @Override public double iSpreadFromJSpread (
  6481.         final org.drip.param.valuation.ValuationParams valParams,
  6482.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6483.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6484.         final double dblJSpread)
  6485.         throws java.lang.Exception
  6486.     {
  6487.         return iSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  6488.     }

  6489.     @Override public double iSpreadFromJSpreadToOptimalExercise (
  6490.         final org.drip.param.valuation.ValuationParams valParams,
  6491.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6492.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6493.         final double dblJSpread)
  6494.         throws java.lang.Exception
  6495.     {
  6496.         if (null != _eosCall || null != _eosPut)
  6497.             throw new java.lang.Exception ("BondComponent::iSpreadFromJSpreadToOptimalExercise => " +
  6498.                 "Cant calc I Spread from J Spread to optimal exercise for bonds w emb option");

  6499.         return iSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  6500.     }

  6501.     @Override public double iSpreadFromNSpread (
  6502.         final org.drip.param.valuation.ValuationParams valParams,
  6503.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6504.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6505.         final int iWorkoutDate,
  6506.         final double dblWorkoutFactor,
  6507.         final double dblNSpread)
  6508.         throws java.lang.Exception
  6509.     {
  6510.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  6511.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  6512.     }

  6513.     @Override public double iSpreadFromNSpread (
  6514.         final org.drip.param.valuation.ValuationParams valParams,
  6515.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6516.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6517.         final double dblNSpread)
  6518.         throws java.lang.Exception
  6519.     {
  6520.         return iSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  6521.     }

  6522.     @Override public double iSpreadFromNSpreadToOptimalExercise (
  6523.         final org.drip.param.valuation.ValuationParams valParams,
  6524.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6525.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6526.         final double dblNSpread)
  6527.         throws java.lang.Exception
  6528.     {
  6529.         if (null != _eosCall || null != _eosPut)
  6530.             throw new java.lang.Exception ("BondComponent::iSpreadFromNSpreadToOptimalExercise => " +
  6531.                 "Cant calc I Spread from N Spread to optimal exercise for bonds w emb option");

  6532.         return iSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  6533.     }

  6534.     @Override public double iSpreadFromOAS (
  6535.         final org.drip.param.valuation.ValuationParams valParams,
  6536.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6537.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6538.         final int iWorkoutDate,
  6539.         final double dblWorkoutFactor,
  6540.         final double dblOAS)
  6541.         throws java.lang.Exception
  6542.     {
  6543.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  6544.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  6545.     }

  6546.     @Override public double iSpreadFromOAS (
  6547.         final org.drip.param.valuation.ValuationParams valParams,
  6548.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6549.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6550.         final double dblOAS)
  6551.         throws java.lang.Exception
  6552.     {
  6553.         return iSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  6554.     }

  6555.     @Override public double iSpreadFromOASToOptimalExercise (
  6556.         final org.drip.param.valuation.ValuationParams valParams,
  6557.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6558.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6559.         final double dblOAS)
  6560.         throws java.lang.Exception
  6561.     {
  6562.         if (null != _eosCall || null != _eosPut)
  6563.             throw new java.lang.Exception ("BondComponent::iSpreadFromOASToOptimalExercise => " +
  6564.                 "Cant calc I Spread from OAS to optimal exercise for bonds w emb option");

  6565.         return iSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  6566.     }

  6567.     @Override public double iSpreadFromPECS (
  6568.         final org.drip.param.valuation.ValuationParams valParams,
  6569.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6570.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6571.         final int iWorkoutDate,
  6572.         final double dblWorkoutFactor,
  6573.         final double dblPECS)
  6574.         throws java.lang.Exception
  6575.     {
  6576.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  6577.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  6578.     }

  6579.     @Override public double iSpreadFromPECS (
  6580.         final org.drip.param.valuation.ValuationParams valParams,
  6581.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6582.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6583.         final double dblPECS)
  6584.         throws java.lang.Exception
  6585.     {
  6586.         return iSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  6587.     }

  6588.     @Override public double iSpreadFromPECSToOptimalExercise (
  6589.         final org.drip.param.valuation.ValuationParams valParams,
  6590.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6591.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6592.         final double dblPECS)
  6593.         throws java.lang.Exception
  6594.     {
  6595.         if (null != _eosCall || null != _eosPut)
  6596.             throw new java.lang.Exception ("BondComponent::iSpreadFromPECSToOptimalExercise => " +
  6597.                 "Cant calc I Spread from PECS to optimal exercise for bonds w emb option");

  6598.         return iSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  6599.     }

  6600.     @Override public double iSpreadFromPrice (
  6601.         final org.drip.param.valuation.ValuationParams valParams,
  6602.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6603.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6604.         final int iWorkoutDate,
  6605.         final double dblWorkoutFactor,
  6606.         final double dblPrice)
  6607.         throws java.lang.Exception
  6608.     {
  6609.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  6610.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  6611.     }

  6612.     @Override public double iSpreadFromPrice (
  6613.         final org.drip.param.valuation.ValuationParams valParams,
  6614.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6615.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6616.         final double dblPrice)
  6617.         throws java.lang.Exception
  6618.     {
  6619.         return iSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  6620.     }

  6621.     @Override public double iSpreadFromPriceToOptimalExercise (
  6622.         final org.drip.param.valuation.ValuationParams valParams,
  6623.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6624.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6625.         final double dblPrice)
  6626.         throws java.lang.Exception
  6627.     {
  6628.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  6629.         if (null == wi)
  6630.             throw new java.lang.Exception
  6631.                 ("BondComponent::iSpreadFromPriceToOptimalExercise => Can't do Work-out");

  6632.         return iSpreadFromYield (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  6633.     }

  6634.     @Override public double iSpreadFromTSYSpread (
  6635.         final org.drip.param.valuation.ValuationParams valParams,
  6636.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6637.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6638.         final int iWorkoutDate,
  6639.         final double dblWorkoutFactor,
  6640.         final double dblTSYSpread)
  6641.         throws java.lang.Exception
  6642.     {
  6643.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  6644.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  6645.     }

  6646.     @Override public double iSpreadFromTSYSpread (
  6647.         final org.drip.param.valuation.ValuationParams valParams,
  6648.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6649.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6650.         final double dblTSYSpread)
  6651.         throws java.lang.Exception
  6652.     {
  6653.         return iSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  6654.     }

  6655.     @Override public double iSpreadFromTSYSpreadToOptimalExercise (
  6656.         final org.drip.param.valuation.ValuationParams valParams,
  6657.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6658.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6659.         final double dblTSYSpread)
  6660.         throws java.lang.Exception
  6661.     {
  6662.         if (null != _eosCall || null != _eosPut)
  6663.             throw new java.lang.Exception ("BondComponent::iSpreadFromTSYSpreadToOptimalExercise => " +
  6664.                 "Cant calc I Spread from TSY Spread to optimal exercise for bonds w emb option");

  6665.         return iSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  6666.     }

  6667.     @Override public double iSpreadFromYield (
  6668.         final org.drip.param.valuation.ValuationParams valParams,
  6669.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6670.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6671.         final int iWorkoutDate,
  6672.         final double dblWorkoutFactor,
  6673.         final double dblYield)
  6674.         throws java.lang.Exception
  6675.     {
  6676.         if (null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  6677.             throw new java.lang.Exception ("BondComponent::iSpreadFromYield => Invalid Inputs");

  6678.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  6679.         if (null == dcFunding)
  6680.             throw new java.lang.Exception ("BondComponent::iSpreadFromYield => Invalid Inputs");

  6681.         return dblYield - dcFunding.estimateManifestMeasure ("SwapRate", iWorkoutDate);
  6682.     }

  6683.     @Override public double iSpreadFromYield (
  6684.         final org.drip.param.valuation.ValuationParams valParams,
  6685.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6686.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6687.         final double dblYield)
  6688.         throws java.lang.Exception
  6689.     {
  6690.         return iSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  6691.     }

  6692.     @Override public double iSpreadFromYieldToOptimalExercise (
  6693.         final org.drip.param.valuation.ValuationParams valParams,
  6694.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6695.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6696.         final double dblYield)
  6697.         throws java.lang.Exception
  6698.     {
  6699.         if (null != _eosCall || null != _eosPut)
  6700.             throw new java.lang.Exception ("BondComponent::iSpreadFromYieldToOptimalExercise => " +
  6701.                 "Cant calc I Spread from Yield to optimal exercise for bonds w emb option");

  6702.         return iSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  6703.     }

  6704.     @Override public double iSpreadFromYieldSpread (
  6705.         final org.drip.param.valuation.ValuationParams valParams,
  6706.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6707.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6708.         final int iWorkoutDate,
  6709.         final double dblWorkoutFactor,
  6710.         final double dblYieldSpread)
  6711.         throws java.lang.Exception
  6712.     {
  6713.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  6714.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  6715.     }

  6716.     @Override public double iSpreadFromYieldSpread (
  6717.         final org.drip.param.valuation.ValuationParams valParams,
  6718.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6719.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6720.         final double dblYieldSpread)
  6721.         throws java.lang.Exception
  6722.     {
  6723.         return iSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  6724.     }

  6725.     @Override public double iSpreadFromYieldSpreadToOptimalExercise (
  6726.         final org.drip.param.valuation.ValuationParams valParams,
  6727.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6728.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6729.         final double dblYieldSpread)
  6730.         throws java.lang.Exception
  6731.     {
  6732.         if (null != _eosCall || null != _eosPut)
  6733.             throw new java.lang.Exception ("BondComponent::iSpreadFromYieldSpreadToOptimalExercise => " +
  6734.                 "Cant calc I Spread from Yield Spread to optimal exercise for bonds w emb option");

  6735.         return iSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  6736.     }

  6737.     @Override public double iSpreadFromZSpread (
  6738.         final org.drip.param.valuation.ValuationParams valParams,
  6739.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6740.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6741.         final int iWorkoutDate,
  6742.         final double dblWorkoutFactor,
  6743.         final double dblZSpread)
  6744.         throws java.lang.Exception
  6745.     {
  6746.         return iSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  6747.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  6748.     }

  6749.     @Override public double iSpreadFromZSpread (
  6750.         final org.drip.param.valuation.ValuationParams valParams,
  6751.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6752.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6753.         final double dblZSpread)
  6754.         throws java.lang.Exception
  6755.     {
  6756.         return iSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  6757.     }

  6758.     @Override public double iSpreadFromZSpreadToOptimalExercise (
  6759.         final org.drip.param.valuation.ValuationParams valParams,
  6760.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6761.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6762.         final double dblZSpread)
  6763.         throws java.lang.Exception
  6764.     {
  6765.         if (null != _eosCall || null != _eosPut)
  6766.             throw new java.lang.Exception ("BondComponent::iSpreadFromZSpreadToOptimalExercise => " +
  6767.                 "Cant calc I Spread from Z Spread to optimal exercise for bonds w emb option");

  6768.         return iSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  6769.     }

  6770.     @Override public double jSpreadFromASW (
  6771.         final org.drip.param.valuation.ValuationParams valParams,
  6772.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6773.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6774.         final int iWorkoutDate,
  6775.         final double dblWorkoutFactor,
  6776.         final double dblASW)
  6777.         throws java.lang.Exception
  6778.     {
  6779.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  6780.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  6781.     }

  6782.     @Override public double jSpreadFromASW (
  6783.         final org.drip.param.valuation.ValuationParams valParams,
  6784.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6785.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6786.         final double dblASW)
  6787.         throws java.lang.Exception
  6788.     {
  6789.         return jSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  6790.     }

  6791.     @Override public double jSpreadFromASWToOptimalExercise (
  6792.         final org.drip.param.valuation.ValuationParams valParams,
  6793.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6794.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6795.         final double dblASW)
  6796.         throws java.lang.Exception
  6797.     {
  6798.         if (null != _eosCall || null != _eosPut)
  6799.             throw new java.lang.Exception ("BondComponent::iSpreadFromASWToOptimalExercise => " +
  6800.                 "Cant calc J Spread from ASW to optimal exercise for bonds w emb option");

  6801.         return jSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  6802.     }

  6803.     @Override public double jSpreadFromBondBasis (
  6804.         final org.drip.param.valuation.ValuationParams valParams,
  6805.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6806.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6807.         final int iWorkoutDate,
  6808.         final double dblWorkoutFactor,
  6809.         final double dblBondBasis)
  6810.         throws java.lang.Exception
  6811.     {
  6812.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  6813.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  6814.     }

  6815.     @Override public double jSpreadFromBondBasis (
  6816.         final org.drip.param.valuation.ValuationParams valParams,
  6817.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6818.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6819.         final double dblBondBasis)
  6820.         throws java.lang.Exception
  6821.     {
  6822.         return jSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  6823.     }

  6824.     @Override public double jSpreadFromBondBasisToOptimalExercise (
  6825.         final org.drip.param.valuation.ValuationParams valParams,
  6826.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6827.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6828.         final double dblBondBasis)
  6829.         throws java.lang.Exception
  6830.     {
  6831.         if (null != _eosCall || null != _eosPut)
  6832.             throw new java.lang.Exception ("BondComponent::iSpreadFromBondBasisToOptimalExercise => " +
  6833.                 "Cant calc J Spread from Bond Basis to optimal exercise for bonds w emb option");

  6834.         return jSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  6835.     }

  6836.     @Override public double jSpreadFromCreditBasis (
  6837.         final org.drip.param.valuation.ValuationParams valParams,
  6838.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6839.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6840.         final int iWorkoutDate,
  6841.         final double dblWorkoutFactor,
  6842.         final double dblCreditBasis)
  6843.         throws java.lang.Exception
  6844.     {
  6845.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromCreditBasis
  6846.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  6847.     }

  6848.     @Override public double jSpreadFromCreditBasis (
  6849.         final org.drip.param.valuation.ValuationParams valParams,
  6850.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6851.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6852.         final double dblCreditBasis)
  6853.         throws java.lang.Exception
  6854.     {
  6855.         return jSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  6856.     }

  6857.     @Override public double jSpreadFromCreditBasisToOptimalExercise (
  6858.         final org.drip.param.valuation.ValuationParams valParams,
  6859.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  6860.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6861.         final double dblCreditBasis)
  6862.         throws java.lang.Exception
  6863.     {
  6864.         if (null != _eosCall || null != _eosPut)
  6865.             throw new java.lang.Exception ("BondComponent::jSpreadFromCreditBasisToOptimalExercise => " +
  6866.                 "Cant calc I Spread from Credit Basis to optimal exercise for bonds w emb option");

  6867.         return iSpreadFromCreditBasis (valParams, csqs, vcp, maturityDate().julian(), 1., dblCreditBasis);
  6868.     }

  6869.     @Override public double jSpreadFromDiscountMargin (
  6870.         final org.drip.param.valuation.ValuationParams valParams,
  6871.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6872.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6873.         final int iWorkoutDate,
  6874.         final double dblWorkoutFactor,
  6875.         final double dblDiscountMargin)
  6876.         throws java.lang.Exception
  6877.     {
  6878.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  6879.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  6880.                 dblDiscountMargin));
  6881.     }

  6882.     @Override public double jSpreadFromDiscountMargin (
  6883.         final org.drip.param.valuation.ValuationParams valParams,
  6884.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6885.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6886.         final double dblDiscountMargin)
  6887.         throws java.lang.Exception
  6888.     {
  6889.         return jSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  6890.             dblDiscountMargin);
  6891.     }

  6892.     @Override public double jSpreadFromDiscountMarginToOptimalExercise (
  6893.         final org.drip.param.valuation.ValuationParams valParams,
  6894.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6895.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6896.         final double dblDiscountMargin)
  6897.         throws java.lang.Exception
  6898.     {
  6899.         if (null != _eosCall || null != _eosPut)
  6900.             throw new java.lang.Exception ("BondComponent::jSpreadFromDiscountMarginToOptimalExercise =>" +
  6901.                 " Cant calc J Spread from Discount Margin to optimal exercise for bonds w emb option");

  6902.         return jSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  6903.             dblDiscountMargin);
  6904.     }

  6905.     @Override public double jSpreadFromESpread (
  6906.         final org.drip.param.valuation.ValuationParams valParams,
  6907.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6908.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6909.         final int iWorkoutDate,
  6910.         final double dblWorkoutFactor,
  6911.         final double dblESpread)
  6912.         throws java.lang.Exception
  6913.     {
  6914.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  6915.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  6916.     }

  6917.     @Override public double jSpreadFromESpread (
  6918.         final org.drip.param.valuation.ValuationParams valParams,
  6919.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6920.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6921.         final double dblESpread)
  6922.         throws java.lang.Exception
  6923.     {
  6924.         return jSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  6925.     }

  6926.     @Override public double jSpreadFromESpreadToOptimalExercise (
  6927.         final org.drip.param.valuation.ValuationParams valParams,
  6928.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6929.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6930.         final double dblESpread)
  6931.         throws java.lang.Exception
  6932.     {
  6933.         if (null != _eosCall || null != _eosPut)
  6934.             throw new java.lang.Exception ("BondComponent::jSpreadFromESpreadToOptimalExercise => " +
  6935.                 "Cant calc J Spread from E Spread to optimal exercise for bonds w emb option");

  6936.         return jSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  6937.     }

  6938.     @Override public double jSpreadFromGSpread (
  6939.         final org.drip.param.valuation.ValuationParams valParams,
  6940.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6941.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6942.         final int iWorkoutDate,
  6943.         final double dblWorkoutFactor,
  6944.         final double dblGSpread)
  6945.         throws java.lang.Exception
  6946.     {
  6947.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  6948.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  6949.     }

  6950.     @Override public double jSpreadFromGSpread (
  6951.         final org.drip.param.valuation.ValuationParams valParams,
  6952.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6953.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6954.         final double dblGSpread)
  6955.         throws java.lang.Exception
  6956.     {
  6957.         return jSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  6958.     }

  6959.     @Override public double jSpreadFromGSpreadToOptimalExercise (
  6960.         final org.drip.param.valuation.ValuationParams valParams,
  6961.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6962.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6963.         final double dblGSpread)
  6964.         throws java.lang.Exception
  6965.     {
  6966.         if (null != _eosCall || null != _eosPut)
  6967.             throw new java.lang.Exception ("BondComponent::jSpreadFromGSpreadToOptimalExercise => " +
  6968.                 "Cant calc J Spread from G Spread to optimal exercise for bonds w emb option");

  6969.         return jSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  6970.     }

  6971.     @Override public double jSpreadFromISpread (
  6972.         final org.drip.param.valuation.ValuationParams valParams,
  6973.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6974.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6975.         final int iWorkoutDate,
  6976.         final double dblWorkoutFactor,
  6977.         final double dblISpread)
  6978.         throws java.lang.Exception
  6979.     {
  6980.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  6981.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  6982.     }

  6983.     @Override public double jSpreadFromISpread (
  6984.         final org.drip.param.valuation.ValuationParams valParams,
  6985.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6986.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6987.         final double dblISpread)
  6988.         throws java.lang.Exception
  6989.     {
  6990.         return jSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  6991.     }

  6992.     @Override public double jSpreadFromISpreadToOptimalExercise (
  6993.         final org.drip.param.valuation.ValuationParams valParams,
  6994.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  6995.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  6996.         final double dblISpread)
  6997.         throws java.lang.Exception
  6998.     {
  6999.         if (null != _eosCall || null != _eosPut)
  7000.             throw new java.lang.Exception ("BondComponent::jSpreadFromISpreadToOptimalExercise => " +
  7001.                 "Cant calc J Spread from I Spread to optimal exercise for bonds w emb option");

  7002.         return jSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  7003.     }

  7004.     @Override public double jSpreadFromNSpread (
  7005.         final org.drip.param.valuation.ValuationParams valParams,
  7006.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7007.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7008.         final int iWorkoutDate,
  7009.         final double dblWorkoutFactor,
  7010.         final double dblNSpread)
  7011.         throws java.lang.Exception
  7012.     {
  7013.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  7014.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  7015.     }

  7016.     @Override public double jSpreadFromNSpread (
  7017.         final org.drip.param.valuation.ValuationParams valParams,
  7018.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7019.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7020.         final double dblNSpread)
  7021.         throws java.lang.Exception
  7022.     {
  7023.         return jSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  7024.     }

  7025.     @Override public double jSpreadFromNSpreadToOptimalExercise (
  7026.         final org.drip.param.valuation.ValuationParams valParams,
  7027.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7028.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7029.         final double dblNSpread)
  7030.         throws java.lang.Exception
  7031.     {
  7032.         if (null != _eosCall || null != _eosPut)
  7033.             throw new java.lang.Exception ("BondComponent::jSpreadFromNSpreadToOptimalExercise => " +
  7034.                 "Cant calc J Spread from N Spread to optimal exercise for bonds w emb option");

  7035.         return jSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  7036.     }

  7037.     @Override public double jSpreadFromOAS (
  7038.         final org.drip.param.valuation.ValuationParams valParams,
  7039.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7040.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7041.         final int iWorkoutDate,
  7042.         final double dblWorkoutFactor,
  7043.         final double dblOAS)
  7044.         throws java.lang.Exception
  7045.     {
  7046.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  7047.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  7048.     }

  7049.     @Override public double jSpreadFromOAS (
  7050.         final org.drip.param.valuation.ValuationParams valParams,
  7051.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7052.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7053.         final double dblOAS)
  7054.         throws java.lang.Exception
  7055.     {
  7056.         return jSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  7057.     }

  7058.     @Override public double jSpreadFromOASToOptimalExercise (
  7059.         final org.drip.param.valuation.ValuationParams valParams,
  7060.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7061.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7062.         final double dblOAS)
  7063.         throws java.lang.Exception
  7064.     {
  7065.         if (null != _eosCall || null != _eosPut)
  7066.             throw new java.lang.Exception ("BondComponent::jSpreadFromOASToOptimalExercise => " +
  7067.                 "Cant calc J Spread from OAS to optimal exercise for bonds w emb option");

  7068.         return jSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  7069.     }

  7070.     @Override public double jSpreadFromPECS (
  7071.         final org.drip.param.valuation.ValuationParams valParams,
  7072.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7073.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7074.         final int iWorkoutDate,
  7075.         final double dblWorkoutFactor,
  7076.         final double dblPECS)
  7077.         throws java.lang.Exception
  7078.     {
  7079.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  7080.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  7081.     }

  7082.     @Override public double jSpreadFromPECS (
  7083.         final org.drip.param.valuation.ValuationParams valParams,
  7084.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7085.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7086.         final double dblPECS)
  7087.         throws java.lang.Exception
  7088.     {
  7089.         return jSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  7090.     }

  7091.     @Override public double jSpreadFromPECSToOptimalExercise (
  7092.         final org.drip.param.valuation.ValuationParams valParams,
  7093.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7094.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7095.         final double dblPECS)
  7096.         throws java.lang.Exception
  7097.     {
  7098.         if (null != _eosCall || null != _eosPut)
  7099.             throw new java.lang.Exception ("BondComponent::jSpreadFromPECSToOptimalExercise => " +
  7100.                 "Cant calc J Spread from PECS to optimal exercise for bonds w emb option");

  7101.         return jSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  7102.     }

  7103.     @Override public double jSpreadFromPrice (
  7104.         final org.drip.param.valuation.ValuationParams valParams,
  7105.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7106.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7107.         final int iWorkoutDate,
  7108.         final double dblWorkoutFactor,
  7109.         final double dblPrice)
  7110.         throws java.lang.Exception
  7111.     {
  7112.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  7113.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  7114.     }

  7115.     @Override public double jSpreadFromPrice (
  7116.         final org.drip.param.valuation.ValuationParams valParams,
  7117.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7118.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7119.         final double dblPrice)
  7120.         throws java.lang.Exception
  7121.     {
  7122.         return jSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  7123.     }

  7124.     @Override public double jSpreadFromPriceToOptimalExercise (
  7125.         final org.drip.param.valuation.ValuationParams valParams,
  7126.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7127.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7128.         final double dblPrice)
  7129.         throws java.lang.Exception
  7130.     {
  7131.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  7132.         if (null == wi)
  7133.             throw new java.lang.Exception
  7134.                 ("BondComponent::jSpreadFromPriceToOptimalExercise => Can't do Work-out");

  7135.         return jSpreadFromYield (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  7136.     }

  7137.     @Override public double jSpreadFromTSYSpread (
  7138.         final org.drip.param.valuation.ValuationParams valParams,
  7139.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7140.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7141.         final int iWorkoutDate,
  7142.         final double dblWorkoutFactor,
  7143.         final double dblTSYSpread)
  7144.         throws java.lang.Exception
  7145.     {
  7146.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  7147.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  7148.     }

  7149.     @Override public double jSpreadFromTSYSpread (
  7150.         final org.drip.param.valuation.ValuationParams valParams,
  7151.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7152.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7153.         final double dblTSYSpread)
  7154.         throws java.lang.Exception
  7155.     {
  7156.         return jSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  7157.     }

  7158.     @Override public double jSpreadFromTSYSpreadToOptimalExercise (
  7159.         final org.drip.param.valuation.ValuationParams valParams,
  7160.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7161.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7162.         final double dblTSYSpread)
  7163.         throws java.lang.Exception
  7164.     {
  7165.         if (null != _eosCall || null != _eosPut)
  7166.             throw new java.lang.Exception ("BondComponent::jSpreadFromTSYSpreadToOptimalExercise => " +
  7167.                 "Cant calc J Spread from TSY Spread to optimal exercise for bonds w emb option");

  7168.         return jSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  7169.     }

  7170.     @Override public double jSpreadFromYield (
  7171.         final org.drip.param.valuation.ValuationParams valParams,
  7172.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7173.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7174.         final int iWorkoutDate,
  7175.         final double dblWorkoutFactor,
  7176.         final double dblYield)
  7177.         throws java.lang.Exception
  7178.     {
  7179.         if (null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  7180.             throw new java.lang.Exception ("BondComponent::jSpreadFromYield => Invalid inputs");

  7181.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());

  7182.         if (null == gc) throw new java.lang.Exception ("BondComponent::jSpreadFromYield => Invalid inputs");

  7183.         return dblYield - gc.yield (weightedAverageMaturityDate (valParams, csqc, iWorkoutDate,
  7184.             dblWorkoutFactor));
  7185.     }

  7186.     @Override public double jSpreadFromYield (
  7187.         final org.drip.param.valuation.ValuationParams valParams,
  7188.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7189.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7190.         final double dblYield)
  7191.         throws java.lang.Exception
  7192.     {
  7193.         return jSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  7194.     }

  7195.     @Override public double jSpreadFromYieldToOptimalExercise (
  7196.         final org.drip.param.valuation.ValuationParams valParams,
  7197.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7198.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7199.         final double dblYield)
  7200.         throws java.lang.Exception
  7201.     {
  7202.         if (null != _eosCall || null != _eosPut)
  7203.             throw new java.lang.Exception ("BondComponent::jSpreadFromYieldToOptimalExercise => " +
  7204.                 "Cant calc J Spread from Yield to optimal exercise for bonds w emb option");

  7205.         return jSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  7206.     }

  7207.     @Override public double jSpreadFromYieldSpread (
  7208.         final org.drip.param.valuation.ValuationParams valParams,
  7209.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7210.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7211.         final int iWorkoutDate,
  7212.         final double dblWorkoutFactor,
  7213.         final double dblYieldSpread)
  7214.         throws java.lang.Exception
  7215.     {
  7216.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  7217.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  7218.     }

  7219.     @Override public double jSpreadFromYieldSpread (
  7220.         final org.drip.param.valuation.ValuationParams valParams,
  7221.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7222.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7223.         final double dblYieldSpread)
  7224.         throws java.lang.Exception
  7225.     {
  7226.         return jSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  7227.     }

  7228.     @Override public double jSpreadFromYieldSpreadToOptimalExercise (
  7229.         final org.drip.param.valuation.ValuationParams valParams,
  7230.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7231.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7232.         final double dblYieldSpread)
  7233.         throws java.lang.Exception
  7234.     {
  7235.         if (null != _eosCall || null != _eosPut)
  7236.             throw new java.lang.Exception ("BondComponent::jSpreadFromYieldSpreadToOptimalExercise => " +
  7237.                 "Cant calc J Spread from Yield Spread to optimal exercise for bonds w emb option");

  7238.         return jSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  7239.     }

  7240.     @Override public double jSpreadFromZSpread (
  7241.         final org.drip.param.valuation.ValuationParams valParams,
  7242.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7243.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7244.         final int iWorkoutDate,
  7245.         final double dblWorkoutFactor,
  7246.         final double dblZSpread)
  7247.         throws java.lang.Exception
  7248.     {
  7249.         return jSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  7250.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  7251.     }

  7252.     @Override public double jSpreadFromZSpread (
  7253.         final org.drip.param.valuation.ValuationParams valParams,
  7254.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7255.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7256.         final double dblZSpread)
  7257.         throws java.lang.Exception
  7258.     {
  7259.         return jSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  7260.     }

  7261.     @Override public double jSpreadFromZSpreadToOptimalExercise (
  7262.         final org.drip.param.valuation.ValuationParams valParams,
  7263.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7264.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7265.         final double dblZSpread)
  7266.         throws java.lang.Exception
  7267.     {
  7268.         if (null != _eosCall || null != _eosPut)
  7269.             throw new java.lang.Exception ("BondComponent::iSpreadFromZSpreadToOptimalExercise => " +
  7270.                 "Cant calc J Spread from Z Spread to optimal exercise for bonds w emb option");

  7271.         return jSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  7272.     }

  7273.     @Override public double macaulayDurationFromASW (
  7274.         final org.drip.param.valuation.ValuationParams valParams,
  7275.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7276.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7277.         final int iWorkoutDate,
  7278.         final double dblWorkoutFactor,
  7279.         final double dblASW)
  7280.         throws java.lang.Exception
  7281.     {
  7282.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7283.             yieldFromASW (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  7284.     }

  7285.     @Override public double macaulayDurationFromASW (
  7286.         final org.drip.param.valuation.ValuationParams valParams,
  7287.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7288.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7289.         final double dblASW)
  7290.         throws java.lang.Exception
  7291.     {
  7292.         return macaulayDurationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  7293.     }

  7294.     @Override public double macaulayDurationFromASWToOptimalExercise (
  7295.         final org.drip.param.valuation.ValuationParams valParams,
  7296.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7297.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7298.         final double dblASW)
  7299.         throws java.lang.Exception
  7300.     {
  7301.         if (null != _eosCall || null != _eosPut)
  7302.             throw new java.lang.Exception
  7303.                 ("BondComponent::macaulayDurationFromASWToOptimalExercise => " +
  7304.                     "Cant calc Macaulay Duration from ASW to optimal exercise for bonds w emb option");

  7305.         return macaulayDurationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  7306.     }

  7307.     @Override public double macaulayDurationFromBondBasis (
  7308.         final org.drip.param.valuation.ValuationParams valParams,
  7309.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7310.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7311.         final int iWorkoutDate,
  7312.         final double dblWorkoutFactor,
  7313.         final double dblBondBasis)
  7314.         throws java.lang.Exception
  7315.     {
  7316.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7317.             yieldFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  7318.     }

  7319.     @Override public double macaulayDurationFromBondBasis (
  7320.         final org.drip.param.valuation.ValuationParams valParams,
  7321.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7322.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7323.         final double dblBondBasis)
  7324.         throws java.lang.Exception
  7325.     {
  7326.         return macaulayDurationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7327.             dblBondBasis);
  7328.     }

  7329.     @Override public double macaulayDurationFromBondBasisToOptimalExercise (
  7330.         final org.drip.param.valuation.ValuationParams valParams,
  7331.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7332.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7333.         final double dblBondBasis)
  7334.         throws java.lang.Exception
  7335.     {
  7336.         if (null != _eosCall || null != _eosPut)
  7337.             throw new java.lang.Exception
  7338.                 ("BondComponent::macaulayDurationFromBondBasisToOptimalExercise => " +
  7339.                     "Cant calc Macaulay Duration from Bnd Basis to optimal exercise for bonds w emb option");

  7340.         return macaulayDurationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7341.             dblBondBasis);
  7342.     }

  7343.     @Override public double macaulayDurationFromCreditBasis (
  7344.         final org.drip.param.valuation.ValuationParams valParams,
  7345.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7346.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7347.         final int iWorkoutDate,
  7348.         final double dblWorkoutFactor,
  7349.         final double dblCreditBasis)
  7350.         throws java.lang.Exception
  7351.     {
  7352.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7353.             yieldFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  7354.     }

  7355.     @Override public double macaulayDurationFromCreditBasis (
  7356.         final org.drip.param.valuation.ValuationParams valParams,
  7357.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7358.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7359.         final double dblCreditBasis)
  7360.         throws java.lang.Exception
  7361.     {
  7362.         return macaulayDurationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7363.             dblCreditBasis);
  7364.     }

  7365.     @Override public double macaulayDurationFromCreditBasisToOptimalExercise (
  7366.         final org.drip.param.valuation.ValuationParams valParams,
  7367.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7368.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7369.         final double dblCreditBasis)
  7370.         throws java.lang.Exception
  7371.     {
  7372.         if (null != _eosCall || null != _eosPut)
  7373.             throw new java.lang.Exception
  7374.                 ("BondComponent::macaulayDurationFromCreditBasisToOptimalExercise => " +
  7375.                     "Cant calc Macaulay Duration from Crd Basis to optimal exercise for bonds w emb option");

  7376.         return macaulayDurationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7377.             dblCreditBasis);
  7378.     }

  7379.     @Override public double macaulayDurationFromDiscountMargin (
  7380.         final org.drip.param.valuation.ValuationParams valParams,
  7381.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7382.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7383.         final int iWorkoutDate,
  7384.         final double dblWorkoutFactor,
  7385.         final double dblDiscountMargin)
  7386.         throws java.lang.Exception
  7387.     {
  7388.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7389.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7390.                 dblDiscountMargin));
  7391.     }

  7392.     @Override public double macaulayDurationFromDiscountMargin (
  7393.         final org.drip.param.valuation.ValuationParams valParams,
  7394.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7395.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7396.         final double dblDiscountMargin)
  7397.         throws java.lang.Exception
  7398.     {
  7399.         return macaulayDurationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7400.             dblDiscountMargin);
  7401.     }

  7402.     @Override public double macaulayDurationFromDiscountMarginToOptimalExercise (
  7403.         final org.drip.param.valuation.ValuationParams valParams,
  7404.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7405.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7406.         final double dblDiscountMargin)
  7407.         throws java.lang.Exception
  7408.     {
  7409.         if (null != _eosCall || null != _eosPut)
  7410.             throw new java.lang.Exception
  7411.                 ("BondComponent::macaulayDurationFromDiscountMarginToOptimalExercise => " +
  7412.                     "Cant calc Macaulay Duration from Disc Marg to optimal exercise for bonds w emb option");

  7413.         return macaulayDurationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7414.             dblDiscountMargin);
  7415.     }

  7416.     @Override public double macaulayDurationFromESpread (
  7417.         final org.drip.param.valuation.ValuationParams valParams,
  7418.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7419.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7420.         final int iWorkoutDate,
  7421.         final double dblWorkoutFactor,
  7422.         final double dblESpread)
  7423.         throws java.lang.Exception
  7424.     {
  7425.         return macaulayDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7426.             priceFromESpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  7427.     }

  7428.     @Override public double macaulayDurationFromESpread (
  7429.         final org.drip.param.valuation.ValuationParams valParams,
  7430.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7431.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7432.         final double dblESpread)
  7433.         throws java.lang.Exception
  7434.     {
  7435.         return macaulayDurationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  7436.     }

  7437.     @Override public double macaulayDurationFromESpreadToOptimalExercise (
  7438.         final org.drip.param.valuation.ValuationParams valParams,
  7439.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7440.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7441.         final double dblESpread)
  7442.         throws java.lang.Exception
  7443.     {
  7444.         if (null != _eosCall || null != _eosPut)
  7445.             throw new java.lang.Exception
  7446.                 ("BondComponent::macaulayDurationFromESpreadToOptimalExercise => " +
  7447.                     "Cant calc Macaulay Duration from E Spread to optimal exercise for bonds w emb option");

  7448.         return macaulayDurationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  7449.     }

  7450.     @Override public double macaulayDurationFromGSpread (
  7451.         final org.drip.param.valuation.ValuationParams valParams,
  7452.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7453.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7454.         final int iWorkoutDate,
  7455.         final double dblWorkoutFactor,
  7456.         final double dblGSpread)
  7457.         throws java.lang.Exception
  7458.     {
  7459.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7460.             yieldFromGSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  7461.     }

  7462.     @Override public double macaulayDurationFromGSpread (
  7463.         final org.drip.param.valuation.ValuationParams valParams,
  7464.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7465.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7466.         final double dblGSpread)
  7467.         throws java.lang.Exception
  7468.     {
  7469.         return macaulayDurationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  7470.     }

  7471.     @Override public double macaulayDurationFromGSpreadToOptimalExercise (
  7472.         final org.drip.param.valuation.ValuationParams valParams,
  7473.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7474.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7475.         final double dblGSpread)
  7476.         throws java.lang.Exception
  7477.     {
  7478.         if (null != _eosCall || null != _eosPut)
  7479.             throw new java.lang.Exception
  7480.                 ("BondComponent::macaulayDurationFromGSpreadToOptimalExercise => " +
  7481.                     "Cant calc Macaulay Duration from G Spread to optimal exercise for bonds w emb option");

  7482.         return macaulayDurationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  7483.     }

  7484.     @Override public double macaulayDurationFromISpread (
  7485.         final org.drip.param.valuation.ValuationParams valParams,
  7486.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7487.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7488.         final int iWorkoutDate,
  7489.         final double dblWorkoutFactor,
  7490.         final double dblISpread)
  7491.         throws java.lang.Exception
  7492.     {
  7493.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7494.             yieldFromISpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  7495.     }

  7496.     @Override public double macaulayDurationFromISpread (
  7497.         final org.drip.param.valuation.ValuationParams valParams,
  7498.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7499.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7500.         final double dblISpread)
  7501.         throws java.lang.Exception
  7502.     {
  7503.         return macaulayDurationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  7504.     }

  7505.     @Override public double macaulayDurationFromISpreadToOptimalExercise (
  7506.         final org.drip.param.valuation.ValuationParams valParams,
  7507.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7508.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7509.         final double dblISpread)
  7510.         throws java.lang.Exception
  7511.     {
  7512.         if (null != _eosCall || null != _eosPut)
  7513.             throw new java.lang.Exception
  7514.                 ("BondComponent::macaulayDurationFromISpreadToOptimalExercise => " +
  7515.                     "Cant calc Macaulay Duration from I Spread to optimal exercise for bonds w emb option");

  7516.         return macaulayDurationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  7517.     }

  7518.     @Override public double macaulayDurationFromJSpread (
  7519.         final org.drip.param.valuation.ValuationParams valParams,
  7520.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7521.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7522.         final int iWorkoutDate,
  7523.         final double dblWorkoutFactor,
  7524.         final double dblJSpread)
  7525.         throws java.lang.Exception
  7526.     {
  7527.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7528.             yieldFromJSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  7529.     }

  7530.     @Override public double macaulayDurationFromJSpread (
  7531.         final org.drip.param.valuation.ValuationParams valParams,
  7532.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7533.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7534.         final double dblJSpread)
  7535.         throws java.lang.Exception
  7536.     {
  7537.         return macaulayDurationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  7538.     }

  7539.     @Override public double macaulayDurationFromJSpreadToOptimalExercise (
  7540.         final org.drip.param.valuation.ValuationParams valParams,
  7541.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7542.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7543.         final double dblJSpread)
  7544.         throws java.lang.Exception
  7545.     {
  7546.         if (null != _eosCall || null != _eosPut)
  7547.             throw new java.lang.Exception
  7548.                 ("BondComponent::macaulayDurationFromJSpreadToOptimalExercise => " +
  7549.                     "Cant calc Macaulay Duration from J Spread to optimal exercise for bonds w emb option");

  7550.         return macaulayDurationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  7551.     }

  7552.     @Override public double macaulayDurationFromNSpread (
  7553.         final org.drip.param.valuation.ValuationParams valParams,
  7554.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7555.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7556.         final int iWorkoutDate,
  7557.         final double dblWorkoutFactor,
  7558.         final double dblNSpread)
  7559.         throws java.lang.Exception
  7560.     {
  7561.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7562.             yieldFromNSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  7563.     }

  7564.     @Override public double macaulayDurationFromNSpread (
  7565.         final org.drip.param.valuation.ValuationParams valParams,
  7566.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7567.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7568.         final double dblNSpread)
  7569.         throws java.lang.Exception
  7570.     {
  7571.         return macaulayDurationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  7572.     }

  7573.     @Override public double macaulayDurationFromNSpreadToOptimalExercise (
  7574.         final org.drip.param.valuation.ValuationParams valParams,
  7575.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7576.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7577.         final double dblNSpread)
  7578.         throws java.lang.Exception
  7579.     {
  7580.         if (null != _eosCall || null != _eosPut)
  7581.             throw new java.lang.Exception
  7582.                 ("BondComponent::macaulayDurationFromNSpreadToOptimalExercise => " +
  7583.                     "Cant calc Macaulay Duration from N Spread to optimal exercise for bonds w emb option");

  7584.         return macaulayDurationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  7585.     }

  7586.     @Override public double macaulayDurationFromOAS (
  7587.         final org.drip.param.valuation.ValuationParams valParams,
  7588.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7589.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7590.         final int iWorkoutDate,
  7591.         final double dblWorkoutFactor,
  7592.         final double dblOAS)
  7593.         throws java.lang.Exception
  7594.     {
  7595.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7596.             yieldFromOAS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  7597.     }

  7598.     @Override public double macaulayDurationFromOAS (
  7599.         final org.drip.param.valuation.ValuationParams valParams,
  7600.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7601.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7602.         final double dblOAS)
  7603.         throws java.lang.Exception
  7604.     {
  7605.         return macaulayDurationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  7606.     }

  7607.     @Override public double mnacaulayDurationFromOASToOptimalExercise (
  7608.         final org.drip.param.valuation.ValuationParams valParams,
  7609.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7610.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7611.         final double dblOAS)
  7612.         throws java.lang.Exception
  7613.     {
  7614.         if (null != _eosCall || null != _eosPut)
  7615.             throw new java.lang.Exception
  7616.                 ("BondComponent::mnacaulayDurationFromOASToOptimalExercise => " +
  7617.                     "Cant calc Macaulay Duration from OAS to optimal exercise for bonds w emb option");

  7618.         return macaulayDurationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  7619.     }

  7620.     @Override public double macaulayDurationFromPECS (
  7621.         final org.drip.param.valuation.ValuationParams valParams,
  7622.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7623.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7624.         final int iWorkoutDate,
  7625.         final double dblWorkoutFactor,
  7626.         final double dblPECS)
  7627.         throws java.lang.Exception
  7628.     {
  7629.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7630.             yieldFromPECS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  7631.     }

  7632.     @Override public double macaulayDurationFromPECS (
  7633.         final org.drip.param.valuation.ValuationParams valParams,
  7634.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7635.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7636.         final double dblPECS)
  7637.         throws java.lang.Exception
  7638.     {
  7639.         return macaulayDurationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  7640.     }

  7641.     @Override public double macaulayDurationFromPECSToOptimalExercise (
  7642.         final org.drip.param.valuation.ValuationParams valParams,
  7643.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7644.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7645.         final double dblPECS)
  7646.         throws java.lang.Exception
  7647.     {
  7648.         if (null != _eosCall || null != _eosPut)
  7649.             throw new java.lang.Exception
  7650.                 ("BondComponent::macaulayDurationFromPECSToOptimalExercise => " +
  7651.                     "Cant calc Macaulay Duration from PECS to optimal exercise for bonds w emb option");

  7652.         return macaulayDurationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  7653.     }

  7654.     @Override public double macaulayDurationFromPrice (
  7655.         final org.drip.param.valuation.ValuationParams valParams,
  7656.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7657.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7658.         final int iWorkoutDate,
  7659.         final double dblWorkoutFactor,
  7660.         final double dblPrice)
  7661.         throws java.lang.Exception
  7662.     {
  7663.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7664.             yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  7665.     }

  7666.     @Override public double macaulayDurationFromPrice (
  7667.         final org.drip.param.valuation.ValuationParams valParams,
  7668.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7669.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7670.         final double dblPrice)
  7671.         throws java.lang.Exception
  7672.     {
  7673.         return macaulayDurationFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  7674.     }

  7675.     @Override public double macaulayDurationFromPriceToOptimalExercise (
  7676.         final org.drip.param.valuation.ValuationParams valParams,
  7677.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7678.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7679.         final double dblPrice)
  7680.         throws java.lang.Exception
  7681.     {
  7682.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  7683.         if (null == wi)
  7684.             throw new java.lang.Exception
  7685.                 ("BondComponent::macaulayDurationFromPriceToOptimalExercise => Cant determine Work-out");

  7686.         return macaulayDurationFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  7687.     }

  7688.     @Override public double macaulayDurationFromTSYSpread (
  7689.         final org.drip.param.valuation.ValuationParams valParams,
  7690.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7691.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7692.         final int iWorkoutDate,
  7693.         final double dblWorkoutFactor,
  7694.         final double dblTSYSpread)
  7695.         throws java.lang.Exception
  7696.     {
  7697.         return macaulayDurationFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7698.             yieldFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  7699.     }

  7700.     @Override public double macaulayDurationFromTSYSpread (
  7701.         final org.drip.param.valuation.ValuationParams valParams,
  7702.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7703.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7704.         final double dblTSYSpread)
  7705.         throws java.lang.Exception
  7706.     {
  7707.         return macaulayDurationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7708.             dblTSYSpread);
  7709.     }

  7710.     @Override public double macaulayDurationFromTSYSpreadToOptimalExercise (
  7711.         final org.drip.param.valuation.ValuationParams valParams,
  7712.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7713.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7714.         final double dblTSYSpread)
  7715.         throws java.lang.Exception
  7716.     {
  7717.         if (null != _eosCall || null != _eosPut)
  7718.             throw new java.lang.Exception
  7719.                 ("BondComponent::macaulayDurationFromTSYSpreadToOptimalExercise => " +
  7720.                     "Cant calc Macaulay Duration from TSY Sprd to optimal exercise for bonds w emb option");

  7721.         return macaulayDurationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7722.             dblTSYSpread);
  7723.     }

  7724.     @Override public double macaulayDurationFromYield (
  7725.         final org.drip.param.valuation.ValuationParams valParams,
  7726.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7727.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7728.         final int iWorkoutDate,
  7729.         final double dblWorkoutFactor,
  7730.         final double dblYield)
  7731.         throws java.lang.Exception
  7732.     {
  7733.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor))
  7734.             throw new java.lang.Exception ("BondComponent::macaulayDurationFromYield => Invalid inputs");

  7735.         int iValueDate = valParams.valueDate();

  7736.         if (iValueDate >= iWorkoutDate)
  7737.             throw new java.lang.Exception ("BondComponent::macaulayDurationFromYield => Invalid inputs");

  7738.         boolean bFirstPeriod = true;
  7739.         double dblPeriodYearFract = 0.;
  7740.         double dblCumulativePeriodPV = 0.;
  7741.         boolean bTerminateCouponFlow = false;
  7742.         boolean bApplyFlatForwardRate = false;
  7743.         double dblCumulativePeriodDuration = 0.;
  7744.         double dblFlatForwardRate = java.lang.Double.NaN;
  7745.         org.drip.analytics.daycount.ActActDCParams aap = null;
  7746.         org.drip.analytics.cashflow.CompositePeriod periodRef = null;

  7747.         int iFrequency = freq();

  7748.         java.lang.String strDC = couponDC();

  7749.         java.lang.String strCalendar = currency();

  7750.         boolean bApplyCpnEOMAdj = _stream.couponEOMAdjustment();

  7751.         if (null == strCalendar || strCalendar.isEmpty()) strCalendar = redemptionCurrency();

  7752.         org.drip.param.valuation.ValuationCustomizationParams vcpQuote = null == _quoteConvention ? null :
  7753.             _quoteConvention.valuationCustomizationParams();

  7754.         if (null != vcp) {
  7755.             strDC = vcp.yieldDayCount();

  7756.             iFrequency = vcp.yieldFreq();

  7757.             strCalendar = vcp.yieldCalendar();

  7758.             bApplyCpnEOMAdj = vcp.applyYieldEOMAdj();

  7759.             bApplyFlatForwardRate = vcp.applyFlatForwardRate();
  7760.         } else if (null != vcpQuote) {
  7761.             strDC = vcpQuote.yieldDayCount();

  7762.             iFrequency = vcpQuote.yieldFreq();

  7763.             strCalendar = vcpQuote.yieldCalendar();

  7764.             bApplyCpnEOMAdj = vcpQuote.applyYieldEOMAdj();

  7765.             bApplyFlatForwardRate = vcpQuote.applyFlatForwardRate();
  7766.         }

  7767.         int iAmortizationMode = _notionalSetting.periodAmortizationMode();

  7768.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  7769.             int iPeriodPayDate = period.payDate();

  7770.             if (iPeriodPayDate < iValueDate) continue;

  7771.             if (bFirstPeriod) {
  7772.                 bFirstPeriod = false;

  7773.                 dblPeriodYearFract = period.couponDCF() - period.accrualDCF (iValueDate);
  7774.             } else
  7775.                 dblPeriodYearFract += period.couponDCF();

  7776.             periodRef = period;

  7777.             int iPeriodEndDate = period.endDate();

  7778.             int iPeriodStartDate = period.startDate();

  7779.             if (iPeriodEndDate >= iWorkoutDate) {
  7780.                 bTerminateCouponFlow = true;
  7781.                 iPeriodEndDate = iWorkoutDate;
  7782.             }

  7783.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate,
  7784.                 valParams, csqc);

  7785.             if (null == cpcm)
  7786.                 throw new java.lang.Exception ("BondComponent::macaulayDurationFromYield => No CPCM");

  7787.             if (null != vcp) {
  7788.                 if (null == (aap = vcp.yieldAAP()))
  7789.                     aap = new org.drip.analytics.daycount.ActActDCParams (vcp.yieldFreq(), iPeriodEndDate -
  7790.                         iPeriodStartDate);
  7791.             } else if (null != vcpQuote) {
  7792.                 if (null == (aap = vcpQuote.yieldAAP()))
  7793.                     aap = new org.drip.analytics.daycount.ActActDCParams (vcpQuote.yieldFreq(),
  7794.                         iPeriodEndDate - iPeriodStartDate);
  7795.             } else
  7796.                 aap = new org.drip.analytics.daycount.ActActDCParams (iFrequency, iPeriodEndDate -
  7797.                     iPeriodStartDate);

  7798.             double dblYearFract = org.drip.analytics.daycount.Convention.YearFraction (iValueDate,
  7799.                 iPeriodPayDate, strDC, bApplyCpnEOMAdj, aap, strCalendar);

  7800.             double dblYieldAnnuity = org.drip.analytics.support.Helper.Yield2DF (iFrequency, dblYield,
  7801.                 s_bYieldDFOffofCouponAccrualDCF ? dblPeriodYearFract : dblYearFract) * cpcm.cumulative();

  7802.             double dblPeriodStartNotional = notional (iPeriodStartDate);

  7803.             double dblPeriodEndNotional = notional (iPeriodEndDate);

  7804.             double dblCouponNotional = dblPeriodStartNotional;

  7805.             if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START == iAmortizationMode)
  7806.                 dblCouponNotional = notional (iPeriodStartDate);
  7807.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END == iAmortizationMode)
  7808.                 dblCouponNotional = dblPeriodEndNotional;
  7809.             else if (org.drip.product.params.NotionalSetting.PERIOD_AMORT_EFFECTIVE == iAmortizationMode)
  7810.                 dblCouponNotional = notional (iPeriodStartDate, iPeriodEndDate);

  7811.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  7812.                 dblFlatForwardRate = cpcm.rate();

  7813.             double dblCouponPV = period.accrualDCF (iPeriodEndDate) * (bApplyFlatForwardRate ?
  7814.                 dblFlatForwardRate : cpcm.rate()) * couponFactor (iPeriodEndDate) * dblYieldAnnuity *
  7815.                     dblCouponNotional;

  7816.             double dblPeriodNotionalPV = (dblPeriodStartNotional - dblPeriodEndNotional) * dblYieldAnnuity;
  7817.             dblCumulativePeriodDuration += dblPeriodYearFract * (dblCouponPV + dblPeriodNotionalPV);
  7818.             dblCumulativePeriodPV += (dblCouponPV + dblPeriodNotionalPV);

  7819.             if (bTerminateCouponFlow) break;
  7820.         }

  7821.         if (null != periodRef)
  7822.             aap = new org.drip.analytics.daycount.ActActDCParams (iFrequency, periodRef.endDate() -
  7823.                 periodRef.startDate());

  7824.         double dblRedemptionPV = dblWorkoutFactor * org.drip.analytics.support.Helper.Yield2DF (iFrequency,
  7825.             dblYield, s_bYieldDFOffofCouponAccrualDCF ? dblPeriodYearFract :
  7826.                 org.drip.analytics.daycount.Convention.YearFraction (iValueDate, terminationAdjust
  7827.                     (iWorkoutDate), strDC, bApplyCpnEOMAdj, aap, strCalendar)) * notional (iWorkoutDate);

  7828.         return (dblCumulativePeriodDuration + dblPeriodYearFract * dblRedemptionPV) / (dblCumulativePeriodPV
  7829.             + dblRedemptionPV);
  7830.     }

  7831.     @Override public double macaulayDurationFromYield (
  7832.         final org.drip.param.valuation.ValuationParams valParams,
  7833.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7834.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7835.         final double dblYield)
  7836.         throws java.lang.Exception
  7837.     {
  7838.         return macaulayDurationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  7839.     }

  7840.     @Override public double macaulayDurationFromYieldToOptimalExercise (
  7841.         final org.drip.param.valuation.ValuationParams valParams,
  7842.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7843.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7844.         final double dblYield)
  7845.         throws java.lang.Exception
  7846.     {
  7847.         if (null != _eosCall || null != _eosPut)
  7848.             throw new java.lang.Exception ("BondComponent::macaulayDurationFromYieldToOptimalExercise =>" +
  7849.                 " Cant calc Macaulay Duration from Yield to optimal exercise for bonds w emb option");

  7850.         return macaulayDurationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  7851.     }

  7852.     @Override public double macaulayDurationFromYieldSpread (
  7853.         final org.drip.param.valuation.ValuationParams valParams,
  7854.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7855.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7856.         final int iWorkoutDate,
  7857.         final double dblWorkoutFactor,
  7858.         final double dblYieldSpread)
  7859.         throws java.lang.Exception
  7860.     {
  7861.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7862.             yieldFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  7863.     }

  7864.     @Override public double macaulayDurationFromYieldSpread (
  7865.         final org.drip.param.valuation.ValuationParams valParams,
  7866.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7867.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7868.         final double dblYieldSpread)
  7869.         throws java.lang.Exception
  7870.     {
  7871.         return macaulayDurationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7872.             dblYieldSpread);
  7873.     }

  7874.     @Override public double macaulayDurationFromYieldSpreadToOptimalExercise (
  7875.         final org.drip.param.valuation.ValuationParams valParams,
  7876.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7877.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7878.         final double dblYieldSpread)
  7879.         throws java.lang.Exception
  7880.     {
  7881.         if (null != _eosCall || null != _eosPut)
  7882.             throw new java.lang.Exception
  7883.                 ("BondComponent::macaulayDurationFromYieldSpreadToOptimalExercise => " +
  7884.                     "Cant calc Macaulay Duration from Yld Sprd to optimal exercise for bonds w emb option");

  7885.         return macaulayDurationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7886.             dblYieldSpread);
  7887.     }

  7888.     @Override public double macaulayDurationFromZSpread (
  7889.         final org.drip.param.valuation.ValuationParams valParams,
  7890.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7891.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7892.         final int iWorkoutDate,
  7893.         final double dblWorkoutFactor,
  7894.         final double dblZSpread)
  7895.         throws java.lang.Exception
  7896.     {
  7897.         return macaulayDurationFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7898.             yieldFromZSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  7899.     }

  7900.     @Override public double macaulayDurationFromZSpread (
  7901.         final org.drip.param.valuation.ValuationParams valParams,
  7902.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7903.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7904.         final double dblZSpread)
  7905.         throws java.lang.Exception
  7906.     {
  7907.         return macaulayDurationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  7908.     }

  7909.     @Override public double macaulayDurationFromZSpreadToOptimalExercise (
  7910.         final org.drip.param.valuation.ValuationParams valParams,
  7911.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7912.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7913.         final double dblZSpread)
  7914.         throws java.lang.Exception
  7915.     {
  7916.         if (null != _eosCall || null != _eosPut)
  7917.             throw new java.lang.Exception
  7918.                 ("BondComponent::macaulayDurationFromZSpreadToOptimalExercise => " +
  7919.                     "Cant calc Macaulay Duration from Z Spread to optimal exercise for bonds w emb option");

  7920.         return macaulayDurationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  7921.     }

  7922.     @Override public double modifiedDurationFromASW (
  7923.         final org.drip.param.valuation.ValuationParams valParams,
  7924.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7925.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7926.         final int iWorkoutDate,
  7927.         final double dblWorkoutFactor,
  7928.         final double dblASW)
  7929.         throws java.lang.Exception
  7930.     {
  7931.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7932.             priceFromASW (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  7933.     }

  7934.     @Override public double modifiedDurationFromASW (
  7935.         final org.drip.param.valuation.ValuationParams valParams,
  7936.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7937.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7938.         final double dblASW)
  7939.         throws java.lang.Exception
  7940.     {
  7941.         return modifiedDurationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  7942.     }

  7943.     @Override public double modifiedDurationFromASWToOptimalExercise (
  7944.         final org.drip.param.valuation.ValuationParams valParams,
  7945.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7946.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7947.         final double dblASW)
  7948.         throws java.lang.Exception
  7949.     {
  7950.         if (null != _eosCall || null != _eosPut)
  7951.             throw new java.lang.Exception
  7952.                 ("BondComponent::modifiedDurationFromASWToOptimalExercise => " +
  7953.                     "Cant calc Modified Duration from ASW to optimal exercise for bonds w emb option");

  7954.         return modifiedDurationFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  7955.     }

  7956.     @Override public double modifiedDurationFromBondBasis (
  7957.         final org.drip.param.valuation.ValuationParams valParams,
  7958.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7959.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7960.         final int iWorkoutDate,
  7961.         final double dblWorkoutFactor,
  7962.         final double dblBondBasis)
  7963.         throws java.lang.Exception
  7964.     {
  7965.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  7966.             priceFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  7967.     }

  7968.     @Override public double modifiedDurationFromBondBasis (
  7969.         final org.drip.param.valuation.ValuationParams valParams,
  7970.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7971.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7972.         final double dblBondBasis)
  7973.         throws java.lang.Exception
  7974.     {
  7975.         return modifiedDurationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7976.             dblBondBasis);
  7977.     }

  7978.     @Override public double modifiedDurationFromBondBasisToOptimalExercise (
  7979.         final org.drip.param.valuation.ValuationParams valParams,
  7980.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7981.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7982.         final double dblBondBasis)
  7983.         throws java.lang.Exception
  7984.     {
  7985.         if (null != _eosCall || null != _eosPut)
  7986.             throw new java.lang.Exception
  7987.                 ("BondComponent::modifiedDurationFromBondBasisToOptimalExercise => " +
  7988.                     "Cant calc Modified Duration from Bnd Basis to optimal exercise for bonds w emb option");

  7989.         return modifiedDurationFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  7990.             dblBondBasis);
  7991.     }

  7992.     @Override public double modifiedDurationFromCreditBasis (
  7993.         final org.drip.param.valuation.ValuationParams valParams,
  7994.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  7995.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  7996.         final int iWorkoutDate,
  7997.         final double dblWorkoutFactor,
  7998.         final double dblCreditBasis)
  7999.         throws java.lang.Exception
  8000.     {
  8001.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8002.             priceFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  8003.     }

  8004.     @Override public double modifiedDurationFromCreditBasis (
  8005.         final org.drip.param.valuation.ValuationParams valParams,
  8006.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8007.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8008.         final double dblCreditBasis)
  8009.         throws java.lang.Exception
  8010.     {
  8011.         return modifiedDurationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8012.             dblCreditBasis);
  8013.     }

  8014.     @Override public double modifiedDurationFromCreditBasisToOptimalExercise (
  8015.         final org.drip.param.valuation.ValuationParams valParams,
  8016.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8017.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8018.         final double dblCreditBasis)
  8019.         throws java.lang.Exception
  8020.     {
  8021.         if (null != _eosCall || null != _eosPut)
  8022.             throw new java.lang.Exception
  8023.                 ("BondComponent::modifiedDurationFromCreditBasisToOptimalExercise => " +
  8024.                     "Cant calc Modified Duration from Crd Basis to optimal exercise for bonds w emb option");

  8025.         return modifiedDurationFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8026.             dblCreditBasis);
  8027.     }

  8028.     @Override public double modifiedDurationFromDiscountMargin (
  8029.         final org.drip.param.valuation.ValuationParams valParams,
  8030.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8031.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8032.         final int iWorkoutDate,
  8033.         final double dblWorkoutFactor,
  8034.         final double dblDiscountMargin)
  8035.         throws java.lang.Exception
  8036.     {
  8037.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8038.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8039.                 dblDiscountMargin));
  8040.     }

  8041.     @Override public double modifiedDurationFromDiscountMargin (
  8042.         final org.drip.param.valuation.ValuationParams valParams,
  8043.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8044.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8045.         final double dblDiscountMargin)
  8046.         throws java.lang.Exception
  8047.     {
  8048.         return modifiedDurationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8049.             dblDiscountMargin);
  8050.     }

  8051.     @Override public double modifiedDurationFromDiscountMarginToOptimalExercise (
  8052.         final org.drip.param.valuation.ValuationParams valParams,
  8053.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8054.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8055.         final double dblDiscountMargin)
  8056.         throws java.lang.Exception
  8057.     {
  8058.         if (null != _eosCall || null != _eosPut)
  8059.             throw new java.lang.Exception
  8060.                 ("BondComponent::modifiedDurationFromDiscountMarginToOptimalExercise => " +
  8061.                     "Cant calc Modified Duration from Disc Marg to optimal exercise for bonds w emb option");

  8062.         return modifiedDurationFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8063.             dblDiscountMargin);
  8064.     }

  8065.     @Override public double modifiedDurationFromESpread (
  8066.         final org.drip.param.valuation.ValuationParams valParams,
  8067.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8068.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8069.         final int iWorkoutDate,
  8070.         final double dblWorkoutFactor,
  8071.         final double dblESpread)
  8072.         throws java.lang.Exception
  8073.     {
  8074.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8075.             priceFromESpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  8076.     }

  8077.     @Override public double modifiedDurationFromESpread (
  8078.         final org.drip.param.valuation.ValuationParams valParams,
  8079.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8080.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8081.         final double dblESpread)
  8082.         throws java.lang.Exception
  8083.     {
  8084.         return modifiedDurationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  8085.     }

  8086.     @Override public double modifiedDurationFromESpreadToOptimalExercise (
  8087.         final org.drip.param.valuation.ValuationParams valParams,
  8088.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8089.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8090.         final double dblESpread)
  8091.         throws java.lang.Exception
  8092.     {
  8093.         if (null != _eosCall || null != _eosPut)
  8094.             throw new java.lang.Exception
  8095.                 ("BondComponent::modifiedDurationFromESpreadToOptimalExercise => " +
  8096.                     "Cant calc Modified Duration from E Spread to optimal exercise for bonds w emb option");

  8097.         return modifiedDurationFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  8098.     }

  8099.     @Override public double modifiedDurationFromGSpread (
  8100.         final org.drip.param.valuation.ValuationParams valParams,
  8101.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8102.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8103.         final int iWorkoutDate,
  8104.         final double dblWorkoutFactor,
  8105.         final double dblGSpread)
  8106.         throws java.lang.Exception
  8107.     {
  8108.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8109.             priceFromGSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  8110.     }

  8111.     @Override public double modifiedDurationFromGSpread (
  8112.         final org.drip.param.valuation.ValuationParams valParams,
  8113.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8114.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8115.         final double dblGSpread)
  8116.         throws java.lang.Exception
  8117.     {
  8118.         return modifiedDurationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  8119.     }

  8120.     @Override public double modifiedDurationFromGSpreadToOptimalExercise (
  8121.         final org.drip.param.valuation.ValuationParams valParams,
  8122.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8123.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8124.         final double dblGSpread)
  8125.         throws java.lang.Exception
  8126.     {
  8127.         if (null != _eosCall || null != _eosPut)
  8128.             throw new java.lang.Exception
  8129.                 ("BondComponent::modifiedDurationFromGSpreadToOptimalExercise => " +
  8130.                     "Cant calc Modified Duration from G Spread to optimal exercise for bonds w emb option");

  8131.         return modifiedDurationFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  8132.     }

  8133.     @Override public double modifiedDurationFromISpread (
  8134.         final org.drip.param.valuation.ValuationParams valParams,
  8135.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8136.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8137.         final int iWorkoutDate,
  8138.         final double dblWorkoutFactor,
  8139.         final double dblISpread)
  8140.         throws java.lang.Exception
  8141.     {
  8142.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8143.             priceFromISpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  8144.     }

  8145.     @Override public double modifiedDurationFromISpread (
  8146.         final org.drip.param.valuation.ValuationParams valParams,
  8147.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8148.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8149.         final double dblISpread)
  8150.         throws java.lang.Exception
  8151.     {
  8152.         return modifiedDurationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  8153.     }

  8154.     @Override public double modifiedDurationFromISpreadToOptimalExercise (
  8155.         final org.drip.param.valuation.ValuationParams valParams,
  8156.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8157.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8158.         final double dblISpread)
  8159.         throws java.lang.Exception
  8160.     {
  8161.         if (null != _eosCall || null != _eosPut)
  8162.             throw new java.lang.Exception
  8163.                 ("BondComponent::modifiedDurationFromISpreadToOptimalExercise => " +
  8164.                     "Cant calc Modified Duration from I Spread to optimal exercise for bonds w emb option");

  8165.         return modifiedDurationFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  8166.     }

  8167.     @Override public double modifiedDurationFromJSpread (
  8168.         final org.drip.param.valuation.ValuationParams valParams,
  8169.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8170.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8171.         final int iWorkoutDate,
  8172.         final double dblWorkoutFactor,
  8173.         final double dblJSpread)
  8174.         throws java.lang.Exception
  8175.     {
  8176.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8177.             priceFromJSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  8178.     }

  8179.     @Override public double modifiedDurationFromJSpread (
  8180.         final org.drip.param.valuation.ValuationParams valParams,
  8181.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8182.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8183.         final double dblJSpread)
  8184.         throws java.lang.Exception
  8185.     {
  8186.         return modifiedDurationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  8187.     }

  8188.     @Override public double modifiedDurationFromJSpreadToOptimalExercise (
  8189.         final org.drip.param.valuation.ValuationParams valParams,
  8190.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8191.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8192.         final double dblJSpread)
  8193.         throws java.lang.Exception
  8194.     {
  8195.         if (null != _eosCall || null != _eosPut)
  8196.             throw new java.lang.Exception
  8197.                 ("BondComponent::modifiedDurationFromJSpreadToOptimalExercise => " +
  8198.                     "Cant calc Modified Duration from J Spread to optimal exercise for bonds w emb option");

  8199.         return modifiedDurationFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  8200.     }

  8201.     @Override public double modifiedDurationFromNSpread (
  8202.         final org.drip.param.valuation.ValuationParams valParams,
  8203.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8204.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8205.         final int iWorkoutDate,
  8206.         final double dblWorkoutFactor,
  8207.         final double dblNSpread)
  8208.         throws java.lang.Exception
  8209.     {
  8210.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8211.             priceFromNSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  8212.     }

  8213.     @Override public double modifiedDurationFromNSpread (
  8214.         final org.drip.param.valuation.ValuationParams valParams,
  8215.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8216.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8217.         final double dblNSpread)
  8218.         throws java.lang.Exception
  8219.     {
  8220.         return modifiedDurationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  8221.     }

  8222.     @Override public double modifiedDurationFromNSpreadToOptimalExercise (
  8223.         final org.drip.param.valuation.ValuationParams valParams,
  8224.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8225.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8226.         final double dblNSpread)
  8227.         throws java.lang.Exception
  8228.     {
  8229.         if (null != _eosCall || null != _eosPut)
  8230.             throw new java.lang.Exception
  8231.                 ("BondComponent::modifiedDurationFromNSpreadToOptimalExercise => " +
  8232.                     "Cant calc Modified Duration from N Spread to optimal exercise for bonds w emb option");

  8233.         return modifiedDurationFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  8234.     }

  8235.     @Override public double modifiedDurationFromOAS (
  8236.         final org.drip.param.valuation.ValuationParams valParams,
  8237.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8238.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8239.         final int iWorkoutDate,
  8240.         final double dblWorkoutFactor,
  8241.         final double dblOAS)
  8242.         throws java.lang.Exception
  8243.     {
  8244.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8245.             priceFromOAS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  8246.     }

  8247.     @Override public double modifiedDurationFromOAS (
  8248.         final org.drip.param.valuation.ValuationParams valParams,
  8249.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8250.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8251.         final double dblOAS)
  8252.         throws java.lang.Exception
  8253.     {
  8254.         return modifiedDurationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  8255.     }

  8256.     @Override public double modifiedDurationFromOASToOptimalExercise (
  8257.         final org.drip.param.valuation.ValuationParams valParams,
  8258.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8259.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8260.         final double dblOAS)
  8261.         throws java.lang.Exception
  8262.     {
  8263.         if (null != _eosCall || null != _eosPut)
  8264.             throw new java.lang.Exception
  8265.                 ("BondComponent::modifiedDurationFromOASToOptimalExercise => " +
  8266.                     "Cant calc Modified Duration from OAS to optimal exercise for bonds w emb option");

  8267.         return modifiedDurationFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  8268.     }

  8269.     @Override public double modifiedDurationFromPECS (
  8270.         final org.drip.param.valuation.ValuationParams valParams,
  8271.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8272.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8273.         final int iWorkoutDate,
  8274.         final double dblWorkoutFactor,
  8275.         final double dblPECS)
  8276.         throws java.lang.Exception
  8277.     {
  8278.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8279.             yieldFromPECS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  8280.     }

  8281.     @Override public double modifiedDurationFromPECS (
  8282.         final org.drip.param.valuation.ValuationParams valParams,
  8283.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8284.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8285.         final double dblPECS)
  8286.         throws java.lang.Exception
  8287.     {
  8288.         return modifiedDurationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  8289.     }

  8290.     @Override public double modifiedDurationFromPECSToOptimalExercise (
  8291.         final org.drip.param.valuation.ValuationParams valParams,
  8292.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8293.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8294.         final double dblPECS)
  8295.         throws java.lang.Exception
  8296.     {
  8297.         if (null != _eosCall || null != _eosPut)
  8298.             throw new java.lang.Exception
  8299.                 ("BondComponent::modifiedDurationFromPECSToOptimalExercise => " +
  8300.                     "Cant calc Modified Duration from PECS to optimal exercise for bonds w emb option");

  8301.         return modifiedDurationFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  8302.     }

  8303.     @Override public double modifiedDurationFromPrice (
  8304.         final org.drip.param.valuation.ValuationParams valParams,
  8305.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8306.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8307.         final int iWorkoutDate,
  8308.         final double dblWorkoutFactor,
  8309.         final double dblPrice)
  8310.         throws java.lang.Exception
  8311.     {
  8312.         if (null == valParams || !org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  8313.             throw new java.lang.Exception ("BondComponent::modifiedDurationFromPrice => Input inputs");

  8314.         if (null == _floaterSetting)
  8315.             return (dblPrice - priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8316.                 yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice) + 0.0001)) /
  8317.                     (dblPrice + accrued (valParams.valueDate(), csqc));

  8318.         return (dblPrice - priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8319.             discountMarginFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice) +
  8320.                 0.0001)) / (dblPrice + accrued (valParams.valueDate(), csqc));
  8321.     }

  8322.     @Override public double modifiedDurationFromPrice (
  8323.         final org.drip.param.valuation.ValuationParams valParams,
  8324.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8325.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8326.         final double dblPrice)
  8327.         throws java.lang.Exception
  8328.     {
  8329.         return modifiedDurationFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  8330.     }

  8331.     @Override public double modifiedDurationFromPriceToOptimalExercise (
  8332.         final org.drip.param.valuation.ValuationParams valParams,
  8333.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8334.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8335.         final double dblPrice)
  8336.         throws java.lang.Exception
  8337.     {
  8338.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  8339.         if (null == wi)
  8340.             throw new java.lang.Exception
  8341.                 ("BondComponent::modifiedDurationFromPriceToOptimalExercise => Cant determine Work-out");

  8342.         return modifiedDurationFromYield (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  8343.     }

  8344.     @Override public double modifiedDurationFromTSYSpread (
  8345.         final org.drip.param.valuation.ValuationParams valParams,
  8346.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8347.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8348.         final int iWorkoutDate,
  8349.         final double dblWorkoutFactor,
  8350.         final double dblTSYSpread)
  8351.         throws java.lang.Exception
  8352.     {
  8353.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8354.             priceFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  8355.     }

  8356.     @Override public double modifiedDurationFromTSYSpread (
  8357.         final org.drip.param.valuation.ValuationParams valParams,
  8358.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8359.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8360.         final double dblTSYSpread)
  8361.         throws java.lang.Exception
  8362.     {
  8363.         return modifiedDurationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8364.             dblTSYSpread);
  8365.     }

  8366.     @Override public double modifiedDurationFromTSYSpreadToOptimalExercise (
  8367.         final org.drip.param.valuation.ValuationParams valParams,
  8368.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8369.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8370.         final double dblTSYSpread)
  8371.         throws java.lang.Exception
  8372.     {
  8373.         if (null != _eosCall || null != _eosPut)
  8374.             throw new java.lang.Exception
  8375.                 ("BondComponent::modifiedDurationFromTSYSpreadToOptimalExercise => " +
  8376.                     "Cant calc Modified Duration from TSY Sprd to optimal exercise for bonds w emb option");

  8377.         return modifiedDurationFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8378.             dblTSYSpread);
  8379.     }

  8380.     @Override public double modifiedDurationFromYield (
  8381.         final org.drip.param.valuation.ValuationParams valParams,
  8382.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8383.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8384.         final int iWorkoutDate,
  8385.         final double dblWorkoutFactor,
  8386.         final double dblYield)
  8387.         throws java.lang.Exception
  8388.     {
  8389.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8390.             priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  8391.     }

  8392.     @Override public double modifiedDurationFromYield (
  8393.         final org.drip.param.valuation.ValuationParams valParams,
  8394.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8395.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8396.         final double dblYield)
  8397.         throws java.lang.Exception
  8398.     {
  8399.         return modifiedDurationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  8400.     }

  8401.     @Override public double modifiedDurationFromYieldToOptimalExercise (
  8402.         final org.drip.param.valuation.ValuationParams valParams,
  8403.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8404.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8405.         final double dblYield)
  8406.         throws java.lang.Exception
  8407.     {
  8408.         if (null != _eosCall || null != _eosPut)
  8409.             throw new java.lang.Exception ("BondComponent::modifiedDurationFromYieldToOptimalExercise =>" +
  8410.                 " Cant calc Modified Duration from Yield to optimal exercise for bonds w emb option");

  8411.         return modifiedDurationFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  8412.     }

  8413.     @Override public double modifiedDurationFromYieldSpread (
  8414.         final org.drip.param.valuation.ValuationParams valParams,
  8415.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8416.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8417.         final int iWorkoutDate,
  8418.         final double dblWorkoutFactor,
  8419.         final double dblYieldSpread)
  8420.         throws java.lang.Exception
  8421.     {
  8422.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8423.             priceFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  8424.     }

  8425.     @Override public double modifiedDurationFromYieldSpread (
  8426.         final org.drip.param.valuation.ValuationParams valParams,
  8427.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8428.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8429.         final double dblYieldSpread)
  8430.         throws java.lang.Exception
  8431.     {
  8432.         return modifiedDurationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8433.             dblYieldSpread);
  8434.     }

  8435.     @Override public double modifiedDurationFromYieldSpreadToOptimalExercise (
  8436.         final org.drip.param.valuation.ValuationParams valParams,
  8437.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8438.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8439.         final double dblYieldSpread)
  8440.         throws java.lang.Exception
  8441.     {
  8442.         if (null != _eosCall || null != _eosPut)
  8443.             throw new java.lang.Exception
  8444.                 ("BondComponent::modifiedDurationFromYieldSpreadToOptimalExercise => " +
  8445.                     "Cant calc Modified Duration from Yld Sprd to optimal exercise for bonds w emb option");

  8446.         return modifiedDurationFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8447.             dblYieldSpread);
  8448.     }

  8449.     @Override public double modifiedDurationFromZSpread (
  8450.         final org.drip.param.valuation.ValuationParams valParams,
  8451.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8452.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8453.         final int iWorkoutDate,
  8454.         final double dblWorkoutFactor,
  8455.         final double dblZSpread)
  8456.         throws java.lang.Exception
  8457.     {
  8458.         return modifiedDurationFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8459.             priceFromZSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  8460.     }

  8461.     @Override public double modifiedDurationFromZSpread (
  8462.         final org.drip.param.valuation.ValuationParams valParams,
  8463.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8464.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8465.         final double dblZSpread)
  8466.         throws java.lang.Exception
  8467.     {
  8468.         return modifiedDurationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  8469.     }

  8470.     @Override public double modifiedDurationFromZSpreadToOptimalExercise (
  8471.         final org.drip.param.valuation.ValuationParams valParams,
  8472.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8473.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8474.         final double dblZSpread)
  8475.         throws java.lang.Exception
  8476.     {
  8477.         if (null != _eosCall || null != _eosPut)
  8478.             throw new java.lang.Exception
  8479.                 ("BondComponent::modifiedDurationFromZSpreadToOptimalExercise => " +
  8480.                     "Cant calc Modified Duration from Z Spread to optimal exercise for bonds w emb option");

  8481.         return modifiedDurationFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  8482.     }

  8483.     @Override public double nSpreadFromASW (
  8484.         final org.drip.param.valuation.ValuationParams valParams,
  8485.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8486.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8487.         final int iWorkoutDate,
  8488.         final double dblWorkoutFactor,
  8489.         final double dblASW)
  8490.         throws java.lang.Exception
  8491.     {
  8492.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  8493.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  8494.     }

  8495.     @Override public double nSpreadFromASW (
  8496.         final org.drip.param.valuation.ValuationParams valParams,
  8497.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8498.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8499.         final double dblASW)
  8500.         throws java.lang.Exception
  8501.     {
  8502.         return nSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  8503.     }

  8504.     @Override public double nSpreadFromASWToOptimalExercise (
  8505.         final org.drip.param.valuation.ValuationParams valParams,
  8506.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8507.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8508.         final double dblASW)
  8509.         throws java.lang.Exception
  8510.     {
  8511.         if (null != _eosCall || null != _eosPut)
  8512.             throw new java.lang.Exception ("BondComponent::nSpreadFromASWToOptimalExercise => " +
  8513.                 "Cant calc N Spread from ASW to optimal exercise for bonds w emb option");

  8514.         return nSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  8515.     }

  8516.     @Override public double nSpreadFromBondBasis (
  8517.         final org.drip.param.valuation.ValuationParams valParams,
  8518.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8519.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8520.         final int iWorkoutDate,
  8521.         final double dblWorkoutFactor,
  8522.         final double dblBondBasis)
  8523.         throws java.lang.Exception
  8524.     {
  8525.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  8526.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  8527.     }

  8528.     @Override public double nSpreadFromBondBasis (
  8529.         final org.drip.param.valuation.ValuationParams valParams,
  8530.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8531.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8532.         final double dblBondBasis)
  8533.         throws java.lang.Exception
  8534.     {
  8535.         return nSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  8536.     }

  8537.     @Override public double nSpreadFromBondBasisToOptimalExercise (
  8538.         final org.drip.param.valuation.ValuationParams valParams,
  8539.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8540.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8541.         final double dblBondBasis)
  8542.         throws java.lang.Exception
  8543.     {
  8544.         if (null != _eosCall || null != _eosPut)
  8545.             throw new java.lang.Exception ("BondComponent::nSpreadFromBondBasisToOptimalExercise => " +
  8546.                 "Cant calc N Spread from Bond Basis to optimal exercise for bonds w emb option");

  8547.         return nSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  8548.     }

  8549.     @Override public double nSpreadFromCreditBasis (
  8550.         final org.drip.param.valuation.ValuationParams valParams,
  8551.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8552.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8553.         final int iWorkoutDate,
  8554.         final double dblWorkoutFactor,
  8555.         final double dblCreditBasis)
  8556.         throws java.lang.Exception
  8557.     {
  8558.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromCreditBasis
  8559.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  8560.     }

  8561.     @Override public double nSpreadFromCreditBasis (
  8562.         final org.drip.param.valuation.ValuationParams valParams,
  8563.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8564.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8565.         final double dblCreditBasis)
  8566.         throws java.lang.Exception
  8567.     {
  8568.         return nSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  8569.     }

  8570.     @Override public double nSpreadFromCreditBasisToOptimalExercise (
  8571.         final org.drip.param.valuation.ValuationParams valParams,
  8572.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  8573.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8574.         final double dblCreditBasis)
  8575.         throws java.lang.Exception
  8576.     {
  8577.         if (null != _eosCall || null != _eosPut)
  8578.             throw new java.lang.Exception ("BondComponent::nSpreadFromCreditBasisToOptimalExercise => " +
  8579.                 "Cant calc N Spread from Credit Basis to optimal exercise for bonds w emb option");

  8580.         return nSpreadFromCreditBasis (valParams, csqs, vcp, maturityDate().julian(), 1., dblCreditBasis);
  8581.     }

  8582.     @Override public double nSpreadFromDiscountMargin (
  8583.         final org.drip.param.valuation.ValuationParams valParams,
  8584.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8585.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8586.         final int iWorkoutDate,
  8587.         final double dblWorkoutFactor,
  8588.         final double dblDiscountMargin)
  8589.         throws java.lang.Exception
  8590.     {
  8591.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8592.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  8593.                 dblDiscountMargin));
  8594.     }

  8595.     @Override public double nSpreadFromDiscountMargin (
  8596.         final org.drip.param.valuation.ValuationParams valParams,
  8597.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8598.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8599.         final double dblDiscountMargin)
  8600.         throws java.lang.Exception
  8601.     {
  8602.         return nSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8603.             dblDiscountMargin);
  8604.     }

  8605.     @Override public double nSpreadFromDiscountMarginToOptimalExercise (
  8606.         final org.drip.param.valuation.ValuationParams valParams,
  8607.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8608.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8609.         final double dblDiscountMargin)
  8610.         throws java.lang.Exception
  8611.     {
  8612.         if (null != _eosCall || null != _eosPut)
  8613.             throw new java.lang.Exception ("BondComponent::nSpreadFromDiscountMarginToOptimalExercise =>" +
  8614.                 " Cant calc N Spread from Discount Margin to optimal exercise for bonds w emb option");

  8615.         return nSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  8616.             dblDiscountMargin);
  8617.     }

  8618.     @Override public double nSpreadFromESpread (
  8619.         final org.drip.param.valuation.ValuationParams valParams,
  8620.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8621.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8622.         final int iWorkoutDate,
  8623.         final double dblWorkoutFactor,
  8624.         final double dblESpread)
  8625.         throws java.lang.Exception
  8626.     {
  8627.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  8628.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  8629.     }

  8630.     @Override public double nSpreadFromESpread (
  8631.         final org.drip.param.valuation.ValuationParams valParams,
  8632.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8633.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8634.         final double dblESpread)
  8635.         throws java.lang.Exception
  8636.     {
  8637.         return nSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  8638.     }

  8639.     @Override public double nSpreadFromESpreadToOptimalExercise (
  8640.         final org.drip.param.valuation.ValuationParams valParams,
  8641.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8642.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8643.         final double dblESpread)
  8644.         throws java.lang.Exception
  8645.     {
  8646.         if (null != _eosCall || null != _eosPut)
  8647.             throw new java.lang.Exception ("BondComponent::nSpreadFromESpreadToOptimalExercise => " +
  8648.                 "Cant calc N Spread from E Spread to optimal exercise for bonds w emb option");

  8649.         return nSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  8650.     }

  8651.     @Override public double nSpreadFromGSpread (
  8652.         final org.drip.param.valuation.ValuationParams valParams,
  8653.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8654.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8655.         final int iWorkoutDate,
  8656.         final double dblWorkoutFactor,
  8657.         final double dblGSpread)
  8658.         throws java.lang.Exception
  8659.     {
  8660.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  8661.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  8662.     }

  8663.     @Override public double nSpreadFromGSpread (
  8664.         final org.drip.param.valuation.ValuationParams valParams,
  8665.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8666.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8667.         final double dblGSpread)
  8668.         throws java.lang.Exception
  8669.     {
  8670.         return nSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  8671.     }

  8672.     @Override public double nSpreadFromGSpreadToOptimalExercise (
  8673.         final org.drip.param.valuation.ValuationParams valParams,
  8674.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8675.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8676.         final double dblGSpread)
  8677.         throws java.lang.Exception
  8678.     {
  8679.         if (null != _eosCall || null != _eosPut)
  8680.             throw new java.lang.Exception ("BondComponent::nSpreadFromGSpreadToOptimalExercise => " +
  8681.                 "Cant calc N Spread from G Spread to optimal exercise for bonds w emb option");

  8682.         return nSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  8683.     }

  8684.     @Override public double nSpreadFromISpread (
  8685.         final org.drip.param.valuation.ValuationParams valParams,
  8686.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8687.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8688.         final int iWorkoutDate,
  8689.         final double dblWorkoutFactor,
  8690.         final double dblISpread)
  8691.         throws java.lang.Exception
  8692.     {
  8693.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  8694.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  8695.     }

  8696.     @Override public double nSpreadFromISpread (
  8697.         final org.drip.param.valuation.ValuationParams valParams,
  8698.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8699.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8700.         final double dblISpread)
  8701.         throws java.lang.Exception
  8702.     {
  8703.         return nSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  8704.     }

  8705.     @Override public double nSpreadFromISpreadToOptimalExercise (
  8706.         final org.drip.param.valuation.ValuationParams valParams,
  8707.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8708.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8709.         final double dblISpread)
  8710.         throws java.lang.Exception
  8711.     {
  8712.         if (null != _eosCall || null != _eosPut)
  8713.             throw new java.lang.Exception ("BondComponent::nSpreadFromISpreadToOptimalExercise => " +
  8714.                 "Cant calc N Spread from I Spread to optimal exercise for bonds w emb option");

  8715.         return nSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  8716.     }

  8717.     @Override public double nSpreadFromJSpread (
  8718.         final org.drip.param.valuation.ValuationParams valParams,
  8719.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8720.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8721.         final int iWorkoutDate,
  8722.         final double dblWorkoutFactor,
  8723.         final double dblJSpread)
  8724.         throws java.lang.Exception
  8725.     {
  8726.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  8727.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  8728.     }

  8729.     @Override public double nSpreadFromJSpread (
  8730.         final org.drip.param.valuation.ValuationParams valParams,
  8731.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8732.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8733.         final double dblJSpread)
  8734.         throws java.lang.Exception
  8735.     {
  8736.         return nSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  8737.     }

  8738.     @Override public double nSpreadFromJSpreadToOptimalExercise (
  8739.         final org.drip.param.valuation.ValuationParams valParams,
  8740.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8741.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8742.         final double dblJSpread)
  8743.         throws java.lang.Exception
  8744.     {
  8745.         if (null != _eosCall || null != _eosPut)
  8746.             throw new java.lang.Exception ("BondComponent::nSpreadFromJSpreadToOptimalExercise => " +
  8747.                 "Cant calc N Spread from J Spread to optimal exercise for bonds w emb option");

  8748.         return nSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  8749.     }

  8750.     @Override public double nSpreadFromOAS (
  8751.         final org.drip.param.valuation.ValuationParams valParams,
  8752.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8753.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8754.         final int iWorkoutDate,
  8755.         final double dblWorkoutFactor,
  8756.         final double dblOAS)
  8757.         throws java.lang.Exception
  8758.     {
  8759.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  8760.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  8761.     }

  8762.     @Override public double nSpreadFromOAS (
  8763.         final org.drip.param.valuation.ValuationParams valParams,
  8764.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8765.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8766.         final double dblOAS)
  8767.         throws java.lang.Exception
  8768.     {
  8769.         return nSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  8770.     }

  8771.     @Override public double nSpreadFromOASToOptimalExercise (
  8772.         final org.drip.param.valuation.ValuationParams valParams,
  8773.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8774.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8775.         final double dblOAS)
  8776.         throws java.lang.Exception
  8777.     {
  8778.         if (null != _eosCall || null != _eosPut)
  8779.             throw new java.lang.Exception ("BondComponent::nSpreadFromOASToOptimalExercise => " +
  8780.                 "Cant calc N Spread from OAS to optimal exercise for bonds w emb option");

  8781.         return nSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  8782.     }

  8783.     @Override public double nSpreadFromPECS (
  8784.         final org.drip.param.valuation.ValuationParams valParams,
  8785.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8786.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8787.         final int iWorkoutDate,
  8788.         final double dblWorkoutFactor,
  8789.         final double dblPECS)
  8790.         throws java.lang.Exception
  8791.     {
  8792.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  8793.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  8794.     }

  8795.     @Override public double nSpreadFromPECS (
  8796.         final org.drip.param.valuation.ValuationParams valParams,
  8797.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8798.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8799.         final double dblPECS)
  8800.         throws java.lang.Exception
  8801.     {
  8802.         return nSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  8803.     }

  8804.     @Override public double nSpreadFromPECSToOptimalExercise (
  8805.         final org.drip.param.valuation.ValuationParams valParams,
  8806.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8807.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8808.         final double dblPECS)
  8809.         throws java.lang.Exception
  8810.     {
  8811.         if (null != _eosCall || null != _eosPut)
  8812.             throw new java.lang.Exception ("BondComponent::nSpreadFromPECSToOptimalExercise => " +
  8813.                 "Cant calc N Spread from PECS to optimal exercise for bonds w emb option");

  8814.         return nSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  8815.     }

  8816.     @Override public double nSpreadFromPrice (
  8817.         final org.drip.param.valuation.ValuationParams valParams,
  8818.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8819.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8820.         final int iWorkoutDate,
  8821.         final double dblWorkoutFactor,
  8822.         final double dblPrice)
  8823.         throws java.lang.Exception
  8824.     {
  8825.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  8826.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  8827.     }

  8828.     @Override public double nSpreadFromPrice (
  8829.         final org.drip.param.valuation.ValuationParams valParams,
  8830.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8831.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8832.         final double dblPrice)
  8833.         throws java.lang.Exception
  8834.     {
  8835.         return nSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  8836.     }

  8837.     @Override public double nSpreadFromPriceToOptimalExercise (
  8838.         final org.drip.param.valuation.ValuationParams valParams,
  8839.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8840.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8841.         final double dblPrice)
  8842.         throws java.lang.Exception
  8843.     {
  8844.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  8845.         if (null == wi)
  8846.             throw new java.lang.Exception
  8847.                 ("BondComponent::nSpreadFromPriceToOptimalExercise => Can't do Work-out");

  8848.         return nSpreadFromYield (valParams, csqc, vcp, wi.date(), wi.factor(), wi.yield());
  8849.     }

  8850.     @Override public double nSpreadFromTSYSpread (
  8851.         final org.drip.param.valuation.ValuationParams valParams,
  8852.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8853.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8854.         final int iWorkoutDate,
  8855.         final double dblWorkoutFactor,
  8856.         final double dblTSYSpread)
  8857.         throws java.lang.Exception
  8858.     {
  8859.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  8860.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  8861.     }

  8862.     @Override public double nSpreadFromTSYSpread (
  8863.         final org.drip.param.valuation.ValuationParams valParams,
  8864.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8865.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8866.         final double dblTSYSpread)
  8867.         throws java.lang.Exception
  8868.     {
  8869.         return nSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  8870.     }

  8871.     @Override public double nSpreadFromTSYSpreadToOptimalExercise (
  8872.         final org.drip.param.valuation.ValuationParams valParams,
  8873.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8874.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8875.         final double dblTSYSpread)
  8876.         throws java.lang.Exception
  8877.     {
  8878.         if (null != _eosCall || null != _eosPut)
  8879.             throw new java.lang.Exception ("BondComponent::nSpreadFromTSYSpreadToOptimalExercise => " +
  8880.                 "Cant calc N Spread from TSY Spread to optimal exercise for bonds w emb option");

  8881.         return nSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  8882.     }

  8883.     @Override public double nSpreadFromYield (
  8884.         final org.drip.param.valuation.ValuationParams valParams,
  8885.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8886.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8887.         final int iWorkoutDate,
  8888.         final double dblWorkoutFactor,
  8889.         final double dblYield)
  8890.         throws java.lang.Exception
  8891.     {
  8892.         if (null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  8893.             throw new java.lang.Exception ("BondComponent::nSpreadFromYield => Invalid inputs");

  8894.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  8895.         if (null == dcFunding)
  8896.             throw new java.lang.Exception ("BondComponent::nSpreadFromYield => Invalid inputs");

  8897.         return dblYield - dcFunding.proxyManifestMeasure ("SwapRate", iWorkoutDate);
  8898.     }

  8899.     @Override public double nSpreadFromYield (
  8900.         final org.drip.param.valuation.ValuationParams valParams,
  8901.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8902.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8903.         final double dblYield)
  8904.         throws java.lang.Exception
  8905.     {
  8906.         return nSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  8907.     }

  8908.     @Override public double nSpreadFromYieldToOptimalExercise (
  8909.         final org.drip.param.valuation.ValuationParams valParams,
  8910.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8911.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8912.         final double dblYield)
  8913.         throws java.lang.Exception
  8914.     {
  8915.         if (null != _eosCall || null != _eosPut)
  8916.             throw new java.lang.Exception ("BondComponent::nSpreadFromYieldToOptimalExercise => " +
  8917.                 "Cant calc N Spread from Yield to optimal exercise for bonds w emb option");

  8918.         return nSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  8919.     }

  8920.     @Override public double nSpreadFromYieldSpread (
  8921.         final org.drip.param.valuation.ValuationParams valParams,
  8922.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8923.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8924.         final int iWorkoutDate,
  8925.         final double dblWorkoutFactor,
  8926.         final double dblYieldSpread)
  8927.         throws java.lang.Exception
  8928.     {
  8929.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  8930.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  8931.     }

  8932.     @Override public double nSpreadFromYieldSpread (
  8933.         final org.drip.param.valuation.ValuationParams valParams,
  8934.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8935.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8936.         final double dblYieldSpread)
  8937.         throws java.lang.Exception
  8938.     {
  8939.         return nSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  8940.     }

  8941.     @Override public double nSpreadFromYieldSpreadToOptimalExercise (
  8942.         final org.drip.param.valuation.ValuationParams valParams,
  8943.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8944.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8945.         final double dblYieldSpread)
  8946.         throws java.lang.Exception
  8947.     {
  8948.         if (null != _eosCall || null != _eosPut)
  8949.             throw new java.lang.Exception ("BondComponent::nSpreadFromYieldSpreadToOptimalExercise => " +
  8950.                 "Cant calc N Spread from Yield Spread to optimal exercise for bonds w emb option");

  8951.         return nSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  8952.     }

  8953.     @Override public double nSpreadFromZSpread (
  8954.         final org.drip.param.valuation.ValuationParams valParams,
  8955.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8956.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8957.         final int iWorkoutDate,
  8958.         final double dblWorkoutFactor,
  8959.         final double dblZSpread)
  8960.         throws java.lang.Exception
  8961.     {
  8962.         return nSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  8963.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  8964.     }

  8965.     @Override public double nSpreadFromZSpread (
  8966.         final org.drip.param.valuation.ValuationParams valParams,
  8967.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8968.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8969.         final double dblZSpread)
  8970.         throws java.lang.Exception
  8971.     {
  8972.         return nSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  8973.     }

  8974.     @Override public double nSpreadFromZSpreadToOptimalExercise (
  8975.         final org.drip.param.valuation.ValuationParams valParams,
  8976.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8977.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8978.         final double dblZSpread)
  8979.         throws java.lang.Exception
  8980.     {
  8981.         if (null != _eosCall || null != _eosPut)
  8982.             throw new java.lang.Exception ("BondComponent::nSpreadFromZSpreadToOptimalExercise => " +
  8983.                 "Cant calc N Spread from Z Spread to optimal exercise for bonds w emb option");

  8984.         return nSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  8985.     }

  8986.     @Override public double oasFromASW (
  8987.         final org.drip.param.valuation.ValuationParams valParams,
  8988.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  8989.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  8990.         final int iWorkoutDate,
  8991.         final double dblWorkoutFactor,
  8992.         final double dblASW)
  8993.         throws java.lang.Exception
  8994.     {
  8995.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW (valParams,
  8996.             csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  8997.     }

  8998.     @Override public double oasFromASW (
  8999.         final org.drip.param.valuation.ValuationParams valParams,
  9000.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9001.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9002.         final double dblASW)
  9003.         throws java.lang.Exception
  9004.     {
  9005.         return oasFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  9006.     }

  9007.     @Override public double oasFromASWToOptimalExercise (
  9008.         final org.drip.param.valuation.ValuationParams valParams,
  9009.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9010.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9011.         final double dblASW)
  9012.         throws java.lang.Exception
  9013.     {
  9014.         if (null != _eosCall || null != _eosPut)
  9015.             throw new java.lang.Exception ("BondComponent::oasFromASWToOptimalExercise => " +
  9016.                 "Cant calc OAS from ASW to optimal exercise for bonds w emb option");

  9017.         return oasFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  9018.     }

  9019.     @Override public double oasFromBondBasis (
  9020.         final org.drip.param.valuation.ValuationParams valParams,
  9021.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9022.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9023.         final int iWorkoutDate,
  9024.         final double dblWorkoutFactor,
  9025.         final double dblBondBasis)
  9026.         throws java.lang.Exception
  9027.     {
  9028.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  9029.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  9030.     }

  9031.     @Override public double oasFromBondBasis (
  9032.         final org.drip.param.valuation.ValuationParams valParams,
  9033.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9034.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9035.         final double dblBondBasis)
  9036.         throws java.lang.Exception
  9037.     {
  9038.         return oasFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  9039.     }

  9040.     @Override public double oasFromBondBasisToOptimalExercise (
  9041.         final org.drip.param.valuation.ValuationParams valParams,
  9042.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9043.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9044.         final double dblBondBasis)
  9045.         throws java.lang.Exception
  9046.     {
  9047.         if (null != _eosCall || null != _eosPut)
  9048.             throw new java.lang.Exception ("BondComponent::oasFromBondBasisToOptimalExercise => " +
  9049.                 "Cant calc OAS from Bnd Basis to optimal exercise for bonds w emb option");

  9050.         return oasFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  9051.     }

  9052.     @Override public double oasFromCreditBasis (
  9053.         final org.drip.param.valuation.ValuationParams valParams,
  9054.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9055.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9056.         final int iWorkoutDate,
  9057.         final double dblWorkoutFactor,
  9058.         final double dblCreditBasis)
  9059.         throws java.lang.Exception
  9060.     {
  9061.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  9062.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  9063.     }

  9064.     @Override public double oasFromCreditBasis (
  9065.         final org.drip.param.valuation.ValuationParams valParams,
  9066.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9067.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9068.         final double dblCreditBasis)
  9069.         throws java.lang.Exception
  9070.     {
  9071.         return oasFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  9072.     }

  9073.     @Override public double oasFromCreditBasisToOptimalExercise (
  9074.         final org.drip.param.valuation.ValuationParams valParams,
  9075.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9076.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9077.         final double dblCreditBasis)
  9078.         throws java.lang.Exception
  9079.     {
  9080.         if (null != _eosCall || null != _eosPut)
  9081.             throw new java.lang.Exception ("BondComponent::oasFromCreditBasisToOptimalExercise => " +
  9082.                 "Cant calc OAS from Credit Basis to optimal exercise for bonds w emb option");

  9083.         return oasFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  9084.     }

  9085.     @Override public double oasFromDiscountMargin (
  9086.         final org.drip.param.valuation.ValuationParams valParams,
  9087.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9088.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9089.         final int iWorkoutDate,
  9090.         final double dblWorkoutFactor,
  9091.         final double dblDiscountMargin)
  9092.         throws java.lang.Exception
  9093.     {
  9094.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromDiscountMargin
  9095.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblDiscountMargin));
  9096.     }

  9097.     @Override public double oasFromDiscountMargin (
  9098.         final org.drip.param.valuation.ValuationParams valParams,
  9099.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9100.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9101.         final double dblDiscountMargin)
  9102.         throws java.lang.Exception
  9103.     {
  9104.         return oasFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  9105.     }

  9106.     @Override public double oasFromDiscountMarginToOptimalExercise (
  9107.         final org.drip.param.valuation.ValuationParams valParams,
  9108.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9109.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9110.         final double dblDiscountMargin)
  9111.         throws java.lang.Exception
  9112.     {
  9113.         if (null != _eosCall || null != _eosPut)
  9114.             throw new java.lang.Exception ("BondComponent::oasFromDiscountMarginToOptimalExercise => " +
  9115.                 "Cant calc OAS from Discount Margin to optimal exercise for bonds w emb option");

  9116.         return oasFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  9117.     }

  9118.     @Override public double oasFromESpread (
  9119.         final org.drip.param.valuation.ValuationParams valParams,
  9120.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9121.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9122.         final int iWorkoutDate,
  9123.         final double dblWorkoutFactor,
  9124.         final double dblESpread)
  9125.         throws java.lang.Exception
  9126.     {
  9127.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  9128.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  9129.     }

  9130.     @Override public double oasFromESpread (
  9131.         final org.drip.param.valuation.ValuationParams valParams,
  9132.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9133.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9134.         final double dblESpread)
  9135.         throws java.lang.Exception
  9136.     {
  9137.         return oasFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  9138.     }

  9139.     @Override public double oasFromESpreadToOptimalExercise (
  9140.         final org.drip.param.valuation.ValuationParams valParams,
  9141.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9142.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9143.         final double dblESpread)
  9144.         throws java.lang.Exception
  9145.     {
  9146.         if (null != _eosCall || null != _eosPut)
  9147.             throw new java.lang.Exception ("BondComponent::oasFromESpreadToOptimalExercise => " +
  9148.                 "Cant calc OAS from E Spread to optimal exercise for bonds w emb option");

  9149.         return oasFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  9150.     }

  9151.     @Override public double oasFromGSpread (
  9152.         final org.drip.param.valuation.ValuationParams valParams,
  9153.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9154.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9155.         final int iWorkoutDate,
  9156.         final double dblWorkoutFactor,
  9157.         final double dblGSpread)
  9158.         throws java.lang.Exception
  9159.     {
  9160.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  9161.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  9162.     }

  9163.     @Override public double oasFromGSpread (
  9164.         final org.drip.param.valuation.ValuationParams valParams,
  9165.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9166.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9167.         final double dblGSpread)
  9168.         throws java.lang.Exception
  9169.     {
  9170.         return oasFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  9171.     }

  9172.     @Override public double oasFromGSpreadToOptimalExercise (
  9173.         final org.drip.param.valuation.ValuationParams valParams,
  9174.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9175.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9176.         final double dblGSpread)
  9177.         throws java.lang.Exception
  9178.     {
  9179.         if (null != _eosCall || null != _eosPut)
  9180.             throw new java.lang.Exception ("BondComponent::oasFromGSpreadToOptimalExercise => " +
  9181.                 "Cant calc OAS from G Spread to optimal exercise for bonds w emb option");

  9182.         return oasFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  9183.     }

  9184.     @Override public double oasFromISpread (
  9185.         final org.drip.param.valuation.ValuationParams valParams,
  9186.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9187.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9188.         final int iWorkoutDate,
  9189.         final double dblWorkoutFactor,
  9190.         final double dblISpread)
  9191.         throws java.lang.Exception
  9192.     {
  9193.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  9194.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  9195.     }

  9196.     @Override public double oasFromISpread (
  9197.         final org.drip.param.valuation.ValuationParams valParams,
  9198.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9199.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9200.         final double dblISpread)
  9201.         throws java.lang.Exception
  9202.     {
  9203.         return oasFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  9204.     }

  9205.     @Override public double oasFromISpreadToOptimalExercise (
  9206.         final org.drip.param.valuation.ValuationParams valParams,
  9207.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9208.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9209.         final double dblISpread)
  9210.         throws java.lang.Exception
  9211.     {
  9212.         if (null != _eosCall || null != _eosPut)
  9213.             throw new java.lang.Exception ("BondComponent::oasFromISpreadToOptimalExercise => " +
  9214.                 "Cant calc OAS from I Spread to optimal exercise for bonds w emb option");

  9215.         return oasFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  9216.     }

  9217.     @Override public double oasFromJSpread (
  9218.         final org.drip.param.valuation.ValuationParams valParams,
  9219.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9220.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9221.         final int iWorkoutDate,
  9222.         final double dblWorkoutFactor,
  9223.         final double dblJSpread)
  9224.         throws java.lang.Exception
  9225.     {
  9226.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  9227.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  9228.     }

  9229.     @Override public double oasFromJSpread (
  9230.         final org.drip.param.valuation.ValuationParams valParams,
  9231.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9232.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9233.         final double dblJSpread)
  9234.         throws java.lang.Exception
  9235.     {
  9236.         return oasFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  9237.     }

  9238.     @Override public double oasFromJSpreadToOptimalExercise (
  9239.         final org.drip.param.valuation.ValuationParams valParams,
  9240.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9241.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9242.         final double dblJSpread)
  9243.         throws java.lang.Exception
  9244.     {
  9245.         if (null != _eosCall || null != _eosPut)
  9246.             throw new java.lang.Exception ("BondComponent::oasFromJSpreadToOptimalExercise => " +
  9247.                 "Cant calc OAS from J Spread to optimal exercise for bonds w emb option");

  9248.         return oasFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  9249.     }

  9250.     @Override public double oasFromNSpread (
  9251.         final org.drip.param.valuation.ValuationParams valParams,
  9252.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9253.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9254.         final int iWorkoutDate,
  9255.         final double dblWorkoutFactor,
  9256.         final double dblNSpread)
  9257.         throws java.lang.Exception
  9258.     {
  9259.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  9260.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  9261.     }

  9262.     @Override public double oasFromNSpread (
  9263.         final org.drip.param.valuation.ValuationParams valParams,
  9264.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9265.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9266.         final double dblNSpread)
  9267.         throws java.lang.Exception
  9268.     {
  9269.         return oasFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  9270.     }

  9271.     @Override public double oasFromNSpreadToOptimalExercise (
  9272.         final org.drip.param.valuation.ValuationParams valParams,
  9273.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9274.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9275.         final double dblNSpread)
  9276.         throws java.lang.Exception
  9277.     {
  9278.         if (null != _eosCall || null != _eosPut)
  9279.             throw new java.lang.Exception ("BondComponent::oasFromNSpreadToOptimalExercise => " +
  9280.                 "Cant calc OAS from N Spread to optimal exercise for bonds w emb option");

  9281.         return oasFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  9282.     }

  9283.     @Override public double oasFromPECS (
  9284.         final org.drip.param.valuation.ValuationParams valParams,
  9285.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9286.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9287.         final int iWorkoutDate,
  9288.         final double dblWorkoutFactor,
  9289.         final double dblPECS)
  9290.         throws java.lang.Exception
  9291.     {
  9292.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  9293.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  9294.     }

  9295.     @Override public double oasFromPECS (
  9296.         final org.drip.param.valuation.ValuationParams valParams,
  9297.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9298.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9299.         final double dblPECS)
  9300.         throws java.lang.Exception
  9301.     {
  9302.         return oasFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  9303.     }

  9304.     @Override public double oasFromPECSToOptimalExercise (
  9305.         final org.drip.param.valuation.ValuationParams valParams,
  9306.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9307.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9308.         final double dblPECS)
  9309.         throws java.lang.Exception
  9310.     {
  9311.         if (null != _eosCall || null != _eosPut)
  9312.             throw new java.lang.Exception ("BondComponent::oasFromPECSToOptimalExercise => " +
  9313.                 "Cant calc OAS from PECS to optimal exercise for bonds w emb option");

  9314.         return oasFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  9315.     }

  9316.     @Override public double oasFromPrice (
  9317.         final org.drip.param.valuation.ValuationParams valParams,
  9318.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9319.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9320.         final int iWorkoutDate,
  9321.         final double dblWorkoutFactor,
  9322.         final double dblPrice)
  9323.         throws java.lang.Exception
  9324.     {
  9325.         return new BondCalibrator (this, false).calibrateOASFromPrice (valParams, csqc, vcp,
  9326.             ZERO_OFF_OF_TREASURIES_DISCOUNT_CURVE, iWorkoutDate, dblWorkoutFactor, dblPrice);
  9327.     }

  9328.     @Override public double oasFromPrice (
  9329.         final org.drip.param.valuation.ValuationParams valParams,
  9330.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9331.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9332.         final double dblPrice)
  9333.         throws java.lang.Exception
  9334.     {
  9335.         return oasFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  9336.     }

  9337.     @Override public double oasFromPriceToOptimalExercise (
  9338.         final org.drip.param.valuation.ValuationParams valParams,
  9339.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9340.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9341.         final double dblPrice)
  9342.         throws java.lang.Exception
  9343.     {
  9344.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  9345.         if (null == wi)
  9346.             throw new java.lang.Exception
  9347.                 ("BondComponent::oasFromPriceToOptimalExercise - cant calc Work-out");

  9348.         return oasFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  9349.     }

  9350.     @Override public double oasFromTSYSpread (
  9351.         final org.drip.param.valuation.ValuationParams valParams,
  9352.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9353.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9354.         final int iWorkoutDate,
  9355.         final double dblWorkoutFactor,
  9356.         final double dblTSYSpread)
  9357.         throws java.lang.Exception
  9358.     {
  9359.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  9360.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  9361.     }

  9362.     @Override public double oasFromTSYSpread (
  9363.         final org.drip.param.valuation.ValuationParams valParams,
  9364.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9365.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9366.         final double dblTSYSpread)
  9367.         throws java.lang.Exception
  9368.     {
  9369.         return oasFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  9370.     }

  9371.     @Override public double oasFromTSYSpreadToOptimalExercise (
  9372.         final org.drip.param.valuation.ValuationParams valParams,
  9373.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9374.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9375.         final double dblTSYSpread)
  9376.         throws java.lang.Exception
  9377.     {
  9378.         if (null != _eosCall || null != _eosPut)
  9379.             throw new java.lang.Exception ("BondComponent::oasFromTSYSpreadToOptimalExercise => " +
  9380.                 "Cant calc OAS from TSY Sprd to optimal exercise for bonds w emb option");

  9381.         return oasFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  9382.     }

  9383.     @Override public double oasFromYield (
  9384.         final org.drip.param.valuation.ValuationParams valParams,
  9385.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9386.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9387.         final int iWorkoutDate,
  9388.         final double dblWorkoutFactor,
  9389.         final double dblYield)
  9390.         throws java.lang.Exception
  9391.     {
  9392.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  9393.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  9394.     }

  9395.     @Override public double oasFromYield (
  9396.         final org.drip.param.valuation.ValuationParams valParams,
  9397.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9398.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9399.         final double dblYield)
  9400.         throws java.lang.Exception
  9401.     {
  9402.         return oasFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  9403.     }

  9404.     @Override public double oasFromYieldToOptimalExercise (
  9405.         final org.drip.param.valuation.ValuationParams valParams,
  9406.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9407.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9408.         final double dblYield)
  9409.         throws java.lang.Exception
  9410.     {
  9411.         if (null != _eosCall || null != _eosPut)
  9412.             throw new java.lang.Exception ("BondComponent::oasFromYieldToOptimalExercise => " +
  9413.                 "Cant calc OAS from Yield to optimal exercise for bonds w emb option");

  9414.         return oasFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  9415.     }

  9416.     @Override public double oasFromYieldSpread (
  9417.         final org.drip.param.valuation.ValuationParams valParams,
  9418.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9419.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9420.         final int iWorkoutDate,
  9421.         final double dblWorkoutFactor,
  9422.         final double dblYieldSpread)
  9423.         throws java.lang.Exception
  9424.     {
  9425.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  9426.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  9427.     }

  9428.     @Override public double oasFromYieldSpread (
  9429.         final org.drip.param.valuation.ValuationParams valParams,
  9430.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9431.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9432.         final double dblYieldSpread)
  9433.         throws java.lang.Exception
  9434.     {
  9435.         return oasFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  9436.     }

  9437.     @Override public double oasFromYieldSpreadToOptimalExercise (
  9438.         final org.drip.param.valuation.ValuationParams valParams,
  9439.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9440.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9441.         final double dblYieldSpread)
  9442.         throws java.lang.Exception
  9443.     {
  9444.         if (null != _eosCall || null != _eosPut)
  9445.             throw new java.lang.Exception ("BondComponent::oasFromYieldSpreadToOptimalExercise => " +
  9446.                 "Cant calc OAS from Yield Sprd to optimal exercise for bonds w emb option");

  9447.         return oasFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  9448.     }

  9449.     @Override public double oasFromZSpread (
  9450.         final org.drip.param.valuation.ValuationParams valParams,
  9451.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9452.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9453.         final int iWorkoutDate,
  9454.         final double dblWorkoutFactor,
  9455.         final double dblZSpread)
  9456.         throws java.lang.Exception
  9457.     {
  9458.         return oasFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  9459.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  9460.     }

  9461.     @Override public double oasFromZSpread (
  9462.         final org.drip.param.valuation.ValuationParams valParams,
  9463.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9464.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9465.         final double dblZSpread)
  9466.         throws java.lang.Exception
  9467.     {
  9468.         return oasFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  9469.     }

  9470.     @Override public double oasFromZSpreadToOptimalExercise (
  9471.         final org.drip.param.valuation.ValuationParams valParams,
  9472.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9473.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9474.         final double dblZSpread)
  9475.         throws java.lang.Exception
  9476.     {
  9477.         if (null != _eosCall || null != _eosPut)
  9478.             throw new java.lang.Exception ("BondComponent::oasFromZSpreadToOptimalExercise => " +
  9479.                 "Cant calc OAS from Z Spread to optimal exercise for bonds w emb option");

  9480.         return oasFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  9481.     }

  9482.     @Override public double pecsFromASW (
  9483.         final org.drip.param.valuation.ValuationParams valParams,
  9484.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9485.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9486.         final int iWorkoutDate,
  9487.         final double dblWorkoutFactor,
  9488.         final double dblASW)
  9489.         throws java.lang.Exception
  9490.     {
  9491.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  9492.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  9493.     }

  9494.     @Override public double pecsFromASW (
  9495.         final org.drip.param.valuation.ValuationParams valParams,
  9496.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9497.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9498.         final double dblASW)
  9499.         throws java.lang.Exception
  9500.     {
  9501.         return pecsFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  9502.     }

  9503.     @Override public double pecsFromASWToOptimalExercise (
  9504.         final org.drip.param.valuation.ValuationParams valParams,
  9505.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9506.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9507.         final double dblASW)
  9508.         throws java.lang.Exception
  9509.     {
  9510.         if (null != _eosCall || null != _eosPut)
  9511.             throw new java.lang.Exception ("BondComponent::pecsFromASWToOptimalExercise => " +
  9512.                 "Cant calc PECS from ASW to optimal exercise for bonds w emb option");

  9513.         return pecsFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  9514.     }

  9515.     @Override public double pecsFromBondBasis (
  9516.         final org.drip.param.valuation.ValuationParams valParams,
  9517.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9518.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9519.         final int iWorkoutDate,
  9520.         final double dblWorkoutFactor,
  9521.         final double dblBondBasis)
  9522.         throws java.lang.Exception
  9523.     {
  9524.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  9525.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  9526.     }

  9527.     @Override public double pecsFromBondBasis (
  9528.         final org.drip.param.valuation.ValuationParams valParams,
  9529.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9530.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9531.         final double dblBondBasis)
  9532.         throws java.lang.Exception
  9533.     {
  9534.         return pecsFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  9535.     }

  9536.     @Override public double pecsFromBondBasisToOptimalExercise (
  9537.         final org.drip.param.valuation.ValuationParams valParams,
  9538.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9539.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9540.         final double dblBondBasis)
  9541.         throws java.lang.Exception
  9542.     {
  9543.         if (null != _eosCall || null != _eosPut)
  9544.             throw new java.lang.Exception ("BondComponent::pecsFromBondBasisToOptimalExercise => " +
  9545.                 "Cant calc PECS from Bond Basis to optimal exercise for bonds w emb option");

  9546.         return pecsFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  9547.     }

  9548.     @Override public double pecsFromCreditBasis (
  9549.         final org.drip.param.valuation.ValuationParams valParams,
  9550.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9551.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9552.         final int iWorkoutDate,
  9553.         final double dblWorkoutFactor,
  9554.         final double dblCreditBasis)
  9555.         throws java.lang.Exception
  9556.     {
  9557.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  9558.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  9559.     }

  9560.     @Override public double pecsFromCreditBasis (
  9561.         final org.drip.param.valuation.ValuationParams valParams,
  9562.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9563.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9564.         final double dblCreditBasis)
  9565.         throws java.lang.Exception
  9566.     {
  9567.         return pecsFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  9568.     }

  9569.     @Override public double pecsFromCreditBasisToOptimalExercise (
  9570.         final org.drip.param.valuation.ValuationParams valParams,
  9571.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9572.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9573.         final double dblCreditBasis)
  9574.         throws java.lang.Exception
  9575.     {
  9576.         if (null != _eosCall || null != _eosPut)
  9577.             throw new java.lang.Exception ("BondComponent::pecsFromCreditBasisToOptimalExercise => " +
  9578.                 "Cant calc PECS from Credit Basis to optimal exercise for bonds w emb option");

  9579.         return pecsFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  9580.     }

  9581.     @Override public double pecsFromDiscountMargin (
  9582.         final org.drip.param.valuation.ValuationParams valParams,
  9583.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9584.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9585.         final int iWorkoutDate,
  9586.         final double dblWorkoutFactor,
  9587.         final double dblDiscountMargin)
  9588.         throws java.lang.Exception
  9589.     {
  9590.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromDiscountMargin
  9591.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblDiscountMargin));
  9592.     }

  9593.     @Override public double pecsFromDiscountMargin (
  9594.         final org.drip.param.valuation.ValuationParams valParams,
  9595.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9596.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9597.         final double dblDiscountMargin)
  9598.         throws java.lang.Exception
  9599.     {
  9600.         return pecsFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  9601.     }

  9602.     @Override public double pecsFromDiscountMarginToOptimalExercise (
  9603.         final org.drip.param.valuation.ValuationParams valParams,
  9604.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9605.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9606.         final double dblDiscountMargin)
  9607.         throws java.lang.Exception
  9608.     {
  9609.         if (null != _eosCall || null != _eosPut)
  9610.             throw new java.lang.Exception ("BondComponent::pecsFromDiscountMarginToOptimalExercise => " +
  9611.                 "Cant calc PECS from Discount Margin to optimal exercise for bonds w emb option");

  9612.         return pecsFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1., dblDiscountMargin);
  9613.     }

  9614.     @Override public double pecsFromESpread (
  9615.         final org.drip.param.valuation.ValuationParams valParams,
  9616.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9617.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9618.         final int iWorkoutDate,
  9619.         final double dblWorkoutFactor,
  9620.         final double dblESpread)
  9621.         throws java.lang.Exception
  9622.     {
  9623.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromESpread
  9624.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  9625.     }

  9626.     @Override public double pecsFromESpread (
  9627.         final org.drip.param.valuation.ValuationParams valParams,
  9628.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9629.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9630.         final double dblESpread)
  9631.         throws java.lang.Exception
  9632.     {
  9633.         return pecsFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  9634.     }

  9635.     @Override public double pecsFromESpreadToOptimalExercise (
  9636.         final org.drip.param.valuation.ValuationParams valParams,
  9637.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9638.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9639.         final double dblESpread)
  9640.         throws java.lang.Exception
  9641.     {
  9642.         if (null != _eosCall || null != _eosPut)
  9643.             throw new java.lang.Exception ("BondComponent::pecsFromESpreadToOptimalExercise => " +
  9644.                 "Cant calc PECS from E Spread to optimal exercise for bonds w emb option");

  9645.         return pecsFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  9646.     }

  9647.     @Override public double pecsFromGSpread (
  9648.         final org.drip.param.valuation.ValuationParams valParams,
  9649.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9650.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9651.         final int iWorkoutDate,
  9652.         final double dblWorkoutFactor,
  9653.         final double dblGSpread)
  9654.         throws java.lang.Exception
  9655.     {
  9656.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  9657.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  9658.     }

  9659.     @Override public double pecsFromGSpread (
  9660.         final org.drip.param.valuation.ValuationParams valParams,
  9661.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9662.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9663.         final double dblGSpread)
  9664.         throws java.lang.Exception
  9665.     {
  9666.         return pecsFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  9667.     }

  9668.     @Override public double pecsFromGSpreadToOptimalExercise (
  9669.         final org.drip.param.valuation.ValuationParams valParams,
  9670.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9671.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9672.         final double dblGSpread)
  9673.         throws java.lang.Exception
  9674.     {
  9675.         if (null != _eosCall || null != _eosPut)
  9676.             throw new java.lang.Exception ("BondComponent::pecsFromGSpreadToOptimalExercise => " +
  9677.                 "Cant calc PECS from G Spread to optimal exercise for bonds w emb option");

  9678.         return pecsFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  9679.     }

  9680.     @Override public double pecsFromISpread (
  9681.         final org.drip.param.valuation.ValuationParams valParams,
  9682.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9683.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9684.         final int iWorkoutDate,
  9685.         final double dblWorkoutFactor,
  9686.         final double dblISpread)
  9687.         throws java.lang.Exception
  9688.     {
  9689.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  9690.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  9691.     }

  9692.     @Override public double pecsFromISpread (
  9693.         final org.drip.param.valuation.ValuationParams valParams,
  9694.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9695.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9696.         final double dblISpread)
  9697.         throws java.lang.Exception
  9698.     {
  9699.         return pecsFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  9700.     }

  9701.     @Override public double pecsFromISpreadToOptimalExercise (
  9702.         final org.drip.param.valuation.ValuationParams valParams,
  9703.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9704.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9705.         final double dblISpread)
  9706.         throws java.lang.Exception
  9707.     {
  9708.         if (null != _eosCall || null != _eosPut)
  9709.             throw new java.lang.Exception ("BondComponent::pecsFromISpreadToOptimalExercise => " +
  9710.                 "Cant calc PECS from I Spread to optimal exercise for bonds w emb option");

  9711.         return pecsFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  9712.     }

  9713.     @Override public double pecsFromJSpread (
  9714.         final org.drip.param.valuation.ValuationParams valParams,
  9715.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9716.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9717.         final int iWorkoutDate,
  9718.         final double dblWorkoutFactor,
  9719.         final double dblJSpread)
  9720.         throws java.lang.Exception
  9721.     {
  9722.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  9723.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  9724.     }

  9725.     @Override public double pecsFromJSpread (
  9726.         final org.drip.param.valuation.ValuationParams valParams,
  9727.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9728.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9729.         final double dblJSpread)
  9730.         throws java.lang.Exception
  9731.     {
  9732.         return pecsFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  9733.     }

  9734.     @Override public double pecsFromJSpreadToOptimalExercise (
  9735.         final org.drip.param.valuation.ValuationParams valParams,
  9736.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9737.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9738.         final double dblJSpread)
  9739.         throws java.lang.Exception
  9740.     {
  9741.         if (null != _eosCall || null != _eosPut)
  9742.             throw new java.lang.Exception ("BondComponent::pecsFromJSpreadToOptimalExercise => " +
  9743.                 "Cant calc PECS from J Spread to optimal exercise for bonds w emb option");

  9744.         return pecsFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  9745.     }

  9746.     @Override public double pecsFromNSpread (
  9747.         final org.drip.param.valuation.ValuationParams valParams,
  9748.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9749.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9750.         final int iWorkoutDate,
  9751.         final double dblWorkoutFactor,
  9752.         final double dblNSpread)
  9753.         throws java.lang.Exception
  9754.     {
  9755.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  9756.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  9757.     }

  9758.     @Override public double pecsFromNSpread (
  9759.         final org.drip.param.valuation.ValuationParams valParams,
  9760.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9761.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9762.         final double dblNSpread)
  9763.         throws java.lang.Exception
  9764.     {
  9765.         return pecsFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  9766.     }

  9767.     @Override public double pecsFromNSpreadToOptimalExercise (
  9768.         final org.drip.param.valuation.ValuationParams valParams,
  9769.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9770.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9771.         final double dblNSpread)
  9772.         throws java.lang.Exception
  9773.     {
  9774.         if (null != _eosCall || null != _eosPut)
  9775.             throw new java.lang.Exception ("BondComponent::pecsFromNSpreadToOptimalExercise => " +
  9776.                 "Cant calc PECS from N Spread to optimal exercise for bonds w emb option");

  9777.         return pecsFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  9778.     }

  9779.     @Override public double pecsFromOAS (
  9780.         final org.drip.param.valuation.ValuationParams valParams,
  9781.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9782.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9783.         final int iWorkoutDate,
  9784.         final double dblWorkoutFactor,
  9785.         final double dblOAS)
  9786.         throws java.lang.Exception
  9787.     {
  9788.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  9789.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  9790.     }

  9791.     @Override public double pecsFromOAS (
  9792.         final org.drip.param.valuation.ValuationParams valParams,
  9793.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9794.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9795.         final double dblOAS)
  9796.         throws java.lang.Exception
  9797.     {
  9798.         return pecsFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  9799.     }

  9800.     @Override public double pecsFromOASToOptimalExercise (
  9801.         final org.drip.param.valuation.ValuationParams valParams,
  9802.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9803.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9804.         final double dblOAS)
  9805.         throws java.lang.Exception
  9806.     {
  9807.         if (null != _eosCall || null != _eosPut)
  9808.             throw new java.lang.Exception ("BondComponent::pecsFromOASToOptimalExercise => " +
  9809.                 "Cant calc PECS from OAS to optimal exercise for bonds w emb option");

  9810.         return pecsFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  9811.     }

  9812.     @Override public double pecsFromPrice (
  9813.         final org.drip.param.valuation.ValuationParams valParams,
  9814.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9815.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9816.         final int iWorkoutDate,
  9817.         final double dblWorkoutFactor,
  9818.         final double dblPrice)
  9819.         throws java.lang.Exception
  9820.     {
  9821.         return new BondCalibrator (this, false).calibrateCreditBasisFromPrice (valParams, csqc, iWorkoutDate,
  9822.             dblWorkoutFactor, dblPrice, true);
  9823.     }

  9824.     @Override public double pecsFromPrice (
  9825.         final org.drip.param.valuation.ValuationParams valParams,
  9826.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9827.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9828.         final double dblPrice)
  9829.         throws java.lang.Exception
  9830.     {
  9831.         return pecsFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  9832.     }

  9833.     @Override public double pecsFromPriceToOptimalExercise (
  9834.         final org.drip.param.valuation.ValuationParams valParams,
  9835.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9836.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9837.         final double dblPrice)
  9838.         throws java.lang.Exception
  9839.     {
  9840.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  9841.         if (null == wi)
  9842.             throw new java.lang.Exception
  9843.                 ("BondComponent::pecsFromPriceToOptimalExercise => Cant determine Work-out");

  9844.         return pecsFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  9845.     }

  9846.     @Override public double pecsFromTSYSpread (
  9847.         final org.drip.param.valuation.ValuationParams valParams,
  9848.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9849.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9850.         final int iWorkoutDate,
  9851.         final double dblWorkoutFactor,
  9852.         final double dblTSYSpread)
  9853.         throws java.lang.Exception
  9854.     {
  9855.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  9856.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  9857.     }

  9858.     @Override public double pecsFromTSYSpread (
  9859.         final org.drip.param.valuation.ValuationParams valParams,
  9860.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9861.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9862.         final double dblTSYSpread)
  9863.         throws java.lang.Exception
  9864.     {
  9865.         return pecsFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  9866.     }

  9867.     @Override public double pecsFromTSYSpreadToOptimalExercise (
  9868.         final org.drip.param.valuation.ValuationParams valParams,
  9869.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9870.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9871.         final double dblTSYSpread)
  9872.         throws java.lang.Exception
  9873.     {
  9874.         if (null != _eosCall || null != _eosPut)
  9875.             throw new java.lang.Exception ("BondComponent::pecsFromTSYSpreadToOptimalExercise => " +
  9876.                 "Cant calc PECS from TSY Spread to optimal exercise for bonds w emb option");

  9877.         return pecsFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  9878.     }

  9879.     @Override public double pecsFromYield (
  9880.         final org.drip.param.valuation.ValuationParams valParams,
  9881.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9882.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9883.         final int iWorkoutDate,
  9884.         final double dblWorkoutFactor,
  9885.         final double dblYield)
  9886.         throws java.lang.Exception
  9887.     {
  9888.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  9889.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  9890.     }

  9891.     @Override public double pecsFromYield (
  9892.         final org.drip.param.valuation.ValuationParams valParams,
  9893.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9894.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9895.         final double dblYield)
  9896.         throws java.lang.Exception
  9897.     {
  9898.         return pecsFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  9899.     }

  9900.     @Override public double pecsFromYieldToOptimalExercise (
  9901.         final org.drip.param.valuation.ValuationParams valParams,
  9902.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9903.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9904.         final double dblYield)
  9905.         throws java.lang.Exception
  9906.     {
  9907.         if (null != _eosCall || null != _eosPut)
  9908.             throw new java.lang.Exception ("BondComponent::pecsFromYieldToOptimalExercise => " +
  9909.                 "Cant calc PECS from Yield to optimal exercise for bonds w emb option");

  9910.         return pecsFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  9911.     }

  9912.     @Override public double pecsFromYieldSpread (
  9913.         final org.drip.param.valuation.ValuationParams valParams,
  9914.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9915.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9916.         final int iWorkoutDate,
  9917.         final double dblWorkoutFactor,
  9918.         final double dblYieldSpread)
  9919.         throws java.lang.Exception
  9920.     {
  9921.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  9922.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  9923.     }

  9924.     @Override public double pecsFromYieldSpread (
  9925.         final org.drip.param.valuation.ValuationParams valParams,
  9926.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9927.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9928.         final double dblYieldSpread)
  9929.         throws java.lang.Exception
  9930.     {
  9931.         return pecsFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  9932.     }

  9933.     @Override public double pecsFromYieldSpreadToOptimalExercise (
  9934.         final org.drip.param.valuation.ValuationParams valParams,
  9935.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9936.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9937.         final double dblYieldSpread)
  9938.         throws java.lang.Exception
  9939.     {
  9940.         if (null != _eosCall || null != _eosPut)
  9941.             throw new java.lang.Exception ("BondComponent::pecsFromYieldSpreadToOptimalExercise => " +
  9942.                 "Cant calc PECS from Yield Spread to optimal exercise for bonds w emb option");

  9943.         return pecsFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  9944.     }

  9945.     @Override public double pecsFromZSpread (
  9946.         final org.drip.param.valuation.ValuationParams valParams,
  9947.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9948.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9949.         final int iWorkoutDate,
  9950.         final double dblWorkoutFactor,
  9951.         final double dblZSpread)
  9952.         throws java.lang.Exception
  9953.     {
  9954.         return pecsFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZSpread
  9955.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  9956.     }

  9957.     @Override public double pecsFromZSpread (
  9958.         final org.drip.param.valuation.ValuationParams valParams,
  9959.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9960.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9961.         final double dblZSpread)
  9962.         throws java.lang.Exception
  9963.     {
  9964.         return pecsFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  9965.     }

  9966.     @Override public double pecsFromZSpreadToOptimalExercise (
  9967.         final org.drip.param.valuation.ValuationParams valParams,
  9968.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9969.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9970.         final double dblZSpread)
  9971.         throws java.lang.Exception
  9972.     {
  9973.         if (null != _eosCall || null != _eosPut)
  9974.             throw new java.lang.Exception ("BondComponent::pecsFromZSpreadToOptimalExercise => " +
  9975.                 "Cant calc PECS from Z Spread to optimal exercise for bonds w emb option");

  9976.         return pecsFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  9977.     }

  9978.     @Override public double priceFromASW (
  9979.         final org.drip.param.valuation.ValuationParams valParams,
  9980.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  9981.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  9982.         final int iWorkoutDate,
  9983.         final double dblWorkoutFactor,
  9984.         final double dblASW)
  9985.         throws java.lang.Exception
  9986.     {
  9987.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor)
  9988.             || !org.drip.numerical.common.NumberUtil.IsValid (dblASW))
  9989.             throw new java.lang.Exception ("BondComponent::priceFromASW => Invalid Inputs");

  9990.         int iValueDate = valParams.valueDate();

  9991.         if (iValueDate >= iWorkoutDate)
  9992.             throw new java.lang.Exception ("BondComponent::priceFromASW => Invalid Inputs");

  9993.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  9994.         if (null == dcFunding)
  9995.             throw new java.lang.Exception ("BondComponent::priceFromASW => Invalid Inputs");

  9996.         org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate, valParams,
  9997.             csqc);

  9998.         if (null == cpcm) throw new java.lang.Exception ("BondComponent::priceFromASW => No CPCM");

  9999.         return dblWorkoutFactor - 100. * dcFunding.parSwapDV01 (iWorkoutDate) * (dblASW +
  10000.             dcFunding.estimateManifestMeasure ("SwapRate", iWorkoutDate) - cpcm.rate());
  10001.     }

  10002.     @Override public double priceFromASW (
  10003.         final org.drip.param.valuation.ValuationParams valParams,
  10004.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10005.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10006.         final double dblASW)
  10007.         throws java.lang.Exception
  10008.     {
  10009.         return priceFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  10010.     }

  10011.     @Override public double priceFromASWToOptimalExercise (
  10012.         final org.drip.param.valuation.ValuationParams valParams,
  10013.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10014.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10015.         final double dblASW)
  10016.         throws java.lang.Exception
  10017.     {
  10018.         if (null != _eosCall || null != _eosPut)
  10019.             throw new java.lang.Exception ("BondComponent::priceFromASWToOptimalExercise => " +
  10020.                 "Cant calc Price from ASW to optimal exercise for bonds w emb option");

  10021.         return priceFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  10022.     }

  10023.     @Override public double priceFromBondBasis (
  10024.         final org.drip.param.valuation.ValuationParams valParams,
  10025.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10026.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10027.         final int iWorkoutDate,
  10028.         final double dblWorkoutFactor,
  10029.         final double dblBondBasis)
  10030.         throws java.lang.Exception
  10031.     {
  10032.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  10033.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  10034.     }

  10035.     @Override public double priceFromBondBasis (
  10036.         final org.drip.param.valuation.ValuationParams valParams,
  10037.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10038.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10039.         final double dblBondBasis)
  10040.         throws java.lang.Exception
  10041.     {
  10042.         return priceFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  10043.     }

  10044.     @Override public double priceFromBondBasisToOptimalExercise (
  10045.         final org.drip.param.valuation.ValuationParams valParams,
  10046.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10047.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10048.         final double dblBondBasis)
  10049.         throws java.lang.Exception
  10050.     {
  10051.         if (null != _eosCall || null != _eosPut)
  10052.             throw new java.lang.Exception ("BondComponent::priceFromBondBasisToOptimalExercise => " +
  10053.                 "Cant calc Price from Bond Basis to optimal exercise for bonds w emb option");

  10054.         return priceFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  10055.     }

  10056.     @Override public double priceFromCreditBasis (
  10057.         final org.drip.param.valuation.ValuationParams valParams,
  10058.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10059.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10060.         final int iWorkoutDate,
  10061.         final double dblWorkoutFactor,
  10062.         final double dblCreditBasis)
  10063.         throws java.lang.Exception
  10064.     {
  10065.         return priceFromCreditCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, dblCreditBasis,
  10066.             false);
  10067.     }

  10068.     @Override public double priceFromCreditBasis (
  10069.         final org.drip.param.valuation.ValuationParams valParams,
  10070.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10071.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10072.         final double dblCreditBasis)
  10073.         throws java.lang.Exception
  10074.     {
  10075.         return priceFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  10076.     }

  10077.     @Override public double priceFromCreditBasisToOptimalExercise (
  10078.         final org.drip.param.valuation.ValuationParams valParams,
  10079.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10080.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10081.         final double dblCreditBasis)
  10082.         throws java.lang.Exception
  10083.     {
  10084.         if (null != _eosCall || null != _eosPut)
  10085.             throw new java.lang.Exception ("BondComponent::priceFromCreditBasisToOptimalExercise => " +
  10086.                 "Cant calc Price from Credit Basis to optimal exercise for bonds w emb option");

  10087.         return priceFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  10088.     }

  10089.     @Override public double priceFromDiscountMargin (
  10090.         final org.drip.param.valuation.ValuationParams valParams,
  10091.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10092.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10093.         final int iWorkoutDate,
  10094.         final double dblWorkoutFactor,
  10095.         final double dblDiscountMargin)
  10096.         throws java.lang.Exception
  10097.     {
  10098.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10099.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10100.                 dblDiscountMargin));
  10101.     }

  10102.     @Override public double priceFromDiscountMargin (
  10103.         final org.drip.param.valuation.ValuationParams valParams,
  10104.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10105.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10106.         double dblDiscountMargin)
  10107.         throws java.lang.Exception
  10108.     {
  10109.         return priceFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  10110.             dblDiscountMargin);
  10111.     }

  10112.     @Override public double priceFromDiscountMarginToOptimalExercise (
  10113.         final org.drip.param.valuation.ValuationParams valParams,
  10114.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10115.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10116.         final double dblDiscountMargin)
  10117.         throws java.lang.Exception
  10118.     {
  10119.         if (null != _eosCall || null != _eosPut)
  10120.             throw new java.lang.Exception ("BondComponent::priceFromDiscountMarginToOptimalExercise => " +
  10121.                 "Cant calc Price from Discount Margin to optimal exercise for bonds w emb option");

  10122.         return priceFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  10123.             dblDiscountMargin);
  10124.     }

  10125.     @Override public double priceFromESpread (
  10126.         final org.drip.param.valuation.ValuationParams valParams,
  10127.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10128.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10129.         final int iWorkoutDate,
  10130.         final double dblWorkoutFactor,
  10131.         final double dblESpread)
  10132.         throws java.lang.Exception
  10133.     {
  10134.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  10135.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  10136.     }

  10137.     @Override public double priceFromESpread (
  10138.         final org.drip.param.valuation.ValuationParams valParams,
  10139.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10140.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10141.         final double dblESpread)
  10142.         throws java.lang.Exception
  10143.     {
  10144.         return priceFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  10145.     }

  10146.     @Override public double priceFromESpreadToOptimalExercise (
  10147.         final org.drip.param.valuation.ValuationParams valParams,
  10148.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10149.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10150.         final double dblESpread)
  10151.         throws java.lang.Exception
  10152.     {
  10153.         if (null != _eosCall || null != _eosPut)
  10154.             throw new java.lang.Exception ("BondComponent::priceFromESpreadToOptimalExercise => " +
  10155.                 "Cant calc Price from E Spread to optimal exercise for bonds w emb option");

  10156.         return priceFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  10157.     }

  10158.     @Override public double priceFromGSpread (
  10159.         final org.drip.param.valuation.ValuationParams valParams,
  10160.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10161.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10162.         final int iWorkoutDate,
  10163.         final double dblWorkoutFactor,
  10164.         final double dblGSpread)
  10165.         throws java.lang.Exception
  10166.     {
  10167.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  10168.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  10169.     }

  10170.     @Override public double priceFromGSpread (
  10171.         final org.drip.param.valuation.ValuationParams valParams,
  10172.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10173.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10174.         final double dblGSpread)
  10175.         throws java.lang.Exception
  10176.     {
  10177.         return priceFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  10178.     }

  10179.     @Override public double priceFromGSpreadToOptimalExercise (
  10180.         final org.drip.param.valuation.ValuationParams valParams,
  10181.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10182.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10183.         final double dblGSpread)
  10184.         throws java.lang.Exception
  10185.     {
  10186.         if (null != _eosCall || null != _eosPut)
  10187.             throw new java.lang.Exception ("BondComponent::priceFromGSpreadToOptimalExercise => " +
  10188.                 "Cant calc Price from G Spread to optimal exercise for bonds w emb option");

  10189.         return priceFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  10190.     }

  10191.     @Override public double priceFromISpread (
  10192.         final org.drip.param.valuation.ValuationParams valParams,
  10193.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10194.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10195.         final int iWorkoutDate,
  10196.         final double dblWorkoutFactor,
  10197.         final double dblISpread)
  10198.         throws java.lang.Exception
  10199.     {
  10200.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  10201.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  10202.     }

  10203.     @Override public double priceFromISpread (
  10204.         final org.drip.param.valuation.ValuationParams valParams,
  10205.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10206.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10207.         final double dblISpread)
  10208.         throws java.lang.Exception
  10209.     {
  10210.         return priceFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  10211.     }

  10212.     @Override public double priceFromISpreadToOptimalExercise (
  10213.         final org.drip.param.valuation.ValuationParams valParams,
  10214.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10215.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10216.         final double dblISpread)
  10217.         throws java.lang.Exception
  10218.     {
  10219.         if (null != _eosCall || null != _eosPut)
  10220.             throw new java.lang.Exception ("BondComponent::priceFromISpreadToOptimalExercise => " +
  10221.                 "Cant calc Price from I Spread to optimal exercise for bonds w emb option");

  10222.         return priceFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  10223.     }

  10224.     @Override public double priceFromJSpread (
  10225.         final org.drip.param.valuation.ValuationParams valParams,
  10226.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10227.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10228.         final int iWorkoutDate,
  10229.         final double dblWorkoutFactor,
  10230.         final double dblJSpread)
  10231.         throws java.lang.Exception
  10232.     {
  10233.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  10234.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  10235.     }

  10236.     @Override public double priceFromJSpread (
  10237.         final org.drip.param.valuation.ValuationParams valParams,
  10238.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10239.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10240.         final double dblJSpread)
  10241.         throws java.lang.Exception
  10242.     {
  10243.         return priceFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  10244.     }

  10245.     @Override public double priceFromJSpreadToOptimalExercise (
  10246.         final org.drip.param.valuation.ValuationParams valParams,
  10247.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10248.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10249.         final double dblJSpread)
  10250.         throws java.lang.Exception
  10251.     {
  10252.         if (null != _eosCall || null != _eosPut)
  10253.             throw new java.lang.Exception ("BondComponent::priceFromJSpreadToOptimalExercise => " +
  10254.                 "Cant calc Price from J Spread to optimal exercise for bonds w emb option");

  10255.         return priceFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  10256.     }

  10257.     @Override public double priceFromNSpread (
  10258.         final org.drip.param.valuation.ValuationParams valParams,
  10259.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10260.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10261.         final int iWorkoutDate,
  10262.         final double dblWorkoutFactor,
  10263.         final double dblNSpread)
  10264.         throws java.lang.Exception
  10265.     {
  10266.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  10267.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  10268.     }

  10269.     @Override public double priceFromNSpread (
  10270.         final org.drip.param.valuation.ValuationParams valParams,
  10271.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10272.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10273.         final double dblNSpread)
  10274.         throws java.lang.Exception
  10275.     {
  10276.         return priceFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  10277.     }

  10278.     @Override public double priceFromNSpreadToOptimalExercise (
  10279.         final org.drip.param.valuation.ValuationParams valParams,
  10280.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10281.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10282.         final double dblNSpread)
  10283.         throws java.lang.Exception
  10284.     {
  10285.         if (null != _eosCall || null != _eosPut)
  10286.             throw new java.lang.Exception ("BondComponent::priceFromNSpreadToOptimalExercise => " +
  10287.                 "Cant calc Price from N Spread to optimal exercise for bonds w emb option");

  10288.         return priceFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  10289.     }

  10290.     @Override public double priceFromOAS (
  10291.         final org.drip.param.valuation.ValuationParams valParams,
  10292.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10293.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10294.         final int iWorkoutDate,
  10295.         final double dblWorkoutFactor,
  10296.         final double dblOAS)
  10297.         throws java.lang.Exception
  10298.     {
  10299.         return priceFromZeroCurve (valParams, csqc, vcp, ZERO_OFF_OF_TREASURIES_DISCOUNT_CURVE,
  10300.             iWorkoutDate, dblWorkoutFactor, dblOAS);
  10301.     }

  10302.     @Override public double priceFromOAS (
  10303.         final org.drip.param.valuation.ValuationParams valParams,
  10304.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10305.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10306.         final double dblOAS)
  10307.         throws java.lang.Exception
  10308.     {
  10309.         return priceFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  10310.     }

  10311.     @Override public double priceFromOASToOptimalExercise (
  10312.         final org.drip.param.valuation.ValuationParams valParams,
  10313.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10314.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10315.         final double dblOAS)
  10316.         throws java.lang.Exception
  10317.     {
  10318.         if (null != _eosCall || null != _eosPut)
  10319.             throw new java.lang.Exception ("BondComponent::priceFromOASToOptimalExercise => " +
  10320.                 "Cant calc Price from OAS to optimal exercise for bonds w emb option");

  10321.         return priceFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  10322.     }

  10323.     @Override public double priceFromPECS (
  10324.         final org.drip.param.valuation.ValuationParams valParams,
  10325.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10326.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10327.         final int iWorkoutDate,
  10328.         final double dblWorkoutFactor,
  10329.         final double dblPECS)
  10330.         throws java.lang.Exception
  10331.     {
  10332.         return priceFromCreditCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, dblPECS, true);
  10333.     }

  10334.     @Override public double priceFromPECS (
  10335.         final org.drip.param.valuation.ValuationParams valParams,
  10336.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10337.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10338.         final double dblPECS)
  10339.         throws java.lang.Exception
  10340.     {
  10341.         return priceFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  10342.     }

  10343.     @Override public double priceFromPECSToOptimalExercise (
  10344.         final org.drip.param.valuation.ValuationParams valParams,
  10345.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10346.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10347.         final double dblPECS)
  10348.         throws java.lang.Exception
  10349.     {
  10350.         if (null != _eosCall || null != _eosPut)
  10351.             throw new java.lang.Exception ("BondComponent::priceFromPECSToOptimalExercise => " +
  10352.                 "Cant calc Price from PECS to optimal exercise for bonds w emb option");

  10353.         return priceFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  10354.     }

  10355.     @Override public double priceFromTSYSpread (
  10356.         final org.drip.param.valuation.ValuationParams valParams,
  10357.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10358.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10359.         final int iWorkoutDate,
  10360.         final double dblWorkoutFactor,
  10361.         final double dblTSYSpread)
  10362.         throws java.lang.Exception
  10363.     {
  10364.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  10365.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  10366.     }

  10367.     @Override public double priceFromTSYSpread (
  10368.         final org.drip.param.valuation.ValuationParams valParams,
  10369.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10370.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10371.         final double dblTSYSpread)
  10372.         throws java.lang.Exception
  10373.     {
  10374.         return priceFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  10375.     }

  10376.     @Override public double priceFromTSYSpreadToOptimalExercise (
  10377.         final org.drip.param.valuation.ValuationParams valParams,
  10378.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10379.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10380.         final double dblTSYSpread)
  10381.         throws java.lang.Exception
  10382.     {
  10383.         if (null != _eosCall || null != _eosPut)
  10384.             throw new java.lang.Exception ("BondComponent::priceFromTSYSpreadToOptimalExercise => " +
  10385.                 "Cant calc Price from TSY Spread to optimal exercise for bonds w emb option");

  10386.         return priceFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  10387.     }

  10388.     @Override public double priceFromYield (
  10389.         final org.drip.param.valuation.ValuationParams valParams,
  10390.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10391.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10392.         final int iWorkoutDate,
  10393.         final double dblWorkoutFactor,
  10394.         final double dblYield)
  10395.         throws java.lang.Exception
  10396.     {
  10397.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield, false);
  10398.     }

  10399.     @Override public double priceFromYield (
  10400.         final org.drip.param.valuation.ValuationParams valParams,
  10401.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10402.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10403.         final double dblYield)
  10404.         throws java.lang.Exception
  10405.     {
  10406.         return priceFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  10407.     }

  10408.     @Override public double priceFromYieldToOptimalExercise (
  10409.         final org.drip.param.valuation.ValuationParams valParams,
  10410.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10411.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10412.         final double dblYield)
  10413.         throws java.lang.Exception
  10414.     {
  10415.         if (null != _eosCall || null != _eosPut)
  10416.             throw new java.lang.Exception ("BondComponent::priceFromYieldToOptimalExercise => " +
  10417.                 "Cannot calc exercise px from yld for bonds w emb option");

  10418.         return priceFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  10419.     }

  10420.     @Override public double priceFromYieldSpread (
  10421.         final org.drip.param.valuation.ValuationParams valParams,
  10422.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10423.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10424.         final int iWorkoutDate,
  10425.         final double dblWorkoutFactor,
  10426.         final double dblYieldSpread)
  10427.         throws java.lang.Exception
  10428.     {
  10429.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  10430.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  10431.     }

  10432.     @Override public double priceFromYieldSpread (
  10433.         final org.drip.param.valuation.ValuationParams valParams,
  10434.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10435.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10436.         final double dblYieldSpread)
  10437.         throws java.lang.Exception
  10438.     {
  10439.         return priceFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  10440.     }

  10441.     @Override public double priceFromYieldSpreadToOptimalExercise (
  10442.         final org.drip.param.valuation.ValuationParams valParams,
  10443.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10444.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10445.         final double dblYieldSpread)
  10446.         throws java.lang.Exception
  10447.     {
  10448.         if (null != _eosCall || null != _eosPut)
  10449.             throw new java.lang.Exception ("BondComponent::priceFromYieldSpreadToOptimalExercise => " +
  10450.                 "Cant calc Price from Yield Spread to optimal exercise for bonds w emb option");

  10451.         return priceFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  10452.     }

  10453.     @Override public double priceFromZSpread (
  10454.         final org.drip.param.valuation.ValuationParams valParams,
  10455.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10456.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10457.         final int iWorkoutDate,
  10458.         final double dblWorkoutFactor,
  10459.         final double dblZSpread)
  10460.         throws java.lang.Exception
  10461.     {
  10462.         return priceFromZeroCurve (valParams, csqc, vcp, ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE,
  10463.             iWorkoutDate, dblWorkoutFactor, dblZSpread);
  10464.     }

  10465.     @Override public double priceFromZSpread (
  10466.         final org.drip.param.valuation.ValuationParams valParams,
  10467.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10468.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10469.         final double dblZSpread)
  10470.         throws java.lang.Exception
  10471.     {
  10472.         return priceFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  10473.     }

  10474.     @Override public double priceFromZSpreadToOptimalExercise (
  10475.         final org.drip.param.valuation.ValuationParams valParams,
  10476.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10477.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10478.         final double dblZSpread)
  10479.         throws java.lang.Exception
  10480.     {
  10481.         if (null != _eosCall || null != _eosPut)
  10482.             throw new java.lang.Exception ("BondComponent::priceFromZSpreadToOptimalExercise => " +
  10483.                 "Cant calc Price from Z Spread to optimal exercise for bonds w emb option");

  10484.         return priceFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  10485.     }

  10486.     @Override public double tsySpreadFromASW (
  10487.         final org.drip.param.valuation.ValuationParams valParams,
  10488.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10489.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10490.         final int iWorkoutDate,
  10491.         final double dblWorkoutFactor,
  10492.         final double dblASW)
  10493.         throws java.lang.Exception
  10494.     {
  10495.         return tsySpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  10496.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  10497.     }

  10498.     @Override public double tsySpreadFromASW (
  10499.         final org.drip.param.valuation.ValuationParams valParams,
  10500.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10501.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10502.         final double dblASW)
  10503.         throws java.lang.Exception
  10504.     {
  10505.         return tsySpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  10506.     }

  10507.     @Override public double tsySpreadFromASWToOptimalExercise (
  10508.         final org.drip.param.valuation.ValuationParams valParams,
  10509.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10510.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10511.         final double dblASW)
  10512.         throws java.lang.Exception
  10513.     {
  10514.         if (null != _eosCall || null != _eosPut)
  10515.             throw new java.lang.Exception ("BondComponent::tsySpreadFromASWToOptimalExercise => " +
  10516.                 "Cant calc TSY Spread from ASW to optimal exercise for bonds w emb option");

  10517.         return tsySpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  10518.     }

  10519.     @Override public double tsySpreadFromBondBasis (
  10520.         final org.drip.param.valuation.ValuationParams valParams,
  10521.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10522.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10523.         final int iWorkoutDate,
  10524.         final double dblWorkoutFactor,
  10525.         final double dblBondBasis)
  10526.         throws java.lang.Exception
  10527.     {
  10528.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  10529.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  10530.     }

  10531.     @Override public double tsySpreadFromBondBasis (
  10532.         final org.drip.param.valuation.ValuationParams valParams,
  10533.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10534.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10535.         final double dblBondBasis)
  10536.         throws java.lang.Exception
  10537.     {
  10538.         return tsySpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  10539.     }

  10540.     @Override public double tsySpreadFromBondBasisToOptimalExercise (
  10541.         final org.drip.param.valuation.ValuationParams valParams,
  10542.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10543.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10544.         final double dblBondBasis)
  10545.         throws java.lang.Exception
  10546.     {
  10547.         if (null != _eosCall || null != _eosPut)
  10548.             throw new java.lang.Exception ("BondComponent::tsySpreadFromBondBasisToOptimalExercise => " +
  10549.                 "Cant calc TSY Spread from Bond Basis to optimal exercise for bonds w emb option");

  10550.         return tsySpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  10551.     }

  10552.     @Override public double tsySpreadFromCreditBasis (
  10553.         final org.drip.param.valuation.ValuationParams valParams,
  10554.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10555.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10556.         final int iWorkoutDate,
  10557.         final double dblWorkoutFactor,
  10558.         final double dblCreditBasis)
  10559.         throws java.lang.Exception
  10560.     {
  10561.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10562.             yieldFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  10563.     }

  10564.     @Override public double tsySpreadFromCreditBasis (
  10565.         final org.drip.param.valuation.ValuationParams valParams,
  10566.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10567.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10568.         final double dblCreditBasis)
  10569.         throws java.lang.Exception
  10570.     {
  10571.         return tsySpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  10572.     }

  10573.     @Override public double tsySpreadFromCreditBasisToOptimalExercise (
  10574.         final org.drip.param.valuation.ValuationParams valParams,
  10575.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10576.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10577.         final double dblCreditBasis)
  10578.         throws java.lang.Exception
  10579.     {
  10580.         if (null != _eosCall || null != _eosPut)
  10581.             throw new java.lang.Exception ("BondComponent::tsySpreadFromCreditBasisToOptimalExercise => " +
  10582.                 "Cant calc TSY Spread from Credit Basis to optimal exercise for bonds w emb option");

  10583.         return tsySpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  10584.     }

  10585.     @Override public double tsySpreadFromDiscountMargin (
  10586.         final org.drip.param.valuation.ValuationParams valParams,
  10587.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10588.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10589.         final int iWorkoutDate,
  10590.         final double dblWorkoutFactor,
  10591.         final double dblDiscountMargin)
  10592.         throws java.lang.Exception
  10593.     {
  10594.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10595.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10596.                 dblDiscountMargin));
  10597.     }

  10598.     @Override public double tsySpreadFromDiscountMargin (
  10599.         final org.drip.param.valuation.ValuationParams valParams,
  10600.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10601.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10602.         final double dblDiscountMargin)
  10603.         throws java.lang.Exception
  10604.     {
  10605.         return tsySpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  10606.             dblDiscountMargin);
  10607.     }

  10608.     @Override public double tsySpreadFromDiscountMarginToOptimalExercise (
  10609.         final org.drip.param.valuation.ValuationParams valParams,
  10610.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10611.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10612.         final double dblDiscountMargin)
  10613.         throws java.lang.Exception
  10614.     {
  10615.         if (null != _eosCall || null != _eosPut)
  10616.             throw new java.lang.Exception ("BondComponent::tsySpreadFromDiscountMarginToOptimalExercise " +
  10617.                 "=> Cant calc TSY Spread from Discount Margin to optimal exercise for bonds w emb option");

  10618.         return tsySpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  10619.             dblDiscountMargin);
  10620.     }

  10621.     @Override public double tsySpreadFromESpread (
  10622.         final org.drip.param.valuation.ValuationParams valParams,
  10623.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10624.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10625.         final int iWorkoutDate,
  10626.         final double dblWorkoutFactor,
  10627.         final double dblESpread)
  10628.         throws java.lang.Exception
  10629.     {
  10630.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  10631.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  10632.     }

  10633.     @Override public double tsySpreadFromESpread (
  10634.         final org.drip.param.valuation.ValuationParams valParams,
  10635.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10636.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10637.         final double dblESpread)
  10638.         throws java.lang.Exception
  10639.     {
  10640.         return tsySpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  10641.     }

  10642.     @Override public double tsySpreadFromESpreadToOptimalExercise (
  10643.         final org.drip.param.valuation.ValuationParams valParams,
  10644.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10645.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10646.         final double dblESpread)
  10647.         throws java.lang.Exception
  10648.     {
  10649.         if (null != _eosCall || null != _eosPut)
  10650.             throw new java.lang.Exception ("BondComponent::tsySpreadFromESpreadToOptimalExercise => " +
  10651.                 "Cant calc TSY Spread from E Spread to optimal exercise for bonds w emb option");

  10652.         return tsySpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  10653.     }

  10654.     @Override public double tsySpreadFromGSpread (
  10655.         final org.drip.param.valuation.ValuationParams valParams,
  10656.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10657.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10658.         final int iWorkoutDate,
  10659.         final double dblWorkoutFactor,
  10660.         final double dblGSpread)
  10661.         throws java.lang.Exception
  10662.     {
  10663.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  10664.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  10665.     }

  10666.     @Override public double tsySpreadFromGSpread (
  10667.         final org.drip.param.valuation.ValuationParams valParams,
  10668.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10669.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10670.         final double dblGSpread)
  10671.         throws java.lang.Exception
  10672.     {
  10673.         return tsySpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  10674.     }

  10675.     @Override public double tsySpreadFromGSpreadToOptimalExercise (
  10676.         final org.drip.param.valuation.ValuationParams valParams,
  10677.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10678.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10679.         final double dblGSpread)
  10680.         throws java.lang.Exception
  10681.     {
  10682.         if (null != _eosCall || null != _eosPut)
  10683.             throw new java.lang.Exception ("BondComponent::tsySpreadFromGSpreadToOptimalExercise => " +
  10684.                 "Cant calc TSY Spread from G Spread to optimal exercise for bonds w emb option");

  10685.         return tsySpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  10686.     }

  10687.     @Override public double tsySpreadFromISpread (
  10688.         final org.drip.param.valuation.ValuationParams valParams,
  10689.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10690.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10691.         final int iWorkoutDate,
  10692.         final double dblWorkoutFactor,
  10693.         final double dblISpread)
  10694.         throws java.lang.Exception
  10695.     {
  10696.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  10697.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  10698.     }

  10699.     @Override public double tsySpreadFromISpread (
  10700.         final org.drip.param.valuation.ValuationParams valParams,
  10701.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10702.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10703.         final double dblISpread)
  10704.         throws java.lang.Exception
  10705.     {
  10706.         return tsySpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  10707.     }

  10708.     @Override public double tsySpreadFromISpreadToOptimalExercise (
  10709.         final org.drip.param.valuation.ValuationParams valParams,
  10710.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10711.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10712.         final double dblISpread)
  10713.         throws java.lang.Exception
  10714.     {
  10715.         if (null != _eosCall || null != _eosPut)
  10716.             throw new java.lang.Exception ("BondComponent::tsySpreadFromISpreadToOptimalExercise => " +
  10717.                 "Cant calc TSY Spread from I Spread to optimal exercise for bonds w emb option");

  10718.         return tsySpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  10719.     }

  10720.     @Override public double tsySpreadFromJSpread (
  10721.         final org.drip.param.valuation.ValuationParams valParams,
  10722.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10723.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10724.         final int iWorkoutDate,
  10725.         final double dblWorkoutFactor,
  10726.         final double dblJSpread)
  10727.         throws java.lang.Exception
  10728.     {
  10729.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  10730.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  10731.     }

  10732.     @Override public double tsySpreadFromJSpread (
  10733.         final org.drip.param.valuation.ValuationParams valParams,
  10734.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10735.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10736.         final double dblJSpread)
  10737.         throws java.lang.Exception
  10738.     {
  10739.         return tsySpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  10740.     }

  10741.     @Override public double tsySpreadFromJSpreadToOptimalExercise (
  10742.         final org.drip.param.valuation.ValuationParams valParams,
  10743.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10744.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10745.         final double dblJSpread)
  10746.         throws java.lang.Exception
  10747.     {
  10748.         if (null != _eosCall || null != _eosPut)
  10749.             throw new java.lang.Exception ("BondComponent::tsySpreadFromJSpreadToOptimalExercise => " +
  10750.                 "Cant calc TSY Spread from J Spread to optimal exercise for bonds w emb option");

  10751.         return tsySpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  10752.     }

  10753.     @Override public double tsySpreadFromNSpread (
  10754.         final org.drip.param.valuation.ValuationParams valParams,
  10755.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10756.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10757.         final int iWorkoutDate,
  10758.         final double dblWorkoutFactor,
  10759.         final double dblNSpread)
  10760.         throws java.lang.Exception
  10761.     {
  10762.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  10763.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  10764.     }

  10765.     @Override public double tsySpreadFromNSpread (
  10766.         final org.drip.param.valuation.ValuationParams valParams,
  10767.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10768.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10769.         final double dblNSpread)
  10770.         throws java.lang.Exception
  10771.     {
  10772.         return tsySpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  10773.     }

  10774.     @Override public double tsySpreadFromNSpreadToOptimalExercise (
  10775.         final org.drip.param.valuation.ValuationParams valParams,
  10776.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10777.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10778.         final double dblNSpread)
  10779.         throws java.lang.Exception
  10780.     {
  10781.         if (null != _eosCall || null != _eosPut)
  10782.             throw new java.lang.Exception ("BondComponent::tsySpreadFromNSpreadToOptimalExercise => " +
  10783.                 "Cant calc TSY Spread from N Spread to optimal exercise for bonds w emb option");

  10784.         return tsySpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  10785.     }

  10786.     @Override public double tsySpreadFromOAS (
  10787.         final org.drip.param.valuation.ValuationParams valParams,
  10788.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10789.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10790.         final int iWorkoutDate,
  10791.         final double dblWorkoutFactor,
  10792.         final double dblOAS)
  10793.         throws java.lang.Exception
  10794.     {
  10795.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  10796.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  10797.     }

  10798.     @Override public double tsySpreadFromOAS (
  10799.         final org.drip.param.valuation.ValuationParams valParams,
  10800.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10801.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10802.         final double dblOAS)
  10803.         throws java.lang.Exception
  10804.     {
  10805.         return tsySpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  10806.     }

  10807.     @Override public double tsySpreadFromOASToOptimalExercise (
  10808.         final org.drip.param.valuation.ValuationParams valParams,
  10809.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10810.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10811.         final double dblOAS)
  10812.         throws java.lang.Exception
  10813.     {
  10814.         if (null != _eosCall || null != _eosPut)
  10815.             throw new java.lang.Exception ("BondComponent::tsySpreadFromOASToOptimalExercise => " +
  10816.                 "Cant calc TSY Spread from OAS to optimal exercise for bonds w emb option");

  10817.         return tsySpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  10818.     }

  10819.     @Override public double tsySpreadFromPECS (
  10820.         final org.drip.param.valuation.ValuationParams valParams,
  10821.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10822.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10823.         final int iWorkoutDate,
  10824.         final double dblWorkoutFactor,
  10825.         final double dblPECS)
  10826.         throws java.lang.Exception
  10827.     {
  10828.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  10829.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  10830.     }

  10831.     @Override public double tsySpreadFromPECS (
  10832.         final org.drip.param.valuation.ValuationParams valParams,
  10833.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10834.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10835.         final double dblPECS)
  10836.         throws java.lang.Exception
  10837.     {
  10838.         return tsySpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  10839.     }

  10840.     @Override public double tsySpreadFromPECSToOptimalExercise (
  10841.         final org.drip.param.valuation.ValuationParams valParams,
  10842.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10843.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10844.         final double dblPECS)
  10845.         throws java.lang.Exception
  10846.     {
  10847.         if (null != _eosCall || null != _eosPut)
  10848.             throw new java.lang.Exception ("BondComponent::tsySpreadFromPECSToOptimalExercise => " +
  10849.                 "Cant calc TSY Spread from PECS to optimal exercise for bonds w emb option");

  10850.         return tsySpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  10851.     }

  10852.     @Override public double tsySpreadFromPrice (
  10853.         final org.drip.param.valuation.ValuationParams valParams,
  10854.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10855.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10856.         final int iWorkoutDate,
  10857.         final double dblWorkoutFactor,
  10858.         final double dblPrice)
  10859.         throws java.lang.Exception
  10860.     {
  10861.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  10862.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  10863.     }

  10864.     @Override public double tsySpreadFromPrice (
  10865.         final org.drip.param.valuation.ValuationParams valParams,
  10866.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10867.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10868.         final double dblPrice)
  10869.         throws java.lang.Exception
  10870.     {
  10871.         return tsySpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  10872.     }

  10873.     @Override public double tsySpreadFromPriceToOptimalExercise (
  10874.         final org.drip.param.valuation.ValuationParams valParams,
  10875.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10876.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10877.         final double dblPrice)
  10878.         throws java.lang.Exception
  10879.     {
  10880.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  10881.         if (null == wi)
  10882.             throw new java.lang.Exception
  10883.                 ("BondComponent::tsySpreadFromPriceToOptimalExercise => Cant determine Work-out");

  10884.         return tsySpreadFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  10885.     }

  10886.     @Override public double tsySpreadFromYield (
  10887.         final org.drip.param.valuation.ValuationParams valParams,
  10888.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10889.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10890.         final int iWorkoutDate,
  10891.         final double dblWorkoutFactor,
  10892.         final double dblYield)
  10893.         throws java.lang.Exception
  10894.     {
  10895.         return dblYield - treasuryBenchmarkYield (valParams, csqc, iWorkoutDate);
  10896.     }

  10897.     @Override public double tsySpreadFromYield (
  10898.         final org.drip.param.valuation.ValuationParams valParams,
  10899.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10900.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10901.         final double dblYield)
  10902.         throws java.lang.Exception
  10903.     {
  10904.         return tsySpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  10905.     }

  10906.     @Override public double tsySpreadFromYieldToOptimalExercise (
  10907.         final org.drip.param.valuation.ValuationParams valParams,
  10908.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10909.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10910.         final double dblYield)
  10911.         throws java.lang.Exception
  10912.     {
  10913.         if (null != _eosCall || null != _eosPut)
  10914.             throw new java.lang.Exception ("BondComponent::tsySpreadFromYieldToOptimalExercise => " +
  10915.                 "Cant calc TSY Spread from Yield to optimal exercise for bonds w emb option");

  10916.         return tsySpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  10917.     }

  10918.     @Override public double tsySpreadFromYieldSpread (
  10919.         final org.drip.param.valuation.ValuationParams valParams,
  10920.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10921.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10922.         final int iWorkoutDate,
  10923.         final double dblWorkoutFactor,
  10924.         final double dblYieldSpread)
  10925.         throws java.lang.Exception
  10926.     {
  10927.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  10928.             yieldFromYieldSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  10929.     }

  10930.     @Override public double tsySpreadFromYieldSpread (
  10931.         final org.drip.param.valuation.ValuationParams valParams,
  10932.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10933.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10934.         final double dblYieldSpread)
  10935.         throws java.lang.Exception
  10936.     {
  10937.         return tsySpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  10938.     }

  10939.     @Override public double tsySpreadFromYieldSpreadToOptimalExercise (
  10940.         final org.drip.param.valuation.ValuationParams valParams,
  10941.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10942.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10943.         final double dblYieldSpread)
  10944.         throws java.lang.Exception
  10945.     {
  10946.         if (null != _eosCall || null != _eosPut)
  10947.             throw new java.lang.Exception ("BondComponent::tsySpreadFromYieldSpreadToOptimalExercise => " +
  10948.                 "Cant calc TSY Spread from Yield Spread to optimal exercise for bonds w emb option");

  10949.         return tsySpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  10950.     }

  10951.     @Override public double tsySpreadFromZSpread (
  10952.         final org.drip.param.valuation.ValuationParams valParams,
  10953.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10954.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10955.         final int iWorkoutDate,
  10956.         final double dblWorkoutFactor,
  10957.         final double dblZSpread)
  10958.         throws java.lang.Exception
  10959.     {
  10960.         return tsySpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  10961.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  10962.     }

  10963.     @Override public double tsySpreadFromZSpread (
  10964.         final org.drip.param.valuation.ValuationParams valParams,
  10965.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10966.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10967.         final double dblZSpread)
  10968.         throws java.lang.Exception
  10969.     {
  10970.         return tsySpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  10971.     }

  10972.     @Override public double tsySpreadFromZSpreadToOptimalExercise (
  10973.         final org.drip.param.valuation.ValuationParams valParams,
  10974.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10975.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10976.         final double dblZSpread)
  10977.         throws java.lang.Exception
  10978.     {
  10979.         if (null != _eosCall || null != _eosPut)
  10980.             throw new java.lang.Exception ("BondComponent::tsySpreadFromZSpreadToOptimalExercise => " +
  10981.                 "Cant calc TSY Spread from Z Spread to optimal exercise for bonds w emb option");

  10982.         return tsySpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  10983.     }

  10984.     @Override public double yieldFromASW (
  10985.         final org.drip.param.valuation.ValuationParams valParams,
  10986.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10987.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  10988.         final int iWorkoutDate,
  10989.         final double dblWorkoutFactor,
  10990.         final double dblASW)
  10991.         throws java.lang.Exception
  10992.     {
  10993.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  10994.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  10995.     }

  10996.     @Override public double yieldFromASW (
  10997.         final org.drip.param.valuation.ValuationParams valParams,
  10998.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  10999.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11000.         final double dblASW)
  11001.         throws java.lang.Exception
  11002.     {
  11003.         return yieldFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  11004.     }

  11005.     @Override public double yieldFromASWToOptimalExercise (
  11006.         final org.drip.param.valuation.ValuationParams valParams,
  11007.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11008.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11009.         final double dblASW)
  11010.         throws java.lang.Exception
  11011.     {
  11012.         if (null != _eosCall || null != _eosPut)
  11013.             throw new java.lang.Exception ("BondComponent::yieldFromASWToOptimalExercise => " +
  11014.                 "Cant calc Yield from ASW to optimal exercise for bonds w emb option");

  11015.         return yieldFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  11016.     }

  11017.     @Override public double yieldFromBondBasis (
  11018.         final org.drip.param.valuation.ValuationParams valParams,
  11019.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11020.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11021.         final int iWorkoutDate,
  11022.         final double dblWorkoutFactor,
  11023.         final double dblBondBasis)
  11024.         throws java.lang.Exception
  11025.     {
  11026.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblBondBasis))
  11027.             throw new java.lang.Exception ("BondComponent::yieldFromBondBasis => Invalid Inputs");

  11028.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromFundingCurve
  11029.             (valParams, csqc, iWorkoutDate, dblWorkoutFactor, 0.)) + dblBondBasis;
  11030.     }

  11031.     @Override public double yieldFromBondBasis (
  11032.         final org.drip.param.valuation.ValuationParams valParams,
  11033.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11034.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11035.         final double dblBondBasis)
  11036.         throws java.lang.Exception
  11037.     {
  11038.         return yieldFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  11039.     }

  11040.     @Override public double yieldFromBondBasisToOptimalExercise (
  11041.         final org.drip.param.valuation.ValuationParams valParams,
  11042.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11043.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11044.         final double dblBondBasis)
  11045.         throws java.lang.Exception
  11046.     {
  11047.         if (null != _eosCall || null != _eosPut)
  11048.             throw new java.lang.Exception ("BondComponent::yieldFromBondBasisToOptimalExercise => " +
  11049.                 "Cant calc Yield from Bond Basis to optimal exercise for bonds w emb option");

  11050.         return yieldFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  11051.     }

  11052.     @Override public double yieldFromCreditBasis (
  11053.         final org.drip.param.valuation.ValuationParams valParams,
  11054.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11055.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11056.         final int iWorkoutDate,
  11057.         final double dblWorkoutFactor,
  11058.         final double dblCreditBasis)
  11059.         throws java.lang.Exception
  11060.     {
  11061.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  11062.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  11063.     }

  11064.     @Override public double yieldFromCreditBasis (
  11065.         final org.drip.param.valuation.ValuationParams valParams,
  11066.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11067.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11068.         final double dblCreditBasis)
  11069.         throws java.lang.Exception
  11070.     {
  11071.         return yieldFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  11072.     }

  11073.     @Override public double yieldFromCreditBasisToOptimalExercise (
  11074.         final org.drip.param.valuation.ValuationParams valParams,
  11075.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11076.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11077.         final double dblCreditBasis)
  11078.         throws java.lang.Exception
  11079.     {
  11080.         if (null != _eosCall || null != _eosPut)
  11081.             throw new java.lang.Exception ("BondComponent::yieldFromCreditBasisToOptimalExercise => " +
  11082.                 "Cant calc Yield from Credit Basis to optimal exercise for bonds w emb option");

  11083.         return yieldFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  11084.     }

  11085.     @Override public double yieldFromDiscountMargin (
  11086.         final org.drip.param.valuation.ValuationParams valParams,
  11087.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11088.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11089.         final int iWorkoutDate,
  11090.         final double dblWorkoutFactor,
  11091.         final double dblDiscountMargin)
  11092.         throws java.lang.Exception
  11093.     {
  11094.         if (null == valParams || null == csqc || !org.drip.numerical.common.NumberUtil.IsValid (dblWorkoutFactor)
  11095.             || !org.drip.numerical.common.NumberUtil.IsValid (dblDiscountMargin))
  11096.             throw new java.lang.Exception ("BondComponent::yieldFromDiscountMargin => Invalid inputs");

  11097.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  11098.         if (null == dcFunding)
  11099.             throw new java.lang.Exception ("BondComponent::yieldFromDiscountMargin => Invalid inputs");

  11100.         int iValueDate = valParams.valueDate();

  11101.         int iFreq = freq();

  11102.         org.drip.analytics.cashflow.CompositePeriod cp = currentPeriod (iValueDate);

  11103.         if (null == cp)
  11104.             throw new java.lang.Exception ("BondComponent::yieldFromDiscountMargin => Invalid inputs");

  11105.         return null == _floaterSetting || !(cp instanceof
  11106.             org.drip.analytics.cashflow.CompositeFloatingPeriod) ? dblDiscountMargin + dcFunding.libor
  11107.                 (iValueDate, ((int) (12. / (0 == iFreq ? 2 : iFreq))) + "M") : dblDiscountMargin + indexRate
  11108.                     (iValueDate, csqc, (org.drip.analytics.cashflow.CompositeFloatingPeriod) currentPeriod
  11109.                         (iValueDate));
  11110.     }

  11111.     @Override public double yieldFromDiscountMargin (
  11112.         final org.drip.param.valuation.ValuationParams valParams,
  11113.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11114.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11115.         final double dblDiscountMargin)
  11116.         throws java.lang.Exception
  11117.     {
  11118.         return yieldFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  11119.             dblDiscountMargin);
  11120.     }

  11121.     @Override public double yieldFromDiscountMarginToOptimalExercise (
  11122.         final org.drip.param.valuation.ValuationParams valParams,
  11123.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11124.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11125.         final double dblDiscountMargin)
  11126.         throws java.lang.Exception
  11127.     {
  11128.         return yieldFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  11129.             dblDiscountMargin);
  11130.     }

  11131.     @Override public double yieldFromESpread (
  11132.         final org.drip.param.valuation.ValuationParams valParams,
  11133.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11134.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11135.         final int iWorkoutDate,
  11136.         final double dblWorkoutFactor,
  11137.         final double dblESpread)
  11138.         throws java.lang.Exception
  11139.     {
  11140.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZeroCurve
  11141.             (valParams, csqc, vcp, ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE, iWorkoutDate,
  11142.                 dblWorkoutFactor, dblESpread));
  11143.     }

  11144.     @Override public double yieldFromESpread (
  11145.         final org.drip.param.valuation.ValuationParams valParams,
  11146.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11147.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11148.         final double dblESpread)
  11149.         throws java.lang.Exception
  11150.     {
  11151.         return yieldFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  11152.     }

  11153.     @Override public double yieldFromESpreadToOptimalExercise (
  11154.         final org.drip.param.valuation.ValuationParams valParams,
  11155.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11156.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11157.         final double dblESpread)
  11158.         throws java.lang.Exception
  11159.     {
  11160.         if (null != _eosCall || null != _eosPut)
  11161.             throw new java.lang.Exception ("BondComponent::yieldFromESpreadToOptimalExercise => " +
  11162.                 "Cant calc Yield from E Spread to optimal exercise for bonds w emb option");

  11163.         return yieldFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  11164.     }

  11165.     @Override public double yieldFromGSpread (
  11166.         final org.drip.param.valuation.ValuationParams valParams,
  11167.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11168.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11169.         final int iWorkoutDate,
  11170.         final double dblWorkoutFactor,
  11171.         final double dblGSpread)
  11172.         throws java.lang.Exception
  11173.     {
  11174.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblGSpread) || valParams.valueDate() >= iWorkoutDate
  11175.             || null == csqc)
  11176.             throw new java.lang.Exception ("BondComponent::yieldFromGSpread => Invalid Inputs");

  11177.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());

  11178.         if (null == gc) throw new java.lang.Exception ("BondComponent::yieldFromGSpread => Invalid Inputs");

  11179.         return gc.yield (iWorkoutDate) + dblGSpread;
  11180.     }

  11181.     @Override public double yieldFromGSpread (
  11182.         final org.drip.param.valuation.ValuationParams valParams,
  11183.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11184.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11185.         final double dblGSpread)
  11186.         throws java.lang.Exception
  11187.     {
  11188.         return yieldFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  11189.     }

  11190.     @Override public double yieldFromGSpreadToOptimalExercise (
  11191.         final org.drip.param.valuation.ValuationParams valParams,
  11192.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11193.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11194.         final double dblGSpread)
  11195.         throws java.lang.Exception
  11196.     {
  11197.         if (null != _eosCall || null != _eosPut)
  11198.             throw new java.lang.Exception ("BondComponent::yieldFromGSpreadToOptimalExercise => " +
  11199.                 "Cant calc Yield from G Spread to optimal exercise for bonds w emb option");

  11200.         return yieldFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  11201.     }

  11202.     @Override public double yieldFromISpread (
  11203.         final org.drip.param.valuation.ValuationParams valParams,
  11204.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11205.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11206.         final int iWorkoutDate,
  11207.         final double dblWorkoutFactor,
  11208.         final double dblISpread)
  11209.         throws java.lang.Exception
  11210.     {
  11211.         if (null == valParams || valParams.valueDate() >= iWorkoutDate || null == csqc ||
  11212.             !org.drip.numerical.common.NumberUtil.IsValid (dblISpread))
  11213.             throw new java.lang.Exception ("BondComponent::yieldFromISpread => Invalid Inputs");

  11214.         org.drip.state.discount.MergedDiscountForwardCurve dc = csqc.fundingState
  11215.             (org.drip.state.identifier.FundingLabel.Standard (payCurrency()));

  11216.         if (null == dc) throw new java.lang.Exception ("BondComponent::yieldFromISpread => Invalid Inputs");

  11217.         return dc.estimateManifestMeasure ("SwapRate", iWorkoutDate) + dblISpread;
  11218.     }

  11219.     @Override public double yieldFromISpread (
  11220.         final org.drip.param.valuation.ValuationParams valParams,
  11221.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11222.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11223.         final double dblISpread)
  11224.         throws java.lang.Exception
  11225.     {
  11226.         return yieldFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  11227.     }

  11228.     @Override public double yieldFromISpreadToOptimalExercise (
  11229.         final org.drip.param.valuation.ValuationParams valParams,
  11230.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11231.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11232.         final double dblISpread)
  11233.         throws java.lang.Exception
  11234.     {
  11235.         return yieldFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  11236.     }

  11237.     @Override public double yieldFromJSpread (
  11238.         final org.drip.param.valuation.ValuationParams valParams,
  11239.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11240.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11241.         final int iWorkoutDate,
  11242.         final double dblWorkoutFactor,
  11243.         final double dblJSpread)
  11244.         throws java.lang.Exception
  11245.     {
  11246.         if (null == valParams || valParams.valueDate() >= iWorkoutDate || null == csqc ||
  11247.             !org.drip.numerical.common.NumberUtil.IsValid (dblJSpread))
  11248.             throw new java.lang.Exception ("BondComponent::yieldFromJSpread => Invalid Inputs");

  11249.         org.drip.state.govvie.GovvieCurve gc = csqc.govvieState (govvieLabel());

  11250.         if (null == gc) throw new java.lang.Exception ("BondComponent::yieldFromJSpread => Invalid Inputs");

  11251.         return dblJSpread + gc.yield (weightedAverageMaturityDate (valParams, csqc, iWorkoutDate,
  11252.             dblWorkoutFactor));
  11253.     }

  11254.     @Override public double yieldFromJSpread (
  11255.         final org.drip.param.valuation.ValuationParams valParams,
  11256.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11257.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11258.         final double dblJSpread)
  11259.         throws java.lang.Exception
  11260.     {
  11261.         return yieldFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  11262.     }

  11263.     @Override public double yieldFromJSpreadToOptimalExercise (
  11264.         final org.drip.param.valuation.ValuationParams valParams,
  11265.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11266.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11267.         final double dblJSpread)
  11268.         throws java.lang.Exception
  11269.     {
  11270.         return yieldFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  11271.     }

  11272.     @Override public double yieldFromNSpread (
  11273.         final org.drip.param.valuation.ValuationParams valParams,
  11274.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11275.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11276.         final int iWorkoutDate,
  11277.         final double dblWorkoutFactor,
  11278.         final double dblNSpread)
  11279.         throws java.lang.Exception
  11280.     {
  11281.         if (null == valParams || valParams.valueDate() >= iWorkoutDate || null == csqc ||
  11282.             !org.drip.numerical.common.NumberUtil.IsValid (dblNSpread))
  11283.             throw new java.lang.Exception ("BondComponent::yieldFromNSpread => Invalid Inputs");

  11284.         org.drip.state.discount.MergedDiscountForwardCurve dc = csqc.fundingState
  11285.             (org.drip.state.identifier.FundingLabel.Standard (payCurrency()));

  11286.         if (null == dc) throw new java.lang.Exception ("BondComponent::yieldFromNSpread => Invalid Inputs");

  11287.         return dc.proxyManifestMeasure ("SwapRate", iWorkoutDate) + dblNSpread;
  11288.     }

  11289.     @Override public double yieldFromNSpread (
  11290.         final org.drip.param.valuation.ValuationParams valParams,
  11291.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11292.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11293.         final double dblNSpread)
  11294.         throws java.lang.Exception
  11295.     {
  11296.         return yieldFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  11297.     }

  11298.     @Override public double yieldFromNSpreadToOptimalExercise (
  11299.         final org.drip.param.valuation.ValuationParams valParams,
  11300.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11301.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11302.         final double dblNSpread)
  11303.         throws java.lang.Exception
  11304.     {
  11305.         return yieldFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  11306.     }

  11307.     @Override public double yieldFromOAS (
  11308.         final org.drip.param.valuation.ValuationParams valParams,
  11309.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11310.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11311.         final int iWorkoutDate,
  11312.         final double dblWorkoutFactor,
  11313.         final double dblOAS)
  11314.         throws java.lang.Exception
  11315.     {
  11316.         return yieldFromOAS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS (valParams,
  11317.             csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  11318.     }

  11319.     @Override public double yieldFromOAS (
  11320.         final org.drip.param.valuation.ValuationParams valParams,
  11321.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11322.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11323.         final double dblOAS)
  11324.         throws java.lang.Exception
  11325.     {
  11326.         return yieldFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  11327.     }

  11328.     @Override public double yieldFromOASToOptimalExercise (
  11329.         final org.drip.param.valuation.ValuationParams valParams,
  11330.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11331.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11332.         final double dblOAS)
  11333.         throws java.lang.Exception
  11334.     {
  11335.         if (null != _eosCall || null != _eosPut)
  11336.             throw new java.lang.Exception ("BondComponent::yieldFromOASToOptimalExercise => " +
  11337.                 "Cant calc Yield from OAS to optimal exercise for bonds w emb option");

  11338.         return yieldFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  11339.     }

  11340.     @Override public double yieldFromPECS (
  11341.         final org.drip.param.valuation.ValuationParams valParams,
  11342.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11343.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11344.         final int iWorkoutDate,
  11345.         final double dblWorkoutFactor,
  11346.         final double dblPECS)
  11347.         throws java.lang.Exception
  11348.     {
  11349.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  11350.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  11351.     }

  11352.     @Override public double yieldFromPECS (
  11353.         final org.drip.param.valuation.ValuationParams valParams,
  11354.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11355.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11356.         final double dblPECS)
  11357.         throws java.lang.Exception
  11358.     {
  11359.         return yieldFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  11360.     }

  11361.     @Override public double yieldFromPECSToOptimalExercise (
  11362.         final org.drip.param.valuation.ValuationParams valParams,
  11363.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11364.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11365.         final double dblPECS)
  11366.         throws java.lang.Exception
  11367.     {
  11368.         if (null != _eosCall || null != _eosPut)
  11369.             throw new java.lang.Exception ("BondComponent::yieldFromPECSToOptimalExercise => " +
  11370.                 "Cant calc Yield from PECS to optimal exercise for bonds w emb option");

  11371.         return yieldFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  11372.     }

  11373.     @Override public double yieldFromPrice (
  11374.         final org.drip.param.valuation.ValuationParams valParams,
  11375.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11376.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11377.         final int iWorkoutDate,
  11378.         final double dblWorkoutFactor,
  11379.         final double dblPrice)
  11380.         throws java.lang.Exception
  11381.     {
  11382.         return new BondCalibrator (this, false).calibrateYieldFromPrice (valParams, csqc, vcp, iWorkoutDate,
  11383.             dblWorkoutFactor, dblPrice);
  11384.     }

  11385.     @Override public double yieldFromPrice (
  11386.         final org.drip.param.valuation.ValuationParams valParams,
  11387.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11388.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11389.         final double dblPrice)
  11390.         throws java.lang.Exception
  11391.     {
  11392.         return yieldFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11393.     }

  11394.     @Override public double yieldFromPriceToOptimalExercise (
  11395.         final org.drip.param.valuation.ValuationParams valParams,
  11396.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11397.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11398.         final double dblPrice)
  11399.         throws java.lang.Exception
  11400.     {
  11401.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  11402.         if (null == wi)
  11403.             throw new java.lang.Exception ("BondComponent::yieldFromPriceToOptimalExercise => " +
  11404.                 "Cant calc Workout from Price to optimal exercise for bonds w emb option");

  11405.         return wi.yield();
  11406.     }

  11407.     @Override public double yieldFromPriceTC (
  11408.         final org.drip.param.valuation.ValuationParams valParams,
  11409.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11410.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11411.         final int iWorkoutDate,
  11412.         final double dblWorkoutFactor,
  11413.         final double dblPrice)
  11414.         throws java.lang.Exception
  11415.     {
  11416.         return new BondCalibrator (this, true).calibrateYieldFromPrice (valParams, csqc, vcp, iWorkoutDate,
  11417.             dblWorkoutFactor, dblPrice);
  11418.     }

  11419.     @Override public double yieldFromTSYSpread (
  11420.         final org.drip.param.valuation.ValuationParams valParams,
  11421.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11422.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11423.         final int iWorkoutDate,
  11424.         final double dblWorkoutFactor,
  11425.         final double dblTSYSpread)
  11426.         throws java.lang.Exception
  11427.     {
  11428.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblTSYSpread) || valParams.valueDate() >=
  11429.             iWorkoutDate)
  11430.             throw new java.lang.Exception ("BondComponent::calcYieldFromTSYSpread => Invalid Inputs");

  11431.         return treasuryBenchmarkYield (valParams, csqc, iWorkoutDate) + dblTSYSpread;
  11432.     }

  11433.     @Override public double yieldFromTSYSpread (
  11434.         final org.drip.param.valuation.ValuationParams valParams,
  11435.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11436.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11437.         final double dblPrice)
  11438.         throws java.lang.Exception
  11439.     {
  11440.         return yieldFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11441.     }

  11442.     @Override public double yieldFromTSYSpreadToOptimalExercise (
  11443.         final org.drip.param.valuation.ValuationParams valParams,
  11444.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11445.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11446.         final double dblPrice)
  11447.         throws java.lang.Exception
  11448.     {
  11449.         if (null != _eosCall || null != _eosPut)
  11450.             throw new java.lang.Exception ("BondComponent::yieldFromTSYSpreadToOptimalExercise => " +
  11451.                 "Cant calc Yield from TSY Spread to optimal exercise for bonds w emb option");

  11452.         return yieldFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11453.     }

  11454.     @Override public double yieldFromYieldSpread (
  11455.         final org.drip.param.valuation.ValuationParams valParams,
  11456.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11457.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11458.         final int iWorkoutDate,
  11459.         final double dblWorkoutFactor,
  11460.         final double dblYieldSpread)
  11461.         throws java.lang.Exception
  11462.     {
  11463.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblYieldSpread) || valParams.valueDate() >=
  11464.             iWorkoutDate)
  11465.             throw new java.lang.Exception ("BondComponent::yieldFromYieldSpread => Invalid Inputs");

  11466.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromFundingCurve
  11467.             (valParams, csqc, iWorkoutDate, dblWorkoutFactor, 0.)) + dblYieldSpread;
  11468.     }

  11469.     @Override public double yieldFromYieldSpread (
  11470.         final org.drip.param.valuation.ValuationParams valParams,
  11471.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11472.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11473.         final double dblYieldSpread)
  11474.         throws java.lang.Exception
  11475.     {
  11476.         return yieldFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  11477.     }

  11478.     @Override public double yieldFromYieldSpreadToOptimalExercise (
  11479.         final org.drip.param.valuation.ValuationParams valParams,
  11480.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11481.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11482.         final double dblYieldSpread)
  11483.         throws java.lang.Exception
  11484.     {
  11485.         if (null != _eosCall || null != _eosPut)
  11486.             throw new java.lang.Exception ("BondComponent::yieldFromYieldSpreadToOptimalExercise => " +
  11487.                 "Cant calc Yield from Yield Spread to optimal exercise for bonds w emb option");

  11488.         return yieldFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  11489.     }

  11490.     @Override public double yieldFromZSpread (
  11491.         final org.drip.param.valuation.ValuationParams valParams,
  11492.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11493.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11494.         final int iWorkoutDate,
  11495.         final double dblWorkoutFactor,
  11496.         final double dblZSpread)
  11497.         throws java.lang.Exception
  11498.     {
  11499.         return yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromZeroCurve
  11500.             (valParams, csqc, vcp, ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE, iWorkoutDate,
  11501.                 dblWorkoutFactor, dblZSpread));
  11502.     }

  11503.     @Override public double yieldFromZSpread (
  11504.         final org.drip.param.valuation.ValuationParams valParams,
  11505.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11506.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11507.         final double dblZSpread)
  11508.         throws java.lang.Exception
  11509.     {
  11510.         return yieldFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  11511.     }

  11512.     @Override public double yieldFromZSpreadToOptimalExercise (
  11513.         final org.drip.param.valuation.ValuationParams valParams,
  11514.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11515.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11516.         final double dblZSpread)
  11517.         throws java.lang.Exception
  11518.     {
  11519.         if (null != _eosCall || null != _eosPut)
  11520.             throw new java.lang.Exception ("BondComponent::yieldFromZSpreadToOptimalExercise => " +
  11521.                 "Cant calc Yield from Z Spread to optimal exercise for bonds w emb option");

  11522.         return yieldFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  11523.     }

  11524.     @Override public double yield01FromASW (
  11525.         final org.drip.param.valuation.ValuationParams valParams,
  11526.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11527.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11528.         final int iWorkoutDate,
  11529.         final double dblWorkoutFactor,
  11530.         final double dblASW)
  11531.         throws java.lang.Exception
  11532.     {
  11533.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  11534.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  11535.     }

  11536.     @Override public double yield01FromASW (
  11537.         final org.drip.param.valuation.ValuationParams valParams,
  11538.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11539.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11540.         final double dblASW)
  11541.         throws java.lang.Exception
  11542.     {
  11543.         return yield01FromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  11544.     }

  11545.     @Override public double yield01FromASWToOptimalExercise (
  11546.         final org.drip.param.valuation.ValuationParams valParams,
  11547.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11548.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11549.         final double dblASW)
  11550.         throws java.lang.Exception
  11551.     {
  11552.         if (null != _eosCall || null != _eosPut)
  11553.             throw new java.lang.Exception ("BondComponent::yield01FromASWToOptimalExercise => " +
  11554.                 "Cant calc Yield from ASW to optimal exercise for bonds w emb option");

  11555.         return yield01FromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  11556.     }

  11557.     @Override public double yield01FromBondBasis (
  11558.         final org.drip.param.valuation.ValuationParams valParams,
  11559.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11560.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11561.         final int iWorkoutDate,
  11562.         final double dblWorkoutFactor,
  11563.         final double dblBondBasis)
  11564.         throws java.lang.Exception
  11565.     {
  11566.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromBondBasis
  11567.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  11568.     }

  11569.     @Override public double yield01FromBondBasis (
  11570.         final org.drip.param.valuation.ValuationParams valParams,
  11571.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11572.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11573.         final double dblBondBasis)
  11574.         throws java.lang.Exception
  11575.     {
  11576.         return yieldFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  11577.     }

  11578.     @Override public double yield01FromBondBasisToOptimalExercise (
  11579.         final org.drip.param.valuation.ValuationParams valParams,
  11580.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11581.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11582.         final double dblBondBasis)
  11583.         throws java.lang.Exception
  11584.     {
  11585.         if (null != _eosCall || null != _eosPut)
  11586.             throw new java.lang.Exception ("BondComponent::yield01FromBondBasisToOptimalExercise => " +
  11587.                 "Cant calc Yield01 from Bond Basis to optimal exercise for bonds w emb option");

  11588.         return yield01FromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  11589.     }

  11590.     @Override public double yield01FromCreditBasis (
  11591.         final org.drip.param.valuation.ValuationParams valParams,
  11592.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11593.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11594.         final int iWorkoutDate,
  11595.         final double dblWorkoutFactor,
  11596.         final double dblCreditBasis)
  11597.         throws java.lang.Exception
  11598.     {
  11599.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromCreditBasis
  11600.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  11601.     }

  11602.     @Override public double yield01FromCreditBasis (
  11603.         final org.drip.param.valuation.ValuationParams valParams,
  11604.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11605.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11606.         final double dblCreditBasis)
  11607.         throws java.lang.Exception
  11608.     {
  11609.         return yield01FromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  11610.     }

  11611.     @Override public double yield01FromCreditBasisToOptimalExercise (
  11612.         final org.drip.param.valuation.ValuationParams valParams,
  11613.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11614.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11615.         final double dblCreditBasis)
  11616.         throws java.lang.Exception
  11617.     {
  11618.         if (null != _eosCall || null != _eosPut)
  11619.             throw new java.lang.Exception ("BondComponent::yield01FromCreditBasisToOptimalExercise => " +
  11620.                 "Cant calc Yield01 from Credit Basis to optimal exercise for bonds w emb option");

  11621.         return yield01FromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  11622.     }

  11623.     @Override public double yield01FromDiscountMargin (
  11624.         final org.drip.param.valuation.ValuationParams valParams,
  11625.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11626.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11627.         final int iWorkoutDate,
  11628.         final double dblWorkoutFactor,
  11629.         final double dblDiscountMargin)
  11630.         throws java.lang.Exception
  11631.     {
  11632.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  11633.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  11634.                 dblDiscountMargin));
  11635.     }

  11636.     @Override public double yield01FromDiscountMargin (
  11637.         final org.drip.param.valuation.ValuationParams valParams,
  11638.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11639.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11640.         final double dblDiscountMargin)
  11641.         throws java.lang.Exception
  11642.     {
  11643.         return yield01FromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  11644.             dblDiscountMargin);
  11645.     }

  11646.     @Override public double yield01FromDiscountMarginToOptimalExercise (
  11647.         final org.drip.param.valuation.ValuationParams valParams,
  11648.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11649.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11650.         final double dblDiscountMargin)
  11651.         throws java.lang.Exception
  11652.     {
  11653.         if (null != _eosCall || null != _eosPut)
  11654.             throw new java.lang.Exception ("BondComponent::yield01FromDiscountMarginToOptimalExercise =>" +
  11655.                 " Cant calc Yield01 from Discount Margin to optimal exercise for bonds w emb option");

  11656.         return yield01FromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  11657.             dblDiscountMargin);
  11658.     }

  11659.     @Override public double yield01FromESpread (
  11660.         final org.drip.param.valuation.ValuationParams valParams,
  11661.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11662.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11663.         final int iWorkoutDate,
  11664.         final double dblWorkoutFactor,
  11665.         final double dblESpread)
  11666.         throws java.lang.Exception
  11667.     {
  11668.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  11669.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  11670.     }

  11671.     @Override public double yield01FromESpread (
  11672.         final org.drip.param.valuation.ValuationParams valParams,
  11673.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11674.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11675.         final double dblESpread)
  11676.         throws java.lang.Exception
  11677.     {
  11678.         return yield01FromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  11679.     }

  11680.     @Override public double yield01FromESpreadToOptimalExercise (
  11681.         final org.drip.param.valuation.ValuationParams valParams,
  11682.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11683.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11684.         final double dblESpread)
  11685.         throws java.lang.Exception
  11686.     {
  11687.         if (null != _eosCall || null != _eosPut)
  11688.             throw new java.lang.Exception ("BondComponent::yield01FromESpreadToOptimalExercise => " +
  11689.                 "Cant calc Yield01 from E Spread to optimal exercise for bonds w emb option");

  11690.         return yield01FromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  11691.     }

  11692.     @Override public double yield01FromGSpread (
  11693.         final org.drip.param.valuation.ValuationParams valParams,
  11694.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11695.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11696.         final int iWorkoutDate,
  11697.         final double dblWorkoutFactor,
  11698.         final double dblGSpread)
  11699.         throws java.lang.Exception
  11700.     {
  11701.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  11702.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  11703.     }

  11704.     @Override public double yield01FromGSpread (
  11705.         final org.drip.param.valuation.ValuationParams valParams,
  11706.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11707.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11708.         final double dblGSpread)
  11709.         throws java.lang.Exception
  11710.     {
  11711.         return yield01FromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  11712.     }

  11713.     @Override public double yield01FromGSpreadToOptimalExercise (
  11714.         final org.drip.param.valuation.ValuationParams valParams,
  11715.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11716.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11717.         final double dblGSpread)
  11718.         throws java.lang.Exception
  11719.     {
  11720.         if (null != _eosCall || null != _eosPut)
  11721.             throw new java.lang.Exception ("BondComponent::yield01FromGSpreadToOptimalExercise => " +
  11722.                 "Cant calc Yield01 from G Spread to optimal exercise for bonds w emb option");

  11723.         return yield01FromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  11724.     }

  11725.     @Override public double yield01FromISpread (
  11726.         final org.drip.param.valuation.ValuationParams valParams,
  11727.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11728.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11729.         final int iWorkoutDate,
  11730.         final double dblWorkoutFactor,
  11731.         final double dblISpread)
  11732.         throws java.lang.Exception
  11733.     {
  11734.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  11735.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  11736.     }

  11737.     @Override public double yield01FromISpread (
  11738.         final org.drip.param.valuation.ValuationParams valParams,
  11739.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11740.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11741.         final double dblISpread)
  11742.         throws java.lang.Exception
  11743.     {
  11744.         return yield01FromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  11745.     }

  11746.     @Override public double yield01FromISpreadToOptimalExercise (
  11747.         final org.drip.param.valuation.ValuationParams valParams,
  11748.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11749.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11750.         final double dblISpread)
  11751.         throws java.lang.Exception
  11752.     {
  11753.         if (null != _eosCall || null != _eosPut)
  11754.             throw new java.lang.Exception ("BondComponent::yield01FromISpreadToOptimalExercise => " +
  11755.                 "Cant calc Yield01 from I Spread to optimal exercise for bonds w emb option");

  11756.         return yield01FromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  11757.     }

  11758.     @Override public double yield01FromJSpread (
  11759.         final org.drip.param.valuation.ValuationParams valParams,
  11760.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11761.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11762.         final int iWorkoutDate,
  11763.         final double dblWorkoutFactor,
  11764.         final double dblJSpread)
  11765.         throws java.lang.Exception
  11766.     {
  11767.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  11768.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  11769.     }

  11770.     @Override public double yield01FromJSpread (
  11771.         final org.drip.param.valuation.ValuationParams valParams,
  11772.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11773.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11774.         final double dblJSpread)
  11775.         throws java.lang.Exception
  11776.     {
  11777.         return yield01FromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  11778.     }

  11779.     @Override public double yield01FromJSpreadToOptimalExercise (
  11780.         final org.drip.param.valuation.ValuationParams valParams,
  11781.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11782.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11783.         final double dblJSpread)
  11784.         throws java.lang.Exception
  11785.     {
  11786.         if (null != _eosCall || null != _eosPut)
  11787.             throw new java.lang.Exception ("BondComponent::yield01FromJSpreadToOptimalExercise => " +
  11788.                 "Cant calc Yield01 from J Spread to optimal exercise for bonds w emb option");

  11789.         return yield01FromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  11790.     }

  11791.     @Override public double yield01FromOAS (
  11792.         final org.drip.param.valuation.ValuationParams valParams,
  11793.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11794.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11795.         final int iWorkoutDate,
  11796.         final double dblWorkoutFactor,
  11797.         final double dblOAS)
  11798.         throws java.lang.Exception
  11799.     {
  11800.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  11801.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  11802.     }

  11803.     @Override public double yield01FromOAS (
  11804.         final org.drip.param.valuation.ValuationParams valParams,
  11805.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11806.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11807.         final double dblOAS)
  11808.         throws java.lang.Exception
  11809.     {
  11810.         return yield01FromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  11811.     }

  11812.     @Override public double yield01FromOASToOptimalExercise (
  11813.         final org.drip.param.valuation.ValuationParams valParams,
  11814.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11815.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11816.         final double dblOAS)
  11817.         throws java.lang.Exception
  11818.     {
  11819.         if (null != _eosCall || null != _eosPut)
  11820.             throw new java.lang.Exception ("BondComponent::yield01FromOASToOptimalExercise => " +
  11821.                 "Cant calc Yield01 from OAS to optimal exercise for bonds w emb option");

  11822.         return yield01FromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  11823.     }

  11824.     @Override public double yield01FromPECS (
  11825.         final org.drip.param.valuation.ValuationParams valParams,
  11826.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11827.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11828.         final int iWorkoutDate,
  11829.         final double dblWorkoutFactor,
  11830.         final double dblPECS)
  11831.         throws java.lang.Exception
  11832.     {
  11833.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  11834.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  11835.     }

  11836.     @Override public double yield01FromPECS (
  11837.         final org.drip.param.valuation.ValuationParams valParams,
  11838.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11839.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11840.         final double dblPECS)
  11841.         throws java.lang.Exception
  11842.     {
  11843.         return yield01FromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  11844.     }

  11845.     @Override public double yield01FromPECSToOptimalExercise (
  11846.         final org.drip.param.valuation.ValuationParams valParams,
  11847.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11848.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11849.         final double dblPECS)
  11850.         throws java.lang.Exception
  11851.     {
  11852.         if (null != _eosCall || null != _eosPut)
  11853.             throw new java.lang.Exception ("BondComponent::yield01FromPECSToOptimalExercise => " +
  11854.                 "Cant calc Yield01 from PECS to optimal exercise for bonds w emb option");

  11855.         return yield01FromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  11856.     }

  11857.     @Override public double yield01FromPrice (
  11858.         final org.drip.param.valuation.ValuationParams valParams,
  11859.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11860.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11861.         final int iWorkoutDate,
  11862.         final double dblWorkoutFactor,
  11863.         final double dblPrice)
  11864.         throws java.lang.Exception
  11865.     {
  11866.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  11867.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  11868.     }

  11869.     @Override public double yield01FromPrice (
  11870.         final org.drip.param.valuation.ValuationParams valParams,
  11871.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11872.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11873.         final double dblPrice)
  11874.         throws java.lang.Exception
  11875.     {
  11876.         return yield01FromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11877.     }

  11878.     @Override public double yield01FromPriceToOptimalExercise (
  11879.         final org.drip.param.valuation.ValuationParams valParams,
  11880.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11881.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11882.         final double dblPrice)
  11883.         throws java.lang.Exception
  11884.     {
  11885.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  11886.         if (null == wi)
  11887.             throw new java.lang.Exception ("BondComponent::yield01FromPriceToOptimalExercise => " +
  11888.                 "Cant calc Workout from Price to optimal exercise for bonds w emb option");

  11889.         return yield01FromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  11890.     }

  11891.     @Override public double yield01FromTSYSpread (
  11892.         final org.drip.param.valuation.ValuationParams valParams,
  11893.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11894.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11895.         final int iWorkoutDate,
  11896.         final double dblWorkoutFactor,
  11897.         final double dblTSYSpread)
  11898.         throws java.lang.Exception
  11899.     {
  11900.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromTSYSpread
  11901.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  11902.     }

  11903.     @Override public double yield01FromTSYSpread (
  11904.         final org.drip.param.valuation.ValuationParams valParams,
  11905.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11906.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11907.         final double dblPrice)
  11908.         throws java.lang.Exception
  11909.     {
  11910.         return yield01FromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11911.     }

  11912.     @Override public double yield01FromTSYSpreadToOptimalExercise (
  11913.         final org.drip.param.valuation.ValuationParams valParams,
  11914.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11915.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11916.         final double dblPrice)
  11917.         throws java.lang.Exception
  11918.     {
  11919.         if (null != _eosCall || null != _eosPut)
  11920.             throw new java.lang.Exception ("BondComponent::yield01FromTSYSpreadToOptimalExercise => " +
  11921.                 "Cant calc Yield01 from TSY Spread to optimal exercise for bonds w emb option");

  11922.         return yield01FromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  11923.     }

  11924.     @Override public double yield01FromYield (
  11925.         final org.drip.param.valuation.ValuationParams valParams,
  11926.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11927.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11928.         final int iWorkoutDate,
  11929.         final double dblWorkoutFactor,
  11930.         final double dblYield)
  11931.         throws java.lang.Exception
  11932.     {
  11933.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  11934.             throw new java.lang.Exception ("BondComponent::yield01FromYield => Invalid Inputs");

  11935.         return priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield) -
  11936.             priceFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield + 0.0001);
  11937.     }

  11938.     @Override public double yield01FromYield (
  11939.         final org.drip.param.valuation.ValuationParams valParams,
  11940.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11941.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11942.         final double dblYield)
  11943.         throws java.lang.Exception
  11944.     {
  11945.         return yield01FromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  11946.     }

  11947.     @Override public double yield01FromYieldToOptimalExercise (
  11948.         final org.drip.param.valuation.ValuationParams valParams,
  11949.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11950.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11951.         final double dblYield)
  11952.         throws java.lang.Exception
  11953.     {
  11954.         if (null != _eosCall || null != _eosPut)
  11955.             throw new java.lang.Exception ("BondComponent::yield01FromYieldToOptimalExercise => " +
  11956.                 "Cant calc Yield01 from Yield to optimal exercise for bonds w emb option");

  11957.         return yield01FromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  11958.     }

  11959.     @Override public double yield01FromYieldSpread (
  11960.         final org.drip.param.valuation.ValuationParams valParams,
  11961.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11962.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11963.         final int iWorkoutDate,
  11964.         final double dblWorkoutFactor,
  11965.         final double dblYieldSpread)
  11966.         throws java.lang.Exception
  11967.     {
  11968.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromYieldSpread
  11969.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  11970.     }

  11971.     @Override public double yield01FromYieldSpread (
  11972.         final org.drip.param.valuation.ValuationParams valParams,
  11973.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11974.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11975.         final double dblYieldSpread)
  11976.         throws java.lang.Exception
  11977.     {
  11978.         return yield01FromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  11979.     }

  11980.     @Override public double yield01FromYieldSpreadToOptimalExercise (
  11981.         final org.drip.param.valuation.ValuationParams valParams,
  11982.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11983.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11984.         final double dblYieldSpread)
  11985.         throws java.lang.Exception
  11986.     {
  11987.         if (null != _eosCall || null != _eosPut)
  11988.             throw new java.lang.Exception ("BondComponent::yield01FromYieldSpreadToOptimalExercise => " +
  11989.                 "Cant calc Yield01 from Yield Spread to optimal exercise for bonds w emb option");

  11990.         return yield01FromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  11991.     }

  11992.     @Override public double yield01FromZSpread (
  11993.         final org.drip.param.valuation.ValuationParams valParams,
  11994.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  11995.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  11996.         final int iWorkoutDate,
  11997.         final double dblWorkoutFactor,
  11998.         final double dblZSpread)
  11999.         throws java.lang.Exception
  12000.     {
  12001.         return yield01FromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  12002.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  12003.     }

  12004.     @Override public double yield01FromZSpread (
  12005.         final org.drip.param.valuation.ValuationParams valParams,
  12006.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12007.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12008.         final double dblZSpread)
  12009.         throws java.lang.Exception
  12010.     {
  12011.         return yield01FromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  12012.     }

  12013.     @Override public double yield01FromZSpreadToOptimalExercise (
  12014.         final org.drip.param.valuation.ValuationParams valParams,
  12015.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12016.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12017.         final double dblZSpread)
  12018.         throws java.lang.Exception
  12019.     {
  12020.         if (null != _eosCall || null != _eosPut)
  12021.             throw new java.lang.Exception ("BondComponent::yield01FromZSpreadToOptimalExercise => " +
  12022.                 "Cant calc Yield01 from Z Spread to optimal exercise for bonds w emb option");

  12023.         return yield01FromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  12024.     }

  12025.     @Override public double yieldSpreadFromASW (
  12026.         final org.drip.param.valuation.ValuationParams valParams,
  12027.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12028.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12029.         final int iWorkoutDate,
  12030.         final double dblWorkoutFactor,
  12031.         final double dblASW)
  12032.         throws java.lang.Exception
  12033.     {
  12034.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromASW
  12035.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  12036.     }

  12037.     @Override public double yieldSpreadFromASW (
  12038.         final org.drip.param.valuation.ValuationParams valParams,
  12039.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12040.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12041.         final double dblASW)
  12042.         throws java.lang.Exception
  12043.     {
  12044.         return yieldSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  12045.     }

  12046.     @Override public double yieldSpreadFromASWToOptimalExercise (
  12047.         final org.drip.param.valuation.ValuationParams valParams,
  12048.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12049.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12050.         final double dblASW)
  12051.         throws java.lang.Exception
  12052.     {
  12053.         if (null != _eosCall || null != _eosPut)
  12054.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromASWToOptimalExercise => " +
  12055.                 "Cant calc Yield Spread from ASW to optimal exercise for bonds w emb option");

  12056.         return yieldSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  12057.     }

  12058.     @Override public double yieldSpreadFromBondBasis (
  12059.         final org.drip.param.valuation.ValuationParams valParams,
  12060.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12061.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12062.         final int iWorkoutDate,
  12063.         final double dblWorkoutFactor,
  12064.         final double dblBondBasis)
  12065.         throws java.lang.Exception
  12066.     {
  12067.         return yieldSpreadFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12068.             yieldFromBondBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  12069.     }

  12070.     @Override public double yieldSpreadFromBondBasis (
  12071.         final org.drip.param.valuation.ValuationParams valParams,
  12072.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12073.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12074.         final double dblBondBasis)
  12075.         throws java.lang.Exception
  12076.     {
  12077.         return yieldSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  12078.     }

  12079.     @Override public double yieldSpreadFromBondBasisToOptimalExercise (
  12080.         final org.drip.param.valuation.ValuationParams valParams,
  12081.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12082.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12083.         final double dblBondBasis)
  12084.         throws java.lang.Exception
  12085.     {
  12086.         if (null != _eosCall || null != _eosPut)
  12087.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromBondBasisToOptimalExercise => "
  12088.                 + "Cant calc Yield Spread from Bond Basis to optimal exercise for bonds w emb option");

  12089.         return yieldSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  12090.     }

  12091.     @Override public double yieldSpreadFromCreditBasis (
  12092.         final org.drip.param.valuation.ValuationParams valParams,
  12093.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12094.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12095.         final int iWorkoutDate,
  12096.         final double dblWorkoutFactor,
  12097.         final double dblCreditBasis)
  12098.         throws java.lang.Exception
  12099.     {
  12100.         return yieldSpreadFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12101.             yieldFromCreditBasis (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  12102.     }

  12103.     @Override public double yieldSpreadFromCreditBasis (
  12104.         final org.drip.param.valuation.ValuationParams valParams,
  12105.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12106.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12107.         final double dblCreditBasis)
  12108.         throws java.lang.Exception
  12109.     {
  12110.         return yieldSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12111.             dblCreditBasis);
  12112.     }

  12113.     @Override public double yieldSpreadFromCreditBasisToOptimalExercise (
  12114.         final org.drip.param.valuation.ValuationParams valParams,
  12115.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12116.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12117.         final double dblCreditBasis)
  12118.         throws java.lang.Exception
  12119.     {
  12120.         if (null != _eosCall || null != _eosPut)
  12121.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromCreditBasisToOptimalExercise " +
  12122.                 "=> Cant calc Yield Spread from Credit Basis to optimal exercise for bonds w emb option");

  12123.         return yieldSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12124.             dblCreditBasis);
  12125.     }

  12126.     @Override public double yieldSpreadFromDiscountMargin (
  12127.         final org.drip.param.valuation.ValuationParams valParams,
  12128.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12129.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12130.         final int iWorkoutDate,
  12131.         final double dblWorkoutFactor,
  12132.         final double dblDiscountMargin)
  12133.         throws java.lang.Exception
  12134.     {
  12135.         return yieldSpreadFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12136.             yieldFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12137.                 dblDiscountMargin));
  12138.     }

  12139.     @Override public double yieldSpreadFromDiscountMargin (
  12140.         final org.drip.param.valuation.ValuationParams valParams,
  12141.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12142.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12143.         final double dblDiscountMargin)
  12144.         throws java.lang.Exception
  12145.     {
  12146.         return yieldSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12147.             dblDiscountMargin);
  12148.     }

  12149.     @Override public double yieldSpreadFromDiscountMarginToOptimalExercise (
  12150.         final org.drip.param.valuation.ValuationParams valParams,
  12151.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12152.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12153.         final double dblDiscountMargin)
  12154.         throws java.lang.Exception
  12155.     {
  12156.         if (null != _eosCall || null != _eosPut)
  12157.             throw new java.lang.Exception
  12158.                 ("BondComponent::yieldSpreadFromDiscountMarginToOptimalExercise => " +
  12159.                     "Cant calc Yield Spread from Disc Margin to optimal exercise for bonds w emb option");

  12160.         return yieldSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12161.             dblDiscountMargin);
  12162.     }

  12163.     @Override public double yieldSpreadFromESpread (
  12164.         final org.drip.param.valuation.ValuationParams valParams,
  12165.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12166.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12167.         final int iWorkoutDate,
  12168.         final double dblWorkoutFactor,
  12169.         final double dblESpread)
  12170.         throws java.lang.Exception
  12171.     {
  12172.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromESpread
  12173.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblESpread));
  12174.     }

  12175.     @Override public double yieldSpreadFromESpread (
  12176.         final org.drip.param.valuation.ValuationParams valParams,
  12177.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12178.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12179.         final double dblESpread)
  12180.         throws java.lang.Exception
  12181.     {
  12182.         return yieldSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  12183.     }

  12184.     @Override public double yieldSpreadFromESpreadToOptimalExercise (
  12185.         final org.drip.param.valuation.ValuationParams valParams,
  12186.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12187.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12188.         final double dblESpread)
  12189.         throws java.lang.Exception
  12190.     {
  12191.         if (null != _eosCall || null != _eosPut)
  12192.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromESpreadToOptimalExercise => " +
  12193.                 "Cant calc Yield Spread from E Spread to optimal exercise for bonds w emb option");

  12194.         return yieldSpreadFromESpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblESpread);
  12195.     }

  12196.     @Override public double yieldSpreadFromGSpread (
  12197.         final org.drip.param.valuation.ValuationParams valParams,
  12198.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12199.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12200.         final int iWorkoutDate,
  12201.         final double dblWorkoutFactor,
  12202.         final double dblGSpread)
  12203.         throws java.lang.Exception
  12204.     {
  12205.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromGSpread
  12206.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  12207.     }

  12208.     @Override public double yieldSpreadFromGSpread (
  12209.         final org.drip.param.valuation.ValuationParams valParams,
  12210.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12211.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12212.         final double dblGSpread)
  12213.         throws java.lang.Exception
  12214.     {
  12215.         return yieldSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  12216.     }

  12217.     @Override public double yieldSpreadFromGSpreadToOptimalExercise (
  12218.         final org.drip.param.valuation.ValuationParams valParams,
  12219.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12220.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12221.         final double dblGSpread)
  12222.         throws java.lang.Exception
  12223.     {
  12224.         if (null != _eosCall || null != _eosPut)
  12225.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromGSpreadToOptimalExercise => " +
  12226.                 "Cant calc Yield Spread from G Spread to optimal exercise for bonds w emb option");

  12227.         return yieldSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  12228.     }

  12229.     @Override public double yieldSpreadFromISpread (
  12230.         final org.drip.param.valuation.ValuationParams valParams,
  12231.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12232.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12233.         final int iWorkoutDate,
  12234.         final double dblWorkoutFactor,
  12235.         final double dblISpread)
  12236.         throws java.lang.Exception
  12237.     {
  12238.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromISpread
  12239.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  12240.     }

  12241.     @Override public double yieldSpreadFromISpread (
  12242.         final org.drip.param.valuation.ValuationParams valParams,
  12243.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12244.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12245.         final double dblISpread)
  12246.         throws java.lang.Exception
  12247.     {
  12248.         return yieldSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  12249.     }

  12250.     @Override public double yieldSpreadFromISpreadToOptimalExercise (
  12251.         final org.drip.param.valuation.ValuationParams valParams,
  12252.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12253.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12254.         final double dblISpread)
  12255.         throws java.lang.Exception
  12256.     {
  12257.         if (null != _eosCall || null != _eosPut)
  12258.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromISpreadToOptimalExercise => " +
  12259.                 "Cant calc Yield Spread from I Spread to optimal exercise for bonds w emb option");

  12260.         return yieldSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  12261.     }

  12262.     @Override public double yieldSpreadFromJSpread (
  12263.         final org.drip.param.valuation.ValuationParams valParams,
  12264.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12265.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12266.         final int iWorkoutDate,
  12267.         final double dblWorkoutFactor,
  12268.         final double dblJSpread)
  12269.         throws java.lang.Exception
  12270.     {
  12271.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromJSpread
  12272.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  12273.     }

  12274.     @Override public double yieldSpreadFromJSpread (
  12275.         final org.drip.param.valuation.ValuationParams valParams,
  12276.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12277.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12278.         final double dblJSpread)
  12279.         throws java.lang.Exception
  12280.     {
  12281.         return yieldSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  12282.     }

  12283.     @Override public double yieldSpreadFromJSpreadToOptimalExercise (
  12284.         final org.drip.param.valuation.ValuationParams valParams,
  12285.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12286.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12287.         final double dblJSpread)
  12288.         throws java.lang.Exception
  12289.     {
  12290.         if (null != _eosCall || null != _eosPut)
  12291.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromJSpreadToOptimalExercise => " +
  12292.                 "Cant calc Yield Spread from J Spread to optimal exercise for bonds w emb option");

  12293.         return yieldSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  12294.     }

  12295.     @Override public double yieldSpreadFromNSpread (
  12296.         final org.drip.param.valuation.ValuationParams valParams,
  12297.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12298.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12299.         final int iWorkoutDate,
  12300.         final double dblWorkoutFactor,
  12301.         final double dblNSpread)
  12302.         throws java.lang.Exception
  12303.     {
  12304.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromNSpread
  12305.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  12306.     }

  12307.     @Override public double yieldSpreadFromNSpread (
  12308.         final org.drip.param.valuation.ValuationParams valParams,
  12309.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12310.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12311.         final double dblNSpread)
  12312.         throws java.lang.Exception
  12313.     {
  12314.         return yieldSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  12315.     }

  12316.     @Override public double yieldSpreadFromNSpreadToOptimalExercise (
  12317.         final org.drip.param.valuation.ValuationParams valParams,
  12318.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12319.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12320.         final double dblNSpread)
  12321.         throws java.lang.Exception
  12322.     {
  12323.         if (null != _eosCall || null != _eosPut)
  12324.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromNSpreadToOptimalExercise => " +
  12325.                 "Cant calc Yield Spread from N Spread to optimal exercise for bonds w emb option");

  12326.         return yieldSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  12327.     }

  12328.     @Override public double yieldSpreadFromOAS (
  12329.         final org.drip.param.valuation.ValuationParams valParams,
  12330.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12331.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12332.         final int iWorkoutDate,
  12333.         final double dblWorkoutFactor,
  12334.         final double dblOAS)
  12335.         throws java.lang.Exception
  12336.     {
  12337.         return yieldSpreadFromOAS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromOAS
  12338.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  12339.     }

  12340.     @Override public double yieldSpreadFromOAS (
  12341.         final org.drip.param.valuation.ValuationParams valParams,
  12342.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12343.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12344.         final double dblOAS)
  12345.         throws java.lang.Exception
  12346.     {
  12347.         return yieldSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  12348.     }

  12349.     @Override public double yieldSpreadFromOASToOptimalExercise (
  12350.         final org.drip.param.valuation.ValuationParams valParams,
  12351.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12352.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12353.         final double dblOAS)
  12354.         throws java.lang.Exception
  12355.     {
  12356.         if (null != _eosCall || null != _eosPut)
  12357.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromOASToOptimalExercise => " +
  12358.                 "Cant calc Yield Spread from OAS to optimal exercise for bonds w emb option");

  12359.         return yieldSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  12360.     }

  12361.     @Override public double yieldSpreadFromPECS (
  12362.         final org.drip.param.valuation.ValuationParams valParams,
  12363.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12364.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12365.         final int iWorkoutDate,
  12366.         final double dblWorkoutFactor,
  12367.         final double dblPECS)
  12368.         throws java.lang.Exception
  12369.     {
  12370.         return yieldSpreadFromPECS (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPECS
  12371.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  12372.     }

  12373.     @Override public double yieldSpreadFromPECS (
  12374.         final org.drip.param.valuation.ValuationParams valParams,
  12375.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12376.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12377.         final double dblPECS)
  12378.         throws java.lang.Exception
  12379.     {
  12380.         return yieldSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  12381.     }

  12382.     @Override public double yieldSpreadFromPECSToOptimalExercise (
  12383.         final org.drip.param.valuation.ValuationParams valParams,
  12384.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12385.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12386.         final double dblPECS)
  12387.         throws java.lang.Exception
  12388.     {
  12389.         if (null != _eosCall || null != _eosPut)
  12390.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromPECSToOptimalExercise => " +
  12391.                 "Cant calc Yield Spread from PECS to optimal exercise for bonds w emb option");

  12392.         return yieldSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  12393.     }

  12394.     @Override public double yieldSpreadFromPrice (
  12395.         final org.drip.param.valuation.ValuationParams valParams,
  12396.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12397.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12398.         final int iWorkoutDate,
  12399.         final double dblWorkoutFactor,
  12400.         final double dblPrice)
  12401.         throws java.lang.Exception
  12402.     {
  12403.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromPrice
  12404.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice));
  12405.     }

  12406.     @Override public double yieldSpreadFromPrice (
  12407.         final org.drip.param.valuation.ValuationParams valParams,
  12408.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12409.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12410.         final double dblPrice)
  12411.         throws java.lang.Exception
  12412.     {
  12413.         return yieldSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  12414.     }

  12415.     @Override public double yieldSpreadFromPriceToOptimalExercise (
  12416.         final org.drip.param.valuation.ValuationParams valParams,
  12417.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12418.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12419.         final double dblPrice)
  12420.         throws java.lang.Exception
  12421.     {
  12422.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  12423.         if (null == wi)
  12424.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromPriceToOptimalExercise => " +
  12425.                 "Cant calc Workout from Price to optimal exercise for bonds w emb option");

  12426.         return yieldSpreadFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  12427.     }

  12428.     @Override public double yieldSpreadFromTSYSpread (
  12429.         final org.drip.param.valuation.ValuationParams valParams,
  12430.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12431.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12432.         final int iWorkoutDate,
  12433.         final double dblWorkoutFactor,
  12434.         final double dblTSYSpread)
  12435.         throws java.lang.Exception
  12436.     {
  12437.         return yieldSpreadFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12438.             yieldFromTSYSpread (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  12439.     }

  12440.     @Override public double yieldSpreadFromTSYSpread (
  12441.         final org.drip.param.valuation.ValuationParams valParams,
  12442.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12443.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12444.         final double dblTSYSpread)
  12445.         throws java.lang.Exception
  12446.     {
  12447.         return yieldSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  12448.     }

  12449.     @Override public double yieldSpreadFromTSYSpreadToOptimalExercise (
  12450.         final org.drip.param.valuation.ValuationParams valParams,
  12451.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12452.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12453.         final double dblTSYSpread)
  12454.         throws java.lang.Exception
  12455.     {
  12456.         if (null != _eosCall || null != _eosPut)
  12457.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromTSYSpreadToOptimalExercise => " +
  12458.                 "Cant calc Yield Spread from TSY Spread to optimal exercise for bonds w emb option");

  12459.         return yieldSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  12460.     }

  12461.     @Override public double yieldSpreadFromYield (
  12462.         final org.drip.param.valuation.ValuationParams valParams,
  12463.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12464.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12465.         final int iWorkoutDate,
  12466.         final double dblWorkoutFactor,
  12467.         final double dblYield)
  12468.         throws java.lang.Exception
  12469.     {
  12470.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblYield))
  12471.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromYield => Invalid Inputs");

  12472.         return dblYield - yieldFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12473.             priceFromFundingCurve (valParams, csqc, iWorkoutDate, dblWorkoutFactor, 0.));
  12474.     }

  12475.     @Override public double yieldSpreadFromYield (
  12476.         final org.drip.param.valuation.ValuationParams valParams,
  12477.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12478.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12479.         final double dblYield)
  12480.         throws java.lang.Exception
  12481.     {
  12482.         return yieldSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  12483.     }

  12484.     @Override public double yieldSpreadFromYieldToOptimalExercise (
  12485.         final org.drip.param.valuation.ValuationParams valParams,
  12486.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12487.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12488.         final double dblYield)
  12489.         throws java.lang.Exception
  12490.     {
  12491.         if (null != _eosCall || null != _eosPut)
  12492.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromYieldToOptimalExercise => " +
  12493.                 "Cant calc Yield Spread from Yield to optimal exercise for bonds w emb option");

  12494.         return yieldSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  12495.     }

  12496.     @Override public double yieldSpreadFromZSpread (
  12497.         final org.drip.param.valuation.ValuationParams valParams,
  12498.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12499.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12500.         final int iWorkoutDate,
  12501.         final double dblWorkoutFactor,
  12502.         final double dblZSpread)
  12503.         throws java.lang.Exception
  12504.     {
  12505.         return yieldSpreadFromYield (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, yieldFromZSpread
  12506.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblZSpread));
  12507.     }

  12508.     @Override public double yieldSpreadFromZSpread (
  12509.         final org.drip.param.valuation.ValuationParams valParams,
  12510.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12511.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12512.         final double dblZSpread)
  12513.         throws java.lang.Exception
  12514.     {
  12515.         return yieldSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  12516.     }

  12517.     @Override public double yieldSpreadFromZSpreadToOptimalExercise (
  12518.         final org.drip.param.valuation.ValuationParams valParams,
  12519.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12520.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12521.         final double dblZSpread)
  12522.         throws java.lang.Exception
  12523.     {
  12524.         if (null != _eosCall || null != _eosPut)
  12525.             throw new java.lang.Exception ("BondComponent::yieldSpreadFromZSpreadToOptimalExercise => " +
  12526.                 "Cant calc Yield Spread from Z Spread to optimal exercise for bonds w emb option");

  12527.         return yieldSpreadFromZSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblZSpread);
  12528.     }

  12529.     @Override public double zSpreadFromASW (
  12530.         final org.drip.param.valuation.ValuationParams valParams,
  12531.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12532.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12533.         final int iWorkoutDate,
  12534.         final double dblWorkoutFactor,
  12535.         final double dblASW)
  12536.         throws java.lang.Exception
  12537.     {
  12538.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromASW
  12539.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblASW));
  12540.     }

  12541.     @Override public double zSpreadFromASW (
  12542.         final org.drip.param.valuation.ValuationParams valParams,
  12543.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12544.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12545.         final double dblASW)
  12546.         throws java.lang.Exception
  12547.     {
  12548.         return zSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  12549.     }

  12550.     @Override public double zSpreadFromASWToOptimalExercise (
  12551.         final org.drip.param.valuation.ValuationParams valParams,
  12552.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12553.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12554.         final double dblASW)
  12555.         throws java.lang.Exception
  12556.     {
  12557.         if (null != _eosCall || null != _eosPut)
  12558.             throw new java.lang.Exception ("BondComponent::zSpreadFromASWToOptimalExercise => " +
  12559.                 "Cant calc Z Spread from ASW to optimal exercise for bonds w emb option");

  12560.         return zSpreadFromASW (valParams, csqc, vcp, maturityDate().julian(), 1., dblASW);
  12561.     }

  12562.     @Override public double zSpreadFromBondBasis (
  12563.         final org.drip.param.valuation.ValuationParams valParams,
  12564.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12565.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12566.         final int iWorkoutDate,
  12567.         final double dblWorkoutFactor,
  12568.         final double dblBondBasis)
  12569.         throws java.lang.Exception
  12570.     {
  12571.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromBondBasis
  12572.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblBondBasis));
  12573.     }

  12574.     @Override public double zSpreadFromBondBasis (
  12575.         final org.drip.param.valuation.ValuationParams valParams,
  12576.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12577.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12578.         final double dblBondBasis)
  12579.         throws java.lang.Exception
  12580.     {
  12581.         return zSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  12582.     }

  12583.     @Override public double zSpreadFromBondBasisToOptimalExercise (
  12584.         final org.drip.param.valuation.ValuationParams valParams,
  12585.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12586.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12587.         final double dblBondBasis)
  12588.         throws java.lang.Exception
  12589.     {
  12590.         if (null != _eosCall || null != _eosPut)
  12591.             throw new java.lang.Exception ("BondComponent::zSpreadFromBondBasisToOptimalExercise => " +
  12592.                 "Cant calc Z Spread from Bond Basis to optimal exercise for bonds w emb option");

  12593.         return zSpreadFromBondBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblBondBasis);
  12594.     }

  12595.     @Override public double zSpreadFromCreditBasis (
  12596.         final org.drip.param.valuation.ValuationParams valParams,
  12597.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12598.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12599.         final int iWorkoutDate,
  12600.         final double dblWorkoutFactor,
  12601.         final double dblCreditBasis)
  12602.         throws java.lang.Exception
  12603.     {
  12604.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromCreditBasis
  12605.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblCreditBasis));
  12606.     }

  12607.     @Override public double zSpreadFromCreditBasis (
  12608.         final org.drip.param.valuation.ValuationParams valParams,
  12609.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12610.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12611.         final double dblCreditBasis)
  12612.         throws java.lang.Exception
  12613.     {
  12614.         return zSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  12615.     }

  12616.     @Override public double zSpreadFromCreditBasisToOptimalExercise (
  12617.         final org.drip.param.valuation.ValuationParams valParams,
  12618.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12619.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12620.         final double dblCreditBasis)
  12621.         throws java.lang.Exception
  12622.     {
  12623.         if (null != _eosCall || null != _eosPut)
  12624.             throw new java.lang.Exception ("BondComponent::zSpreadFromCreditBasisToOptimalExercise => " +
  12625.                 "Cant calc Z Spread from Credit Basis to optimal exercise for bonds w emb option");

  12626.         return zSpreadFromCreditBasis (valParams, csqc, vcp, maturityDate().julian(), 1., dblCreditBasis);
  12627.     }

  12628.     @Override public double zSpreadFromDiscountMargin (
  12629.         final org.drip.param.valuation.ValuationParams valParams,
  12630.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12631.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12632.         final int iWorkoutDate,
  12633.         final double dblWorkoutFactor,
  12634.         final double dblDiscountMargin)
  12635.         throws java.lang.Exception
  12636.     {
  12637.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12638.             priceFromDiscountMargin (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor,
  12639.                 dblDiscountMargin));
  12640.     }

  12641.     @Override public double zSpreadFromDiscountMargin (
  12642.         final org.drip.param.valuation.ValuationParams valParams,
  12643.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12644.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12645.         final double dblDiscountMargin)
  12646.         throws java.lang.Exception
  12647.     {
  12648.         return zSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12649.             dblDiscountMargin);
  12650.     }

  12651.     @Override public double zSpreadFromDiscountMarginToOptimalExercise (
  12652.         final org.drip.param.valuation.ValuationParams valParams,
  12653.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12654.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12655.         final double dblDiscountMargin)
  12656.         throws java.lang.Exception
  12657.     {
  12658.         if (null != _eosCall || null != _eosPut)
  12659.             throw new java.lang.Exception
  12660.                 ("BondComponent::zSpreadFromDiscountMarginToOptimalExercise => " +
  12661.                     "Cant calc Z Spread from Discount Margin to optimal exercise for bonds w emb option");

  12662.         return zSpreadFromDiscountMargin (valParams, csqc, vcp, maturityDate().julian(), 1.,
  12663.             dblDiscountMargin);
  12664.     }

  12665.     @Override public double zSpreadFromGSpread (
  12666.         final org.drip.param.valuation.ValuationParams valParams,
  12667.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12668.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12669.         final int iWorkoutDate,
  12670.         final double dblWorkoutFactor,
  12671.         final double dblGSpread)
  12672.         throws java.lang.Exception
  12673.     {
  12674.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromGSpread
  12675.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblGSpread));
  12676.     }

  12677.     @Override public double zSpreadFromGSpread (
  12678.         final org.drip.param.valuation.ValuationParams valParams,
  12679.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12680.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12681.         final double dblGSpread)
  12682.         throws java.lang.Exception
  12683.     {
  12684.         return zSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  12685.     }

  12686.     @Override public double zSpreadFromGSpreadToOptimalExercise (
  12687.         final org.drip.param.valuation.ValuationParams valParams,
  12688.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12689.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12690.         final double dblGSpread)
  12691.         throws java.lang.Exception
  12692.     {
  12693.         if (null != _eosCall || null != _eosPut)
  12694.             throw new java.lang.Exception ("BondComponent::zSpreadFromGSpreadToOptimalExercise => " +
  12695.                 "Cant calc Z Spread from G Spread to optimal exercise for bonds w emb option");

  12696.         return zSpreadFromGSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblGSpread);
  12697.     }

  12698.     @Override public double zSpreadFromISpread (
  12699.         final org.drip.param.valuation.ValuationParams valParams,
  12700.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12701.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12702.         final int iWorkoutDate,
  12703.         final double dblWorkoutFactor,
  12704.         final double dblISpread)
  12705.         throws java.lang.Exception
  12706.     {
  12707.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromISpread
  12708.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblISpread));
  12709.     }

  12710.     @Override public double zSpreadFromISpread (
  12711.         final org.drip.param.valuation.ValuationParams valParams,
  12712.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12713.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12714.         final double dblISpread)
  12715.         throws java.lang.Exception
  12716.     {
  12717.         return zSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  12718.     }

  12719.     @Override public double zSpreadFromISpreadToOptimalExercise (
  12720.         final org.drip.param.valuation.ValuationParams valParams,
  12721.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12722.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12723.         final double dblISpread)
  12724.         throws java.lang.Exception
  12725.     {
  12726.         if (null != _eosCall || null != _eosPut)
  12727.             throw new java.lang.Exception ("BondComponent::zSpreadFromISpreadToOptimalExercise => " +
  12728.                 "Cant calc Z Spread from I Spread to optimal exercise for bonds w emb option");

  12729.         return zSpreadFromISpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblISpread);
  12730.     }

  12731.     @Override public double zSpreadFromJSpread (
  12732.         final org.drip.param.valuation.ValuationParams valParams,
  12733.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12734.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12735.         final int iWorkoutDate,
  12736.         final double dblWorkoutFactor,
  12737.         final double dblJSpread)
  12738.         throws java.lang.Exception
  12739.     {
  12740.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromJSpread
  12741.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblJSpread));
  12742.     }

  12743.     @Override public double zSpreadFromJSpread (
  12744.         final org.drip.param.valuation.ValuationParams valParams,
  12745.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12746.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12747.         final double dblJSpread)
  12748.         throws java.lang.Exception
  12749.     {
  12750.         return zSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  12751.     }

  12752.     @Override public double zSpreadFromJSpreadToOptimalExercise (
  12753.         final org.drip.param.valuation.ValuationParams valParams,
  12754.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12755.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12756.         final double dblJSpread)
  12757.         throws java.lang.Exception
  12758.     {
  12759.         if (null != _eosCall || null != _eosPut)
  12760.             throw new java.lang.Exception ("BondComponent::zSpreadFromJSpreadToOptimalExercise => " +
  12761.                 "Cant calc Z Spread from J Spread to optimal exercise for bonds w emb option");

  12762.         return zSpreadFromJSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblJSpread);
  12763.     }

  12764.     @Override public double zSpreadFromNSpread (
  12765.         final org.drip.param.valuation.ValuationParams valParams,
  12766.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12767.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12768.         final int iWorkoutDate,
  12769.         final double dblWorkoutFactor,
  12770.         final double dblNSpread)
  12771.         throws java.lang.Exception
  12772.     {
  12773.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromNSpread
  12774.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblNSpread));
  12775.     }

  12776.     @Override public double zSpreadFromNSpread (
  12777.         final org.drip.param.valuation.ValuationParams valParams,
  12778.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12779.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12780.         final double dblNSpread)
  12781.         throws java.lang.Exception
  12782.     {
  12783.         return zSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  12784.     }

  12785.     @Override public double zSpreadFromNSpreadToOptimalExercise (
  12786.         final org.drip.param.valuation.ValuationParams valParams,
  12787.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12788.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12789.         final double dblNSpread)
  12790.         throws java.lang.Exception
  12791.     {
  12792.         if (null != _eosCall || null != _eosPut)
  12793.             throw new java.lang.Exception ("BondComponent::zSpreadFromNSpreadToOptimalExercise => " +
  12794.                 "Cant calc Z Spread from N Spread to optimal exercise for bonds w emb option");

  12795.         return zSpreadFromNSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblNSpread);
  12796.     }

  12797.     @Override public double zSpreadFromOAS (
  12798.         final org.drip.param.valuation.ValuationParams valParams,
  12799.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12800.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12801.         final int iWorkoutDate,
  12802.         final double dblWorkoutFactor,
  12803.         final double dblOAS)
  12804.         throws java.lang.Exception
  12805.     {
  12806.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromOAS
  12807.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblOAS));
  12808.     }

  12809.     @Override public double zSpreadFromOAS (
  12810.         final org.drip.param.valuation.ValuationParams valParams,
  12811.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12812.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12813.         final double dblOAS)
  12814.         throws java.lang.Exception
  12815.     {
  12816.         return zSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  12817.     }

  12818.     @Override public double zSpreadFromOASToOptimalExercise (
  12819.         final org.drip.param.valuation.ValuationParams valParams,
  12820.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12821.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12822.         final double dblOAS)
  12823.         throws java.lang.Exception
  12824.     {
  12825.         if (null != _eosCall || null != _eosPut)
  12826.             throw new java.lang.Exception ("BondComponent::zSpreadFromOASToOptimalExercise => " +
  12827.                 "Cant calc Z Spread from OAS to optimal exercise for bonds w emb option");

  12828.         return zSpreadFromOAS (valParams, csqc, vcp, maturityDate().julian(), 1., dblOAS);
  12829.     }

  12830.     @Override public double zSpreadFromPECS (
  12831.         final org.drip.param.valuation.ValuationParams valParams,
  12832.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12833.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12834.         final int iWorkoutDate,
  12835.         final double dblWorkoutFactor,
  12836.         final double dblPECS)
  12837.         throws java.lang.Exception
  12838.     {
  12839.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromPECS
  12840.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblPECS));
  12841.     }

  12842.     @Override public double zSpreadFromPECS (
  12843.         final org.drip.param.valuation.ValuationParams valParams,
  12844.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12845.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12846.         final double dblPECS)
  12847.         throws java.lang.Exception
  12848.     {
  12849.         return zSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  12850.     }

  12851.     @Override public double zSpreadFromPECSToOptimalExercise (
  12852.         final org.drip.param.valuation.ValuationParams valParams,
  12853.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12854.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12855.         final double dblPECS)
  12856.         throws java.lang.Exception
  12857.     {
  12858.         if (null != _eosCall || null != _eosPut)
  12859.             throw new java.lang.Exception ("BondComponent::zSpreadFromPECSToOptimalExercise => " +
  12860.                 "Cant calc Z Spread from PECS to optimal exercise for bonds w emb option");

  12861.         return zSpreadFromPECS (valParams, csqc, vcp, maturityDate().julian(), 1., dblPECS);
  12862.     }

  12863.     @Override public double zSpreadFromPrice (
  12864.         final org.drip.param.valuation.ValuationParams valParams,
  12865.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12866.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12867.         final int iWorkoutDate,
  12868.         final double dblWorkoutFactor,
  12869.         final double dblPrice)
  12870.         throws java.lang.Exception
  12871.     {
  12872.         return new BondCalibrator (this, false).calibrateZSpreadFromPrice (valParams, csqc, vcp,
  12873.             ZERO_OFF_OF_RATES_INSTRUMENTS_DISCOUNT_CURVE, iWorkoutDate, dblWorkoutFactor, dblPrice);
  12874.     }

  12875.     @Override public double zSpreadFromPrice (
  12876.         final org.drip.param.valuation.ValuationParams valParams,
  12877.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12878.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12879.         final double dblPrice)
  12880.         throws java.lang.Exception
  12881.     {
  12882.         return zSpreadFromPrice (valParams, csqc, vcp, maturityDate().julian(), 1., dblPrice);
  12883.     }

  12884.     @Override public double zSpreadFromPriceToOptimalExercise (
  12885.         final org.drip.param.valuation.ValuationParams valParams,
  12886.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12887.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12888.         final double dblPrice)
  12889.         throws java.lang.Exception
  12890.     {
  12891.         org.drip.param.valuation.WorkoutInfo wi = exerciseYieldFromPrice (valParams, csqc, vcp, dblPrice);

  12892.         if (null == wi)
  12893.             throw new java.lang.Exception ("BondComponent::zSpreadFromPriceToOptimalExercise => " +
  12894.                 "Cant calc Workout from Price to optimal exercise for bonds w emb option");

  12895.         return zSpreadFromPrice (valParams, csqc, vcp, wi.date(), wi.factor(), dblPrice);
  12896.     }

  12897.     @Override public double zSpreadFromTSYSpread (
  12898.         final org.drip.param.valuation.ValuationParams valParams,
  12899.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12900.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12901.         final int iWorkoutDate,
  12902.         final double dblWorkoutFactor,
  12903.         final double dblTSYSpread)
  12904.         throws java.lang.Exception
  12905.     {
  12906.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromTSYSpread
  12907.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblTSYSpread));
  12908.     }

  12909.     @Override public double zSpreadFromTSYSpread (
  12910.         final org.drip.param.valuation.ValuationParams valParams,
  12911.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12912.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12913.         final double dblTSYSpread)
  12914.         throws java.lang.Exception
  12915.     {
  12916.         return zSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  12917.     }

  12918.     @Override public double zSpreadFromTSYSpreadToOptimalExercise (
  12919.         final org.drip.param.valuation.ValuationParams valParams,
  12920.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12921.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12922.         final double dblTSYSpread)
  12923.         throws java.lang.Exception
  12924.     {
  12925.         if (null != _eosCall || null != _eosPut)
  12926.             throw new java.lang.Exception ("BondComponent::zSpreadFromTSYSpreadToOptimalExercise => " +
  12927.                 "Cant calc Z Spread from TSY Spread to optimal exercise for bonds w emb option");

  12928.         return zSpreadFromTSYSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblTSYSpread);
  12929.     }

  12930.     @Override public double zSpreadFromYield (
  12931.         final org.drip.param.valuation.ValuationParams valParams,
  12932.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12933.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12934.         final int iWorkoutDate,
  12935.         final double dblWorkoutFactor,
  12936.         final double dblYield)
  12937.         throws java.lang.Exception
  12938.     {
  12939.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYield
  12940.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYield));
  12941.     }

  12942.     @Override public double zSpreadFromYield (
  12943.         final org.drip.param.valuation.ValuationParams valParams,
  12944.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12945.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12946.         final double dblYield)
  12947.         throws java.lang.Exception
  12948.     {
  12949.         return zSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  12950.     }

  12951.     @Override public double zSpreadFromYieldToOptimalExercise (
  12952.         final org.drip.param.valuation.ValuationParams valParams,
  12953.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12954.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12955.         final double dblYield)
  12956.         throws java.lang.Exception
  12957.     {
  12958.         if (null != _eosCall || null != _eosPut)
  12959.             throw new java.lang.Exception ("BondComponent::zSpreadFromYieldToOptimalExercise => " +
  12960.                 "Cant calc Z Spread from Yield to optimal exercise for bonds w emb option");

  12961.         return zSpreadFromYield (valParams, csqc, vcp, maturityDate().julian(), 1., dblYield);
  12962.     }

  12963.     @Override public double zSpreadFromYieldSpread (
  12964.         final org.drip.param.valuation.ValuationParams valParams,
  12965.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12966.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12967.         final int iWorkoutDate,
  12968.         final double dblWorkoutFactor,
  12969.         final double dblYieldSpread)
  12970.         throws java.lang.Exception
  12971.     {
  12972.         return zSpreadFromPrice (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, priceFromYieldSpread
  12973.             (valParams, csqc, vcp, iWorkoutDate, dblWorkoutFactor, dblYieldSpread));
  12974.     }

  12975.     @Override public double zSpreadFromYieldSpread (
  12976.         final org.drip.param.valuation.ValuationParams valParams,
  12977.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12978.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12979.         final double dblYieldSpread)
  12980.         throws java.lang.Exception
  12981.     {
  12982.         return zSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  12983.     }

  12984.     @Override public double zSpreadFromYieldSpreadToOptimalExercise (
  12985.         final org.drip.param.valuation.ValuationParams valParams,
  12986.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  12987.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  12988.         final double dblYieldSpread)
  12989.         throws java.lang.Exception
  12990.     {
  12991.         if (null != _eosCall || null != _eosPut)
  12992.             throw new java.lang.Exception ("BondComponent::zSpreadFromYieldSpreadToOptimalExercise => " +
  12993.                 "Cant calc Z Spread from Yield Spread to optimal exercise for bonds w emb option");

  12994.         return zSpreadFromYieldSpread (valParams, csqc, vcp, maturityDate().julian(), 1., dblYieldSpread);
  12995.     }

  12996.     @Override public org.drip.analytics.output.BondRVMeasures standardMeasures (
  12997.         final org.drip.param.valuation.ValuationParams valParams,
  12998.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  12999.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13000.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13001.         final org.drip.param.valuation.WorkoutInfo wi,
  13002.         final double dblPrice)
  13003.     {
  13004.         if (null == valParams || null == csqs || null == wi || !org.drip.numerical.common.NumberUtil.IsValid
  13005.             (dblPrice))
  13006.             return null;

  13007.         int iWorkoutDate = wi.date();

  13008.         double dblWorkoutYield = wi.yield();

  13009.         double dblWorkoutFactor = wi.factor();

  13010.         if (valParams.valueDate() >= iWorkoutDate) return null;

  13011.         double dblASW = java.lang.Double.NaN;
  13012.         double dblPECS = java.lang.Double.NaN;
  13013.         double dblGSpread = java.lang.Double.NaN;
  13014.         double dblISpread = java.lang.Double.NaN;
  13015.         double dblYield01 = java.lang.Double.NaN;
  13016.         double dblZSpread = java.lang.Double.NaN;
  13017.         double dblOASpread = java.lang.Double.NaN;
  13018.         double dblBondBasis = java.lang.Double.NaN;
  13019.         double dblConvexity = java.lang.Double.NaN;
  13020.         double dblTSYSpread = java.lang.Double.NaN;
  13021.         double dblCreditBasis = java.lang.Double.NaN;
  13022.         double dblDiscountMargin = java.lang.Double.NaN;
  13023.         double dblMacaulayDuration = java.lang.Double.NaN;
  13024.         double dblModifiedDuration = java.lang.Double.NaN;

  13025.         try {
  13026.             dblDiscountMargin = discountMarginFromYield (valParams, csqs, vcp, iWorkoutDate,
  13027.                 dblWorkoutFactor, dblWorkoutYield);
  13028.         } catch (java.lang.Exception e) {
  13029.             if (!s_bSuppressErrors) e.printStackTrace();
  13030.         }

  13031.         if (null == _floaterSetting) {
  13032.             try {
  13033.                 dblZSpread = zSpreadFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13034.                     dblPrice);
  13035.             } catch (java.lang.Exception e) {
  13036.                 if (!s_bSuppressErrors) e.printStackTrace();
  13037.             }
  13038.         }

  13039.         try {
  13040.             dblOASpread = oasFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice);
  13041.         } catch (java.lang.Exception e) {
  13042.             if (!s_bSuppressErrors) e.printStackTrace();
  13043.         }

  13044.         try {
  13045.             dblISpread = iSpreadFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13046.                 dblWorkoutYield);
  13047.         } catch (java.lang.Exception e) {
  13048.             if (!s_bSuppressErrors) e.printStackTrace();
  13049.         }

  13050.         try {
  13051.             dblGSpread = gSpreadFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13052.                 dblWorkoutYield);
  13053.         } catch (java.lang.Exception e) {
  13054.             if (!s_bSuppressErrors) e.printStackTrace();
  13055.         }

  13056.         try {
  13057.             dblTSYSpread = tsySpreadFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13058.                 dblWorkoutYield);
  13059.         } catch (java.lang.Exception e) {
  13060.             if (!s_bSuppressErrors) e.printStackTrace();
  13061.         }

  13062.         try {
  13063.             dblMacaulayDuration = macaulayDurationFromPrice (valParams, csqs, vcp, iWorkoutDate,
  13064.                 dblWorkoutFactor, dblPrice);
  13065.         } catch (java.lang.Exception e) {
  13066.             if (!s_bSuppressErrors) e.printStackTrace();
  13067.         }

  13068.         try {
  13069.             dblModifiedDuration = modifiedDurationFromPrice (valParams, csqs, vcp, iWorkoutDate,
  13070.                 dblWorkoutFactor, dblPrice);
  13071.         } catch (java.lang.Exception e) {
  13072.             if (!s_bSuppressErrors) e.printStackTrace();
  13073.         }

  13074.         try {
  13075.             dblASW = aswFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice);
  13076.         } catch (java.lang.Exception e) {
  13077.             if (!s_bSuppressErrors) e.printStackTrace();
  13078.         }

  13079.         try {
  13080.             dblConvexity = convexityFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13081.                 dblPrice);
  13082.         } catch (java.lang.Exception e) {
  13083.             if (!s_bSuppressErrors) e.printStackTrace();
  13084.         }

  13085.         try {
  13086.             dblCreditBasis = creditBasisFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13087.                 dblPrice);
  13088.         } catch (java.lang.Exception e) {
  13089.             if (!s_bSuppressErrors) e.printStackTrace();
  13090.         }

  13091.         try {
  13092.             // dblPECS = pecsFromPrice (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor, dblPrice);
  13093.         } catch (java.lang.Exception e) {
  13094.             if (!s_bSuppressErrors) e.printStackTrace();
  13095.         }

  13096.         try {
  13097.             dblBondBasis = bondBasisFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13098.                 dblWorkoutYield);
  13099.         } catch (java.lang.Exception e) {
  13100.             if (!s_bSuppressErrors) e.printStackTrace();
  13101.         }

  13102.         try {
  13103.             dblYield01 = yield01FromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13104.                 dblWorkoutYield);
  13105.         } catch (java.lang.Exception e) {
  13106.             if (!s_bSuppressErrors) e.printStackTrace();
  13107.         }

  13108.         try {
  13109.             return new org.drip.analytics.output.BondRVMeasures (dblPrice, dblBondBasis, dblZSpread,
  13110.                 dblGSpread, dblISpread, dblOASpread, dblTSYSpread, dblDiscountMargin, dblASW, dblCreditBasis,
  13111.                     dblPECS, dblYield01, dblModifiedDuration, dblMacaulayDuration, dblConvexity, wi);
  13112.         } catch (java.lang.Exception e) {
  13113.             if (!s_bSuppressErrors) e.printStackTrace();
  13114.         }

  13115.         return null;
  13116.     }

  13117.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> value (
  13118.         final org.drip.param.valuation.ValuationParams valParams,
  13119.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13120.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13121.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  13122.     {
  13123.         if (null == valParams || null == csqs) return null;

  13124.         if (null != pricerParams) {
  13125.             org.drip.param.definition.CalibrationParams calibParams = pricerParams.calibParams();

  13126.             if (null != calibParams) {
  13127.                 org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapCalibMeasures =
  13128.                     calibMeasures (valParams, pricerParams, csqs, vcp);

  13129.                 if (null != mapCalibMeasures && mapCalibMeasures.containsKey (calibParams.measure()))
  13130.                     return mapCalibMeasures;
  13131.             }
  13132.         }

  13133.         org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures = fairMeasures
  13134.             (valParams, pricerParams, csqs, vcp);

  13135.         if (null == mapMeasures) return null;

  13136.         java.lang.String strName = name();

  13137.         org.drip.param.definition.ProductQuote pq = csqs.productQuote (strName);

  13138.         if (null == pq) return mapMeasures;

  13139.         int iMaturityDate = maturityDate().julian();

  13140.         if (null == _floaterSetting) {
  13141.             double dblParSpread = (mapMeasures.get ("FairDirtyPV") - mapMeasures.get ("FairParPV") -
  13142.                 mapMeasures.get ("FairPrincipalPV")) / mapMeasures.get ("FairDirtyDV01");

  13143.             mapMeasures.put ("ParSpread", dblParSpread);

  13144.             mapMeasures.put ("FairParSpread", dblParSpread);
  13145.         } else {
  13146.             double dblCleanIndexCouponPV = mapMeasures.containsKey ("FairRiskyCleanIndexCouponPV") ?
  13147.                 mapMeasures.get ("FairRiskyCleanIndexCouponPV") : mapMeasures.get
  13148.                     ("FairRisklessCleanIndexCouponPV");

  13149.             double dblZeroDiscountMargin = (mapMeasures.get ("FairCleanPV") - mapMeasures.get ("FairParPV") -
  13150.                 dblCleanIndexCouponPV - mapMeasures.get ("FairPrincipalPV")) / mapMeasures.get
  13151.                     ("FairCleanDV01");

  13152.             mapMeasures.put ("ZeroDiscountMargin", dblZeroDiscountMargin);

  13153.             mapMeasures.put ("FairZeroDiscountMargin", dblZeroDiscountMargin);
  13154.         }

  13155.         org.drip.param.valuation.WorkoutInfo wiMarket = null;

  13156.         if (pq.containsQuote ("Price")) {
  13157.             double dblMarketPrice = pq.quote ("Price").value ("mid");

  13158.             mapMeasures.put ("MarketInputType=CleanPrice", dblMarketPrice);

  13159.             wiMarket = exerciseYieldFromPrice (valParams, csqs, vcp, dblMarketPrice);
  13160.         } else if (pq.containsQuote ("CleanPrice")) {
  13161.             double dblCleanMarketPrice = pq.quote ("CleanPrice").value ("mid");

  13162.             mapMeasures.put ("MarketInputType=CleanPrice", dblCleanMarketPrice);

  13163.             wiMarket = exerciseYieldFromPrice (valParams, csqs, vcp, dblCleanMarketPrice);
  13164.         } else if (pq.containsQuote ("QuotedMargin")) {
  13165.             double dblQuotedMargin = pq.quote ("QuotedMargin").value ("mid");

  13166.             mapMeasures.put ("MarketInputType=QuotedMargin", dblQuotedMargin);

  13167.             try {
  13168.                 wiMarket = exerciseYieldFromPrice (valParams, csqs, vcp, priceFromDiscountMargin (valParams,
  13169.                     csqs, vcp, dblQuotedMargin));
  13170.             } catch (java.lang.Exception e) {
  13171.                 if (!s_bSuppressErrors) e.printStackTrace();
  13172.             }
  13173.         } else if (pq.containsQuote ("DirtyPrice")) {
  13174.             try {
  13175.                 double dblDirtyMarketPrice = pq.quote ("DirtyPrice").value ("mid");

  13176.                 mapMeasures.put ("MarketInputType=DirtyPrice", dblDirtyMarketPrice);

  13177.                 wiMarket = exerciseYieldFromPrice (valParams, csqs, vcp, dblDirtyMarketPrice - accrued
  13178.                     (valParams.valueDate(), csqs));
  13179.             } catch (java.lang.Exception e) {
  13180.                 if (!s_bSuppressErrors) e.printStackTrace();

  13181.                 wiMarket = null;
  13182.             }
  13183.         } else if (pq.containsQuote ("TSYSpread")) {
  13184.             try {
  13185.                 double dblTSYSpread = pq.quote ("TSYSpread").value ("mid");

  13186.                 mapMeasures.put ("MarketInputType=TSYSpread", dblTSYSpread);

  13187.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, treasuryBenchmarkYield
  13188.                     (valParams, csqs, iMaturityDate) + dblTSYSpread, 1.,
  13189.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13190.             } catch (java.lang.Exception e) {
  13191.                 if (!s_bSuppressErrors) e.printStackTrace();

  13192.                 wiMarket = null;
  13193.             }
  13194.         } else if (pq.containsQuote ("Yield")) {
  13195.             try {
  13196.                 double dblYield = pq.quote ("Yield").value ("mid");

  13197.                 mapMeasures.put ("MarketInputType=Yield", dblYield);

  13198.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, dblYield, 1.,
  13199.                     org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13200.             } catch (java.lang.Exception e) {
  13201.                 if (!s_bSuppressErrors) e.printStackTrace();

  13202.                 wiMarket = null;
  13203.             }
  13204.         } else if (pq.containsQuote ("ZSpread")) {
  13205.             try {
  13206.                 double dblZSpread = pq.quote ("ZSpread").value ("mid");

  13207.                 mapMeasures.put ("MarketInputType=ZSpread", dblZSpread);

  13208.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, yieldFromZSpread
  13209.                     (valParams, csqs, vcp, dblZSpread), 1.,
  13210.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13211.             } catch (java.lang.Exception e) {
  13212.                 if (!s_bSuppressErrors) e.printStackTrace();

  13213.                 wiMarket = null;
  13214.             }
  13215.         } else if (pq.containsQuote ("ISpread")) {
  13216.             try {
  13217.                 double dblISpread = pq.quote ("ISpread").value ("mid");

  13218.                 mapMeasures.put ("MarketInputType=ISpread", dblISpread);

  13219.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, yieldFromISpread
  13220.                     (valParams, csqs, vcp, dblISpread), 1.,
  13221.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13222.             } catch (java.lang.Exception e) {
  13223.                 if (!s_bSuppressErrors) e.printStackTrace();

  13224.                 wiMarket = null;
  13225.             }
  13226.         } else if (pq.containsQuote ("CreditBasis")) {
  13227.             try {
  13228.                 double dblCreditBasis = pq.quote ("CreditBasis").value ("mid");

  13229.                 mapMeasures.put ("MarketInputType=CreditBasis", dblCreditBasis);

  13230.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, yieldFromCreditBasis
  13231.                     (valParams, csqs, vcp, dblCreditBasis), 1.,
  13232.                         org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13233.             } catch (java.lang.Exception e) {
  13234.                 if (!s_bSuppressErrors) e.printStackTrace();

  13235.                 wiMarket = null;
  13236.             }
  13237.         } else if (pq.containsQuote ("PECS")) {
  13238.             try {
  13239.                 double dblCreditBasis = pq.quote ("PECS").value ("mid");

  13240.                 mapMeasures.put ("MarketInputType=PECS", dblCreditBasis);

  13241.                 wiMarket = new org.drip.param.valuation.WorkoutInfo (iMaturityDate, yieldFromPECS (valParams,
  13242.                     csqs, vcp, dblCreditBasis), 1., org.drip.param.valuation.WorkoutInfo.WO_TYPE_MATURITY);
  13243.             } catch (java.lang.Exception e) {
  13244.                 if (!s_bSuppressErrors) e.printStackTrace();

  13245.                 wiMarket = null;
  13246.             }
  13247.         }

  13248.         if (null != wiMarket) {
  13249.             org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapWorkoutMeasures =
  13250.                 marketMeasures (valParams, pricerParams, csqs, vcp, wiMarket);

  13251.             if (null == _floaterSetting) {
  13252.                 double dblParSpread = (mapWorkoutMeasures.get ("Price") - mapMeasures.get ("FairParPV") -
  13253.                     mapMeasures.get ("FairPrincipalPV")) / mapMeasures.get ("FairCleanDV01");

  13254.                 mapMeasures.put ("ParSpread", dblParSpread);

  13255.                 mapMeasures.put ("MarketParSpread", dblParSpread);
  13256.             } else {
  13257.                 double dblCleanIndexCouponPV = mapMeasures.containsKey ("FairRiskyCleanIndexCouponPV") ?
  13258.                     mapMeasures.get ("FairRiskyCleanIndexCouponPV") : mapMeasures.get
  13259.                         ("FairRisklessCleanIndexCouponPV");

  13260.                 double dblZeroDiscountMargin = (mapMeasures.get ("Price") - mapMeasures.get ("FairParPV") -
  13261.                     dblCleanIndexCouponPV - mapMeasures.get ("FairPrincipalPV")) / mapMeasures.get
  13262.                         ("FairCleanDV01");

  13263.                 mapMeasures.put ("ZeroDiscountMargin", dblZeroDiscountMargin);

  13264.                 mapMeasures.put ("MarketZeroDiscountMargin", dblZeroDiscountMargin);
  13265.             }

  13266.             org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMeasures, mapWorkoutMeasures);

  13267.             org.drip.state.credit.CreditCurve cc = csqs.creditState (creditLabel());

  13268.             if (null != mapMeasures.get ("FairYield")) {
  13269.                 org.drip.param.market.CurveSurfaceQuoteContainer csqsMarket =
  13270.                     org.drip.param.creator.MarketParamsBuilder.Create
  13271.                         ((org.drip.state.discount.MergedDiscountForwardCurve) csqs.fundingState
  13272.                             (fundingLabel()).parallelShiftQuantificationMetric (wiMarket.yield() -
  13273.                                 mapMeasures.get ("FairYield")), csqs.govvieState (govvieLabel()), cc,
  13274.                                     strName, csqs.productQuote (strName), csqs.quoteMap(), csqs.fixings());

  13275.                 if (null != csqsMarket) {
  13276.                     org.drip.analytics.output.BondWorkoutMeasures bwmMarket = workoutMeasures (valParams,
  13277.                         pricerParams, csqsMarket, wiMarket.date(), wiMarket.factor());

  13278.                     if (null != bwmMarket) {
  13279.                         org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMarketMeasures
  13280.                             = bwmMarket.toMap ("");

  13281.                         org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMarketMeasures,
  13282.                             org.drip.numerical.common.CollectionUtil.PrefixKeys (mapMarketMeasures, "Market"));

  13283.                         org.drip.numerical.common.CollectionUtil.MergeWithMain (mapMeasures, mapMarketMeasures);
  13284.                     }
  13285.                 }
  13286.             }
  13287.         }

  13288.         return mapMeasures;
  13289.     }

  13290.     @Override public java.util.Set<java.lang.String> measureNames()
  13291.     {
  13292.         java.util.Set<java.lang.String> setstrMeasureNames = new java.util.TreeSet<java.lang.String>();

  13293.         setstrMeasureNames.add ("Accrued");

  13294.         setstrMeasureNames.add ("Accrued01");

  13295.         setstrMeasureNames.add ("AssetSwapSpread");

  13296.         setstrMeasureNames.add ("ASW");

  13297.         setstrMeasureNames.add ("BondBasis");

  13298.         setstrMeasureNames.add ("CleanCouponPV");

  13299.         setstrMeasureNames.add ("CleanDV01");

  13300.         setstrMeasureNames.add ("CleanIndexCouponPV");

  13301.         setstrMeasureNames.add ("CleanPrice");

  13302.         setstrMeasureNames.add ("CleanPV");

  13303.         setstrMeasureNames.add ("Convexity");

  13304.         setstrMeasureNames.add ("CreditRisklessParPV");

  13305.         setstrMeasureNames.add ("CreditRisklessPrincipalPV");

  13306.         setstrMeasureNames.add ("CreditRiskyParPV");

  13307.         setstrMeasureNames.add ("CreditRiskyPrincipalPV");

  13308.         setstrMeasureNames.add ("CreditBasis");

  13309.         setstrMeasureNames.add ("DiscountMargin");

  13310.         setstrMeasureNames.add ("DefaultExposure");

  13311.         setstrMeasureNames.add ("DefaultExposureNoRec");

  13312.         setstrMeasureNames.add ("DirtyCouponPV");

  13313.         setstrMeasureNames.add ("DirtyDV01");

  13314.         setstrMeasureNames.add ("DirtyIndexCouponPV");

  13315.         setstrMeasureNames.add ("DirtyPrice");

  13316.         setstrMeasureNames.add ("DirtyPV");

  13317.         setstrMeasureNames.add ("Duration");

  13318.         setstrMeasureNames.add ("DV01");

  13319.         setstrMeasureNames.add ("ExpectedRecovery");

  13320.         setstrMeasureNames.add ("FairAccrued");

  13321.         setstrMeasureNames.add ("FairAccrued01");

  13322.         setstrMeasureNames.add ("FairAssetSwapSpread");

  13323.         setstrMeasureNames.add ("FairASW");

  13324.         setstrMeasureNames.add ("FairBondBasis");

  13325.         setstrMeasureNames.add ("FairCleanCouponPV");

  13326.         setstrMeasureNames.add ("FairCleanDV01");

  13327.         setstrMeasureNames.add ("FairCleanIndexCouponPV");

  13328.         setstrMeasureNames.add ("FairCleanPrice");

  13329.         setstrMeasureNames.add ("FairCleanPV");

  13330.         setstrMeasureNames.add ("FairConvexity");

  13331.         setstrMeasureNames.add ("FairCreditBasis");

  13332.         setstrMeasureNames.add ("FairCreditRisklessParPV");

  13333.         setstrMeasureNames.add ("FairCreditRisklessPrincipalPV");

  13334.         setstrMeasureNames.add ("FairCreditRiskyParPV");

  13335.         setstrMeasureNames.add ("FairCreditRiskyPrincipalPV");

  13336.         setstrMeasureNames.add ("FairDefaultExposure");

  13337.         setstrMeasureNames.add ("FairDefaultExposureNoRec");

  13338.         setstrMeasureNames.add ("FairDirtyCouponPV");

  13339.         setstrMeasureNames.add ("FairDirtyDV01");

  13340.         setstrMeasureNames.add ("FairDirtyIndexCouponPV");

  13341.         setstrMeasureNames.add ("FairDirtyPrice");

  13342.         setstrMeasureNames.add ("FairDirtyPV");

  13343.         setstrMeasureNames.add ("FairDiscountMargin");

  13344.         setstrMeasureNames.add ("FairDuration");

  13345.         setstrMeasureNames.add ("FairDV01");

  13346.         setstrMeasureNames.add ("FairExpectedRecovery");

  13347.         setstrMeasureNames.add ("FairFirstIndexRate");

  13348.         setstrMeasureNames.add ("FairGSpread");

  13349.         setstrMeasureNames.add ("FairISpread");

  13350.         setstrMeasureNames.add ("FairLossOnInstantaneousDefault");

  13351.         setstrMeasureNames.add ("FairMacaulayDuration");

  13352.         setstrMeasureNames.add ("FairModifiedDuration");

  13353.         setstrMeasureNames.add ("FairOAS");

  13354.         setstrMeasureNames.add ("FairOASpread");

  13355.         setstrMeasureNames.add ("FairOptionAdjustedSpread");

  13356.         setstrMeasureNames.add ("FairParPV");

  13357.         setstrMeasureNames.add ("FairParSpread");

  13358.         setstrMeasureNames.add ("FairPECS");

  13359.         setstrMeasureNames.add ("FairPrice");

  13360.         setstrMeasureNames.add ("FairPrincipalPV");

  13361.         setstrMeasureNames.add ("FairPV");

  13362.         setstrMeasureNames.add ("FairRecoveryPV");

  13363.         setstrMeasureNames.add ("FairRisklessCleanCouponPV");

  13364.         setstrMeasureNames.add ("FairRisklessCleanDV01");

  13365.         setstrMeasureNames.add ("FairRisklessCleanIndexCouponPV");

  13366.         setstrMeasureNames.add ("FairRisklessCleanPV");

  13367.         setstrMeasureNames.add ("FairRisklessDirtyCouponPV");

  13368.         setstrMeasureNames.add ("FairRisklessDirtyDV01");

  13369.         setstrMeasureNames.add ("FairRisklessDirtyIndexCouponPV");

  13370.         setstrMeasureNames.add ("FairRisklessDirtyPV");

  13371.         setstrMeasureNames.add ("FairRiskyCleanCouponPV");

  13372.         setstrMeasureNames.add ("FairRiskyCleanDV01");

  13373.         setstrMeasureNames.add ("FairRiskyCleanIndexCouponPV");

  13374.         setstrMeasureNames.add ("FairRiskyCleanPV");

  13375.         setstrMeasureNames.add ("FairRiskyDirtyCouponPV");

  13376.         setstrMeasureNames.add ("FairRiskyDirtyDV01");

  13377.         setstrMeasureNames.add ("FairRiskyDirtyIndexCouponPV");

  13378.         setstrMeasureNames.add ("FairRiskyDirtyPV");

  13379.         setstrMeasureNames.add ("FairTSYSpread");

  13380.         setstrMeasureNames.add ("FairWorkoutDate");

  13381.         setstrMeasureNames.add ("FairWorkoutFactor");

  13382.         setstrMeasureNames.add ("FairWorkoutType");

  13383.         setstrMeasureNames.add ("FairWorkoutYield");

  13384.         setstrMeasureNames.add ("FairYield");

  13385.         setstrMeasureNames.add ("FairYield01");

  13386.         setstrMeasureNames.add ("FairYieldBasis");

  13387.         setstrMeasureNames.add ("FairYieldSpread");

  13388.         setstrMeasureNames.add ("FairZeroDiscountMargin");

  13389.         setstrMeasureNames.add ("FairZSpread");

  13390.         setstrMeasureNames.add ("FirstCouponRate");

  13391.         setstrMeasureNames.add ("FirstIndexRate");

  13392.         setstrMeasureNames.add ("GSpread");

  13393.         setstrMeasureNames.add ("ISpread");

  13394.         setstrMeasureNames.add ("LossOnInstantaneousDefault");

  13395.         setstrMeasureNames.add ("MacaulayDuration");

  13396.         setstrMeasureNames.add ("MarketAccrued");

  13397.         setstrMeasureNames.add ("MarketAccrued01");

  13398.         setstrMeasureNames.add ("MarketCleanCouponPV");

  13399.         setstrMeasureNames.add ("MarketCleanDV01");

  13400.         setstrMeasureNames.add ("MarketCleanIndexCouponPV");

  13401.         setstrMeasureNames.add ("MarketCleanPrice");

  13402.         setstrMeasureNames.add ("MarketCleanPV");

  13403.         setstrMeasureNames.add ("MarketCreditRisklessParPV");

  13404.         setstrMeasureNames.add ("MarketCreditRisklessPrincipalPV");

  13405.         setstrMeasureNames.add ("MarketCreditRiskyParPV");

  13406.         setstrMeasureNames.add ("MarketCreditRiskyPrincipalPV");

  13407.         setstrMeasureNames.add ("MarketDefaultExposure");

  13408.         setstrMeasureNames.add ("MarketDefaultExposureNoRec");

  13409.         setstrMeasureNames.add ("MarketDirtyCouponPV");

  13410.         setstrMeasureNames.add ("MarketDirtyDV01");

  13411.         setstrMeasureNames.add ("MarketDirtyIndexCouponPV");

  13412.         setstrMeasureNames.add ("MarketDirtyPrice");

  13413.         setstrMeasureNames.add ("MarketDirtyPV");

  13414.         setstrMeasureNames.add ("MarketDV01");

  13415.         setstrMeasureNames.add ("MarketExpectedRecovery");

  13416.         setstrMeasureNames.add ("MarketFirstCouponRate");

  13417.         setstrMeasureNames.add ("MarketFirstIndexRate");

  13418.         setstrMeasureNames.add ("MarketInputType=CleanPrice");

  13419.         setstrMeasureNames.add ("MarketInputType=CreditBasis");

  13420.         setstrMeasureNames.add ("MarketInputType=DirtyPrice");

  13421.         setstrMeasureNames.add ("MarketInputType=GSpread");

  13422.         setstrMeasureNames.add ("MarketInputType=ISpread");

  13423.         setstrMeasureNames.add ("MarketInputType=PECS");

  13424.         setstrMeasureNames.add ("MarketInputType=QuotedMargin");

  13425.         setstrMeasureNames.add ("MarketInputType=TSYSpread");

  13426.         setstrMeasureNames.add ("MarketInputType=Yield");

  13427.         setstrMeasureNames.add ("MarketInputType=ZSpread");

  13428.         setstrMeasureNames.add ("MarketLossOnInstantaneousDefault");

  13429.         setstrMeasureNames.add ("MarketParPV");

  13430.         setstrMeasureNames.add ("MarketPrincipalPV");

  13431.         setstrMeasureNames.add ("MarketPV");

  13432.         setstrMeasureNames.add ("MarketRecoveryPV");

  13433.         setstrMeasureNames.add ("MarketRisklessDirtyCouponPV");

  13434.         setstrMeasureNames.add ("MarketRisklessDirtyDV01");

  13435.         setstrMeasureNames.add ("MarketRisklessDirtyIndexCouponPV");

  13436.         setstrMeasureNames.add ("MarketRisklessDirtyPV");

  13437.         setstrMeasureNames.add ("MarketRiskyDirtyCouponPV");

  13438.         setstrMeasureNames.add ("MarketRiskyDirtyDV01");

  13439.         setstrMeasureNames.add ("MarketRiskyDirtyIndexCouponPV");

  13440.         setstrMeasureNames.add ("MarketRiskyDirtyPV");

  13441.         setstrMeasureNames.add ("ModifiedDuration");

  13442.         setstrMeasureNames.add ("OAS");

  13443.         setstrMeasureNames.add ("OASpread");

  13444.         setstrMeasureNames.add ("OptionAdjustedSpread");

  13445.         setstrMeasureNames.add ("ParEquivalentCDSSpread");

  13446.         setstrMeasureNames.add ("ParPV");

  13447.         setstrMeasureNames.add ("ParSpread");

  13448.         setstrMeasureNames.add ("PECS");

  13449.         setstrMeasureNames.add ("Price");

  13450.         setstrMeasureNames.add ("PrincipalPV");

  13451.         setstrMeasureNames.add ("PV");

  13452.         setstrMeasureNames.add ("RecoveryPV");

  13453.         setstrMeasureNames.add ("RisklessCleanCouponPV");

  13454.         setstrMeasureNames.add ("RisklessCleanDV01");

  13455.         setstrMeasureNames.add ("RisklessCleanIndexCouponPV");

  13456.         setstrMeasureNames.add ("RisklessCleanPV");

  13457.         setstrMeasureNames.add ("RisklessDirtyCouponPV");

  13458.         setstrMeasureNames.add ("RisklessDirtyDV01");

  13459.         setstrMeasureNames.add ("RisklessDirtyIndexCouponPV");

  13460.         setstrMeasureNames.add ("RisklessDirtyPV");

  13461.         setstrMeasureNames.add ("RiskyCleanCouponPV");

  13462.         setstrMeasureNames.add ("RiskyCleanDV01");

  13463.         setstrMeasureNames.add ("RiskyCleanIndexCouponPV");

  13464.         setstrMeasureNames.add ("RiskyCleanPV");

  13465.         setstrMeasureNames.add ("RiskyDirtyCouponPV");

  13466.         setstrMeasureNames.add ("RiskyDirtyDV01");

  13467.         setstrMeasureNames.add ("RiskyDirtyIndexCouponPV");

  13468.         setstrMeasureNames.add ("RiskyDirtyPV");

  13469.         setstrMeasureNames.add ("TSYSpread");

  13470.         setstrMeasureNames.add ("WorkoutDate");

  13471.         setstrMeasureNames.add ("WorkoutFactor");

  13472.         setstrMeasureNames.add ("WorkoutType");

  13473.         setstrMeasureNames.add ("WorkoutYield");

  13474.         setstrMeasureNames.add ("Yield");

  13475.         setstrMeasureNames.add ("Yield01");

  13476.         setstrMeasureNames.add ("YieldBasis");

  13477.         setstrMeasureNames.add ("YieldSpread");

  13478.         setstrMeasureNames.add ("ZeroDiscountMargin");

  13479.         setstrMeasureNames.add ("ZSpread");

  13480.         return setstrMeasureNames;
  13481.     }

  13482.     @Override public double pv (
  13483.         final org.drip.param.valuation.ValuationParams valParams,
  13484.         final org.drip.param.pricer.CreditPricerParams pricerParamsIn,
  13485.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  13486.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  13487.         throws java.lang.Exception
  13488.     {
  13489.         if (null == valParams || null == csqc)
  13490.             throw new java.lang.Exception ("BondComponent::pv => Invalid Inputs!");

  13491.         int iValueDate = valParams.valueDate();

  13492.         org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqc.fundingState (fundingLabel());

  13493.         if (null == dcFunding) throw new java.lang.Exception ("BondComponent::pv => Invalid Inputs!");

  13494.         int iLossPayLag = null == _creditSetting ? 0 : _creditSetting.lossPayLag();

  13495.         double dblProductRecovery = null == _creditSetting ? java.lang.Double.NaN :
  13496.             _creditSetting.recovery();

  13497.         boolean bUseCurveRecovery = null == _creditSetting ? false : _creditSetting.useCurveRecovery();

  13498.         boolean bAccrualOnDefault = null == _creditSetting ? false : _creditSetting.accrualOnDefault();

  13499.         org.drip.state.credit.CreditCurve cc = csqc.creditState (creditLabel());

  13500.         double dblRecoveryPV = 0.;
  13501.         double dblPrincipalPV = 0.;
  13502.         double dblDirtyCouponPV = 0.;
  13503.         boolean bApplyFlatForwardRate = false;
  13504.         double dblFlatForwardRate = java.lang.Double.NaN;

  13505.         if (null != vcp)
  13506.             bApplyFlatForwardRate = vcp.applyFlatForwardRate();
  13507.         else {
  13508.             org.drip.param.valuation.ValuationCustomizationParams vcpQuote = null == _quoteConvention ? null
  13509.                 : _quoteConvention.valuationCustomizationParams();

  13510.             if (null != vcpQuote) bApplyFlatForwardRate = vcpQuote.applyFlatForwardRate();
  13511.         }

  13512.         int iMaturityDate = maturityDate().julian();

  13513.         org.drip.param.pricer.CreditPricerParams pricerParams = null != pricerParamsIn ? pricerParamsIn : new
  13514.             org.drip.param.pricer.CreditPricerParams (7, null, false,
  13515.                 org.drip.param.pricer.CreditPricerParams.PERIOD_DISCRETIZATION_FULL_COUPON);

  13516.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods()) {
  13517.             int iPeriodPayDate = period.payDate();

  13518.             if (iPeriodPayDate < iValueDate) continue;

  13519.             int iPeriodEndDate = period.endDate();

  13520.             int iPeriodStartDate = period.startDate();

  13521.             org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = couponMetrics (iValueDate,
  13522.                 valParams, csqc);

  13523.             if (null == cpcm) throw new java.lang.Exception ("BondComponent::pv => Invalid Inputs!");

  13524.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblFlatForwardRate))
  13525.                 dblFlatForwardRate = cpcm.rate();

  13526.             double dblPeriodCoupon = bApplyFlatForwardRate ? dblFlatForwardRate : cpcm.rate();

  13527.             double dblPeriodAnnuity = dcFunding.df (iPeriodPayDate) * cpcm.cumulative();

  13528.             double dblPeriodDirtyDV01 = 0.0001 * period.accrualDCF (iPeriodEndDate) * dblPeriodAnnuity *
  13529.                 notional (iPeriodStartDate);

  13530.             double dblPeriodPrincipalPV = (notional (iPeriodStartDate) - notional (iPeriodEndDate)) *
  13531.                 dblPeriodAnnuity;

  13532.             if (null != cc && null != pricerParams) {
  13533.                 double dblSurvProb = cc.survival (pricerParams.survivalToPayDate() ? iPeriodPayDate :
  13534.                     iPeriodEndDate);

  13535.                 dblPeriodDirtyDV01 *= dblSurvProb;
  13536.                 dblPeriodPrincipalPV *= dblSurvProb;

  13537.                 for (org.drip.analytics.cashflow.LossQuadratureMetrics lqm : period.lossMetrics (this,
  13538.                     valParams, pricerParams, iMaturityDate, csqc)) {
  13539.                     if (null == lqm) continue;

  13540.                     int iSubPeriodEndDate = lqm.endDate();

  13541.                     int iSubPeriodStartDate = lqm.startDate();

  13542.                     double dblSubPeriodDF = dcFunding.effectiveDF (iSubPeriodStartDate + iLossPayLag,
  13543.                         iSubPeriodEndDate + iLossPayLag);

  13544.                     double dblSubPeriodNotional = notional (iSubPeriodStartDate, iSubPeriodEndDate);

  13545.                     double dblSubPeriodSurvival = cc.survival (iSubPeriodStartDate) - cc.survival
  13546.                         (iSubPeriodEndDate);

  13547.                     if (bAccrualOnDefault)
  13548.                         dblPeriodDirtyDV01 += 0.0001 * lqm.accrualDCF() * dblSubPeriodSurvival *
  13549.                             dblSubPeriodDF * dblSubPeriodNotional;

  13550.                     dblRecoveryPV += (bUseCurveRecovery ? cc.effectiveRecovery (iSubPeriodStartDate,
  13551.                         iSubPeriodEndDate) : dblProductRecovery) * dblSubPeriodSurvival *
  13552.                             dblSubPeriodNotional * dblSubPeriodDF;
  13553.                 }
  13554.             }

  13555.             dblPrincipalPV += dblPeriodPrincipalPV;

  13556.             dblDirtyCouponPV += 10000. * dblPeriodCoupon * couponFactor (iPeriodEndDate) *
  13557.                 dblPeriodDirtyDV01;
  13558.         }

  13559.         double dblParPV = dcFunding.df (iMaturityDate) * notional (iMaturityDate);

  13560.         if (null != cc && null != pricerParams) dblParPV *= cc.survival (iMaturityDate);

  13561.         return (dblDirtyCouponPV + dblPrincipalPV + dblParPV + dblRecoveryPV) / dcFunding.df (null !=
  13562.             _quoteConvention ? _quoteConvention.settleDate (valParams) : valParams.cashPayDate());
  13563.     }

  13564.     @Override public org.drip.numerical.differentiation.WengertJacobian jackDDirtyPVDManifestMeasure (
  13565.         final org.drip.param.valuation.ValuationParams valParams,
  13566.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13567.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13568.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  13569.     {
  13570.         return null;
  13571.     }

  13572.     @Override public org.drip.product.calib.ProductQuoteSet calibQuoteSet (
  13573.         final org.drip.state.representation.LatentStateSpecification[] aLSS)
  13574.     {
  13575.         return null;
  13576.     }

  13577.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint fundingPRWC (
  13578.         final org.drip.param.valuation.ValuationParams valParams,
  13579.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13580.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13581.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13582.         final org.drip.product.calib.ProductQuoteSet pqs)
  13583.     {
  13584.         return null;
  13585.     }

  13586.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint forwardPRWC (
  13587.         final org.drip.param.valuation.ValuationParams valParams,
  13588.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13589.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13590.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13591.         final org.drip.product.calib.ProductQuoteSet pqs)
  13592.     {
  13593.         return null;
  13594.     }

  13595.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint fundingForwardPRWC (
  13596.         final org.drip.param.valuation.ValuationParams valParams,
  13597.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13598.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13599.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13600.         final org.drip.product.calib.ProductQuoteSet pqs)
  13601.     {
  13602.         return null;
  13603.     }

  13604.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint fxPRWC (
  13605.         final org.drip.param.valuation.ValuationParams valParams,
  13606.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13607.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13608.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13609.         final org.drip.product.calib.ProductQuoteSet pqs)
  13610.     {
  13611.         return null;
  13612.     }

  13613.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint govviePRWC (
  13614.         final org.drip.param.valuation.ValuationParams valParams,
  13615.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13616.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13617.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13618.         final org.drip.product.calib.ProductQuoteSet pqs)
  13619.     {
  13620.         return null;
  13621.     }

  13622.     @Override public org.drip.state.estimator.PredictorResponseWeightConstraint volatilityPRWC (
  13623.         final org.drip.param.valuation.ValuationParams valParams,
  13624.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13625.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13626.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13627.         final org.drip.product.calib.ProductQuoteSet pqs)
  13628.     {
  13629.         return null;
  13630.     }

  13631.     @Override public org.drip.numerical.differentiation.WengertJacobian manifestMeasureDFMicroJack (
  13632.         final java.lang.String strManifestMeasure,
  13633.         final org.drip.param.valuation.ValuationParams valParams,
  13634.         final org.drip.param.pricer.CreditPricerParams pricerParams,
  13635.         final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13636.         final org.drip.param.valuation.ValuationCustomizationParams vcp)
  13637.     {
  13638.         return null;
  13639.     }

  13640.     /**
  13641.      * The BondCalibrator implements a calibrator that calibrates the yield, the credit basis, or the Z
  13642.      *      Spread for the bond given the price input. Calibration happens via either Newton-Raphson method,
  13643.      *      or via bracketing/root searching.
  13644.      *
  13645.      * @author Lakshmi Krishnamurthy
  13646.      *
  13647.      */

  13648.     public class BondCalibrator {
  13649.         private BondComponent _bond = null;
  13650.         private boolean _bApplyCouponExtension = false;

  13651.         /**
  13652.          * Constructor: Construct the calibrator from the parent bond.
  13653.          *
  13654.          * @param bond Parent
  13655.          * @param bApplyCouponExtension TRUE - Apply the Coupon Extension
  13656.          *
  13657.          * @throws java.lang.Exception Thrown if the inputs are invalid
  13658.          */

  13659.         public BondCalibrator (
  13660.             final BondComponent bond,
  13661.             final boolean bApplyCouponExtension)
  13662.             throws java.lang.Exception
  13663.         {
  13664.             if (null == (_bond = bond))
  13665.                 throw new java.lang.Exception ("BondComponent::BondCalibrator ctr => Invalid Inputs");

  13666.             _bApplyCouponExtension = bApplyCouponExtension;
  13667.         }

  13668.         /**
  13669.          * Calibrate the bond yield from the market price using the root bracketing technique.
  13670.          *
  13671.          * @param valParams Valuation Parameters
  13672.          * @param csqs Bond Market Parameters
  13673.          * @param vcp Valuation Customization Parameters
  13674.          * @param iWorkoutDate JulianDate Work-out
  13675.          * @param dblWorkoutFactor Work-out factor
  13676.          * @param dblPrice Price to be calibrated to
  13677.          *
  13678.          * @return The calibrated Yield
  13679.          *
  13680.          * @throws java.lang.Exception Thrown if the yield cannot be calibrated
  13681.          */

  13682.         public double calibrateYieldFromPrice (
  13683.             final org.drip.param.valuation.ValuationParams valParams,
  13684.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13685.             final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13686.             final int iWorkoutDate,
  13687.             final double dblWorkoutFactor,
  13688.             final double dblPrice)
  13689.             throws java.lang.Exception
  13690.         {
  13691.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13692.                 throw new java.lang.Exception
  13693.                     ("BondComponent::BondCalibrator::calibrateYieldFromPrice => Invalid Inputs!");

  13694.             org.drip.function.definition.R1ToR1 ofYieldToPrice = new org.drip.function.definition.R1ToR1
  13695.                 (null) {
  13696.                 @Override public double evaluate (
  13697.                     final double dblYield)
  13698.                     throws java.lang.Exception
  13699.                 {
  13700.                     return _bond.priceFromYield (valParams, csqs, vcp, iWorkoutDate, dblWorkoutFactor,
  13701.                         dblYield, _bApplyCouponExtension) - dblPrice;
  13702.                 }
  13703.             };

  13704.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13705.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., ofYieldToPrice, true).findRoot();

  13706.             if (null == rfop || !rfop.containsRoot())
  13707.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderZheng (0., ofYieldToPrice,
  13708.                     true).findRoot();

  13709.             if (null == rfop || !rfop.containsRoot())
  13710.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0., ofYieldToPrice,
  13711.                     null, org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13712.                         true).findRoot();

  13713.             if (null == rfop || !rfop.containsRoot())
  13714.                 throw new java.lang.Exception
  13715.                     ("BondComponent::BondCalibrator::calibrateYieldFromPrice => Cannot get root!");

  13716.             return rfop.getRoot();
  13717.         }

  13718.         /**
  13719.          * Calibrate the bond Z Spread from the market price using the root bracketing technique.
  13720.          *
  13721.          * @param valParams Valuation Parameters
  13722.          * @param csqs Bond Market Parameters
  13723.          * @param vcp Valuation Customization Parameters
  13724.          * @param iZeroCurveBaseDC The Discount Curve to derive the zero curve off of
  13725.          * @param iWorkoutDate JulianDate Work-out
  13726.          * @param dblWorkoutFactor Work-out factor
  13727.          * @param dblPrice Price to be calibrated to
  13728.          *
  13729.          * @return The calibrated Z Spread
  13730.          *
  13731.          * @throws java.lang.Exception Thrown if the Z Spread cannot be calibrated
  13732.          */

  13733.         public double calibrateZSpreadFromPrice (
  13734.             final org.drip.param.valuation.ValuationParams valParams,
  13735.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13736.             final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13737.             final int iZeroCurveBaseDC,
  13738.             final int iWorkoutDate,
  13739.             final double dblWorkoutFactor,
  13740.             final double dblPrice)
  13741.             throws java.lang.Exception
  13742.         {
  13743.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13744.                 throw new java.lang.Exception
  13745.                     ("BondComponent::BondCalibrator::calibrateZSpreadFromPrice => Invalid Inputs!");

  13746.             if (null != _floaterSetting)
  13747.                 throw new java.lang.Exception
  13748.                     ("BondComponent::BondCalibrator::calibrateZSpreadFromPrice => Z Spread Calculation turned off for floaters!");

  13749.             org.drip.function.definition.R1ToR1 ofZSpreadToPrice = new org.drip.function.definition.R1ToR1
  13750.                 (null) {
  13751.                 @Override public double evaluate (
  13752.                     final double dblZSpread)
  13753.                     throws java.lang.Exception
  13754.                 {
  13755.                     return _bond.priceFromZeroCurve (valParams, csqs, vcp, iZeroCurveBaseDC, iWorkoutDate,
  13756.                         dblWorkoutFactor, dblZSpread) - dblPrice;
  13757.                 }
  13758.             };

  13759.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13760.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., ofZSpreadToPrice,
  13761.                     true).findRoot();

  13762.             if (null == rfop || !rfop.containsRoot())
  13763.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBrent (0., ofZSpreadToPrice,
  13764.                     true).findRoot();

  13765.             if (null == rfop || !rfop.containsRoot())
  13766.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0., ofZSpreadToPrice,
  13767.                     new org.drip.function.r1tor1solver.ExecutionControl (ofZSpreadToPrice, new
  13768.                         org.drip.function.r1tor1solver.ExecutionControlParams (200, false, 1.e-02, 1.e-02,
  13769.                             1.e-01, 1.e-01)),
  13770.                                 org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13771.                                     true).findRoot();

  13772.             if (null == rfop || !rfop.containsRoot())
  13773.                 throw new java.lang.Exception
  13774.                     ("BondComponent::BondCalibrator::calibrateZSpreadFromPrice => Cannot get root!");

  13775.             return rfop.getRoot();
  13776.         }

  13777.         /**
  13778.          * Calibrate the Bond OAS from the Market Price using the Root Bracketing Technique.
  13779.          *
  13780.          * @param valParams Valuation Parameters
  13781.          * @param csqs Bond Market Parameters
  13782.          * @param vcp Valuation Customization Parameters
  13783.          * @param iZeroCurveBaseDC The Discount Curve to derive the zero curve off of
  13784.          * @param iWorkoutDate JulianDate Work-out
  13785.          * @param dblWorkoutFactor Work-out factor
  13786.          * @param dblPrice Price to be calibrated to
  13787.          *
  13788.          * @return The Calibrated OAS
  13789.          *
  13790.          * @throws java.lang.Exception Thrown if the OAS cannot be calibrated
  13791.          */

  13792.         public double calibrateOASFromPrice (
  13793.             final org.drip.param.valuation.ValuationParams valParams,
  13794.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13795.             final org.drip.param.valuation.ValuationCustomizationParams vcp,
  13796.             final int iZeroCurveBaseDC,
  13797.             final int iWorkoutDate,
  13798.             final double dblWorkoutFactor,
  13799.             final double dblPrice)
  13800.             throws java.lang.Exception
  13801.         {
  13802.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13803.                 throw new java.lang.Exception
  13804.                     ("BondComponent::BondCalibrator::calibrateOASFromPrice => Invalid Inputs!");

  13805.             org.drip.function.definition.R1ToR1 r1ToR1OASToPrice = new org.drip.function.definition.R1ToR1
  13806.                 (null) {
  13807.                 @Override public double evaluate (
  13808.                     final double dblZSpread)
  13809.                     throws java.lang.Exception
  13810.                 {
  13811.                     return _bond.priceFromZeroCurve (valParams, csqs, vcp, iZeroCurveBaseDC, iWorkoutDate,
  13812.                         dblWorkoutFactor, dblZSpread) - dblPrice;
  13813.                 }
  13814.             };

  13815.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13816.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., r1ToR1OASToPrice,
  13817.                     true).findRoot();

  13818.             if (null == rfop || !rfop.containsRoot())
  13819.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBrent (0., r1ToR1OASToPrice,
  13820.                     true).findRoot();

  13821.             if (null == rfop || !rfop.containsRoot())
  13822.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0., r1ToR1OASToPrice,
  13823.                     null, org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13824.                         true).findRoot();

  13825.             if (null == rfop || !rfop.containsRoot())
  13826.                 throw new java.lang.Exception
  13827.                     ("BondComponent::BondCalibrator::calibrateOASFromPrice => Cannot get root!");

  13828.             return rfop.getRoot();
  13829.         }

  13830.         /**
  13831.          * Calibrate the bond Z Spread from the market price. Calibration is done by bumping the discount
  13832.          *  curve.
  13833.          *
  13834.          * @param valParams Valuation Parameters
  13835.          * @param csqs Bond Market Parameters
  13836.          * @param iWorkoutDate JulianDate Work-out
  13837.          * @param dblWorkoutFactor Work-out factor
  13838.          * @param dblPrice Price to be calibrated to
  13839.          *
  13840.          * @return The calibrated Z Spread
  13841.          *
  13842.          * @throws java.lang.Exception Thrown if the yield cannot be calibrated
  13843.          */

  13844.         public double calibDiscCurveSpreadFromPrice (
  13845.             final org.drip.param.valuation.ValuationParams valParams,
  13846.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13847.             final int iWorkoutDate,
  13848.             final double dblWorkoutFactor,
  13849.             final double dblPrice)
  13850.             throws java.lang.Exception
  13851.         {
  13852.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13853.                 throw new java.lang.Exception
  13854.                     ("BondComponent::BondCalibrator::calibrateDiscCurveSpreadFromPrice => Invalid Inputs!");

  13855.             org.drip.function.definition.R1ToR1 ofDiscCurveSpreadToPrice = new
  13856.                 org.drip.function.definition.R1ToR1 (null) {
  13857.                 @Override public double evaluate (
  13858.                     final double dblZSpread)
  13859.                     throws java.lang.Exception
  13860.                 {
  13861.                     return _bond.priceFromFundingCurve (valParams, csqs, iWorkoutDate, dblWorkoutFactor,
  13862.                         dblZSpread) - dblPrice;
  13863.                 }
  13864.             };

  13865.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13866.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., ofDiscCurveSpreadToPrice,
  13867.                     true).findRoot();

  13868.             if (null == rfop || !rfop.containsRoot())
  13869.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderZheng (0.,
  13870.                     ofDiscCurveSpreadToPrice, true).findRoot();

  13871.             if (null == rfop || !rfop.containsRoot())
  13872.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0.,
  13873.                     ofDiscCurveSpreadToPrice, null,
  13874.                         org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13875.                             true).findRoot();

  13876.             if (null == rfop || !rfop.containsRoot())
  13877.                 throw new java.lang.Exception
  13878.                     ("BondComponent::BondCalibrator::calibDiscCurveSpreadFromPrice => Cannot get root!");

  13879.             return rfop.getRoot();
  13880.         }

  13881.         /**
  13882.          * Calibrate the bond Z Spread from the market price. Calibration is done by bumping the Zero Curve.
  13883.          *
  13884.          * @param valParams Valuation Parameters
  13885.          * @param csqs Bond Market Parameters
  13886.          * @param iWorkoutDate JulianDate Work-out
  13887.          * @param dblWorkoutFactor Work-out factor
  13888.          * @param dblPrice Price to be calibrated to
  13889.          *
  13890.          * @return The calibrated Z Spread
  13891.          *
  13892.          * @throws java.lang.Exception Thrown if the yield cannot be calibrated
  13893.          */

  13894.         public double calibZeroCurveSpreadFromPrice (
  13895.             final org.drip.param.valuation.ValuationParams valParams,
  13896.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13897.             final int iWorkoutDate,
  13898.             final double dblWorkoutFactor,
  13899.             final double dblPrice)
  13900.             throws java.lang.Exception
  13901.         {
  13902.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13903.                 throw new java.lang.Exception
  13904.                     ("BondComponent::BondCalibrator::calibrateZeroCurveSpreadFromPrice => Invalid Inputs!");

  13905.             if (null != _floaterSetting)
  13906.                 throw new java.lang.Exception
  13907.                     ("BondComponent::BondCalibrator::calibZeroCurveSpreadFromPrice => Z Spread Calculation turned off for floaters!");

  13908.             org.drip.function.definition.R1ToR1 ofZSpreadToPrice = new org.drip.function.definition.R1ToR1
  13909.                 (null) {
  13910.                 @Override public double evaluate (
  13911.                     final double dblZSpread)
  13912.                     throws java.lang.Exception
  13913.                 {
  13914.                     return _bond.priceFromFundingCurve (valParams, csqs, iWorkoutDate, dblWorkoutFactor,
  13915.                         dblZSpread) - dblPrice;
  13916.                 }
  13917.             };

  13918.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13919.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., ofZSpreadToPrice,
  13920.                     true).findRoot();

  13921.             if (null == rfop || !rfop.containsRoot())
  13922.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderZheng (0., ofZSpreadToPrice,
  13923.                     true).findRoot();

  13924.             if (null == rfop || !rfop.containsRoot())
  13925.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0., ofZSpreadToPrice,
  13926.                     null, org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13927.                         true).findRoot();

  13928.             if (null == rfop || !rfop.containsRoot())
  13929.                 throw new java.lang.Exception
  13930.                     ("BondComponent.calibZeroCurveSpreadFromPrice => Cannot get root!");

  13931.             return rfop.getRoot();
  13932.         }

  13933.         /**
  13934.          * Calibrate the bond Credit Basis from the market price
  13935.          *
  13936.          * @param valParams Valuation Parameters
  13937.          * @param csqs Bond Market Parameters
  13938.          * @param iWorkoutDate JulianDate Work-out
  13939.          * @param dblWorkoutFactor Work-out factor
  13940.          * @param dblPrice Price to be calibrated to
  13941.          * @param bFlat TRUE - Calibrate to Flat Curve
  13942.          *
  13943.          * @return The calibrated Credit Basis
  13944.          *
  13945.          * @throws java.lang.Exception Thrown if the Credit Basis cannot be calibrated
  13946.          */

  13947.         public double calibrateCreditBasisFromPrice (
  13948.             final org.drip.param.valuation.ValuationParams valParams,
  13949.             final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
  13950.             final int iWorkoutDate,
  13951.             final double dblWorkoutFactor,
  13952.             final double dblPrice,
  13953.             final boolean bFlat)
  13954.             throws java.lang.Exception
  13955.         {
  13956.             if (!org.drip.numerical.common.NumberUtil.IsValid (dblPrice))
  13957.                 throw new java.lang.Exception
  13958.                     ("BondComponent::BondCalibrator::calibrateCreditBasisFromPrice => Invalid Inputs!");

  13959.             org.drip.function.definition.R1ToR1 ofCreditBasisToPrice = new
  13960.                 org.drip.function.definition.R1ToR1 (null) {
  13961.                 @Override public double evaluate (
  13962.                     final double dblCreditBasis)
  13963.                     throws java.lang.Exception
  13964.                 {
  13965.                     return _bond.priceFromCreditCurve (valParams, csqs, iWorkoutDate, dblWorkoutFactor,
  13966.                         dblCreditBasis, bFlat) - dblPrice;
  13967.                 }
  13968.             };

  13969.             org.drip.function.r1tor1solver.FixedPointFinderOutput rfop = new
  13970.                 org.drip.function.r1tor1solver.FixedPointFinderNewton (0., ofCreditBasisToPrice,
  13971.                     true).findRoot();

  13972.             if (null == rfop || !rfop.containsRoot())
  13973.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderZheng (0., ofCreditBasisToPrice,
  13974.                     true).findRoot();

  13975.             if (null == rfop || !rfop.containsRoot())
  13976.                 rfop = new org.drip.function.r1tor1solver.FixedPointFinderBracketing (0., ofCreditBasisToPrice,
  13977.                     null, org.drip.function.r1tor1solver.VariateIteratorPrimitive.FALSE_POSITION,
  13978.                         true).findRoot();

  13979.             if (null == rfop || !rfop.containsRoot())
  13980.                 throw new java.lang.Exception
  13981.                     ("BondComponent.calibrateCreditBasisFromPrice => Cannot get root!");

  13982.             return rfop.getRoot();
  13983.         }
  13984.     }

  13985.     /**
  13986.      * Generate the EOS Callable Option Adjusted Metrics
  13987.      *
  13988.      * @param valParams The Valuation Parameters
  13989.      * @param csqc The Market Parameters
  13990.      * @param vcp The Valuation Customization Parameters
  13991.      * @param dblCleanPrice Clean Price
  13992.      * @param gbs The Govvie Builder Settings
  13993.      * @param deGovvieForward The Govvie Forward Diffusion Evolver
  13994.      * @param iNumPath The Number of Paths
  13995.      *
  13996.      * @return The Bond EOS Metrics
  13997.      */

  13998.     public org.drip.analytics.output.BondEOSMetrics callMetrics (
  13999.         final org.drip.param.valuation.ValuationParams valParams,
  14000.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  14001.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  14002.         final double dblCleanPrice,
  14003.         final org.drip.state.sequence.GovvieBuilderSettings gbs,
  14004.         final org.drip.measure.process.DiffusionEvolver deGovvieForward,
  14005.         final int iNumPath)
  14006.     {
  14007.         if (null == valParams || null == csqc || null == gbs) return null;

  14008.         org.drip.product.params.EmbeddedOptionSchedule eosCall = callSchedule();

  14009.         if (null == eosCall) return null;

  14010.         int iNumDimension = gbs.dimension();

  14011.         int iValueDate = valParams.valueDate();

  14012.         int[] aiExerciseDate = eosCall.exerciseDates (iValueDate);

  14013.         double[] adblExercisePrice = eosCall.exerciseFactors (iValueDate);

  14014.         if (null == aiExerciseDate || null == adblExercisePrice) return null;

  14015.         double dblOAS = java.lang.Double.NaN;
  14016.         int iNumVertex = aiExerciseDate.length;
  14017.         org.drip.state.sequence.PathVertexGovvie pvg = null;
  14018.         double[] adblOptimalExercisePV = new double[iNumPath];
  14019.         int[] aiOptimalExerciseVertexIndex = new int[iNumPath];
  14020.         double[] adblOptimalExerciseOAS = new double[iNumPath];
  14021.         double[] adblOptimalExercisePrice = new double[iNumPath];
  14022.         double[] adblOptimalExerciseOASGap = new double[iNumPath];
  14023.         double[] adblOptimalExerciseDuration = new double[iNumPath];
  14024.         double[] adblOptimalExerciseConvexity = new double[iNumPath];
  14025.         double[][] aadblForwardPrice = new double[iNumPath][iNumVertex];
  14026.         boolean[][] aabExerciseIndicator = new boolean[iNumPath][iNumVertex];
  14027.         double[][] aadblCorrelation = new double[iNumDimension][iNumDimension];
  14028.         org.drip.analytics.date.JulianDate[] adtOptimalExerciseDate = new
  14029.             org.drip.analytics.date.JulianDate[iNumPath];
  14030.         org.drip.param.valuation.ValuationParams[] aValParamsEvent = new
  14031.             org.drip.param.valuation.ValuationParams[iNumVertex];

  14032.         for (int i = 0; i < iNumDimension; ++i) {
  14033.             for (int j = 0; j < iNumDimension; ++j)
  14034.                 aadblCorrelation[i][j] = i == j ? 1. : 0.;
  14035.         }

  14036.         try {
  14037.             if (null == (pvg = org.drip.state.sequence.PathVertexGovvie.Standard (gbs, new
  14038.                 org.drip.measure.discrete.CorrelatedPathVertexDimension (new
  14039.                     org.drip.measure.crng.RandomNumberGenerator(), aadblCorrelation, iNumVertex, iNumPath,
  14040.                         false, null), deGovvieForward)))
  14041.                 return null;
  14042.         } catch (java.lang.Exception e) {
  14043.             e.printStackTrace();

  14044.             return null;
  14045.         }

  14046.         org.drip.state.govvie.GovvieCurve[][] aaGCPathEvent = pvg.pathVertex (aiExerciseDate);

  14047.         if (null == aaGCPathEvent) return null;

  14048.         try {
  14049.             dblOAS = oasFromPrice (valParams, csqc, vcp, dblCleanPrice);
  14050.         } catch (java.lang.Exception e) {
  14051.             e.printStackTrace();

  14052.             return null;
  14053.         }

  14054.         for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14055.             if (null == (aValParamsEvent[iVertex] = org.drip.param.valuation.ValuationParams.Spot
  14056.                 (aiExerciseDate[iVertex])))
  14057.                 return null;
  14058.         }

  14059.         org.drip.state.discount.MergedDiscountForwardCurve mdfcFunding = csqc.fundingState (fundingLabel());

  14060.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14061.             for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14062.                 try {
  14063.                     aadblForwardPrice[iPath][iVertex] = priceFromOAS (aValParamsEvent[iVertex],
  14064.                         org.drip.param.creator.MarketParamsBuilder.Create (mdfcFunding,
  14065.                             aaGCPathEvent[iPath][iVertex], null, null, null, null, null), null, dblOAS);
  14066.                 } catch (java.lang.Exception e) {
  14067.                     e.printStackTrace();

  14068.                     return null;
  14069.                 }
  14070.             }
  14071.         }

  14072.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14073.             adblOptimalExercisePV[iPath] = 0.;
  14074.             adblOptimalExercisePrice[iPath] = 1.;
  14075.             aiOptimalExerciseVertexIndex[iPath] = iNumVertex;

  14076.             adtOptimalExerciseDate[iPath] = maturityDate();

  14077.             for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14078.                 double dblExercisePV = java.lang.Double.NaN;
  14079.                 aabExerciseIndicator[iPath][iVertex] = false;

  14080.                 try {
  14081.                     dblExercisePV = (aadblForwardPrice[iPath][iVertex] - adblExercisePrice[iVertex]) *
  14082.                         mdfcFunding.df (aiExerciseDate[iVertex]);
  14083.                 } catch (java.lang.Exception e) {
  14084.                     e.printStackTrace();
  14085.                 }

  14086.                 if (dblExercisePV > adblOptimalExercisePV[iPath]) {
  14087.                     adtOptimalExerciseDate[iPath] = new org.drip.analytics.date.JulianDate
  14088.                         (aiExerciseDate[iVertex]);

  14089.                     adblOptimalExercisePrice[iPath] = adblExercisePrice[iVertex];
  14090.                     aiOptimalExerciseVertexIndex[iPath] = iVertex;
  14091.                     adblOptimalExercisePV[iPath] = dblExercisePV;
  14092.                     aabExerciseIndicator[iPath][iVertex] = true;
  14093.                 }
  14094.             }
  14095.         }

  14096.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14097.             int iOptimalExerciseDate = adtOptimalExerciseDate[iPath].julian();

  14098.             try {
  14099.                 adblOptimalExerciseOAS[iPath] = oasFromPrice (valParams, csqc, null, iOptimalExerciseDate,
  14100.                     adblOptimalExercisePrice[iPath], dblCleanPrice);

  14101.                 adblOptimalExerciseDuration[iPath] = modifiedDurationFromPrice (valParams, csqc, null,
  14102.                     iOptimalExerciseDate, adblOptimalExercisePrice[iPath], dblCleanPrice);

  14103.                 adblOptimalExerciseConvexity[iPath] = convexityFromPrice (valParams, csqc, null,
  14104.                     iOptimalExerciseDate, adblOptimalExercisePrice[iPath], dblCleanPrice);
  14105.             } catch (java.lang.Exception e) {
  14106.                 e.printStackTrace();

  14107.                 return null;
  14108.             }

  14109.             adblOptimalExerciseOASGap[iPath] = adblOptimalExerciseOAS[iPath] - dblOAS;
  14110.         }

  14111.         try {
  14112.             return new org.drip.analytics.output.BondEOSMetrics (dblOAS, adblOptimalExercisePrice,
  14113.                 adblOptimalExercisePV, adblOptimalExerciseOAS, adblOptimalExerciseOASGap,
  14114.                     adblOptimalExerciseDuration, adblOptimalExerciseConvexity, aadblForwardPrice,
  14115.                         aabExerciseIndicator);
  14116.         } catch (java.lang.Exception e) {
  14117.             e.printStackTrace();
  14118.         }

  14119.         return null;
  14120.     }

  14121.     /**
  14122.      * Generate the EOS Putable Option Adjusted Metrics
  14123.      *
  14124.      * @param valParams The Valuation Parameters
  14125.      * @param csqc The Market Parameters
  14126.      * @param vcp The Valuation Customization Parameters
  14127.      * @param dblCleanPrice Clean Price
  14128.      * @param gbs The Govvie Builder Settings
  14129.      * @param deGovvieForward The Govvie Forward Diffusion Evolver
  14130.      * @param iNumPath The Number of Paths
  14131.      *
  14132.      * @return The Bond EOS Metrics
  14133.      */

  14134.     public org.drip.analytics.output.BondEOSMetrics putMetrics (
  14135.         final org.drip.param.valuation.ValuationParams valParams,
  14136.         final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
  14137.         final org.drip.param.valuation.ValuationCustomizationParams vcp,
  14138.         final double dblCleanPrice,
  14139.         final org.drip.state.sequence.GovvieBuilderSettings gbs,
  14140.         final org.drip.measure.process.DiffusionEvolver deGovvieForward,
  14141.         final int iNumPath)
  14142.     {
  14143.         if (null == valParams || null == csqc || null == gbs) return null;

  14144.         org.drip.product.params.EmbeddedOptionSchedule eosPut = putSchedule();

  14145.         if (null == eosPut) return null;

  14146.         int iNumDimension = gbs.dimension();

  14147.         int iValueDate = valParams.valueDate();

  14148.         int[] aiExerciseDate = eosPut.exerciseDates (iValueDate);

  14149.         double[] adblExercisePrice = eosPut.exerciseFactors (iValueDate);

  14150.         if (null == aiExerciseDate || null == adblExercisePrice) return null;

  14151.         double dblOAS = java.lang.Double.NaN;
  14152.         int iNumVertex = aiExerciseDate.length;
  14153.         org.drip.state.sequence.PathVertexGovvie pvg = null;
  14154.         double[] adblOptimalExercisePV = new double[iNumPath];
  14155.         int[] aiOptimalExerciseVertexIndex = new int[iNumPath];
  14156.         double[] adblOptimalExerciseOAS = new double[iNumPath];
  14157.         double[] adblOptimalExercisePrice = new double[iNumPath];
  14158.         double[] adblOptimalExerciseOASGap = new double[iNumPath];
  14159.         double[] adblOptimalExerciseDuration = new double[iNumPath];
  14160.         double[] adblOptimalExerciseConvexity = new double[iNumPath];
  14161.         double[][] aadblForwardPrice = new double[iNumPath][iNumVertex];
  14162.         boolean[][] aabExerciseIndicator = new boolean[iNumPath][iNumVertex];
  14163.         double[][] aadblCorrelation = new double[iNumDimension][iNumDimension];
  14164.         org.drip.analytics.date.JulianDate[] adtOptimalExerciseDate = new
  14165.             org.drip.analytics.date.JulianDate[iNumPath];
  14166.         org.drip.param.valuation.ValuationParams[] aValParamsEvent = new
  14167.             org.drip.param.valuation.ValuationParams[iNumVertex];

  14168.         for (int i = 0; i < iNumDimension; ++i) {
  14169.             for (int j = 0; j < iNumDimension; ++j)
  14170.                 aadblCorrelation[i][j] = i == j ? 1. : 0.;
  14171.         }

  14172.         try {
  14173.             if (null == (pvg = org.drip.state.sequence.PathVertexGovvie.Standard (gbs, new
  14174.                 org.drip.measure.discrete.CorrelatedPathVertexDimension (new
  14175.                     org.drip.measure.crng.RandomNumberGenerator(), aadblCorrelation, iNumVertex, iNumPath,
  14176.                         false, null), deGovvieForward)))
  14177.                 return null;
  14178.         } catch (java.lang.Exception e) {
  14179.             e.printStackTrace();

  14180.             return null;
  14181.         }

  14182.         org.drip.state.govvie.GovvieCurve[][] aaGCPathEvent = pvg.pathVertex (aiExerciseDate);

  14183.         if (null == aaGCPathEvent) return null;

  14184.         try {
  14185.             dblOAS = oasFromPrice (valParams, csqc, vcp, dblCleanPrice);
  14186.         } catch (java.lang.Exception e) {
  14187.             e.printStackTrace();

  14188.             return null;
  14189.         }

  14190.         for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14191.             if (null == (aValParamsEvent[iVertex] = org.drip.param.valuation.ValuationParams.Spot
  14192.                 (aiExerciseDate[iVertex])))
  14193.                 return null;
  14194.         }

  14195.         org.drip.state.discount.MergedDiscountForwardCurve mdfcFunding = csqc.fundingState (fundingLabel());

  14196.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14197.             for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14198.                 try {
  14199.                     aadblForwardPrice[iPath][iVertex] = priceFromOAS (aValParamsEvent[iVertex],
  14200.                         org.drip.param.creator.MarketParamsBuilder.Create (mdfcFunding,
  14201.                             aaGCPathEvent[iPath][iVertex], null, null, null, null, null), null, dblOAS);
  14202.                 } catch (java.lang.Exception e) {
  14203.                     e.printStackTrace();

  14204.                     return null;
  14205.                 }
  14206.             }
  14207.         }

  14208.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14209.             adblOptimalExercisePV[iPath] = 0.;
  14210.             adblOptimalExercisePrice[iPath] = 1.;
  14211.             aiOptimalExerciseVertexIndex[iPath] = iNumVertex;

  14212.             adtOptimalExerciseDate[iPath] = maturityDate();

  14213.             for (int iVertex = 0; iVertex < iNumVertex; ++iVertex) {
  14214.                 double dblExercisePV = java.lang.Double.NaN;
  14215.                 aabExerciseIndicator[iPath][iVertex] = false;

  14216.                 try {
  14217.                     dblExercisePV = (adblExercisePrice[iVertex] - aadblForwardPrice[iPath][iVertex]) *
  14218.                         mdfcFunding.df (aiExerciseDate[iVertex]);
  14219.                 } catch (java.lang.Exception e) {
  14220.                     e.printStackTrace();
  14221.                 }

  14222.                 if (dblExercisePV > adblOptimalExercisePV[iPath]) {
  14223.                     adtOptimalExerciseDate[iPath] = new org.drip.analytics.date.JulianDate
  14224.                         (aiExerciseDate[iVertex]);

  14225.                     adblOptimalExercisePrice[iPath] = adblExercisePrice[iVertex];
  14226.                     aiOptimalExerciseVertexIndex[iPath] = iVertex;
  14227.                     adblOptimalExercisePV[iPath] = dblExercisePV;
  14228.                     aabExerciseIndicator[iPath][iVertex] = true;
  14229.                 }
  14230.             }
  14231.         }

  14232.         for (int iPath = 0; iPath < iNumPath; ++iPath) {
  14233.             int iOptimalExerciseDate = adtOptimalExerciseDate[iPath].julian();

  14234.             try {
  14235.                 adblOptimalExerciseOAS[iPath] = oasFromPrice (valParams, csqc, null, iOptimalExerciseDate,
  14236.                     adblOptimalExercisePrice[iPath], dblCleanPrice);

  14237.                 adblOptimalExerciseDuration[iPath] = modifiedDurationFromPrice (valParams, csqc, null,
  14238.                     iOptimalExerciseDate, adblOptimalExercisePrice[iPath], dblCleanPrice);

  14239.                 adblOptimalExerciseConvexity[iPath] = convexityFromPrice (valParams, csqc, null,
  14240.                     iOptimalExerciseDate, adblOptimalExercisePrice[iPath], dblCleanPrice);
  14241.             } catch (java.lang.Exception e) {
  14242.                 e.printStackTrace();

  14243.                 return null;
  14244.             }

  14245.             adblOptimalExerciseOASGap[iPath] = adblOptimalExerciseOAS[iPath] - dblOAS;
  14246.         }

  14247.         try {
  14248.             return new org.drip.analytics.output.BondEOSMetrics (dblOAS, adblOptimalExercisePrice,
  14249.                 adblOptimalExercisePV, adblOptimalExerciseOAS, adblOptimalExerciseOASGap,
  14250.                     adblOptimalExerciseDuration, adblOptimalExerciseConvexity, aadblForwardPrice,
  14251.                         aabExerciseIndicator);
  14252.         } catch (java.lang.Exception e) {
  14253.             e.printStackTrace();
  14254.         }

  14255.         return null;
  14256.     }

  14257.     @Override public void showPeriods()
  14258.         throws java.lang.Exception
  14259.     {
  14260.         for (org.drip.analytics.cashflow.CompositePeriod period : couponPeriods())
  14261.             System.out.println ("\t" + org.drip.analytics.date.DateUtil.YYYYMMDD (period.startDate()) +
  14262.                 "->" + org.drip.analytics.date.DateUtil.YYYYMMDD (period.endDate()) + "    " +
  14263.                     period.accrualDCF (period.endDate()));
  14264.     }
  14265. }