FlatForwardDiscountCurve.java

  1. package org.drip.state.nonlinear;

  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>FlatForwardDiscountCurve</i> manages the Discounting Latent State, using the Forward Rate as the State
  84.  * Response Representation. It exports the following functionality:
  85.  *
  86.  *  <br><br>
  87.  *  <ul>
  88.  *      <li>
  89.  *          Boot Methods - Set/Bump Specific Node Quantification Metric, or Set Flat Value
  90.  *      </li>
  91.  *      <li>
  92.  *          Boot Calibration - Initialize Run, Compute Calibration Metric
  93.  *      </li>
  94.  *      <li>
  95.  *          Compute the discount factor, forward rate, or the zero rate from the Forward Rate Latent State
  96.  *      </li>
  97.  *      <li>
  98.  *          Create a ForwardRateEstimator instance for the given Index
  99.  *      </li>
  100.  *      <li>
  101.  *          Retrieve Array of the Calibration Components
  102.  *      </li>
  103.  *      <li>
  104.  *          Retrieve the Curve Construction Input Set
  105.  *      </li>
  106.  *      <li>
  107.  *          Compute the Jacobian of the Discount Factor Latent State to the input Quote
  108.  *      </li>
  109.  *      <li>
  110.  *          Synthesize scenario Latent State by parallel shifting/custom tweaking the quantification metric
  111.  *      </li>
  112.  *      <li>
  113.  *          Synthesize scenario Latent State by parallel/custom shifting/custom tweaking the manifest measure
  114.  *      </li>
  115.  *  </ul>
  116.  *
  117.  *  <br><br>
  118.  *  <ul>
  119.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  120.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
  121.  *      <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>
  122.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/state/nonlinear/README.md">Nonlinear (i.e., Boot) Latent State Construction</a></li>
  123.  *  </ul>
  124.  * <br><br>
  125.  *
  126.  * @author Lakshmi Krishnamurthy
  127.  */

  128. public class FlatForwardDiscountCurve extends org.drip.state.discount.ExplicitBootDiscountCurve {
  129.     private int _aiDate[] = null;
  130.     private int _iCompoundingFreq = -1;
  131.     private double _adblForwardRate[] = null;
  132.     private boolean _bDiscreteCompounding = false;
  133.     private java.lang.String _strCompoundingDayCount = "";

  134.     protected double yearFract (
  135.         final int iStartDate,
  136.         final int iEndDate)
  137.         throws java.lang.Exception
  138.     {
  139.         return _bDiscreteCompounding ? org.drip.analytics.daycount.Convention.YearFraction (iStartDate,
  140.             iEndDate, _strCompoundingDayCount, false, null, currency()) : 1. * (iEndDate - iStartDate) /
  141.                 365.25;
  142.     }

  143.     private FlatForwardDiscountCurve shiftManifestMeasure (
  144.         final double[] adblShift)
  145.     {
  146.         if (!org.drip.numerical.common.NumberUtil.IsValid (adblShift) || null == _ccis) return null;

  147.         org.drip.product.definition.CalibratableComponent[] aCalibInst = _ccis.components();

  148.         org.drip.param.valuation.ValuationParams valParam = _ccis.valuationParameter();

  149.         org.drip.param.valuation.ValuationCustomizationParams quotingParam = _ccis.quotingParameter();

  150.         org.drip.analytics.support.CaseInsensitiveTreeMap<org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double>>
  151.             mapQuote = _ccis.quoteMap();

  152.         org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.String[]> mapMeasures =
  153.             _ccis.measures();

  154.         org.drip.param.market.LatentStateFixingsContainer lsfc = _ccis.fixing();

  155.         int iNumComp = aCalibInst.length;

  156.         if (adblShift.length != iNumComp) return null;

  157.         try {
  158.             FlatForwardDiscountCurve ffdc = new FlatForwardDiscountCurve (new
  159.                 org.drip.analytics.date.JulianDate (_iEpochDate), _strCurrency, _aiDate, _adblForwardRate,
  160.                     _bDiscreteCompounding, _strCompoundingDayCount, _iCompoundingFreq);

  161.             for (int i = 0; i < iNumComp; ++i) {
  162.                 java.lang.String strInstrumentCode = aCalibInst[i].primaryCode();

  163.                 org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapInstrumentQuote =
  164.                     mapQuote.get (aCalibInst[i].primaryCode());

  165.                 java.lang.String strCalibMeasure = mapMeasures.get (strInstrumentCode)[0];

  166.                 if (null == mapInstrumentQuote || !mapInstrumentQuote.containsKey (strCalibMeasure))
  167.                     return null;

  168.                 org.drip.state.nonlinear.NonlinearCurveBuilder.DiscountCurveNode (valParam, aCalibInst[i],
  169.                     mapInstrumentQuote.get (strCalibMeasure) + adblShift[i], strCalibMeasure, false, i, ffdc,
  170.                         null, lsfc, quotingParam);
  171.             }

  172.             return ffdc.setCCIS (new org.drip.analytics.input.BootCurveConstructionInput (valParam,
  173.                 quotingParam, aCalibInst, mapQuote, mapMeasures, lsfc)) ? ffdc : null;
  174.         } catch (java.lang.Exception e) {
  175.             e.printStackTrace();
  176.         }

  177.         return null;
  178.     }

  179.     /**
  180.      * Boot-strap a constant forward discount curve from an array of dates and discount rates
  181.      *
  182.      * @param dtStart Epoch Date
  183.      * @param strCurrency Currency
  184.      * @param aiDate Array of Dates
  185.      * @param adblForwardRate Array of Forward Rates
  186.      * @param bDiscreteCompounding TRUE - Compounding is Discrete
  187.      * @param strCompoundingDayCount Day Count Convention to be used for Discrete Compounding
  188.      * @param iCompoundingFreq Frequency to be used for Discrete Compounding
  189.      *
  190.      * @throws java.lang.Exception Thrown if the curve cannot be created
  191.      */

  192.     public FlatForwardDiscountCurve (
  193.         final org.drip.analytics.date.JulianDate dtStart,
  194.         final java.lang.String strCurrency,
  195.         final int[] aiDate,
  196.         final double[] adblForwardRate,
  197.         final boolean bDiscreteCompounding,
  198.         final java.lang.String strCompoundingDayCount,
  199.         final int iCompoundingFreq)
  200.         throws java.lang.Exception
  201.     {
  202.         super (
  203.             dtStart.julian(),
  204.             strCurrency
  205.         );

  206.         if (null == aiDate || null == adblForwardRate)
  207.             throw new java.lang.Exception ("FlatForwardDiscountCurve ctr: Invalid inputs");

  208.         int iNumDate = aiDate.length;

  209.         if (0 == iNumDate || iNumDate != adblForwardRate.length)
  210.             throw new java.lang.Exception ("FlatForwardDiscountCurve ctr: Invalid inputs");

  211.         _aiDate = new int[iNumDate];
  212.         _iCompoundingFreq = iCompoundingFreq;
  213.         _adblForwardRate = new double[iNumDate];
  214.         _bDiscreteCompounding = bDiscreteCompounding;
  215.         _strCompoundingDayCount = strCompoundingDayCount;

  216.         for (int i = 0; i < iNumDate; ++i) {
  217.             _aiDate[i] = aiDate[i];
  218.             _adblForwardRate[i] = adblForwardRate[i];
  219.         }
  220.     }

  221.     protected FlatForwardDiscountCurve (
  222.         final FlatForwardDiscountCurve dc)
  223.         throws java.lang.Exception
  224.     {
  225.         super (dc.epoch().julian(), dc.currency());

  226.         _aiDate = dc._aiDate;
  227.         _strCurrency = dc._strCurrency;
  228.         _iEpochDate = dc._iEpochDate;
  229.         _adblForwardRate = dc._adblForwardRate;
  230.         _iCompoundingFreq = dc._iCompoundingFreq;
  231.         _bDiscreteCompounding = dc._bDiscreteCompounding;
  232.         _strCompoundingDayCount = dc._strCompoundingDayCount;
  233.     }

  234.     /**
  235.      * Retrieve the Forward Node Dates
  236.      *
  237.      * @return The Forward Node Dates
  238.      */

  239.     public int[] dates()
  240.     {
  241.         return _aiDate;
  242.     }

  243.     /**
  244.      * Retrieve the Forward Node Values
  245.      *
  246.      * @return The Forward Node Values
  247.      */

  248.     public double[] nodeValues()
  249.     {
  250.         return _adblForwardRate;
  251.     }

  252.     /**
  253.      * Retrieve the Discrete Compounding Flag
  254.      *
  255.      * @return TRUE - Discrete Compounding
  256.      */

  257.     public boolean discreteCompounding()
  258.     {
  259.         return _bDiscreteCompounding;
  260.     }

  261.     /**
  262.      * Retrieve the Compounding Frequency
  263.      *
  264.      * @return The Compounding Frequency
  265.      */

  266.     public int compoundingFrequency()
  267.     {
  268.         return _iCompoundingFreq;
  269.     }

  270.     /**
  271.      * Retrieve the Compounding Day Count
  272.      *
  273.      * @return The Compounding Day Count
  274.      */

  275.     public java.lang.String compoundingDayCount()
  276.     {
  277.         return _strCompoundingDayCount;
  278.     }

  279.     @Override public double df (
  280.         final int iDate)
  281.         throws java.lang.Exception
  282.     {
  283.         if (iDate <= _iEpochDate) return 1.;

  284.         int i = 0;
  285.         double dblDF = 1.;
  286.         double dblExpArg = 0.;
  287.         int iStartDate = _iEpochDate;
  288.         int iNumDate = _aiDate.length;

  289.         while (i < iNumDate && (int) iDate >= (int) _aiDate[i]) {
  290.             if (_bDiscreteCompounding)
  291.                 dblDF *= java.lang.Math.pow (1. + (_adblForwardRate[i] / _iCompoundingFreq), -1. * yearFract
  292.                     (iStartDate, _aiDate[i]) * _iCompoundingFreq);
  293.                 // dblDF /= (1. + (_adblForwardRate[i] * yearFract (iStartDate, _aiDate[i])));
  294.             else
  295.                 dblExpArg -= _adblForwardRate[i] * yearFract (iStartDate, _aiDate[i]);

  296.             iStartDate = _aiDate[i++];
  297.         }

  298.         if (i >= iNumDate) i = iNumDate - 1;

  299.         if (_bDiscreteCompounding)
  300.             dblDF *= java.lang.Math.pow (1. + (_adblForwardRate[i] / _iCompoundingFreq), -1. * yearFract
  301.                 (iStartDate, iDate) * _iCompoundingFreq);
  302.             // dblDF /= (1. + (_adblForwardRate[i] * yearFract (iStartDate, iDate)));
  303.         else
  304.             dblExpArg -= _adblForwardRate[i] * yearFract (iStartDate, iDate);

  305.         return (_bDiscreteCompounding ? dblDF : java.lang.Math.exp (dblExpArg)) * turnAdjust (_iEpochDate,
  306.             iDate);
  307.     }

  308.     @Override public double forward (
  309.         final int iDate1,
  310.         final int iDate2)
  311.         throws java.lang.Exception
  312.     {
  313.         int iStartDate = epoch().julian();

  314.         if (iDate1 < iStartDate || iDate2 < iStartDate) return 0.;

  315.         return 365.25 / (iDate2 - iDate1) * java.lang.Math.log (df (iDate1) / df (iDate2));
  316.     }

  317.     @Override public double zero (
  318.         final int iDate)
  319.         throws java.lang.Exception
  320.     {
  321.         double iStartDate = epoch().julian();

  322.         if (iDate < iStartDate) return 0.;

  323.         return -365.25 / (iDate - iStartDate) * java.lang.Math.log (df (iDate));
  324.     }

  325.     @Override public org.drip.state.forward.ForwardRateEstimator forwardRateEstimator (
  326.         final int iDate,
  327.         final org.drip.state.identifier.ForwardLabel fri)
  328.     {
  329.         return null;
  330.     }

  331.     @Override public java.util.Map<java.lang.Integer, java.lang.Double> canonicalTruthness (
  332.         final java.lang.String strLatentQuantificationMetric)
  333.     {
  334.         return null;
  335.     }

  336.     @Override public FlatForwardDiscountCurve parallelShiftManifestMeasure (
  337.         final java.lang.String strManifestMeasure,
  338.         final double dblShift)
  339.     {
  340.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblShift) || null == _ccis) return null;

  341.         org.drip.product.definition.CalibratableComponent[] aCalibInst = _ccis.components();

  342.         int iNumComp = aCalibInst.length;
  343.         double[] adblShift = new double[iNumComp];

  344.         for (int i = 0; i < iNumComp; ++i)
  345.             adblShift[i] = dblShift;

  346.         return shiftManifestMeasure (adblShift);
  347.     }

  348.     @Override public FlatForwardDiscountCurve shiftManifestMeasure (
  349.         final int iSpanIndex,
  350.         final java.lang.String strManifestMeasure,
  351.         final double dblShift)
  352.     {
  353.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblShift) || null == _ccis) return null;

  354.         org.drip.product.definition.CalibratableComponent[] aCalibInst = _ccis.components();

  355.         int iNumComp = aCalibInst.length;
  356.         double[] adblShift = new double[iNumComp];

  357.         if (iSpanIndex >= iNumComp) return null;

  358.         for (int i = 0; i < iNumComp; ++i)
  359.             adblShift[i] = i == iSpanIndex ? dblShift : 0.;

  360.         return shiftManifestMeasure (adblShift);
  361.     }

  362.     @Override public org.drip.state.discount.ExplicitBootDiscountCurve customTweakManifestMeasure (
  363.         final java.lang.String strManifestMeasure,
  364.         final org.drip.param.definition.ManifestMeasureTweak rvtp)
  365.     {
  366.         return shiftManifestMeasure (org.drip.analytics.support.Helper.TweakManifestMeasure
  367.             (_adblForwardRate, rvtp));
  368.     }

  369.     @Override public FlatForwardDiscountCurve parallelShiftQuantificationMetric (
  370.         final double dblShift)
  371.     {
  372.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblShift)) return null;

  373.         int iNumDate = _adblForwardRate.length;
  374.         double[] adblForwardRate = new double[iNumDate];

  375.         for (int i = 0; i < iNumDate; ++i)
  376.             adblForwardRate[i] = _adblForwardRate[i] + dblShift;

  377.         try {
  378.             return new FlatForwardDiscountCurve (new org.drip.analytics.date.JulianDate (_iEpochDate),
  379.                 _strCurrency, _aiDate, adblForwardRate, _bDiscreteCompounding, _strCompoundingDayCount,
  380.                     _iCompoundingFreq);
  381.         } catch (java.lang.Exception e) {
  382.             e.printStackTrace();
  383.         }

  384.         return null;
  385.     }

  386.     @Override public org.drip.analytics.definition.Curve customTweakQuantificationMetric (
  387.         final org.drip.param.definition.ManifestMeasureTweak rvtp)
  388.     {
  389.         try {
  390.             return new FlatForwardDiscountCurve (new org.drip.analytics.date.JulianDate (_iEpochDate),
  391.                 _strCurrency, _aiDate, org.drip.analytics.support.Helper.TweakManifestMeasure
  392.                     (_adblForwardRate, rvtp), _bDiscreteCompounding, _strCompoundingDayCount,
  393.                         _iCompoundingFreq);
  394.         } catch (java.lang.Exception e) {
  395.             e.printStackTrace();
  396.         }

  397.         return null;
  398.     }

  399.     @Override public FlatForwardDiscountCurve createBasisRateShiftedCurve (
  400.         final int[] aiDate,
  401.         final double[] adblBasis)
  402.     {
  403.         if (null == aiDate || null == adblBasis) return null;

  404.         int iNumDate = aiDate.length;

  405.         if (0 == iNumDate || iNumDate != adblBasis.length) return null;

  406.         double[] adblShiftedRate = new double[iNumDate];

  407.         try {
  408.             for (int i = 0; i < aiDate.length; ++i)
  409.                 adblShiftedRate[i] = zero (aiDate[i]) + adblBasis[i];

  410.             return new FlatForwardDiscountCurve (new org.drip.analytics.date.JulianDate (_iEpochDate),
  411.                 _strCurrency, aiDate, adblShiftedRate, _bDiscreteCompounding, _strCompoundingDayCount,
  412.                     _iCompoundingFreq);
  413.         } catch (java.lang.Exception e) {
  414.             e.printStackTrace();
  415.         }

  416.         return null;
  417.     }

  418.     @Override public java.lang.String latentStateQuantificationMetric()
  419.     {
  420.         return org.drip.analytics.definition.LatentStateStatic.DISCOUNT_QM_ZERO_RATE;
  421.     }

  422.     @Override public org.drip.numerical.differentiation.WengertJacobian jackDDFDManifestMeasure (
  423.         final int iDate,
  424.         final java.lang.String strManifestMeasure)
  425.     {
  426.         if (!org.drip.numerical.common.NumberUtil.IsValid (iDate)) return null;

  427.         int i = 0;
  428.         double dblDF = java.lang.Double.NaN;
  429.         double iStartDate = _iEpochDate;
  430.         org.drip.numerical.differentiation.WengertJacobian wj = null;

  431.         try {
  432.             wj = new org.drip.numerical.differentiation.WengertJacobian (1, _adblForwardRate.length);
  433.         } catch (java.lang.Exception e) {
  434.             e.printStackTrace();

  435.             return null;
  436.         }

  437.         if (iDate <= _iEpochDate) {
  438.             if (!wj.setWengert (0, 0.)) return null;

  439.             return wj;
  440.         }

  441.         try {
  442.             if (!wj.setWengert (0, dblDF = df (iDate))) return null;
  443.         } catch (java.lang.Exception e) {
  444.             e.printStackTrace();

  445.             return null;
  446.         }

  447.         while (i < _adblForwardRate.length && (int) iDate >= (int) _aiDate[i]) {
  448.             if (!wj.accumulatePartialFirstDerivative (0, i, dblDF * (iStartDate - _aiDate[i]) / 365.25))
  449.                 return null;

  450.             iStartDate = _aiDate[i++];
  451.         }

  452.         if (i >= _adblForwardRate.length) i = _adblForwardRate.length - 1;

  453.         return wj.accumulatePartialFirstDerivative (0, i, dblDF * (iStartDate - iDate) / 365.25) ? wj :
  454.             null;
  455.     }

  456.     @Override public boolean setNodeValue (
  457.         final int iNodeIndex,
  458.         final double dblValue)
  459.     {
  460.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblForwardRate.length)
  461.             return false;

  462.         for (int i = iNodeIndex; i < _adblForwardRate.length; ++i)
  463.             _adblForwardRate[i] = dblValue;

  464.         return true;
  465.     }

  466.     @Override public boolean bumpNodeValue (
  467.         final int iNodeIndex,
  468.         final double dblValue)
  469.     {
  470.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblForwardRate.length)
  471.             return false;

  472.         for (int i = iNodeIndex; i < _adblForwardRate.length; ++i)
  473.             _adblForwardRate[i] += dblValue;

  474.         return true;
  475.     }

  476.     @Override public boolean setFlatValue (
  477.         final double dblValue)
  478.     {
  479.         if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;

  480.         for (int i = 0; i < _adblForwardRate.length; ++i)
  481.             _adblForwardRate[i] = dblValue;

  482.         return true;
  483.     }
  484. }