diff --git a/ReleaseNotes/02_09_2023.txt b/ReleaseNotes/02_09_2023.txt
new file mode 100644
index 00000000000..c8ac5f965ef
--- /dev/null
+++ b/ReleaseNotes/02_09_2023.txt
@@ -0,0 +1,37 @@
+
+Features:
+
+Bug Fixes/Re-organization:
+
+ - State Non-linear Flat Forward Discount Curve - Set Flat Value (1, 2)
+ - State Non-linear Flat Forward Curve #1 (3, 4)
+ - State Non-linear Flat Forward Curve #2 (5, 6)
+ - State Non-linear Flat Forward Curve - Constructor (7, 8, 9)
+ - State Non-linear Flat Forward Curve - Jack D Forward D Manifest Measure (10)
+ - State Non-linear Flat Forward FX Curve #1 (11, 12)
+ - State Non-linear Flat Forward FX Curve - Date Array (13)
+ - State Non-linear Flat Forward FX Curve #2 (14)
+ - State Non-linear Flat Forward FX Curve - Spot (15)
+ - State Non-linear Flat Forward FX Curve - Node Basis (16, 17, 18)
+ - State Non-linear Flat Forward FX Curve - Constructor (19, 20, 21)
+ - State Non-linear Flat Forward FX Curve #3 (22, 23, 24)
+ - State Non-linear Flat Forward FX Curve - Zero Basis (25, 26, 27)
+ - State Non-linear Flat Forward FX Curve - Implied Node Rates (28, 29, 30)
+ - State Non-linear Flat Forward FX Curve - Bootstrap Basis (31, 32, 33)
+ - State Non-linear Flat Forward FX Curve - Bootstrap Basis Discount (34, 35, 36)
+ - State Non-linear Flat Forward FX Curve - Rate (37, 38, 39)
+ - State Non-linear Flat Forward FX Curve - Jack D Forward D Manifest Measure (40)
+ - State Non-linear Flat Forward FX Curve - Set Node Value (41, 42, 43)
+ - State Non-linear Flat Forward FX Curve - Bump Node Value (44, 45, 46)
+ - State Non-linear Flat Forward FX Curve - Set Value (47, 48, 49)
+ - State Non-linear Flat Forward Govvie Curve (50, 51)
+ - State Non-linear Flat Forward Govvie Curve - Date Array (52)
+ - State Non-linear Flat Forward Govvie Curve - Yield Array (53)
+ - State Non-linear Flat Forward Govvie Curve - Yield Fraction (54, 55, 56)
+ - State Non-linear Flat Forward Govvie Curve - Constructor (57, 58, 59)
+ - State Non-linear Flat Forward Govvie Curve - Yld (60)
+
+
+Samples:
+
+IdeaDRIP:
diff --git a/ScheduleSheet.xlsx b/ScheduleSheet.xlsx
index 06563307c05..b7defce962d 100644
Binary files a/ScheduleSheet.xlsx and b/ScheduleSheet.xlsx differ
diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java
index f851efc89f6..8e983e63985 100644
--- a/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java
+++ b/src/main/java/org/drip/state/nonlinear/FlatForwardDiscountCurve.java
@@ -694,12 +694,14 @@ public String compoundingDayCount()
}
@Override public boolean setFlatValue (
- final double dblValue)
+ final double value)
{
- if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;
+ if (!NumberUtil.IsValid (value)) {
+ return false;
+ }
for (int i = 0; i < _forwardRateArray.length; ++i)
- _forwardRateArray[i] = dblValue;
+ _forwardRateArray[i] = value;
return true;
}
diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java
index e7f110bc914..38349558c17 100644
--- a/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java
+++ b/src/main/java/org/drip/state/nonlinear/FlatForwardFXCurve.java
@@ -1,11 +1,25 @@
package org.drip.state.nonlinear;
+import org.drip.analytics.date.JulianDate;
+import org.drip.numerical.common.NumberUtil;
+import org.drip.numerical.differentiation.WengertJacobian;
+import org.drip.param.valuation.ValuationParams;
+import org.drip.product.fx.FXForwardComponent;
+import org.drip.product.params.CurrencyPair;
+import org.drip.service.common.StringUtil;
+import org.drip.state.creator.ScenarioDiscountCurveBuilder;
+import org.drip.state.discount.MergedDiscountForwardCurve;
+import org.drip.state.fx.ExplicitBootFXCurve;
+
/*
* -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*/
/*!
+ * Copyright (C) 2025 Lakshmi Krishnamurthy
+ * Copyright (C) 2024 Lakshmi Krishnamurthy
+ * Copyright (C) 2023 Lakshmi Krishnamurthy
* Copyright (C) 2022 Lakshmi Krishnamurthy
* Copyright (C) 2021 Lakshmi Krishnamurthy
* Copyright (C) 2020 Lakshmi Krishnamurthy
@@ -84,85 +98,107 @@
* FlatForwardFXCurve manages the Volatility Latent State, using the Forward FX as the State Response
* Representation.
*
- *
- *
- *
+ *
+ *
+ *
+ *
*
* @author Lakshmi Krishnamurthy
*/
-public class FlatForwardFXCurve extends org.drip.state.fx.ExplicitBootFXCurve {
- private int[] _aiPillarDate = null;
- private double[] _adblFXForward = null;
- private double _dblFXSpot = java.lang.Double.NaN;
+public class FlatForwardFXCurve extends ExplicitBootFXCurve
+{
+ private int[] _dateArray = null;
+ private double _fxSpot = Double.NaN;
+ private double[] _fxForwardArray = null;
private double nodeBasis (
- final int iNodeDate,
- final org.drip.param.valuation.ValuationParams valParam,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final boolean bBasisOnDenom)
- throws java.lang.Exception
+ final int nodeDate,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final boolean basisOnDenominator)
+ throws Exception
{
- return new org.drip.product.fx.FXForwardComponent ("FXFWD_" +
- org.drip.service.common.StringUtil.GUID(), currencyPair(), epoch().julian(), iNodeDate, 1.,
- null).discountCurveBasis (valParam, dcNum, dcDenom, _dblFXSpot, fx (iNodeDate),
- bBasisOnDenom);
+ return new FXForwardComponent (
+ "FXFWD_" + StringUtil.GUID(),
+ currencyPair(),
+ epoch().julian(),
+ nodeDate,
+ 1.,
+ null
+ ).discountCurveBasis (
+ valuationParams,
+ numeratorDiscountCurve,
+ denominatorDiscountCurve,
+ _fxSpot,
+ fx (nodeDate),
+ basisOnDenominator
+ );
}
/**
* FlatForwardVolatilityCurve Constructor
*
- * @param iEpochDate Epoch Date
- * @param cp Currency Pair
- * @param dblFXSpot FX Spot
- * @param aiPillarDate Array of the Pillar Dates
- * @param adblFXForward Array of the corresponding FX Forward Nodes
+ * @param epochDate Epoch Date
+ * @param currencyPair Currency Pair
+ * @param fxSpot FX Spot
+ * @param dateArray Array of the Pillar Dates
+ * @param fxForwardArray Array of the corresponding FX Forward Nodes
*
- * @throws java.lang.Exception Thrown if the Inputs are Invalid
+ * @throws Exception Thrown if the Inputs are Invalid
*/
public FlatForwardFXCurve (
- final int iEpochDate,
- final org.drip.product.params.CurrencyPair cp,
- final double dblFXSpot,
- final int[] aiPillarDate,
- final double[] adblFXForward)
- throws java.lang.Exception
+ final int epochDate,
+ final CurrencyPair currencyPair,
+ final double fxSpot,
+ final int[] dateArray,
+ final double[] fxForwardArray)
+ throws Exception
{
- super (iEpochDate, cp);
+ super (epochDate, currencyPair);
- if (!org.drip.numerical.common.NumberUtil.IsValid (_dblFXSpot = dblFXSpot) || null == (_aiPillarDate =
- aiPillarDate) || null == (_adblFXForward = adblFXForward) || _aiPillarDate.length !=
- _adblFXForward.length)
- throw new java.lang.Exception ("FlatForwardFXCurve ctr => Invalid Inputs");
+ if (!NumberUtil.IsValid (_fxSpot = fxSpot) || null == (_dateArray = dateArray) ||
+ null == (_fxForwardArray = fxForwardArray) || _dateArray.length != _fxForwardArray.length) {
+ throw new Exception ("FlatForwardFXCurve ctr => Invalid Inputs");
+ }
- int iNumPillar = _aiPillarDate.length;
+ int dateArrayCount = _dateArray.length;
- for (int i = 0; i < iNumPillar; ++i) {
- if (!org.drip.numerical.common.NumberUtil.IsValid (_adblFXForward[i]))
- throw new java.lang.Exception ("FlatForwardFXCurve ctr => Invalid Inputs");
+ for (int i = 0; i < dateArrayCount; ++i) {
+ if (!NumberUtil.IsValid (_fxForwardArray[i])) {
+ throw new Exception ("FlatForwardFXCurve ctr => Invalid Inputs");
+ }
}
}
@Override public double fx (
- final int iDate)
- throws java.lang.Exception
+ final int date)
+ throws Exception
{
- if (iDate <= _iEpochDate) return _adblFXForward[0];
+ if (date <= _iEpochDate) {
+ return _fxForwardArray[0];
+ }
- int iNumPillar = _adblFXForward.length;
+ int fxForwardArrayCount = _fxForwardArray.length;
- for (int i = 1; i < iNumPillar; ++i) {
- if (_aiPillarDate[i - 1] <= iDate && _aiPillarDate[i] > iDate) return _adblFXForward[i];
+ for (int i = 1; i < fxForwardArrayCount; ++i) {
+ if (_dateArray[i - 1] <= date && _dateArray[i] > date) {
+ return _fxForwardArray[i];
+ }
}
- return _adblFXForward[iNumPillar - 1];
+ return _fxForwardArray[fxForwardArrayCount - 1];
}
/**
@@ -173,130 +209,169 @@ public FlatForwardFXCurve (
public double fxSpot()
{
- return _dblFXSpot;
+ return _fxSpot;
}
@Override public double[] zeroBasis (
- final int[] aiDateNode,
- final org.drip.param.valuation.ValuationParams valParams,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final boolean bBasisOnDenom)
+ final int[] dateNodeArray,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final boolean basisOnDenominator)
{
- if (null == aiDateNode) return null;
+ if (null == dateNodeArray) {
+ return null;
+ }
- int iNumBasis = aiDateNode.length;
- double[] adblBasis = new double[iNumBasis];
+ int dateNodeCount = dateNodeArray.length;
+ double[] basisArray = new double[dateNodeCount];
- if (0 == iNumBasis) return null;
+ if (0 == dateNodeCount) return null;
- for (int i = 0; i < iNumBasis; ++i) {
+ for (int i = 0; i < dateNodeCount; ++i) {
try {
- adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcNum, dcDenom, bBasisOnDenom);
- } catch (java.lang.Exception e) {
+ basisArray[i] = nodeBasis (
+ dateNodeArray[i],
+ valuationParams,
+ numeratorDiscountCurve,
+ denominatorDiscountCurve,
+ basisOnDenominator
+ );
+ } catch (Exception e) {
e.printStackTrace();
return null;
}
}
- return adblBasis;
+ return basisArray;
}
@Override public double[] impliedNodeRates (
- final int[] aiDateNode,
- final org.drip.param.valuation.ValuationParams valParams,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final boolean bBasisOnDenom)
+ final int[] dateNodeArray,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final boolean basisOnDenominator)
{
- if (null == aiDateNode) return null;
+ if (null == dateNodeArray) {
+ return null;
+ }
- int iNumBasis = aiDateNode.length;
- double[] adblImpliedNodeRate = new double[iNumBasis];
+ int dateNodeCount = dateNodeArray.length;
+ double[] impliedNodeRateArray = new double[dateNodeCount];
- if (0 == iNumBasis) return null;
+ if (0 == dateNodeCount) {
+ return null;
+ }
- for (int i = 0; i < iNumBasis; ++i) {
+ for (int dateNodeIndex = 0; dateNodeIndex < dateNodeCount; ++dateNodeIndex) {
try {
- double dblBaseImpliedRate = java.lang.Double.NaN;
-
- if (bBasisOnDenom)
- dblBaseImpliedRate = dcNum.zero (aiDateNode[i]);
- else
- dblBaseImpliedRate = dcDenom.zero (aiDateNode[i]);
-
- adblImpliedNodeRate[i] = dblBaseImpliedRate + nodeBasis (i, valParams, dcNum, dcDenom,
- bBasisOnDenom);
- } catch (java.lang.Exception e) {
+ impliedNodeRateArray[dateNodeIndex] = (
+ basisOnDenominator ? numeratorDiscountCurve.zero (dateNodeArray[dateNodeIndex]) :
+ denominatorDiscountCurve.zero (dateNodeArray[dateNodeIndex])
+ ) + nodeBasis (
+ dateNodeIndex,
+ valuationParams,
+ numeratorDiscountCurve,
+ denominatorDiscountCurve,
+ basisOnDenominator
+ );
+ } catch (Exception e) {
e.printStackTrace();
}
}
- return adblImpliedNodeRate;
+ return impliedNodeRateArray;
}
@Override public double[] bootstrapBasis (
- final int[] aiDateNode,
- final org.drip.param.valuation.ValuationParams valParams,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final boolean bBasisOnDenom)
+ final int[] dateNodeArray,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final boolean basisOnDenominator)
{
- if (null == aiDateNode) return null;
+ if (null == dateNodeArray) {
+ return null;
+ }
- int iNumBasis = aiDateNode.length;
- double[] adblBasis = new double[iNumBasis];
- org.drip.state.discount.MergedDiscountForwardCurve dcBasis = bBasisOnDenom ? dcDenom : dcNum;
+ int dateNodeCount = dateNodeArray.length;
+ double[] basisArray = new double[dateNodeCount];
+ MergedDiscountForwardCurve basisDiscountCurve = basisOnDenominator ?
+ denominatorDiscountCurve : numeratorDiscountCurve;
- if (0 == iNumBasis || null == dcBasis) return null;
+ if (0 == dateNodeCount || null == basisDiscountCurve) {
+ return null;
+ }
- for (int i = 0; i < iNumBasis; ++i) {
+ for (int dateNodeIndex = 0; dateNodeIndex < dateNodeCount; ++dateNodeIndex) {
try {
- if (bBasisOnDenom)
- adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcNum, dcBasis, true);
- else
- adblBasis[i] = nodeBasis (aiDateNode[i], valParams, dcBasis, dcDenom, false);
- } catch (java.lang.Exception e) {
+ basisArray[dateNodeIndex] = nodeBasis (
+ dateNodeArray[dateNodeIndex],
+ valuationParams,
+ basisOnDenominator ? numeratorDiscountCurve : basisDiscountCurve,
+ basisOnDenominator ? basisDiscountCurve : denominatorDiscountCurve,
+ true
+ );
+ } catch (Exception e) {
e.printStackTrace();
return null;
}
}
- return adblBasis;
+ return basisArray;
}
- @Override public org.drip.state.discount.MergedDiscountForwardCurve bootstrapBasisDC (
- final int[] aiDateNode,
- final org.drip.param.valuation.ValuationParams valParams,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final boolean bBasisOnDenom)
+ @Override public MergedDiscountForwardCurve bootstrapBasisDC (
+ final int[] dateNodeArray,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final boolean basisOnDenominator)
{
- double[] adblImpliedRate = impliedNodeRates (aiDateNode, valParams, dcNum, dcDenom, bBasisOnDenom);
-
- if (null == adblImpliedRate) return null;
+ double[] impliedRateArray = impliedNodeRates (
+ dateNodeArray,
+ valuationParams,
+ numeratorDiscountCurve,
+ denominatorDiscountCurve,
+ basisOnDenominator
+ );
+
+ if (null == impliedRateArray) {
+ return null;
+ }
- int iNumDF = adblImpliedRate.length;
- double[] adblDF = new double[iNumDF];
- org.drip.state.discount.MergedDiscountForwardCurve dc = bBasisOnDenom ? dcDenom : dcNum;
+ int discountFactorCount = impliedRateArray.length;
+ double[] discountFactorArray = new double[discountFactorCount];
+ MergedDiscountForwardCurve discountCurve = basisOnDenominator ?
+ denominatorDiscountCurve : numeratorDiscountCurve;
- if (0 == iNumDF) return null;
+ if (0 == discountFactorCount) {
+ return null;
+ }
- int iSpotDate = valParams.valueDate();
+ int spotDate = valuationParams.valueDate();
- java.lang.String strCurrency = dc.currency();
+ String currency = discountCurve.currency();
- for (int i = 0; i < iNumDF; ++i)
- adblDF[i] = java.lang.Math.exp (-1. * adblImpliedRate[i] * (aiDateNode[i] - iSpotDate) /
- 365.25);
+ for (int discountFactorIndex = 0; discountFactorIndex < discountFactorCount; ++discountFactorIndex) {
+ discountFactorArray[discountFactorIndex] = Math.exp (
+ -1. * impliedRateArray[discountFactorIndex] * (dateNodeArray[discountFactorIndex] - spotDate)
+ / 365.25
+ );
+ }
try {
- return org.drip.state.creator.ScenarioDiscountCurveBuilder.CubicPolynomialDiscountCurve
- (strCurrency + "::BASIS", new org.drip.analytics.date.JulianDate (iSpotDate), strCurrency,
- aiDateNode, adblDF);
- } catch (java.lang.Exception e) {
+ return ScenarioDiscountCurveBuilder.CubicPolynomialDiscountCurve (
+ currency + "::BASIS",
+ new JulianDate (spotDate),
+ currency,
+ dateNodeArray,
+ discountFactorArray
+ );
+ } catch (Exception e) {
e.printStackTrace();
}
@@ -304,63 +379,76 @@ public double fxSpot()
}
@Override public double rate (
- final int[] aiDateNode,
- final org.drip.param.valuation.ValuationParams valParams,
- final org.drip.state.discount.MergedDiscountForwardCurve dcNum,
- final org.drip.state.discount.MergedDiscountForwardCurve dcDenom,
- final int iDate,
- final boolean bBasisOnDenom)
- throws java.lang.Exception
+ final int[] dateNodeArray,
+ final ValuationParams valuationParams,
+ final MergedDiscountForwardCurve numeratorDiscountCurve,
+ final MergedDiscountForwardCurve denominatorDiscountCurve,
+ final int date,
+ final boolean basisOnDenominator)
+ throws Exception
{
- org.drip.state.discount.MergedDiscountForwardCurve dcImplied = bootstrapBasisDC (aiDateNode, valParams, dcNum,
- dcDenom, bBasisOnDenom);
-
- if (null == dcImplied)
- throw new java.lang.Exception ("BasisSplineFXForward::rate: Cannot imply basis DC!");
+ MergedDiscountForwardCurve impliedDiscountCurve = bootstrapBasisDC (
+ dateNodeArray,
+ valuationParams,
+ numeratorDiscountCurve,
+ denominatorDiscountCurve,
+ basisOnDenominator
+ );
+
+ if (null == impliedDiscountCurve) {
+ throw new Exception ("BasisSplineFXForward::rate: Cannot imply basis DC!");
+ }
- return dcImplied.zero (iDate);
+ return impliedDiscountCurve.zero (date);
}
- @Override public org.drip.numerical.differentiation.WengertJacobian jackDForwardDManifestMeasure (
- final java.lang.String strManifestMeasure,
- final int iDate)
+ @Override public WengertJacobian jackDForwardDManifestMeasure (
+ final String manifestMeasure,
+ final int date)
{
return null;
}
@Override public boolean setNodeValue (
- final int iNodeIndex,
- final double dblValue)
+ final int nodeIndex,
+ final double value)
{
- if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblFXForward.length)
+ if (!NumberUtil.IsValid (value) || nodeIndex > _fxForwardArray.length) {
return false;
+ }
- for (int i = iNodeIndex; i < _adblFXForward.length; ++i)
- _adblFXForward[i] = dblValue;
+ for (int fxForwardIndex = nodeIndex; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) {
+ _fxForwardArray[fxForwardIndex] = value;
+ }
return true;
}
@Override public boolean bumpNodeValue (
- final int iNodeIndex,
- final double dblValue)
+ final int nodeIndex,
+ final double value)
{
- if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue) || iNodeIndex > _adblFXForward.length)
+ if (!NumberUtil.IsValid (value) || nodeIndex > _fxForwardArray.length) {
return false;
+ }
- for (int i = iNodeIndex; i < _adblFXForward.length; ++i)
- _adblFXForward[i] += dblValue;
+ for (int fxForwardIndex = nodeIndex; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) {
+ _fxForwardArray[fxForwardIndex] += value;
+ }
return true;
}
@Override public boolean setFlatValue (
- final double dblValue)
+ final double value)
{
- if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;
+ if (!NumberUtil.IsValid (value)) {
+ return false;
+ }
- for (int i = 0; i < _adblFXForward.length; ++i)
- _adblFXForward[i] = dblValue;
+ for (int fxForwardIndex = 0; fxForwardIndex < _fxForwardArray.length; ++fxForwardIndex) {
+ _fxForwardArray[fxForwardIndex] = value;
+ }
return true;
}
diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java
index 27f1c138519..4fdd2d79154 100644
--- a/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java
+++ b/src/main/java/org/drip/state/nonlinear/FlatForwardForwardCurve.java
@@ -1,11 +1,20 @@
package org.drip.state.nonlinear;
+import org.drip.analytics.date.JulianDate;
+import org.drip.numerical.common.NumberUtil;
+import org.drip.numerical.differentiation.WengertJacobian;
+import org.drip.state.forward.ForwardCurve;
+import org.drip.state.identifier.ForwardLabel;
+
/*
* -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*/
/*!
+ * Copyright (C) 2025 Lakshmi Krishnamurthy
+ * Copyright (C) 2024 Lakshmi Krishnamurthy
+ * Copyright (C) 2023 Lakshmi Krishnamurthy
* Copyright (C) 2022 Lakshmi Krishnamurthy
* Copyright (C) 2021 Lakshmi Krishnamurthy
* Copyright (C) 2020 Lakshmi Krishnamurthy
@@ -85,53 +94,60 @@
/**
* FlatForwardForwardCurve contains an implementation of the flat forward rate forward curve.
*
- *
- *
- *
+ *
+ *
+ *
+ *
*
* @author Lakshmi Krishnamurthy
*/
-public class FlatForwardForwardCurve extends org.drip.state.forward.ForwardCurve {
- private double _dblFlatForwardRate = java.lang.Double.NaN;
+public class FlatForwardForwardCurve extends ForwardCurve
+{
+ private double _flatForwardRate = Double.NaN;
/**
* FlatForwardForwardCurve constructor
*
- * @param dtEpoch The Forward Curve Epoch Date
- * @param fri The Floating Rate Index
- * @param dblFlatForwardRate The Flat FOrward Rate
+ * @param epochDate The Forward Curve Epoch Date
+ * @param forwardLabel The Floating Rate Index Forward Label
+ * @param flatForwardRate The Flat FOrward Rate
*
- * @throws java.lang.Exception Thrown if the Inputs are Invalid
+ * @throws Exception Thrown if the Inputs are Invalid
*/
public FlatForwardForwardCurve (
- final org.drip.analytics.date.JulianDate dtEpoch,
- final org.drip.state.identifier.ForwardLabel fri,
- final double dblFlatForwardRate)
- throws java.lang.Exception
+ final JulianDate epochDate,
+ final ForwardLabel forwardLabel,
+ final double flatForwardRate)
+ throws Exception
{
- super (dtEpoch.julian(), fri);
+ super (epochDate.julian(), forwardLabel);
- if (!org.drip.numerical.common.NumberUtil.IsValid (_dblFlatForwardRate = dblFlatForwardRate))
- throw new java.lang.Exception ("FlatForwardForwardCurve ctr: Invalid Inputs");
+ if (!NumberUtil.IsValid (_flatForwardRate = flatForwardRate)) {
+ throw new Exception ("FlatForwardForwardCurve ctr: Invalid Inputs");
+ }
}
@Override public double forward (
- final int iDate)
- throws java.lang.Exception
+ final int date)
+ throws Exception
{
- return _dblFlatForwardRate;
+ return _flatForwardRate;
}
- @Override public org.drip.numerical.differentiation.WengertJacobian jackDForwardDManifestMeasure (
- final java.lang.String strManifestMeasure,
- final int iDate)
+ @Override public WengertJacobian jackDForwardDManifestMeasure (
+ final String manifestMeasure,
+ final int date)
{
return null;
}
diff --git a/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java b/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java
index 58769843bbe..1fb32eeaa23 100644
--- a/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java
+++ b/src/main/java/org/drip/state/nonlinear/FlatForwardGovvieCurve.java
@@ -1,11 +1,19 @@
package org.drip.state.nonlinear;
+import org.drip.analytics.daycount.ActActDCParams;
+import org.drip.analytics.daycount.Convention;
+import org.drip.analytics.support.Helper;
+import org.drip.state.govvie.ExplicitBootGovvieCurve;
+
/*
* -*- mode: java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*/
/*!
+ * Copyright (C) 2025 Lakshmi Krishnamurthy
+ * Copyright (C) 2024 Lakshmi Krishnamurthy
+ * Copyright (C) 2023 Lakshmi Krishnamurthy
* Copyright (C) 2022 Lakshmi Krishnamurthy
* Copyright (C) 2021 Lakshmi Krishnamurthy
* Copyright (C) 2020 Lakshmi Krishnamurthy
@@ -83,94 +91,109 @@
* FlatForwardGovvieCurve manages the Govvie Latent State, using the Flat Forward Rate as the State
* Response Representation.
*
- *
- *
- *
+ *
+ *
+ *
+ *
*
* @author Lakshmi Krishnamurthy
*/
-public class FlatForwardGovvieCurve extends org.drip.state.govvie.ExplicitBootGovvieCurve {
- private int[] _aiDate = null;
- private double[] _adblForwardYield = null;
-
- private double yearFract (
- final int iStartDate,
- final int iEndDate,
- final org.drip.analytics.daycount.ActActDCParams aap,
- final java.lang.String strDayCount)
- throws java.lang.Exception
+public class FlatForwardGovvieCurve extends ExplicitBootGovvieCurve
+{
+ private int[] _dateArray = null;
+ private double[] _forwardYieldArray = null;
+
+ private double yearFraction (
+ final int startDate,
+ final int endDate,
+ final ActActDCParams actActDCParams,
+ final String dayCount)
+ throws Exception
{
- return org.drip.analytics.daycount.Convention.YearFraction (iStartDate, iEndDate, strDayCount, false,
- aap, currency());
+ return Convention.YearFraction (startDate, endDate, dayCount, false, actActDCParams, currency());
}
/**
* Construct a Govvie Curve from an Array of Dates and Flat Forward Yields
*
- * @param iEpochDate Epoch Date
- * @param strTreasuryCode Treasury Code
- * @param strCurrency Currency
- * @param aiDate Array of Dates
- * @param adblForwardYield Array of Forward Yields
+ * @param epochDate Epoch Date
+ * @param treasuryCode Treasury Code
+ * @param currency Currency
+ * @param dateArray Array of Dates
+ * @param forwardYieldArray Array of Forward Yields
*
- * @throws java.lang.Exception Thrown if the curve cannot be created
+ * @throws Exception Thrown if the curve cannot be created
*/
public FlatForwardGovvieCurve (
- final int iEpochDate,
- final java.lang.String strTreasuryCode,
- final java.lang.String strCurrency,
- final int[] aiDate,
- final double[] adblForwardYield)
- throws java.lang.Exception
+ final int epochDate,
+ final String treasuryCode,
+ final String currency,
+ final int[] dateArray,
+ final double[] forwardYieldArray)
+ throws Exception
{
- super (iEpochDate, strTreasuryCode, strCurrency);
+ super (epochDate, treasuryCode, currency);
- if (null == (_aiDate = aiDate) || null == (_adblForwardYield = adblForwardYield))
- throw new java.lang.Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!");
+ if (null == (_dateArray = dateArray) || null == (_forwardYieldArray = forwardYieldArray)) {
+ throw new Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!");
+ }
- int iNumNode = _aiDate.length;
+ int nodeCount = _dateArray.length;
- if (0 == iNumNode || iNumNode != _adblForwardYield.length)
- throw new java.lang.Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!");
+ if (0 == nodeCount || nodeCount != _forwardYieldArray.length) {
+ throw new Exception ("FlatForwardGovvieCurve Constructor => Invalid Inputs!");
+ }
}
@Override public double yld (
- final int iDate)
- throws java.lang.Exception
+ final int date)
+ throws Exception
{
- if (iDate <= _iEpochDate) return 1.;
+ if (date <= _iEpochDate) {
+ return 1.;
+ }
int i = 0;
- double dblDF = 1.;
- int iStartDate = _iEpochDate;
- int iNumDate = _aiDate.length;
+ double discountFactor = 1.;
+ int startDate = _iEpochDate;
+ int dateArrayCount = _dateArray.length;
- int iFreq = freq();
+ int frequency = freq();
- java.lang.String strDayCount = dayCount();
+ String dayCount = dayCount();
- org.drip.analytics.daycount.ActActDCParams aap =
- org.drip.analytics.daycount.ActActDCParams.FromFrequency (iFreq);
+ ActActDCParams actActDCParams = ActActDCParams.FromFrequency (frequency);
- while (i < iNumDate && (int) iDate >= (int) _aiDate[i]) {
- dblDF *= java.lang.Math.pow (1. + (_adblForwardYield[i] / iFreq), -1. * yearFract (iStartDate,
- _aiDate[i], aap, strDayCount) * iFreq);
+ while (i < dateArrayCount && (int) date >= (int) _dateArray[i]) {
+ discountFactor *= Math.pow (
+ 1. + (_forwardYieldArray[i] / frequency),
+ -1. * yearFraction (startDate, _dateArray[i], actActDCParams, dayCount) * frequency
+ );
- iStartDate = _aiDate[i++];
+ startDate = _dateArray[i++];
}
- if (i >= iNumDate) i = iNumDate - 1;
+ if (i >= dateArrayCount) {
+ i = dateArrayCount - 1;
+ }
- return org.drip.analytics.support.Helper.DF2Yield (iFreq, dblDF * java.lang.Math.pow (1. +
- (_adblForwardYield[i] / iFreq), -1. * yearFract (iStartDate, iDate, aap, strDayCount) * iFreq),
- yearFract (_iEpochDate, iDate, aap, strDayCount));
+ return Helper.DF2Yield (
+ frequency,
+ discountFactor * Math.pow (1. + (_forwardYieldArray[i] / frequency),
+ -1. * yearFraction (startDate, date, actActDCParams, dayCount) * frequency),
+ yearFraction (_iEpochDate, date, actActDCParams, dayCount)
+ );
}
@Override public boolean setNodeValue (
@@ -179,12 +202,12 @@ public FlatForwardGovvieCurve (
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;
- int iNumDate = _aiDate.length;
+ int iNumDate = _dateArray.length;
if (iNodeIndex > iNumDate) return false;
for (int i = iNodeIndex; i < iNumDate; ++i)
- _adblForwardYield[i] = dblValue;
+ _forwardYieldArray[i] = dblValue;
return true;
}
@@ -195,12 +218,12 @@ public FlatForwardGovvieCurve (
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;
- int iNumDate = _aiDate.length;
+ int iNumDate = _dateArray.length;
if (iNodeIndex > iNumDate) return false;
for (int i = iNodeIndex; i < iNumDate; ++i)
- _adblForwardYield[i] += dblValue;
+ _forwardYieldArray[i] += dblValue;
return true;
}
@@ -210,10 +233,10 @@ public FlatForwardGovvieCurve (
{
if (!org.drip.numerical.common.NumberUtil.IsValid (dblValue)) return false;
- int iNumDate = _aiDate.length;
+ int iNumDate = _dateArray.length;
for (int i = 0; i < iNumDate; ++i)
- _adblForwardYield[i] = dblValue;
+ _forwardYieldArray[i] = dblValue;
return true;
}