CreditCurve.java

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

  81. /**
  82.  * <i>CreditCurve</i> is the stub for the survival curve functionality. It extends the Curve object by
  83.  * exposing the following functions:
  84.  *
  85.  *  <br><br>
  86.  *  <ul>
  87.  *      <li>
  88.  *          Set of curve and market identifiers
  89.  *      </li>
  90.  *      <li>
  91.  *          Recovery to a specific date/tenor, and effective recovery between a date interval
  92.  *      </li>
  93.  *      <li>
  94.  *          Hazard Rate to a specific date/tenor, and effective hazard rate between a date interval
  95.  *      </li>
  96.  *      <li>
  97.  *          Survival to a specific date/tenor, and effective survival between a date interval
  98.  *      </li>
  99.  *      <li>
  100.  *          Set/unset date of specific default
  101.  *      </li>
  102.  *      <li>
  103.  *          Generate scenario curves from the base credit curve (flat/parallel/custom)
  104.  *      </li>
  105.  *      <li>
  106.  *          Set/unset the Curve Construction Inputs, Latent State, and the Manifest Metrics
  107.  *      </li>
  108.  *      <li>
  109.  *          Serialization/De-serialization to and from Byte Arrays
  110.  *      </li>
  111.  *  </ul>
  112.  *
  113.  *  <br><br>
  114.  *  <ul>
  115.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  116.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
  117.  *      <li><b>Project</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/state/README.md">Latent State Inference and Creation Utilities</a></li>
  118.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/state/credit/README.md">Credit Latent State Curve Representation</a></li>
  119.  *  </ul>
  120.  * <br><br>
  121.  *
  122.  * @author Lakshmi Krishnamurthy
  123.  */

  124. public abstract class CreditCurve implements org.drip.analytics.definition.Curve {
  125.     private static final int NUM_DF_QUADRATURES = 5;

  126.     protected java.lang.String _strCurrency = "";
  127.     protected int _iEpochDate = java.lang.Integer.MIN_VALUE;
  128.     protected org.drip.state.identifier.EntityCDSLabel _label = null;
  129.     protected int _iSpecificDefaultDate = java.lang.Integer.MIN_VALUE;

  130.     /*
  131.      * Manifest Measure Inputs that go into building the Curve Span
  132.      */

  133.     protected boolean _bFlat = false;
  134.     protected double[] _adblCalibQuote = null;
  135.     protected java.lang.String[] _astrCalibMeasure = null;
  136.     protected org.drip.state.govvie.GovvieCurve _gc = null;
  137.     protected org.drip.state.discount.MergedDiscountForwardCurve _dc = null;
  138.     protected org.drip.param.valuation.ValuationParams _valParam = null;
  139.     protected org.drip.param.pricer.CreditPricerParams _pricerParam = null;
  140.     protected org.drip.param.market.LatentStateFixingsContainer _lsfc = null;
  141.     protected org.drip.product.definition.CalibratableComponent[] _aCalibInst = null;
  142.     protected org.drip.param.valuation.ValuationCustomizationParams _quotingParams = null;
  143.     protected org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String> _mapMeasure = null;
  144.     protected org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double>>
  145.         _mapQuote = null;

  146.     protected CreditCurve (
  147.         final int iEpochDate,
  148.         final org.drip.state.identifier.EntityCDSLabel label,
  149.         final java.lang.String strCurrency)
  150.         throws java.lang.Exception
  151.     {
  152.         if (!org.drip.numerical.common.NumberUtil.IsValid (_iEpochDate = iEpochDate) || null == (_label =
  153.             label) || null == (_strCurrency = strCurrency) || _strCurrency.isEmpty())
  154.             throw new java.lang.Exception ("CreditCurve ctr: Invalid Inputs");
  155.     }

  156.     @Override public org.drip.state.identifier.LatentStateLabel label()
  157.     {
  158.         return _label;
  159.     }

  160.     @Override public java.lang.String currency()
  161.     {
  162.         return _strCurrency;
  163.     }

  164.     @Override public org.drip.analytics.date.JulianDate epoch()
  165.     {
  166.         try {
  167.             return new org.drip.analytics.date.JulianDate (_iEpochDate);
  168.         } catch (java.lang.Exception e) {
  169.             e.printStackTrace();
  170.         }

  171.         return null;
  172.     }

  173.     /**
  174.      * Set the Specific Default Date
  175.      *
  176.      * @param iSpecificDefaultDate Date of Specific Default
  177.      *
  178.      * @return TRUE if successful
  179.      */

  180.     public boolean setSpecificDefault (
  181.         final int iSpecificDefaultDate)
  182.     {
  183.         _iSpecificDefaultDate = iSpecificDefaultDate;
  184.         return true;
  185.     }

  186.     /**
  187.      * Remove the Specific Default Date
  188.      *
  189.      * @return TRUE if successful
  190.      */

  191.     public boolean unsetSpecificDefault()
  192.     {
  193.         _iSpecificDefaultDate = java.lang.Integer.MIN_VALUE;
  194.         return true;
  195.     }

  196.     /**
  197.      * Calculate the survival to the given date
  198.      *
  199.      * @param iDate Date
  200.      *
  201.      * @return Survival Probability
  202.      *
  203.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  204.      */

  205.     public abstract double survival (
  206.         final int iDate)
  207.         throws java.lang.Exception;

  208.     /**
  209.      * Calculate the survival to the given date
  210.      *
  211.      * @param dt Date
  212.      *
  213.      * @return Survival Probability
  214.      *
  215.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  216.      */

  217.     public double survival (
  218.         final org.drip.analytics.date.JulianDate dt)
  219.         throws java.lang.Exception
  220.     {
  221.         if (null == dt) throw new java.lang.Exception ("CreditCurve::survival => Invalid Date");

  222.         return survival (dt.julian());
  223.     }

  224.     /**
  225.      * Calculate the survival to the given tenor
  226.      *
  227.      * @param strTenor Tenor
  228.      *
  229.      * @return Survival Probability
  230.      *
  231.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  232.      */

  233.     public double survival (
  234.         final java.lang.String strTenor)
  235.         throws java.lang.Exception
  236.     {
  237.         if (null == strTenor || strTenor.isEmpty())
  238.             throw new java.lang.Exception ("CreditCurve::survival => Bad tenor");

  239.         return survival (new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor (strTenor));
  240.     }

  241.     /**
  242.      * Calculate the time-weighted survival between a pair of 2 dates
  243.      *
  244.      * @param iDate1 First Date
  245.      * @param iDate2 Second Date
  246.      *
  247.      * @return Survival Probability
  248.      *
  249.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  250.      */

  251.     public double effectiveSurvival (
  252.         final int iDate1,
  253.         final int iDate2)
  254.         throws java.lang.Exception
  255.     {
  256.         if (iDate1 == iDate2) return survival (iDate1);

  257.         int iNumQuadratures = 0;
  258.         double dblEffectiveSurvival = 0.;
  259.         int iQuadratureWidth = (iDate2 - iDate1) / NUM_DF_QUADRATURES;

  260.         for (int iDate = iDate1; iDate <= iDate2; iDate += iQuadratureWidth) {
  261.             ++iNumQuadratures;

  262.             dblEffectiveSurvival += (survival (iDate) + survival (iDate + iQuadratureWidth));
  263.         }

  264.         return dblEffectiveSurvival / (2. * iNumQuadratures);
  265.     }

  266.     /**
  267.      * Calculate the time-weighted survival between a pair of 2 dates
  268.      *
  269.      * @param dt1 First Date
  270.      * @param dt2 Second Date
  271.      *
  272.      * @return Survival Probability
  273.      *
  274.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  275.      */

  276.     public double effectiveSurvival (
  277.         final org.drip.analytics.date.JulianDate dt1,
  278.         final org.drip.analytics.date.JulianDate dt2)
  279.         throws java.lang.Exception
  280.     {
  281.         if (null == dt1 || null == dt2)
  282.             throw new java.lang.Exception ("CreditCurve::effectiveSurvival => Invalid date");

  283.         return effectiveSurvival (dt1.julian(), dt2.julian());
  284.     }

  285.     /**
  286.      * Calculate the time-weighted survival between a pair of 2 tenors
  287.      *
  288.      * @param strTenor1 First tenor
  289.      * @param strTenor2 Second tenor
  290.      *
  291.      * @return Survival Probability
  292.      *
  293.      * @throws java.lang.Exception Thrown if the survival probability cannot be calculated
  294.      */

  295.     public double effectiveSurvival (
  296.         final java.lang.String strTenor1,
  297.         final java.lang.String strTenor2)
  298.         throws java.lang.Exception
  299.     {
  300.         if (null == strTenor1 || strTenor1.isEmpty() || null == strTenor2 || strTenor2.isEmpty())
  301.             throw new java.lang.Exception ("CreditCurve::effectiveSurvival => bad tenor");

  302.         return effectiveSurvival (new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor
  303.             (strTenor1), new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor (strTenor2));
  304.     }

  305.     /**
  306.      * Calculate the recovery rate to the given date
  307.      *
  308.      * @param iDate Date
  309.      *
  310.      * @return Recovery Rate
  311.      *
  312.      * @throws java.lang.Exception Thrown if the Recovery rate cannot be calculated
  313.      */

  314.     public abstract double recovery (
  315.         final int iDate)
  316.         throws java.lang.Exception;

  317.     /**
  318.      * Calculate the recovery rate to the given date
  319.      *
  320.      * @param dt Date
  321.      *
  322.      * @return Recovery Rate
  323.      *
  324.      * @throws java.lang.Exception Thrown if the Recovery rate cannot be calculated
  325.      */

  326.     public double recovery (
  327.         final org.drip.analytics.date.JulianDate dt)
  328.         throws java.lang.Exception
  329.     {
  330.         if (null == dt) throw new java.lang.Exception ("CreditCurve::recovery => Invalid Date");

  331.         return recovery (dt.julian());
  332.     }

  333.     /**
  334.      * Calculate the recovery rate to the given tenor
  335.      *
  336.      * @param strTenor Tenor
  337.      *
  338.      * @return Recovery Rate
  339.      *
  340.      * @throws java.lang.Exception Thrown if the Recovery rate cannot be calculated
  341.      */

  342.     public double recovery (
  343.         final java.lang.String strTenor)
  344.         throws java.lang.Exception
  345.     {
  346.         if (null == strTenor || strTenor.isEmpty())
  347.             throw new java.lang.Exception ("CreditCurve::recovery => Invalid Tenor");

  348.         return recovery (new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor (strTenor));
  349.     }

  350.     /**
  351.      * Calculate the time-weighted recovery between a pair of dates
  352.      *
  353.      * @param iDate1 First Date
  354.      * @param iDate2 Second Date
  355.      *
  356.      * @return Time-weighted recovery
  357.      *
  358.      * @throws java.lang.Exception Thrown if the recovery cannot be calculated
  359.      */

  360.     public double effectiveRecovery (
  361.         final int iDate1,
  362.         final int iDate2)
  363.         throws java.lang.Exception
  364.     {
  365.         if (iDate1 == iDate2) return recovery (iDate1);

  366.         int iNumQuadratures = 0;
  367.         double dblEffectiveRecovery = 0.;
  368.         int iQuadratureWidth = (iDate2 - iDate1) / NUM_DF_QUADRATURES;

  369.         if (0 == iQuadratureWidth) iQuadratureWidth = 1;

  370.         for (int iDate = iDate1; iDate <= iDate2; iDate += iQuadratureWidth) {
  371.             ++iNumQuadratures;

  372.             dblEffectiveRecovery += (recovery (iDate) + recovery (iDate + iQuadratureWidth));
  373.         }

  374.         return dblEffectiveRecovery / (2. * iNumQuadratures);
  375.     }

  376.     /**
  377.      * Calculate the time-weighted recovery between a pair of dates
  378.      *
  379.      * @param dt1 First Date
  380.      * @param dt2 Second Date
  381.      *
  382.      * @return Time-weighted recovery
  383.      *
  384.      * @throws java.lang.Exception Thrown if the recovery cannot be calculated
  385.      */

  386.     public double effectiveRecovery (
  387.         final org.drip.analytics.date.JulianDate dt1,
  388.         final org.drip.analytics.date.JulianDate dt2)
  389.         throws java.lang.Exception
  390.     {
  391.         if (null == dt1 || null == dt2)
  392.             throw new java.lang.Exception ("CreditCurve::effectiveRecovery => Invalid date");

  393.         return effectiveRecovery (dt1.julian(), dt2.julian());
  394.     }

  395.     /**
  396.      * Calculate the time-weighted recovery between a pair of tenors
  397.      *
  398.      * @param strTenor1 First Tenor
  399.      * @param strTenor2 Second Tenor
  400.      *
  401.      * @return Time-weighted recovery
  402.      *
  403.      * @throws java.lang.Exception Thrown if the recovery cannot be calculated
  404.      */

  405.     public double effectiveRecovery (
  406.         final java.lang.String strTenor1,
  407.         final java.lang.String strTenor2)
  408.         throws java.lang.Exception
  409.     {
  410.         if (null == strTenor1 || strTenor1.isEmpty() || null == strTenor2 || strTenor2.isEmpty())
  411.             throw new java.lang.Exception ("CreditCurve::effectiveRecovery => Invalid tenor");

  412.         return effectiveRecovery (new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor
  413.             (strTenor1), new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor (strTenor2));
  414.     }

  415.     /**
  416.      * Calculate the hazard rate between a pair of forward dates
  417.      *
  418.      * @param dt1 First Date
  419.      * @param dt2 Second Date
  420.      *
  421.      * @return Hazard Rate
  422.      *
  423.      * @throws java.lang.Exception Thrown if the hazard rate cannot be calculated
  424.      */

  425.     public double hazard (
  426.         final org.drip.analytics.date.JulianDate dt1,
  427.         final org.drip.analytics.date.JulianDate dt2)
  428.         throws java.lang.Exception
  429.     {
  430.         if (null == dt1 || null == dt2)
  431.             throw new java.lang.Exception ("CreditCurve::hazard => Invalid dates");

  432.         if (dt1.julian() < _iEpochDate || dt2.julian() < _iEpochDate) return 0.;

  433.         return 365.25 / (dt2.julian() - dt1.julian()) * java.lang.Math.log (survival (dt1) / survival (dt2));
  434.     }

  435.     /**
  436.      * Calculate the hazard rate to the given date
  437.      *
  438.      * @param dt Date
  439.      *
  440.      * @return Hazard Rate
  441.      *
  442.      * @throws java.lang.Exception Thrown if the hazard rate cannot be calculated
  443.      */

  444.     public double hazard (
  445.         final org.drip.analytics.date.JulianDate dt)
  446.         throws java.lang.Exception
  447.     {
  448.         return hazard (dt, new org.drip.analytics.date.JulianDate (_iEpochDate));
  449.     }

  450.     /**
  451.      * Calculate the hazard rate to the given tenor
  452.      *
  453.      * @param strTenor Tenor
  454.      *
  455.      * @return Hazard Rate
  456.      *
  457.      * @throws java.lang.Exception Thrown if the hazard rate cannot be calculated
  458.      */

  459.     public double hazard (
  460.         final java.lang.String strTenor)
  461.         throws java.lang.Exception
  462.     {
  463.         if (null == strTenor || strTenor.isEmpty())
  464.             throw new java.lang.Exception ("CreditCurve::hazard => Bad Tenor");

  465.         return hazard (new org.drip.analytics.date.JulianDate (_iEpochDate).addTenor (strTenor));
  466.     }

  467.     /**
  468.      * Create a flat hazard curve from the inputs
  469.      *
  470.      * @param dblFlatNodeValue Flat hazard node value
  471.      * @param bSingleNode Uses a single node for Calibration (True)
  472.      * @param dblRecovery (Optional) Recovery to be used in creation of the flat curve
  473.      *
  474.      * @return New CreditCurve instance
  475.      */

  476.     public abstract CreditCurve flatCurve (
  477.         final double dblFlatNodeValue,
  478.         final boolean bSingleNode,
  479.         final double dblRecovery);

  480.     /**
  481.      * Set the calibration inputs for the CreditCurve
  482.      *
  483.      * @param valParam ValuationParams
  484.      * @param bFlat Flat calibration desired (True)
  485.      * @param dc Base Discount Curve
  486.      * @param gc Govvie Curve
  487.      * @param pricerParam PricerParams
  488.      * @param aCalibInst Array of calibration instruments
  489.      * @param adblCalibQuote Array of calibration quotes
  490.      * @param astrCalibMeasure Array of calibration measures
  491.      * @param lsfc Latent State Fixings Container
  492.      * @param quotingParams Quoting Parameters
  493.      */

  494.     public void setInstrCalibInputs (
  495.         final org.drip.param.valuation.ValuationParams valParam,
  496.         final boolean bFlat,
  497.         final org.drip.state.discount.MergedDiscountForwardCurve dc,
  498.         final org.drip.state.govvie.GovvieCurve gc,
  499.         final org.drip.param.pricer.CreditPricerParams pricerParam,
  500.         final org.drip.product.definition.CalibratableComponent[] aCalibInst,
  501.         final double[] adblCalibQuote,
  502.         final java.lang.String[] astrCalibMeasure,
  503.         final org.drip.param.market.LatentStateFixingsContainer lsfc,
  504.         final org.drip.param.valuation.ValuationCustomizationParams quotingParams)
  505.     {
  506.         _dc = dc;
  507.         _gc = gc;
  508.         _lsfc = lsfc;
  509.         _bFlat = bFlat;
  510.         _valParam = valParam;
  511.         _aCalibInst = aCalibInst;
  512.         _pricerParam = pricerParam;
  513.         _quotingParams = quotingParams;
  514.         _adblCalibQuote = adblCalibQuote;
  515.         _astrCalibMeasure = astrCalibMeasure;

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

  518.         _mapMeasure = new org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String>();

  519.         for (int i = 0; i < aCalibInst.length; ++i) {
  520.             _mapMeasure.put (_aCalibInst[i].primaryCode(), astrCalibMeasure[i]);

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

  523.             mapManifestMeasureCalibQuote.put (_astrCalibMeasure[i], adblCalibQuote[i]);

  524.             _mapQuote.put (_aCalibInst[i].primaryCode(), mapManifestMeasureCalibQuote);

  525.             java.lang.String[] astrSecCode = _aCalibInst[i].secondaryCode();

  526.             if (null != astrSecCode) {
  527.                 for (int j = 0; j < astrSecCode.length; ++j)
  528.                     _mapQuote.put (astrSecCode[j], mapManifestMeasureCalibQuote);
  529.             }
  530.         }
  531.     }

  532.     @Override public boolean setCCIS (
  533.         final org.drip.analytics.input.CurveConstructionInputSet ccis)
  534.     {
  535.         return false;
  536.     }

  537.     @Override public org.drip.product.definition.CalibratableComponent[] calibComp()
  538.     {
  539.         return _aCalibInst;
  540.     }

  541.     @Override public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> manifestMeasure (
  542.         final java.lang.String strInstr)
  543.     {
  544.         if (null == _mapQuote || 0 == _mapQuote.size() || null == strInstr || strInstr.isEmpty() ||
  545.             !_mapQuote.containsKey (strInstr))
  546.             return null;

  547.         return _mapQuote.get (strInstr);
  548.     }
  549. }