BondBuilder.java

  1. package org.drip.product.creator;

  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>BondBuilder</i> contains the suite of helper functions for creating simple fixed/floater bonds, user
  84.  * defined bonds, optionally with custom cash flows and embedded option schedules (European or American). It
  85.  * also constructs bonds by de-serializing the byte stream.
  86.  *
  87.  *  <br><br>
  88.  *  <ul>
  89.  *      <li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
  90.  *      <li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
  91.  *      <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>
  92.  *      <li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/product/creator/README.md">Streams and Products Construction Utilities</a></li>
  93.  *  </ul>
  94.  * <br><br>
  95.  *
  96.  * @author Lakshmi Krishnamurthy
  97.  */

  98. public class BondBuilder {

  99.     /**
  100.      * Custom Bond Type Simple Fixed
  101.      */

  102.     public static final int BOND_TYPE_SIMPLE_FIXED = 0;

  103.     /**
  104.      * Custom Bond Type Simple Floater
  105.      */

  106.     public static final int BOND_TYPE_SIMPLE_FLOATER = 1;

  107.     /**
  108.      * Custom Bond Type Simple From Cash flows
  109.      */

  110.     public static final int BOND_TYPE_SIMPLE_FROM_CF = 2;

  111.     /**
  112.      * Create the full generic bond object from the complete set of parameters
  113.      *
  114.      * @param tsyParams Bond Treasury Parameters
  115.      * @param idParams Bond Identifier Parameters
  116.      * @param cpnParams Bond Coupon Parameters
  117.      * @param fltParams Bond Floater Parameters
  118.      * @param mktConv Bond Market Quote Convention
  119.      * @param crValParams Bond Credit Valuation Parameters
  120.      * @param cfteParams Bond Cash-flow Termination Event Parameters
  121.      * @param periodParams Bond Period Generation Parameters
  122.      * @param notlParams Bond Notional Parameters
  123.      *
  124.      * @return The Bond object
  125.      */

  126.     public static final org.drip.product.credit.BondComponent CreateBondFromParams (
  127.         final org.drip.product.params.TreasuryBenchmarks tsyParams,
  128.         final org.drip.product.params.IdentifierSet idParams,
  129.         final org.drip.product.params.CouponSetting cpnParams,
  130.         final org.drip.product.params.FloaterSetting fltParams,
  131.         final org.drip.product.params.QuoteConvention mktConv,
  132.         final org.drip.product.params.CreditSetting crValParams,
  133.         final org.drip.product.params.TerminationSetting cfteParams,
  134.         final org.drip.product.params.BondStream periodParams,
  135.         final org.drip.product.params.NotionalSetting notlParams)
  136.     {
  137.         if (null == idParams || !idParams.validate() || null == cpnParams || !cpnParams.validate() || (null
  138.             != fltParams && !fltParams.validate()) || null == mktConv || !mktConv.validate() || null ==
  139.                 crValParams || !crValParams.validate() || null == cfteParams || !cfteParams.validate() ||
  140.                     null == periodParams || null == notlParams || !notlParams.validate())
  141.             return null;

  142.         org.drip.product.credit.BondComponent bond = new org.drip.product.credit.BondComponent();

  143.         bond.setTreasuryBenchmark (tsyParams);

  144.         bond.setIdentifierSet (idParams);

  145.         bond.setCouponSetting (cpnParams);

  146.         bond.setFloaterSetting (fltParams);

  147.         bond.setMarketConvention (mktConv);

  148.         bond.setCreditSetting (crValParams);

  149.         bond.setTerminationSetting (cfteParams);

  150.         bond.setStream (periodParams);

  151.         bond.setNotionalSetting (notlParams);

  152.         return bond;
  153.     }

  154.     /**
  155.      * Create a simple fixed bond from parameters
  156.      *
  157.      * @param strName Bond Name
  158.      * @param strCurrency Bond Currency
  159.      * @param strCreditCurveName Credit Curve Name
  160.      * @param dblCoupon Bond Fixed Coupon
  161.      * @param iFreq Coupon Frequency
  162.      * @param strDayCount Bond Coupon Day count convention
  163.      * @param dtEffective Effective Date
  164.      * @param dtMaturity Maturity Date
  165.      * @param fsPrincipalOutstanding Outstanding Principal schedule
  166.      * @param fsCoupon Bond Coupon Schedule
  167.      *
  168.      * @return The Bond Object
  169.      */

  170.     public static final org.drip.product.credit.BondComponent CreateSimpleFixed (
  171.         final java.lang.String strName,
  172.         final java.lang.String strCurrency,
  173.         final java.lang.String strCreditCurveName,
  174.         final double dblCoupon,
  175.         final int iFreq,
  176.         final java.lang.String strDayCount,
  177.         final org.drip.analytics.date.JulianDate dtEffective,
  178.         final org.drip.analytics.date.JulianDate dtMaturity,
  179.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  180.         final org.drip.numerical.common.Array2D fsCoupon)
  181.     {
  182.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  183.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblCoupon))
  184.             return null;

  185.         return CreateBondFromParams (
  186.             null,
  187.             new org.drip.product.params.IdentifierSet (
  188.                 strName,
  189.                 strName,
  190.                 strName,
  191.                 strName
  192.             ),
  193.             new org.drip.product.params.CouponSetting (
  194.                 fsCoupon,
  195.                 "",
  196.                 dblCoupon,
  197.                 java.lang.Double.NaN,
  198.                 java.lang.Double.NaN
  199.             ),
  200.             null,
  201.             new org.drip.product.params.QuoteConvention (
  202.                 null,
  203.                 "",
  204.                 dtEffective.julian(),
  205.                 100.,
  206.                 0,
  207.                 strCurrency,
  208.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  209.             ),
  210.             new org.drip.product.params.CreditSetting (
  211.                 30,
  212.                 java.lang.Double.NaN,
  213.                 true,
  214.                 strCreditCurveName,
  215.                 true
  216.             ),
  217.             new org.drip.product.params.TerminationSetting (
  218.                 false,
  219.                 false,
  220.                 false,
  221.                 null
  222.             ),
  223.             org.drip.product.params.BondStream.Create (
  224.                 dtMaturity.julian(),
  225.                 dtEffective.julian(),
  226.                 java.lang.Integer.MIN_VALUE,
  227.                 java.lang.Integer.MIN_VALUE,
  228.                 dtEffective.julian(),
  229.                 iFreq,
  230.                 dblCoupon,
  231.                 strDayCount,
  232.                 strDayCount,
  233.                 null,
  234.                 null,
  235.                 null,
  236.                 null,
  237.                 null,
  238.                 null,
  239.                 null,
  240.                 null,
  241.                 "",
  242.                 false,
  243.                 strCurrency,
  244.                 strCurrency,
  245.                 null,
  246.                 !org.drip.numerical.common.StringUtil.IsEmpty (strCreditCurveName) ?
  247.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  248.                         strCreditCurveName,
  249.                         strCurrency
  250.                     ) : null
  251.             ), new org.drip.product.params.NotionalSetting (
  252.                 100.,
  253.                 strCurrency,
  254.                 fsPrincipalOutstanding,
  255.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START,
  256.                 false
  257.             )
  258.         );
  259.     }

  260.     /**
  261.      * Create a Fixed Coupon Bond from the First and Penultimate Coupon Dates, and the other Parameters
  262.      *
  263.      * @param strName Bond Name
  264.      * @param strCurrency Bond Currency
  265.      * @param strCreditCurveName Credit Curve Name
  266.      * @param dblCoupon Bond Fixed Coupon
  267.      * @param iFreq Coupon Frequency
  268.      * @param strDayCount Bond Coupon Day count convention
  269.      * @param dtEffective Effective Date
  270.      * @param dtMaturity Maturity Date
  271.      * @param iFirstCouponDate First Coupon Date
  272.      * @param iPenultimateCouponDate Penultimate Coupon Date
  273.      * @param dapPay Pay Date Adjustment Parameters
  274.      * @param dapReset Reset Date Adjustment Parameters
  275.      * @param dapMaturity Maturity Date Adjustment Parameters
  276.      * @param dapEffective Effective Date Adjustment Parameters
  277.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  278.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  279.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  280.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  281.      * @param fsPrincipalOutstanding Outstanding Principal schedule
  282.      * @param fsCoupon Bond Coupon Schedule
  283.      *
  284.      * @return The Bond Object
  285.      */

  286.     public static final org.drip.product.credit.BondComponent CreateSimpleFixedFP (
  287.         final java.lang.String strName,
  288.         final java.lang.String strCurrency,
  289.         final java.lang.String strCreditCurveName,
  290.         final double dblCoupon,
  291.         final int iFreq,
  292.         final java.lang.String strDayCount,
  293.         final org.drip.analytics.date.JulianDate dtEffective,
  294.         final org.drip.analytics.date.JulianDate dtMaturity,
  295.         final int iFirstCouponDate,
  296.         final int iPenultimateCouponDate,
  297.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  298.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  299.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  300.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  301.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  302.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  303.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  304.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  305.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  306.         final org.drip.numerical.common.Array2D fsCoupon)
  307.     {
  308.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  309.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblCoupon))
  310.             return null;

  311.         return CreateBondFromParams (
  312.             null,
  313.             new org.drip.product.params.IdentifierSet (
  314.                 strName,
  315.                 strName,
  316.                 strName,
  317.                 strName
  318.             ),
  319.             new org.drip.product.params.CouponSetting (
  320.                 fsCoupon,
  321.                 "",
  322.                 dblCoupon,
  323.                 java.lang.Double.NaN,
  324.                 java.lang.Double.NaN
  325.             ),
  326.             null,
  327.             new org.drip.product.params.QuoteConvention (
  328.                 null,
  329.                 "",
  330.                 dtEffective.julian(),
  331.                 100.,
  332.                 0,
  333.                 strCurrency,
  334.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  335.             ),
  336.             new org.drip.product.params.CreditSetting (
  337.                 30,
  338.                 java.lang.Double.NaN,
  339.                 true,
  340.                 strCreditCurveName,
  341.                 true
  342.             ),
  343.             new org.drip.product.params.TerminationSetting (
  344.                 false,
  345.                 false,
  346.                 false,
  347.                 dapMaturity
  348.             ),
  349.             org.drip.product.params.BondStream.FromFirstPenultimateCouponDate (
  350.                 dtMaturity.julian(),
  351.                 dtEffective.julian(),
  352.                 dtMaturity.julian(),
  353.                 iFirstCouponDate,
  354.                 iPenultimateCouponDate,
  355.                 iFreq,
  356.                 dblCoupon,
  357.                 strDayCount,
  358.                 strDayCount,
  359.                 dapPay,
  360.                 dapReset,
  361.                 dapMaturity,
  362.                 dapEffective,
  363.                 dapPeriodEnd,
  364.                 dapAccrualEnd,
  365.                 dapPeriodStart,
  366.                 dapAccrualStart,
  367.                 "",
  368.                 false,
  369.                 strCurrency,
  370.                 strCurrency,
  371.                 null,
  372.                 !org.drip.numerical.common.StringUtil.IsEmpty (strCreditCurveName) ?
  373.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  374.                         strCreditCurveName,
  375.                         strCurrency
  376.                     ) : null
  377.             ), new org.drip.product.params.NotionalSetting (
  378.                 100.,
  379.                 strCurrency,
  380.                 fsPrincipalOutstanding,
  381.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START,
  382.                 false
  383.             )
  384.         );
  385.     }

  386.     /**
  387.      * Create a Fixed Coupon Bond from the First Coupon Date and the other Parameters
  388.      *
  389.      * @param strName Bond Name
  390.      * @param strCurrency Bond Currency
  391.      * @param strCreditCurveName Credit Curve Name
  392.      * @param dblCoupon Bond Fixed Coupon
  393.      * @param iFreq Coupon Frequency
  394.      * @param strDayCount Bond Coupon Day count convention
  395.      * @param dtEffective Effective Date
  396.      * @param dtMaturity Maturity Date
  397.      * @param iFirstCouponDate First Coupon Date
  398.      * @param dapPay Pay Date Adjustment Parameters
  399.      * @param dapReset Reset Date Adjustment Parameters
  400.      * @param dapMaturity Maturity Date Adjustment Parameters
  401.      * @param dapEffective Effective Date Adjustment Parameters
  402.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  403.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  404.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  405.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  406.      * @param fsPrincipalOutstanding Outstanding Principal schedule
  407.      * @param fsCoupon Bond Coupon Schedule
  408.      *
  409.      * @return The Bond Object
  410.      */

  411.     public static final org.drip.product.credit.BondComponent CreateSimpleFixedF (
  412.         final java.lang.String strName,
  413.         final java.lang.String strCurrency,
  414.         final java.lang.String strCreditCurveName,
  415.         final double dblCoupon,
  416.         final int iFreq,
  417.         final java.lang.String strDayCount,
  418.         final org.drip.analytics.date.JulianDate dtEffective,
  419.         final org.drip.analytics.date.JulianDate dtMaturity,
  420.         final int iFirstCouponDate,
  421.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  422.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  423.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  424.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  425.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  426.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  427.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  428.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  429.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  430.         final org.drip.numerical.common.Array2D fsCoupon)
  431.     {
  432.         return CreateSimpleFixedFP (
  433.             strName,
  434.             strCurrency,
  435.             strCreditCurveName,
  436.             dblCoupon,
  437.             iFreq,
  438.             strDayCount,
  439.             dtEffective,
  440.             dtMaturity,
  441.             iFirstCouponDate,
  442.             dtMaturity.subtractTenor ((12 / iFreq) + "M").julian(),
  443.             dapPay,
  444.             dapReset,
  445.             dapMaturity,
  446.             dapEffective,
  447.             dapPeriodEnd,
  448.             dapAccrualEnd,
  449.             dapPeriodStart,
  450.             dapAccrualStart,
  451.             fsPrincipalOutstanding,
  452.             fsCoupon
  453.         );
  454.     }

  455.     /**
  456.      * Create a Fixed Coupon Bond from the Penultimate Coupon Date and the other Parameters
  457.      *
  458.      * @param strName Bond Name
  459.      * @param strCurrency Bond Currency
  460.      * @param strCreditCurveName Credit Curve Name
  461.      * @param dblCoupon Bond Fixed Coupon
  462.      * @param iFreq Coupon Frequency
  463.      * @param strDayCount Bond Coupon Day count convention
  464.      * @param dtEffective Effective Date
  465.      * @param dtMaturity Maturity Date
  466.      * @param iPenultimateCouponDate Penultimate Coupon Date
  467.      * @param dapPay Pay Date Adjustment Parameters
  468.      * @param dapReset Reset Date Adjustment Parameters
  469.      * @param dapMaturity Maturity Date Adjustment Parameters
  470.      * @param dapEffective Effective Date Adjustment Parameters
  471.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  472.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  473.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  474.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  475.      * @param fsPrincipalOutstanding Outstanding Principal schedule
  476.      * @param fsCoupon Bond Coupon Schedule
  477.      *
  478.      * @return The Bond Object
  479.      */

  480.     public static final org.drip.product.credit.BondComponent CreateSimpleFixedP (
  481.         final java.lang.String strName,
  482.         final java.lang.String strCurrency,
  483.         final java.lang.String strCreditCurveName,
  484.         final double dblCoupon,
  485.         final int iFreq,
  486.         final java.lang.String strDayCount,
  487.         final org.drip.analytics.date.JulianDate dtEffective,
  488.         final org.drip.analytics.date.JulianDate dtMaturity,
  489.         final int iPenultimateCouponDate,
  490.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  491.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  492.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  493.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  494.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  495.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  496.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  497.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  498.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  499.         final org.drip.numerical.common.Array2D fsCoupon)
  500.     {
  501.         return CreateSimpleFixedFP (
  502.             strName,
  503.             strCurrency,
  504.             strCreditCurveName,
  505.             dblCoupon,
  506.             iFreq,
  507.             strDayCount,
  508.             dtEffective,
  509.             dtMaturity,
  510.             dtEffective.addTenor ((12 / iFreq) + "M").julian(),
  511.             iPenultimateCouponDate,
  512.             dapPay,
  513.             dapReset,
  514.             dapMaturity,
  515.             dapEffective,
  516.             dapPeriodEnd,
  517.             dapAccrualEnd,
  518.             dapPeriodStart,
  519.             dapAccrualStart,
  520.             fsPrincipalOutstanding,
  521.             fsCoupon
  522.         );
  523.     }

  524.     /**
  525.      * Create a simple floating rate bond
  526.      *
  527.      * @param strName Bond Name
  528.      * @param strCurrency Bond Currency
  529.      * @param strRateIndex Floating Rate Index
  530.      * @param strCreditCurveName Credit Curve Name
  531.      * @param dblSpread Bond Floater Spread
  532.      * @param iFreq Coupon Frequency
  533.      * @param strDayCount Coupon Day Count Convention
  534.      * @param dtEffective Effective date
  535.      * @param dtMaturity Maturity Date
  536.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  537.      * @param fsCoupon Coupon Schedule
  538.      *
  539.      * @return The Bond object
  540.      */

  541.     public static final org.drip.product.credit.BondComponent CreateSimpleFloater (
  542.         final java.lang.String strName,
  543.         final java.lang.String strCurrency,
  544.         final java.lang.String strRateIndex,
  545.         final java.lang.String strCreditCurveName,
  546.         final double dblSpread,
  547.         final int iFreq,
  548.         final java.lang.String strDayCount,
  549.         final org.drip.analytics.date.JulianDate dtEffective,
  550.         final org.drip.analytics.date.JulianDate dtMaturity,
  551.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  552.         final org.drip.numerical.common.Array2D fsCoupon)
  553.     {
  554.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  555.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblSpread))
  556.             return null;

  557.         return CreateBondFromParams (
  558.             null,
  559.             new org.drip.product.params.IdentifierSet (
  560.                 strName,
  561.                 strName,
  562.                 strName,
  563.                 strCurrency
  564.             ),
  565.             new org.drip.product.params.CouponSetting (
  566.                 fsCoupon,
  567.                 "",
  568.                 dblSpread,
  569.                 java.lang.Double.NaN,
  570.                 java.lang.Double.NaN
  571.             ),
  572.             new org.drip.product.params.FloaterSetting (
  573.                 org.drip.state.identifier.ForwardLabel.Standard (strRateIndex),
  574.                 "",
  575.                 dblSpread,
  576.                 java.lang.Double.NaN
  577.             ),
  578.             new org.drip.product.params.QuoteConvention (
  579.                 null,
  580.                 "",
  581.                 dtEffective.julian(),
  582.                 100.,
  583.                 0,
  584.                 strCurrency,
  585.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  586.             ),
  587.             new org.drip.product.params.CreditSetting (
  588.                 30,
  589.                 java.lang.Double.NaN,
  590.                 true,
  591.                 strCreditCurveName,
  592.                 true
  593.             ),
  594.             new org.drip.product.params.TerminationSetting (
  595.                 false,
  596.                 false,
  597.                 false,
  598.                 null
  599.             ),
  600.             org.drip.product.params.BondStream.Create (
  601.                 dtMaturity.julian(),
  602.                 dtEffective.julian(),
  603.                 java.lang.Integer.MIN_VALUE,
  604.                 java.lang.Integer.MIN_VALUE,
  605.                 dtEffective.julian(),
  606.                 iFreq,
  607.                 dblSpread,
  608.                 strDayCount,
  609.                 strDayCount,
  610.                 null,
  611.                 null,
  612.                 null,
  613.                 null,
  614.                 null,
  615.                 null,
  616.                 null,
  617.                 null,
  618.                 "",
  619.                 false,
  620.                 strCurrency,
  621.                 strCurrency,
  622.                 org.drip.state.identifier.ForwardLabel.Standard (strRateIndex),
  623.                 null == strCreditCurveName || strCreditCurveName.isEmpty() ? null :
  624.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  625.                         strCreditCurveName,
  626.                         strCurrency
  627.                     )
  628.                 ),
  629.             new org.drip.product.params.NotionalSetting (
  630.                 100.,
  631.                 strCurrency,
  632.                 fsPrincipalOutstanding,
  633.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  634.                 false
  635.             )
  636.         );
  637.     }

  638.     /**
  639.      * Create a Floating Rate Bond from the First and Penultimate Coupon Dates, and the other Parameters
  640.      *
  641.      * @param strName Bond Name
  642.      * @param strCurrency Bond Currency
  643.      * @param strRateIndex Floating Rate Index
  644.      * @param strCreditCurveName Credit Curve Name
  645.      * @param dblSpread Bond Floater Spread
  646.      * @param iFreq Coupon Frequency
  647.      * @param strDayCount Coupon Day Count Convention
  648.      * @param dtEffective Effective date
  649.      * @param dtMaturity Maturity Date
  650.      * @param iFirstCouponDate First Coupon Date
  651.      * @param iPenultimateCouponDate Penultimate Coupon Date
  652.      * @param dapPay Pay Date Adjustment Parameters
  653.      * @param dapReset Reset Date Adjustment Parameters
  654.      * @param dapMaturity Maturity Date Adjustment Parameters
  655.      * @param dapEffective Effective Date Adjustment Parameters
  656.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  657.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  658.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  659.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  660.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  661.      * @param fsCoupon Coupon Schedule
  662.      *
  663.      * @return The Floating Rate Bond Instance
  664.      */

  665.     public static final org.drip.product.credit.BondComponent CreateSimpleFloaterFP (
  666.         final java.lang.String strName,
  667.         final java.lang.String strCurrency,
  668.         final java.lang.String strRateIndex,
  669.         final java.lang.String strCreditCurveName,
  670.         final double dblSpread,
  671.         final int iFreq,
  672.         final java.lang.String strDayCount,
  673.         final org.drip.analytics.date.JulianDate dtEffective,
  674.         final org.drip.analytics.date.JulianDate dtMaturity,
  675.         final int iFirstCouponDate,
  676.         final int iPenultimateCouponDate,
  677.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  678.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  679.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  680.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  681.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  682.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  683.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  684.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  685.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  686.         final org.drip.numerical.common.Array2D fsCoupon)
  687.     {
  688.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  689.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblSpread))
  690.             return null;

  691.         return CreateBondFromParams (
  692.             null,
  693.             new org.drip.product.params.IdentifierSet (
  694.                 strName,
  695.                 strName,
  696.                 strName,
  697.                 strCurrency
  698.             ),
  699.             new org.drip.product.params.CouponSetting (
  700.                 fsCoupon,
  701.                 "",
  702.                 dblSpread,
  703.                 java.lang.Double.NaN,
  704.                 java.lang.Double.NaN
  705.             ),
  706.             new org.drip.product.params.FloaterSetting (
  707.                 org.drip.state.identifier.ForwardLabel.Standard (strRateIndex),
  708.                 "",
  709.                 dblSpread,
  710.                 java.lang.Double.NaN
  711.             ),
  712.             new org.drip.product.params.QuoteConvention (
  713.                 null,
  714.                 "",
  715.                 dtEffective.julian(),
  716.                 100.,
  717.                 0,
  718.                 strCurrency,
  719.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  720.             ),
  721.             new org.drip.product.params.CreditSetting (
  722.                 30,
  723.                 java.lang.Double.NaN,
  724.                 true,
  725.                 strCreditCurveName,
  726.                 true
  727.             ),
  728.             new org.drip.product.params.TerminationSetting (
  729.                 false,
  730.                 false,
  731.                 false,
  732.                 dapMaturity
  733.             ),
  734.             org.drip.product.params.BondStream.FromFirstPenultimateCouponDate (
  735.                 dtMaturity.julian(),
  736.                 dtEffective.julian(),
  737.                 dtMaturity.julian(),
  738.                 iFirstCouponDate,
  739.                 iPenultimateCouponDate,
  740.                 iFreq,
  741.                 dblSpread,
  742.                 strDayCount,
  743.                 strDayCount,
  744.                 dapPay,
  745.                 dapReset,
  746.                 dapMaturity,
  747.                 dapEffective,
  748.                 dapPeriodEnd,
  749.                 dapAccrualEnd,
  750.                 dapPeriodStart,
  751.                 dapAccrualStart,
  752.                 "",
  753.                 false,
  754.                 strCurrency,
  755.                 strCurrency,
  756.                 org.drip.state.identifier.ForwardLabel.Standard (strRateIndex),
  757.                 null == strCreditCurveName || strCreditCurveName.isEmpty() ? null :
  758.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  759.                         strCreditCurveName,
  760.                         strCurrency
  761.                     )
  762.                 ),
  763.             new org.drip.product.params.NotionalSetting (
  764.                 100.,
  765.                 strCurrency,
  766.                 fsPrincipalOutstanding,
  767.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  768.                 false
  769.             )
  770.         );
  771.     }

  772.     /**
  773.      * Create a Floating Rate Bond from the First and Penultimate Coupon Dates, and the other Parameters
  774.      *
  775.      * @param strName Bond Name
  776.      * @param strCurrency Bond Currency
  777.      * @param strRateIndex Floating Rate Index
  778.      * @param strCreditCurveName Credit Curve Name
  779.      * @param dblSpread Bond Floater Spread
  780.      * @param iFreq Coupon Frequency
  781.      * @param strDayCount Coupon Day Count Convention
  782.      * @param dtEffective Effective date
  783.      * @param dtMaturity Maturity Date
  784.      * @param iFirstCouponDate First Coupon Date
  785.      * @param dapPay Pay Date Adjustment Parameters
  786.      * @param dapReset Reset Date Adjustment Parameters
  787.      * @param dapMaturity Maturity Date Adjustment Parameters
  788.      * @param dapEffective Effective Date Adjustment Parameters
  789.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  790.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  791.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  792.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  793.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  794.      * @param fsCoupon Coupon Schedule
  795.      *
  796.      * @return The Floating Rate Bond Instance
  797.      */

  798.     public static final org.drip.product.credit.BondComponent CreateSimpleFloaterF (
  799.         final java.lang.String strName,
  800.         final java.lang.String strCurrency,
  801.         final java.lang.String strRateIndex,
  802.         final java.lang.String strCreditCurveName,
  803.         final double dblSpread,
  804.         final int iFreq,
  805.         final java.lang.String strDayCount,
  806.         final org.drip.analytics.date.JulianDate dtEffective,
  807.         final org.drip.analytics.date.JulianDate dtMaturity,
  808.         final int iFirstCouponDate,
  809.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  810.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  811.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  812.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  813.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  814.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  815.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  816.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  817.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  818.         final org.drip.numerical.common.Array2D fsCoupon)
  819.     {
  820.         return CreateSimpleFloaterFP (
  821.             strName,
  822.             strCurrency,
  823.             strRateIndex,
  824.             strCreditCurveName,
  825.             dblSpread,
  826.             iFreq,
  827.             strDayCount,
  828.             dtEffective,
  829.             dtMaturity,
  830.             iFirstCouponDate,
  831.             dtMaturity.subtractTenor ((12 / iFreq) + "M").julian(),
  832.             dapPay,
  833.             dapReset,
  834.             dapMaturity,
  835.             dapEffective,
  836.             dapPeriodEnd,
  837.             dapAccrualEnd,
  838.             dapPeriodStart,
  839.             dapAccrualStart,
  840.             fsPrincipalOutstanding,
  841.             fsCoupon
  842.         );
  843.     }

  844.     /**
  845.      * Create a Floating Rate Bond from the First and Penultimate Coupon Dates, and the other Parameters
  846.      *
  847.      * @param strName Bond Name
  848.      * @param strCurrency Bond Currency
  849.      * @param strRateIndex Floating Rate Index
  850.      * @param strCreditCurveName Credit Curve Name
  851.      * @param dblSpread Bond Floater Spread
  852.      * @param iFreq Coupon Frequency
  853.      * @param strDayCount Coupon Day Count Convention
  854.      * @param dtEffective Effective date
  855.      * @param dtMaturity Maturity Date
  856.      * @param iPenultimateCouponDate Penultimate Coupon Date
  857.      * @param dapPay Pay Date Adjustment Parameters
  858.      * @param dapReset Reset Date Adjustment Parameters
  859.      * @param dapMaturity Maturity Date Adjustment Parameters
  860.      * @param dapEffective Effective Date Adjustment Parameters
  861.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  862.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  863.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  864.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  865.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  866.      * @param fsCoupon Coupon Schedule
  867.      *
  868.      * @return The Floating Rate Bond Instance
  869.      */

  870.     public static final org.drip.product.credit.BondComponent CreateSimpleFloaterP (
  871.         final java.lang.String strName,
  872.         final java.lang.String strCurrency,
  873.         final java.lang.String strRateIndex,
  874.         final java.lang.String strCreditCurveName,
  875.         final double dblSpread,
  876.         final int iFreq,
  877.         final java.lang.String strDayCount,
  878.         final org.drip.analytics.date.JulianDate dtEffective,
  879.         final org.drip.analytics.date.JulianDate dtMaturity,
  880.         final int iPenultimateCouponDate,
  881.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  882.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  883.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  884.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  885.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  886.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  887.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  888.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  889.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  890.         final org.drip.numerical.common.Array2D fsCoupon)
  891.     {
  892.         return CreateSimpleFloaterFP (
  893.             strName,
  894.             strCurrency,
  895.             strRateIndex,
  896.             strCreditCurveName,
  897.             dblSpread,
  898.             iFreq,
  899.             strDayCount,
  900.             dtEffective,
  901.             dtMaturity,
  902.             dtEffective.addTenor ((12 / iFreq) + "M").julian(),
  903.             iPenultimateCouponDate,
  904.             dapPay,
  905.             dapReset,
  906.             dapMaturity,
  907.             dapEffective,
  908.             dapPeriodEnd,
  909.             dapAccrualEnd,
  910.             dapPeriodStart,
  911.             dapAccrualStart,
  912.             fsPrincipalOutstanding,
  913.             fsCoupon
  914.         );
  915.     }

  916.     /**
  917.      * Create a bond from custom/user-defined cash flows and coupon conventions
  918.      *
  919.      * @param strName Bond Name
  920.      * @param dtEffective Effective Date
  921.      * @param strCurrency Bond Currency
  922.      * @param strCreditCurveName Credit Curve Name
  923.      * @param strDayCount Coupon Day Count Convention
  924.      * @param dblInitialNotional The Initial Notional
  925.      * @param dblCouponRate The Coupon Rate
  926.      * @param iCouponFrequency Coupon Frequency
  927.      * @param adtPeriodEnd Array of Period End Dates
  928.      * @param adblCouponAmount Matching Array of Coupon Amounts
  929.      * @param adblPrincipalAmount Matching Array of Principal Amounts
  930.      * @param bIsPrincipalPayDown Flag indicating whether principal is pay down or outstanding
  931.      *
  932.      * @return The Bond object
  933.      */

  934.     public static final org.drip.product.credit.BondComponent CreateBondFromCF (
  935.         final java.lang.String strName,
  936.         final org.drip.analytics.date.JulianDate dtEffective,
  937.         final java.lang.String strCurrency,
  938.         final java.lang.String strCreditCurveName,
  939.         final java.lang.String strDayCount,
  940.         final double dblInitialNotional,
  941.         final double dblCouponRate,
  942.         final int iCouponFrequency,
  943.         final org.drip.analytics.date.JulianDate[] adtPeriodEnd,
  944.         final double[] adblCouponAmount,
  945.         final double[] adblPrincipalAmount,
  946.         final boolean bIsPrincipalPayDown)
  947.     {
  948.         if (null == adtPeriodEnd || null == adblCouponAmount || null == adblPrincipalAmount || null ==
  949.             dtEffective || !org.drip.numerical.common.NumberUtil.IsValid (dblInitialNotional) ||
  950.                 !org.drip.numerical.common.NumberUtil.IsValid (dblCouponRate) || 0 == iCouponFrequency)
  951.             return null;

  952.         int iEffectiveDate = dtEffective.julian();

  953.         int iNumPeriod = adtPeriodEnd.length;
  954.         int iPeriodStartDate = iEffectiveDate;
  955.         int[] aiPeriodEndDate = new int[iNumPeriod];
  956.         int[] aiPrincipalDate = new int[iNumPeriod + 1];
  957.         org.drip.product.params.BondStream stream = null;
  958.         double[] adblCouponFactor = new double[iNumPeriod];
  959.         double[] adblPeriodEndPrincipal = new double[iNumPeriod];
  960.         double[] adblPrincipalFactor = new double[iNumPeriod + 1];
  961.         double[] adblPeriodEndPrincipalFactor = new double[iNumPeriod];

  962.         if (0 == iNumPeriod || iNumPeriod != adblCouponAmount.length || iNumPeriod !=
  963.             adblPrincipalAmount.length)
  964.             return null;

  965.         if (bIsPrincipalPayDown) {
  966.             for (int i = 0; i < iNumPeriod; ++i)
  967.                 adblPeriodEndPrincipal[i] = (0 == i ? dblInitialNotional : adblPeriodEndPrincipal[i - 1]) -
  968.                     adblPrincipalAmount[i];
  969.         } else
  970.             adblPeriodEndPrincipal = adblPrincipalAmount;

  971.         java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsCouponPeriod = new
  972.             java.util.ArrayList<org.drip.analytics.cashflow.CompositePeriod>();

  973.         for (int i = 0; i < iNumPeriod; ++i) {
  974.             if (null == adtPeriodEnd[i]) return null;

  975.             aiPeriodEndDate[i] = adtPeriodEnd[i].julian();

  976.             adblPeriodEndPrincipalFactor[i] = adblPeriodEndPrincipal[i] / dblInitialNotional;

  977.             try {
  978.                 adblCouponFactor[i] = adblCouponAmount[i] / (0 == i ? dblInitialNotional :
  979.                     adblPeriodEndPrincipal[i - 1]) / org.drip.analytics.daycount.Convention.YearFraction
  980.                         (iPeriodStartDate, aiPeriodEndDate[i], strDayCount, false, null, "") / dblCouponRate;

  981.                 java.util.List<org.drip.analytics.cashflow.ComposableUnitPeriod> lsCUP = new
  982.                     java.util.ArrayList<org.drip.analytics.cashflow.ComposableUnitPeriod>();

  983.                 lsCUP.add (
  984.                     new org.drip.analytics.cashflow.ComposableUnitFixedPeriod (
  985.                         iPeriodStartDate,
  986.                         aiPeriodEndDate[i],
  987.                         new org.drip.param.period.UnitCouponAccrualSetting (
  988.                             iCouponFrequency,
  989.                             strDayCount,
  990.                             false,
  991.                             strDayCount,
  992.                             false,
  993.                             strCurrency,
  994.                             false,
  995.                             org.drip.analytics.support.CompositePeriodBuilder.ACCRUAL_COMPOUNDING_RULE_GEOMETRIC
  996.                         ),
  997.                         new org.drip.param.period.ComposableFixedUnitSetting (
  998.                             (12 / iCouponFrequency) + "M",
  999.                             org.drip.analytics.support.CompositePeriodBuilder.EDGE_DATE_SEQUENCE_REGULAR,
  1000.                             null,
  1001.                             dblCouponRate,
  1002.                             0.,
  1003.                             strCurrency
  1004.                         )
  1005.                     )
  1006.                 );

  1007.                 lsCouponPeriod.add (
  1008.                     new org.drip.analytics.cashflow.CompositeFixedPeriod (
  1009.                         new org.drip.param.period.CompositePeriodSetting (
  1010.                             iCouponFrequency,
  1011.                             (12 / iCouponFrequency) + "M",
  1012.                             strCurrency,
  1013.                             null,
  1014.                             adblPrincipalAmount[i],
  1015.                             null,
  1016.                             null,
  1017.                             null,
  1018.                             null
  1019.                         ),
  1020.                         lsCUP
  1021.                     )
  1022.                 );
  1023.             } catch (java.lang.Exception e) {
  1024.                 e.printStackTrace();

  1025.                 return null;
  1026.             }

  1027.             iPeriodStartDate = aiPeriodEndDate[i];
  1028.         }

  1029.         for (int i = 0; i <= iNumPeriod; ++i) {
  1030.             aiPrincipalDate[i] = 0 == i ? iEffectiveDate : aiPeriodEndDate[i - 1];
  1031.             adblPrincipalFactor[i] = 0 == i ? 1. : adblPeriodEndPrincipalFactor[i - 1];
  1032.         }

  1033.         try {
  1034.             stream = new org.drip.product.params.BondStream (
  1035.                 lsCouponPeriod,
  1036.                 java.lang.Integer.MIN_VALUE,
  1037.                 "MATURITY_TYPE_REGULAR"
  1038.             );
  1039.         } catch (java.lang.Exception e) {
  1040.             e.printStackTrace();

  1041.             return null;
  1042.         }

  1043.         return CreateBondFromParams (
  1044.             null,
  1045.             new org.drip.product.params.IdentifierSet (
  1046.                 strName,
  1047.                 strName,
  1048.                 strName,
  1049.                 strCurrency
  1050.             ),
  1051.             new org.drip.product.params.CouponSetting (
  1052.                 org.drip.numerical.common.Array2D.FromArray (
  1053.                     aiPeriodEndDate,
  1054.                     adblCouponFactor
  1055.                 ),
  1056.                 "",
  1057.                 dblCouponRate,
  1058.                 java.lang.Double.NaN,
  1059.                 java.lang.Double.NaN
  1060.             ),
  1061.             null,
  1062.             new org.drip.product.params.QuoteConvention (
  1063.                 null,
  1064.                 "",
  1065.                 dtEffective.julian(),
  1066.                 1.,
  1067.                 0,
  1068.                 strCurrency,
  1069.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  1070.             ),
  1071.             new org.drip.product.params.CreditSetting (
  1072.                 30,
  1073.                 java.lang.Double.NaN,
  1074.                 true,
  1075.                 strCreditCurveName,
  1076.                 false
  1077.             ),
  1078.             new org.drip.product.params.TerminationSetting (
  1079.                 false,
  1080.                 false,
  1081.                 false,
  1082.                 null
  1083.             ),
  1084.             stream,
  1085.             new org.drip.product.params.NotionalSetting (
  1086.                 1.,
  1087.                 strCurrency,
  1088.                 org.drip.numerical.common.Array2D.FromArray (
  1089.                     aiPrincipalDate,
  1090.                     adblPrincipalFactor
  1091.                 ),
  1092.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_START,
  1093.                 false
  1094.             )
  1095.         );
  1096.     }

  1097.     /**
  1098.      * Creates a Treasury Bond from the Parameters
  1099.      *
  1100.      * @param strTreasuryCode Treasury Code
  1101.      * @param strCurrency Bond Currency
  1102.      * @param dblCoupon Bond Fixed Coupon
  1103.      * @param iFreq Coupon Frequency
  1104.      * @param strDayCount Bond Coupon Day count convention
  1105.      * @param dtEffective Effective Date
  1106.      * @param dtMaturity Maturity Date
  1107.      *
  1108.      * @return The Treasury Bond Instance
  1109.      */

  1110.     public static final org.drip.product.govvie.TreasuryComponent Treasury (
  1111.         final java.lang.String strTreasuryCode,
  1112.         final org.drip.analytics.date.JulianDate dtEffective,
  1113.         final org.drip.analytics.date.JulianDate dtMaturity,
  1114.         final java.lang.String strCurrency,
  1115.         final double dblCoupon,
  1116.         final int iFreq,
  1117.         final java.lang.String strDayCount)
  1118.     {
  1119.         if (null == strTreasuryCode || strTreasuryCode.isEmpty()) return null;

  1120.         org.drip.product.govvie.TreasuryComponent tsyBond = null;

  1121.         try {
  1122.             tsyBond = new org.drip.product.govvie.TreasuryComponent (strTreasuryCode);
  1123.         } catch (java.lang.Exception e) {
  1124.             e.printStackTrace();

  1125.             return null;
  1126.         }

  1127.         java.lang.String strName = strTreasuryCode + " " + org.drip.numerical.common.FormatUtil.FormatDouble
  1128.             (dblCoupon, 1, 2, 100.) + " " + dtMaturity;

  1129.         tsyBond.setIdentifierSet (
  1130.             new org.drip.product.params.IdentifierSet (
  1131.                 strName,
  1132.                 strName,
  1133.                 strName,
  1134.                 strName
  1135.             )
  1136.         );

  1137.         tsyBond.setNotionalSetting (
  1138.             new org.drip.product.params.NotionalSetting (
  1139.                 100.,
  1140.                 strCurrency,
  1141.                 org.drip.numerical.common.Array2D.BulletSchedule(),
  1142.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  1143.                 false
  1144.             )
  1145.         );

  1146.         tsyBond.setCouponSetting (
  1147.             new org.drip.product.params.CouponSetting (
  1148.                 null,
  1149.                 "",
  1150.                 dblCoupon,
  1151.                 java.lang.Double.NaN,
  1152.                 java.lang.Double.NaN
  1153.             )
  1154.         );

  1155.         tsyBond.setStream (
  1156.             org.drip.product.params.BondStream.Create (
  1157.                 dtMaturity.julian(),
  1158.                 dtEffective.julian(),
  1159.                 java.lang.Integer.MIN_VALUE,
  1160.                 java.lang.Integer.MIN_VALUE,
  1161.                 dtEffective.julian(),
  1162.                 iFreq,
  1163.                 dblCoupon,
  1164.                 strDayCount,
  1165.                 strDayCount,
  1166.                 null,
  1167.                 null,
  1168.                 null,
  1169.                 null,
  1170.                 null,
  1171.                 null,
  1172.                 null,
  1173.                 null,
  1174.                 "",
  1175.                 false,
  1176.                 strCurrency,
  1177.                 strCurrency,
  1178.                 null,
  1179.                 null
  1180.             )
  1181.         );

  1182.         return tsyBond;
  1183.     }

  1184.     /**
  1185.      * Construct a Fixed To Float Bond Component
  1186.      *
  1187.      * @param strName Bond Name
  1188.      * @param strCreditCurveName Credit Curve Name
  1189.      * @param iEffectiveDate Effective Date
  1190.      * @param iFixedStreamEndDate Fixed Stream End Date
  1191.      * @param iFixedFirstCouponDate Fixed Stream First Coupon Date
  1192.      * @param iFixedPenultimateCouponDate Fixed Stream Penultimate Coupon Date
  1193.      * @param iFixedFreq Fixed Stream Coupon Frequency
  1194.      * @param dblFixedCoupon Fixed Stream Coupon Rate
  1195.      * @param strFixedCouponDC Fixed Stream Coupon Day Count
  1196.      * @param strFixedAccrualDC Fixed Stream Accrual Day Count
  1197.      * @param iMaturityDate Maturity Date
  1198.      * @param iFloatFirstCouponDate Float Stream First Coupon Date
  1199.      * @param iFloatPenultimateCouponDate Float Stream Penultimate Coupon Date
  1200.      * @param iFloatFreq Float Stream Coupon Frequency
  1201.      * @param dblFloatSpread Float Stream Spread
  1202.      * @param strFloatIndex Float Stream Rate Index
  1203.      * @param dapPay Pay Date Adjustment Parameters
  1204.      * @param dapReset Reset Date Adjustment Parameters
  1205.      * @param dapMaturity Maturity Date Adjustment Parameters
  1206.      * @param dapEffective Effective Date Adjustment Parameters
  1207.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1208.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1209.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1210.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1211.      *
  1212.      * @return The Bond Component
  1213.      */

  1214.     public static final org.drip.product.credit.BondComponent FixedFPToFloatFP (
  1215.         final java.lang.String strName,
  1216.         final java.lang.String strCreditCurveName,
  1217.         final int iEffectiveDate,
  1218.         final int iFixedStreamEndDate,
  1219.         final int iFixedFirstCouponDate,
  1220.         final int iFixedPenultimateCouponDate,
  1221.         final int iFixedFreq,
  1222.         final double dblFixedCoupon,
  1223.         final java.lang.String strFixedCouponDC,
  1224.         final java.lang.String strFixedAccrualDC,
  1225.         final int iMaturityDate,
  1226.         final int iFloatFirstCouponDate,
  1227.         final int iFloatPenultimateCouponDate,
  1228.         final int iFloatFreq,
  1229.         final double dblFloatSpread,
  1230.         final java.lang.String strFloatIndex,
  1231.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1232.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1233.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1234.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1235.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1236.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1237.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1238.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart)
  1239.     {
  1240.         try {
  1241.             org.drip.state.identifier.ForwardLabel forwardLabel =
  1242.                 org.drip.state.identifier.ForwardLabel.Standard (strFloatIndex);

  1243.             if (null == forwardLabel) return null;

  1244.             java.lang.String strCurrency = forwardLabel.currency();

  1245.             return CreateBondFromParams (
  1246.                 null,
  1247.                 new org.drip.product.params.IdentifierSet (
  1248.                     strName,
  1249.                     strName,
  1250.                     strName,
  1251.                     strCurrency
  1252.                 ),
  1253.                 new org.drip.product.params.CouponSetting (
  1254.                     null,
  1255.                     "",
  1256.                     dblFloatSpread,
  1257.                     java.lang.Double.NaN,
  1258.                     java.lang.Double.NaN
  1259.                 ),
  1260.                 new org.drip.product.params.FloaterSetting (
  1261.                     org.drip.state.identifier.ForwardLabel.Standard (strFloatIndex),
  1262.                     "",
  1263.                     dblFloatSpread,
  1264.                     java.lang.Double.NaN
  1265.                 ),
  1266.                 new org.drip.product.params.QuoteConvention (
  1267.                     null,
  1268.                     "",
  1269.                     iEffectiveDate,
  1270.                     100.,
  1271.                     0,
  1272.                     strCurrency,
  1273.                     org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  1274.                 ),
  1275.                 new org.drip.product.params.CreditSetting (
  1276.                     30,
  1277.                     java.lang.Double.NaN,
  1278.                     true,
  1279.                     strCreditCurveName,
  1280.                     true
  1281.                 ),
  1282.                 new org.drip.product.params.TerminationSetting (
  1283.                     false,
  1284.                     false,
  1285.                     false,
  1286.                     null
  1287.                 ),
  1288.                 new org.drip.product.params.BondStream (
  1289.                     org.drip.product.creator.StreamBuilder.FirstPenultimateDateFixedFloat (
  1290.                         iEffectiveDate,
  1291.                         iFixedStreamEndDate,
  1292.                         iFixedFirstCouponDate,
  1293.                         iFixedPenultimateCouponDate,
  1294.                         iFixedFreq,
  1295.                         dblFixedCoupon,
  1296.                         strFixedCouponDC,
  1297.                         strFixedAccrualDC,
  1298.                         iMaturityDate,
  1299.                         iFloatFirstCouponDate,
  1300.                         iFloatPenultimateCouponDate,
  1301.                         iFloatFreq,
  1302.                         dblFloatSpread,
  1303.                         dapPay,
  1304.                         dapPeriodEnd,
  1305.                         dapAccrualEnd,
  1306.                         org.drip.state.identifier.ForwardLabel.Standard (strFloatIndex),
  1307.                         !org.drip.numerical.common.StringUtil.IsEmpty (strCreditCurveName) ?
  1308.                             org.drip.state.identifier.EntityCDSLabel.Standard (
  1309.                                 strCreditCurveName,
  1310.                                 strCurrency
  1311.                             ) : null
  1312.                     ),
  1313.                     iMaturityDate,
  1314.                     ""
  1315.                 ),
  1316.                 new org.drip.product.params.NotionalSetting (
  1317.                     100.,
  1318.                     strCurrency,
  1319.                     null,
  1320.                     org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  1321.                     false
  1322.                 )
  1323.             );
  1324.         } catch (java.lang.Exception e) {
  1325.             e.printStackTrace();
  1326.         }

  1327.         return null;
  1328.     }

  1329.     /**
  1330.      * Construct a Fixed To Float Bond Component
  1331.      *
  1332.      * @param strName Bond Name
  1333.      * @param strCreditCurveName Credit Curve Name
  1334.      * @param iEffectiveDate Effective Date
  1335.      * @param iFixedStreamEndDate Fixed Stream End Date
  1336.      * @param iFixedFirstCouponDate Fixed Stream First Coupon Date
  1337.      * @param iFixedFreq Fixed Stream Coupon Frequency
  1338.      * @param dblFixedCoupon Fixed Stream Coupon Rate
  1339.      * @param strFixedCouponDC Fixed Stream Coupon Day Count
  1340.      * @param strFixedAccrualDC Fixed Stream Accrual Day Count
  1341.      * @param iMaturityDate Maturity Date
  1342.      * @param iFloatFirstCouponDate Float Stream First Coupon Date
  1343.      * @param iFloatFreq Float Stream Coupon Frequency
  1344.      * @param dblFloatSpread Float Stream Spread
  1345.      * @param strFloatIndex Float Stream Rate Index
  1346.      * @param dapPay Pay Date Adjustment Parameters
  1347.      * @param dapReset Reset Date Adjustment Parameters
  1348.      * @param dapMaturity Maturity Date Adjustment Parameters
  1349.      * @param dapEffective Effective Date Adjustment Parameters
  1350.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1351.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1352.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1353.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1354.      *
  1355.      * @return The Bond Component
  1356.      */

  1357.     public static final org.drip.product.credit.BondComponent FixedFToFloatF (
  1358.         final java.lang.String strName,
  1359.         final java.lang.String strCreditCurveName,
  1360.         final int iEffectiveDate,
  1361.         final int iFixedStreamEndDate,
  1362.         final int iFixedFirstCouponDate,
  1363.         final int iFixedFreq,
  1364.         final double dblFixedCoupon,
  1365.         final java.lang.String strFixedCouponDC,
  1366.         final java.lang.String strFixedAccrualDC,
  1367.         final int iMaturityDate,
  1368.         final int iFloatFirstCouponDate,
  1369.         final int iFloatFreq,
  1370.         final double dblFloatSpread,
  1371.         final java.lang.String strFloatIndex,
  1372.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1373.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1374.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1375.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1376.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1377.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1378.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1379.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart)
  1380.     {
  1381.         java.lang.String strPeriodTenor = (12 / iFixedFreq) + "M";

  1382.         return FixedFPToFloatFP (
  1383.             strName,
  1384.             strCreditCurveName,
  1385.             iEffectiveDate,
  1386.             iFixedStreamEndDate,
  1387.             iFixedFirstCouponDate,
  1388.             new org.drip.analytics.date.JulianDate (iFixedStreamEndDate).subtractTenor
  1389.                 (strPeriodTenor).julian(),
  1390.             iFixedFreq,
  1391.             dblFixedCoupon,
  1392.             strFixedCouponDC,
  1393.             strFixedAccrualDC,
  1394.             iMaturityDate,
  1395.             iFloatFirstCouponDate,
  1396.             new org.drip.analytics.date.JulianDate (iMaturityDate).subtractTenor (strPeriodTenor).julian(),
  1397.             iFloatFreq,
  1398.             dblFloatSpread,
  1399.             strFloatIndex,
  1400.             dapPay,
  1401.             dapReset,
  1402.             dapMaturity,
  1403.             dapEffective,
  1404.             dapPeriodEnd,
  1405.             dapAccrualEnd,
  1406.             dapPeriodStart,
  1407.             dapAccrualStart
  1408.         );
  1409.     }

  1410.     /**
  1411.      * Construct a Fixed To Float Bond Component
  1412.      *
  1413.      * @param strName Bond Name
  1414.      * @param strCreditCurveName Credit Curve Name
  1415.      * @param iEffectiveDate Effective Date
  1416.      * @param iFixedStreamEndDate Fixed Stream End Date
  1417.      * @param iFixedFirstCouponDate Fixed Stream First Coupon Date
  1418.      * @param iFixedFreq Fixed Stream Coupon Frequency
  1419.      * @param dblFixedCoupon Fixed Stream Coupon Rate
  1420.      * @param strFixedCouponDC Fixed Stream Coupon Day Count
  1421.      * @param strFixedAccrualDC Fixed Stream Accrual Day Count
  1422.      * @param iMaturityDate Maturity Date
  1423.      * @param iFloatPenultimateCouponDate Float Stream Penultimate Coupon Date
  1424.      * @param iFloatFreq Float Stream Coupon Frequency
  1425.      * @param dblFloatSpread Float Stream Spread
  1426.      * @param strFloatIndex Float Stream Rate Index
  1427.      * @param dapPay Pay Date Adjustment Parameters
  1428.      * @param dapReset Reset Date Adjustment Parameters
  1429.      * @param dapMaturity Maturity Date Adjustment Parameters
  1430.      * @param dapEffective Effective Date Adjustment Parameters
  1431.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1432.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1433.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1434.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1435.      *
  1436.      * @return The Bond Component
  1437.      */

  1438.     public static final org.drip.product.credit.BondComponent FixedFToFloatP (
  1439.         final java.lang.String strName,
  1440.         final java.lang.String strCreditCurveName,
  1441.         final int iEffectiveDate,
  1442.         final int iFixedStreamEndDate,
  1443.         final int iFixedFirstCouponDate,
  1444.         final int iFixedFreq,
  1445.         final double dblFixedCoupon,
  1446.         final java.lang.String strFixedCouponDC,
  1447.         final java.lang.String strFixedAccrualDC,
  1448.         final int iMaturityDate,
  1449.         final int iFloatPenultimateCouponDate,
  1450.         final int iFloatFreq,
  1451.         final double dblFloatSpread,
  1452.         final java.lang.String strFloatIndex,
  1453.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1454.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1455.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1456.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1457.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1458.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1459.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1460.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart)
  1461.     {
  1462.         java.lang.String strPeriodTenor = (12 / iFixedFreq) + "M";

  1463.         return FixedFPToFloatFP (
  1464.             strName,
  1465.             strCreditCurveName,
  1466.             iEffectiveDate,
  1467.             iFixedStreamEndDate,
  1468.             iFixedFirstCouponDate,
  1469.             new org.drip.analytics.date.JulianDate (iFixedStreamEndDate).subtractTenor
  1470.                 (strPeriodTenor).julian(),
  1471.             iFixedFreq,
  1472.             dblFixedCoupon,
  1473.             strFixedCouponDC,
  1474.             strFixedAccrualDC,
  1475.             iMaturityDate,
  1476.             new org.drip.analytics.date.JulianDate (iFixedStreamEndDate).addTenor (strPeriodTenor).julian(),
  1477.             iFloatPenultimateCouponDate,
  1478.             iFloatFreq,
  1479.             dblFloatSpread,
  1480.             strFloatIndex,
  1481.             dapPay,
  1482.             dapReset,
  1483.             dapMaturity,
  1484.             dapEffective,
  1485.             dapPeriodEnd,
  1486.             dapAccrualEnd,
  1487.             dapPeriodStart,
  1488.             dapAccrualStart
  1489.         );
  1490.     }

  1491.     /**
  1492.      * Construct a Fixed To Float Bond Component
  1493.      *
  1494.      * @param strName Bond Name
  1495.      * @param strCreditCurveName Credit Curve Name
  1496.      * @param iEffectiveDate Effective Date
  1497.      * @param iFixedStreamEndDate Fixed Stream End Date
  1498.      * @param iFixedPenultimateCouponDate Fixed Stream Penultimate Coupon Date
  1499.      * @param iFixedFreq Fixed Stream Coupon Frequency
  1500.      * @param dblFixedCoupon Fixed Stream Coupon Rate
  1501.      * @param strFixedCouponDC Fixed Stream Coupon Day Count
  1502.      * @param strFixedAccrualDC Fixed Stream Accrual Day Count
  1503.      * @param iMaturityDate Maturity Date
  1504.      * @param iFloatFirstCouponDate Float Stream First Coupon Date
  1505.      * @param iFloatFreq Float Stream Coupon Frequency
  1506.      * @param dblFloatSpread Float Stream Spread
  1507.      * @param strFloatIndex Float Stream Rate Index
  1508.      * @param dapPay Pay Date Adjustment Parameters
  1509.      * @param dapReset Reset Date Adjustment Parameters
  1510.      * @param dapMaturity Maturity Date Adjustment Parameters
  1511.      * @param dapEffective Effective Date Adjustment Parameters
  1512.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1513.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1514.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1515.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1516.      *
  1517.      * @return The Bond Component
  1518.      */

  1519.     public static final org.drip.product.credit.BondComponent FixedPToFloatF (
  1520.         final java.lang.String strName,
  1521.         final java.lang.String strCreditCurveName,
  1522.         final int iEffectiveDate,
  1523.         final int iFixedStreamEndDate,
  1524.         final int iFixedPenultimateCouponDate,
  1525.         final int iFixedFreq,
  1526.         final double dblFixedCoupon,
  1527.         final java.lang.String strFixedCouponDC,
  1528.         final java.lang.String strFixedAccrualDC,
  1529.         final int iMaturityDate,
  1530.         final int iFloatFirstCouponDate,
  1531.         final int iFloatFreq,
  1532.         final double dblFloatSpread,
  1533.         final java.lang.String strFloatIndex,
  1534.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1535.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1536.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1537.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1538.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1539.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1540.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1541.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart)
  1542.     {
  1543.         java.lang.String strPeriodTenor = (12 / iFixedFreq) + "M";

  1544.         return FixedFPToFloatFP (
  1545.             strName,
  1546.             strCreditCurveName,
  1547.             iEffectiveDate,
  1548.             iFixedStreamEndDate,
  1549.             new org.drip.analytics.date.JulianDate (iEffectiveDate).addTenor (strPeriodTenor).julian(),
  1550.             iFixedPenultimateCouponDate,
  1551.             iFixedFreq,
  1552.             dblFixedCoupon,
  1553.             strFixedCouponDC,
  1554.             strFixedAccrualDC,
  1555.             iMaturityDate,
  1556.             iFloatFirstCouponDate,
  1557.             new org.drip.analytics.date.JulianDate (iMaturityDate).subtractTenor (strPeriodTenor).julian(),
  1558.             iFloatFreq,
  1559.             dblFloatSpread,
  1560.             strFloatIndex,
  1561.             dapPay,
  1562.             dapReset,
  1563.             dapMaturity,
  1564.             dapEffective,
  1565.             dapPeriodEnd,
  1566.             dapAccrualEnd,
  1567.             dapPeriodStart,
  1568.             dapAccrualStart
  1569.         );
  1570.     }

  1571.     /**
  1572.      * Construct a Fixed To Float Bond Component
  1573.      *
  1574.      * @param strName Bond Name
  1575.      * @param strCreditCurveName Credit Curve Name
  1576.      * @param iEffectiveDate Effective Date
  1577.      * @param iFixedStreamEndDate Fixed Stream End Date
  1578.      * @param iFixedPenultimateCouponDate Fixed Stream Penultimate Coupon Date
  1579.      * @param iFixedFreq Fixed Stream Coupon Frequency
  1580.      * @param dblFixedCoupon Fixed Stream Coupon Rate
  1581.      * @param strFixedCouponDC Fixed Stream Coupon Day Count
  1582.      * @param strFixedAccrualDC Fixed Stream Accrual Day Count
  1583.      * @param iMaturityDate Maturity Date
  1584.      * @param iFloatPenultimateCouponDate Float Stream Penultimate Coupon Date
  1585.      * @param iFloatFreq Float Stream Coupon Frequency
  1586.      * @param dblFloatSpread Float Stream Spread
  1587.      * @param strFloatIndex Float Stream Rate Index
  1588.      * @param dapPay Pay Date Adjustment Parameters
  1589.      * @param dapReset Reset Date Adjustment Parameters
  1590.      * @param dapMaturity Maturity Date Adjustment Parameters
  1591.      * @param dapEffective Effective Date Adjustment Parameters
  1592.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1593.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1594.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1595.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1596.      *
  1597.      * @return The Bond Component
  1598.      */

  1599.     public static final org.drip.product.credit.BondComponent FixedPToFloatP (
  1600.         final java.lang.String strName,
  1601.         final java.lang.String strCreditCurveName,
  1602.         final int iEffectiveDate,
  1603.         final int iFixedStreamEndDate,
  1604.         final int iFixedPenultimateCouponDate,
  1605.         final int iFixedFreq,
  1606.         final double dblFixedCoupon,
  1607.         final java.lang.String strFixedCouponDC,
  1608.         final java.lang.String strFixedAccrualDC,
  1609.         final int iMaturityDate,
  1610.         final int iFloatPenultimateCouponDate,
  1611.         final int iFloatFreq,
  1612.         final double dblFloatSpread,
  1613.         final java.lang.String strFloatIndex,
  1614.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1615.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1616.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1617.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1618.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1619.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1620.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1621.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart)
  1622.     {
  1623.         java.lang.String strPeriodTenor = (12 / iFixedFreq) + "M";

  1624.         return FixedFPToFloatFP (
  1625.             strName,
  1626.             strCreditCurveName,
  1627.             iEffectiveDate,
  1628.             iFixedStreamEndDate,
  1629.             new org.drip.analytics.date.JulianDate (iEffectiveDate).addTenor (strPeriodTenor).julian(),
  1630.             iFixedPenultimateCouponDate,
  1631.             iFixedFreq,
  1632.             dblFixedCoupon,
  1633.             strFixedCouponDC,
  1634.             strFixedAccrualDC,
  1635.             iMaturityDate,
  1636.             new org.drip.analytics.date.JulianDate (iFixedStreamEndDate).addTenor (strPeriodTenor).julian(),
  1637.             iFloatPenultimateCouponDate,
  1638.             iFloatFreq,
  1639.             dblFloatSpread,
  1640.             strFloatIndex,
  1641.             dapPay,
  1642.             dapReset,
  1643.             dapMaturity,
  1644.             dapEffective,
  1645.             dapPeriodEnd,
  1646.             dapAccrualEnd,
  1647.             dapPeriodStart,
  1648.             dapAccrualStart
  1649.         );
  1650.     }

  1651.     /**
  1652.      * Create a Simple OTF Fix Float Floating Rate Bond
  1653.      *
  1654.      * @param strName Bond Name
  1655.      * @param strCurrency Bond Currency
  1656.      * @param strRateIndex Floating Rate Index
  1657.      * @param strCreditCurveName Credit Curve Name
  1658.      * @param dblSpread Bond Floater Spread
  1659.      * @param iFreq Coupon Frequency
  1660.      * @param strDayCount Coupon Day Count Convention
  1661.      * @param dtEffective Effective date
  1662.      * @param dtMaturity Maturity Date
  1663.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  1664.      * @param fsCoupon Coupon Schedule
  1665.      *
  1666.      * @return The Bond object
  1667.      */

  1668.     public static final org.drip.product.credit.BondComponent CreateSimpleOTCIRSFloater (
  1669.         final java.lang.String strName,
  1670.         final java.lang.String strCurrency,
  1671.         final java.lang.String strRateIndex,
  1672.         final java.lang.String strCreditCurveName,
  1673.         final double dblSpread,
  1674.         final int iFreq,
  1675.         final java.lang.String strDayCount,
  1676.         final org.drip.analytics.date.JulianDate dtEffective,
  1677.         final org.drip.analytics.date.JulianDate dtMaturity,
  1678.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  1679.         final org.drip.numerical.common.Array2D fsCoupon)
  1680.     {
  1681.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  1682.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblSpread))
  1683.             return null;

  1684.         return CreateBondFromParams (
  1685.             null,
  1686.             new org.drip.product.params.IdentifierSet (
  1687.                 strName,
  1688.                 strName,
  1689.                 strName,
  1690.                 strCurrency
  1691.             ),
  1692.             new org.drip.product.params.CouponSetting (
  1693.                 fsCoupon,
  1694.                 "",
  1695.                 dblSpread,
  1696.                 java.lang.Double.NaN,
  1697.                 java.lang.Double.NaN
  1698.             ),
  1699.             new org.drip.product.params.FloaterSetting (
  1700.                 org.drip.state.identifier.OTCFixFloatLabel.Standard (strRateIndex),
  1701.                 "",
  1702.                 dblSpread,
  1703.                 java.lang.Double.NaN
  1704.             ),
  1705.             new org.drip.product.params.QuoteConvention (
  1706.                 null,
  1707.                 "",
  1708.                 dtEffective.julian(),
  1709.                 100.,
  1710.                 0,
  1711.                 strCurrency,
  1712.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  1713.             ),
  1714.             new org.drip.product.params.CreditSetting (
  1715.                 30,
  1716.                 java.lang.Double.NaN,
  1717.                 true,
  1718.                 strCreditCurveName,
  1719.                 true
  1720.             ),
  1721.             new org.drip.product.params.TerminationSetting (
  1722.                 false,
  1723.                 false,
  1724.                 false,
  1725.                 null
  1726.             ),
  1727.             org.drip.product.params.BondStream.Create (
  1728.                 dtMaturity.julian(),
  1729.                 dtEffective.julian(),
  1730.                 java.lang.Integer.MIN_VALUE,
  1731.                 java.lang.Integer.MIN_VALUE,
  1732.                 dtEffective.julian(),
  1733.                 iFreq,
  1734.                 dblSpread,
  1735.                 strDayCount,
  1736.                 strDayCount,
  1737.                 null,
  1738.                 null,
  1739.                 null,
  1740.                 null,
  1741.                 null,
  1742.                 null,
  1743.                 null,
  1744.                 null,
  1745.                 "",
  1746.                 false,
  1747.                 strCurrency,
  1748.                 strCurrency,
  1749.                 org.drip.state.identifier.OTCFixFloatLabel.Standard (strRateIndex),
  1750.                 null == strCreditCurveName || strCreditCurveName.isEmpty() ? null :
  1751.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  1752.                         strCreditCurveName,
  1753.                         strCurrency
  1754.                     )
  1755.                 ),
  1756.             new org.drip.product.params.NotionalSetting (
  1757.                 100.,
  1758.                 strCurrency,
  1759.                 fsPrincipalOutstanding,
  1760.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  1761.                 false
  1762.             )
  1763.         );
  1764.     }

  1765.     /**
  1766.      * Create a OTC Fix Float Index Floating Rate Bond from the First and Penultimate Coupon Dates, and the
  1767.      *  other Parameters
  1768.      *
  1769.      * @param strName Bond Name
  1770.      * @param strCurrency Bond Currency
  1771.      * @param strRateIndex Floating Rate Index
  1772.      * @param strCreditCurveName Credit Curve Name
  1773.      * @param dblSpread Bond Floater Spread
  1774.      * @param iFreq Coupon Frequency
  1775.      * @param strDayCount Coupon Day Count Convention
  1776.      * @param dtEffective Effective date
  1777.      * @param dtMaturity Maturity Date
  1778.      * @param iFirstCouponDate First Coupon Date
  1779.      * @param iPenultimateCouponDate Penultimate Coupon Date
  1780.      * @param dapPay Pay Date Adjustment Parameters
  1781.      * @param dapReset Reset Date Adjustment Parameters
  1782.      * @param dapMaturity Maturity Date Adjustment Parameters
  1783.      * @param dapEffective Effective Date Adjustment Parameters
  1784.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1785.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1786.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1787.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1788.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  1789.      * @param fsCoupon Coupon Schedule
  1790.      *
  1791.      * @return The Floating Rate Bond Instance
  1792.      */

  1793.     public static final org.drip.product.credit.BondComponent CreateSimpleOTCIRSFloaterFP (
  1794.         final java.lang.String strName,
  1795.         final java.lang.String strCurrency,
  1796.         final java.lang.String strRateIndex,
  1797.         final java.lang.String strCreditCurveName,
  1798.         final double dblSpread,
  1799.         final int iFreq,
  1800.         final java.lang.String strDayCount,
  1801.         final org.drip.analytics.date.JulianDate dtEffective,
  1802.         final org.drip.analytics.date.JulianDate dtMaturity,
  1803.         final int iFirstCouponDate,
  1804.         final int iPenultimateCouponDate,
  1805.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1806.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1807.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1808.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1809.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1810.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1811.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1812.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  1813.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  1814.         final org.drip.numerical.common.Array2D fsCoupon)
  1815.     {
  1816.         if (null == strName || strName.isEmpty() || null == strCurrency || strCurrency.isEmpty() || null ==
  1817.             dtEffective || null == dtMaturity || !org.drip.numerical.common.NumberUtil.IsValid (dblSpread))
  1818.             return null;

  1819.         return CreateBondFromParams (
  1820.             null,
  1821.             new org.drip.product.params.IdentifierSet (
  1822.                 strName,
  1823.                 strName,
  1824.                 strName,
  1825.                 strCurrency
  1826.             ),
  1827.             new org.drip.product.params.CouponSetting (
  1828.                 fsCoupon,
  1829.                 "",
  1830.                 dblSpread,
  1831.                 java.lang.Double.NaN,
  1832.                 java.lang.Double.NaN
  1833.             ),
  1834.             new org.drip.product.params.FloaterSetting (
  1835.                 org.drip.state.identifier.OTCFixFloatLabel.Standard (strRateIndex),
  1836.                 "",
  1837.                 dblSpread,
  1838.                 java.lang.Double.NaN
  1839.             ),
  1840.             new org.drip.product.params.QuoteConvention (
  1841.                 null,
  1842.                 "",
  1843.                 dtEffective.julian(),
  1844.                 100.,
  1845.                 0,
  1846.                 strCurrency,
  1847.                 org.drip.analytics.daycount.Convention.DATE_ROLL_ACTUAL
  1848.             ),
  1849.             new org.drip.product.params.CreditSetting (
  1850.                 30,
  1851.                 java.lang.Double.NaN,
  1852.                 true,
  1853.                 strCreditCurveName,
  1854.                 true
  1855.             ),
  1856.             new org.drip.product.params.TerminationSetting (
  1857.                 false,
  1858.                 false,
  1859.                 false,
  1860.                 dapMaturity
  1861.             ),
  1862.             org.drip.product.params.BondStream.FromFirstPenultimateCouponDate (
  1863.                 dtMaturity.julian(),
  1864.                 dtEffective.julian(),
  1865.                 dtMaturity.julian(),
  1866.                 iFirstCouponDate,
  1867.                 iPenultimateCouponDate,
  1868.                 iFreq,
  1869.                 dblSpread,
  1870.                 strDayCount,
  1871.                 strDayCount,
  1872.                 dapPay,
  1873.                 dapReset,
  1874.                 dapMaturity,
  1875.                 dapEffective,
  1876.                 dapPeriodEnd,
  1877.                 dapAccrualEnd,
  1878.                 dapPeriodStart,
  1879.                 dapAccrualStart,
  1880.                 "",
  1881.                 false,
  1882.                 strCurrency,
  1883.                 strCurrency,
  1884.                 org.drip.state.identifier.OTCFixFloatLabel.Standard (strRateIndex),
  1885.                 null == strCreditCurveName || strCreditCurveName.isEmpty() ? null :
  1886.                     org.drip.state.identifier.EntityCDSLabel.Standard (
  1887.                         strCreditCurveName,
  1888.                         strCurrency
  1889.                     )
  1890.                 ),
  1891.             new org.drip.product.params.NotionalSetting (
  1892.                 100.,
  1893.                 strCurrency,
  1894.                 fsPrincipalOutstanding,
  1895.                 org.drip.product.params.NotionalSetting.PERIOD_AMORT_AT_END,
  1896.                 false
  1897.             )
  1898.         );
  1899.     }

  1900.     /**
  1901.      * Create a OTC Fix Float Index Floating Rate Bond from the First and Penultimate Coupon Dates, and the
  1902.      *  other Parameters
  1903.      *
  1904.      * @param strName Bond Name
  1905.      * @param strCurrency Bond Currency
  1906.      * @param strRateIndex Floating Rate Index
  1907.      * @param strCreditCurveName Credit Curve Name
  1908.      * @param dblSpread Bond Floater Spread
  1909.      * @param iFreq Coupon Frequency
  1910.      * @param strDayCount Coupon Day Count Convention
  1911.      * @param dtEffective Effective date
  1912.      * @param dtMaturity Maturity Date
  1913.      * @param iFirstCouponDate First Coupon Date
  1914.      * @param dapPay Pay Date Adjustment Parameters
  1915.      * @param dapReset Reset Date Adjustment Parameters
  1916.      * @param dapMaturity Maturity Date Adjustment Parameters
  1917.      * @param dapEffective Effective Date Adjustment Parameters
  1918.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1919.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1920.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1921.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1922.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  1923.      * @param fsCoupon Coupon Schedule
  1924.      *
  1925.      * @return The Floating Rate Bond Instance
  1926.      */

  1927.     public static final org.drip.product.credit.BondComponent CreateSimpleOTCIRSFloaterF (
  1928.         final java.lang.String strName,
  1929.         final java.lang.String strCurrency,
  1930.         final java.lang.String strRateIndex,
  1931.         final java.lang.String strCreditCurveName,
  1932.         final double dblSpread,
  1933.         final int iFreq,
  1934.         final java.lang.String strDayCount,
  1935.         final org.drip.analytics.date.JulianDate dtEffective,
  1936.         final org.drip.analytics.date.JulianDate dtMaturity,
  1937.         final int iFirstCouponDate,
  1938.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  1939.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  1940.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  1941.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  1942.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  1943.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  1944.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  1945.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  1946.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  1947.         final org.drip.numerical.common.Array2D fsCoupon)
  1948.     {
  1949.         return CreateSimpleFloaterFP (
  1950.             strName,
  1951.             strCurrency,
  1952.             strRateIndex,
  1953.             strCreditCurveName,
  1954.             dblSpread,
  1955.             iFreq,
  1956.             strDayCount,
  1957.             dtEffective,
  1958.             dtMaturity,
  1959.             iFirstCouponDate,
  1960.             dtMaturity.subtractTenor ((12 / iFreq) + "M").julian(),
  1961.             dapPay,
  1962.             dapReset,
  1963.             dapMaturity,
  1964.             dapEffective,
  1965.             dapPeriodEnd,
  1966.             dapAccrualEnd,
  1967.             dapPeriodStart,
  1968.             dapAccrualStart,
  1969.             fsPrincipalOutstanding,
  1970.             fsCoupon
  1971.         );
  1972.     }

  1973.     /**
  1974.      * Create a OTC Fix-Float Index Floating Rate Bond from the First and Penultimate Coupon Dates, and the
  1975.      *  other Parameters
  1976.      *
  1977.      * @param strName Bond Name
  1978.      * @param strCurrency Bond Currency
  1979.      * @param strRateIndex Floating Rate Index
  1980.      * @param strCreditCurveName Credit Curve Name
  1981.      * @param dblSpread Bond Floater Spread
  1982.      * @param iFreq Coupon Frequency
  1983.      * @param strDayCount Coupon Day Count Convention
  1984.      * @param dtEffective Effective date
  1985.      * @param dtMaturity Maturity Date
  1986.      * @param iPenultimateCouponDate Penultimate Coupon Date
  1987.      * @param dapPay Pay Date Adjustment Parameters
  1988.      * @param dapReset Reset Date Adjustment Parameters
  1989.      * @param dapMaturity Maturity Date Adjustment Parameters
  1990.      * @param dapEffective Effective Date Adjustment Parameters
  1991.      * @param dapPeriodEnd Period End Date Adjustment Parameters
  1992.      * @param dapAccrualEnd Accrual Date Adjustment Parameters
  1993.      * @param dapPeriodStart Period Start Date Adjustment Parameters
  1994.      * @param dapAccrualStart Accrual Start  Date Adjustment Parameters
  1995.      * @param fsPrincipalOutstanding Outstanding Principal Schedule
  1996.      * @param fsCoupon Coupon Schedule
  1997.      *
  1998.      * @return The Floating Rate Bond Instance
  1999.      */

  2000.     public static final org.drip.product.credit.BondComponent CreateSimpleOTCIRSFloaterP (
  2001.         final java.lang.String strName,
  2002.         final java.lang.String strCurrency,
  2003.         final java.lang.String strRateIndex,
  2004.         final java.lang.String strCreditCurveName,
  2005.         final double dblSpread,
  2006.         final int iFreq,
  2007.         final java.lang.String strDayCount,
  2008.         final org.drip.analytics.date.JulianDate dtEffective,
  2009.         final org.drip.analytics.date.JulianDate dtMaturity,
  2010.         final int iPenultimateCouponDate,
  2011.         final org.drip.analytics.daycount.DateAdjustParams dapPay,
  2012.         final org.drip.analytics.daycount.DateAdjustParams dapReset,
  2013.         final org.drip.analytics.daycount.DateAdjustParams dapMaturity,
  2014.         final org.drip.analytics.daycount.DateAdjustParams dapEffective,
  2015.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodEnd,
  2016.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualEnd,
  2017.         final org.drip.analytics.daycount.DateAdjustParams dapPeriodStart,
  2018.         final org.drip.analytics.daycount.DateAdjustParams dapAccrualStart,
  2019.         final org.drip.numerical.common.Array2D fsPrincipalOutstanding,
  2020.         final org.drip.numerical.common.Array2D fsCoupon)
  2021.     {
  2022.         return CreateSimpleFloaterFP (
  2023.             strName,
  2024.             strCurrency,
  2025.             strRateIndex,
  2026.             strCreditCurveName,
  2027.             dblSpread,
  2028.             iFreq,
  2029.             strDayCount,
  2030.             dtEffective,
  2031.             dtMaturity,
  2032.             dtEffective.addTenor ((12 / iFreq) + "M").julian(),
  2033.             iPenultimateCouponDate,
  2034.             dapPay,
  2035.             dapReset,
  2036.             dapMaturity,
  2037.             dapEffective,
  2038.             dapPeriodEnd,
  2039.             dapAccrualEnd,
  2040.             dapPeriodStart,
  2041.             dapAccrualStart,
  2042.             fsPrincipalOutstanding,
  2043.             fsCoupon
  2044.         );
  2045.     }
  2046. }