Stream.java

package org.drip.product.rates;

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

/*!
 * Copyright (C) 2020 Lakshmi Krishnamurthy
 * Copyright (C) 2019 Lakshmi Krishnamurthy
 * Copyright (C) 2018 Lakshmi Krishnamurthy
 * Copyright (C) 2017 Lakshmi Krishnamurthy
 * Copyright (C) 2016 Lakshmi Krishnamurthy
 * Copyright (C) 2015 Lakshmi Krishnamurthy
 * Copyright (C) 2014 Lakshmi Krishnamurthy
 * 
 *  This file is part of DROP, an open-source library targeting analytics/risk, transaction cost analytics,
 *  	asset liability management analytics, capital, exposure, and margin analytics, valuation adjustment
 *  	analytics, and portfolio construction analytics within and across fixed income, credit, commodity,
 *  	equity, FX, and structured products. It also includes auxiliary libraries for algorithm support,
 *  	numerical analysis, numerical optimization, spline builder, model validation, statistical learning,
 *  	and computational support.
 *  
 *  	https://lakshmidrip.github.io/DROP/
 *  
 *  DROP is composed of three modules:
 *  
 *  - DROP Product Core - https://lakshmidrip.github.io/DROP-Product-Core/
 *  - DROP Portfolio Core - https://lakshmidrip.github.io/DROP-Portfolio-Core/
 *  - DROP Computational Core - https://lakshmidrip.github.io/DROP-Computational-Core/
 * 
 * 	DROP Product Core implements libraries for the following:
 * 	- Fixed Income Analytics
 * 	- Loan Analytics
 * 	- Transaction Cost Analytics
 * 
 * 	DROP Portfolio Core implements libraries for the following:
 * 	- Asset Allocation Analytics
 *  - Asset Liability Management Analytics
 * 	- Capital Estimation Analytics
 * 	- Exposure Analytics
 * 	- Margin Analytics
 * 	- XVA Analytics
 * 
 * 	DROP Computational Core implements libraries for the following:
 * 	- Algorithm Support
 * 	- Computation Support
 * 	- Function Analysis
 *  - Model Validation
 * 	- Numerical Analysis
 * 	- Numerical Optimizer
 * 	- Spline Builder
 *  - Statistical Learning
 * 
 * 	Documentation for DROP is Spread Over:
 * 
 * 	- Main                     => https://lakshmidrip.github.io/DROP/
 * 	- Wiki                     => https://github.com/lakshmiDRIP/DROP/wiki
 * 	- GitHub                   => https://github.com/lakshmiDRIP/DROP
 * 	- Repo Layout Taxonomy     => https://github.com/lakshmiDRIP/DROP/blob/master/Taxonomy.md
 * 	- Javadoc                  => https://lakshmidrip.github.io/DROP/Javadoc/index.html
 * 	- Technical Specifications => https://github.com/lakshmiDRIP/DROP/tree/master/Docs/Internal
 * 	- Release Versions         => https://lakshmidrip.github.io/DROP/version.html
 * 	- Community Credits        => https://lakshmidrip.github.io/DROP/credits.html
 * 	- Issues Catalog           => https://github.com/lakshmiDRIP/DROP/issues
 * 	- JUnit                    => https://lakshmidrip.github.io/DROP/junit/index.html
 * 	- Jacoco                   => https://lakshmidrip.github.io/DROP/jacoco/index.html
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *   	you may not use this file except in compliance with the License.
 *   
 *  You may obtain a copy of the License at
 *  	http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing, software
 *  	distributed under the License is distributed on an "AS IS" BASIS,
 *  	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  
 *  See the License for the specific language governing permissions and
 *  	limitations under the License.
 */

/**
 * <i>Stream</i> implements the fixed and the floating streams.
 * 
 * <br><br>
 *  <ul>
 *		<li><b>Module </b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/ProductCore.md">Product Core Module</a></li>
 *		<li><b>Library</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/FixedIncomeAnalyticsLibrary.md">Fixed Income Analytics</a></li>
 *		<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>
 *		<li><b>Package</b> = <a href = "https://github.com/lakshmiDRIP/DROP/tree/master/src/main/java/org/drip/product/rates/README.md">Fixed Income Multi-Stream Components</a></li>
 *  </ul>
 * <br><br>
 * 
 * @author Lakshmi Krishnamurthy
 */

public class Stream {
	private java.util.List<org.drip.analytics.cashflow.CompositePeriod> _lsPeriod = null;

	private double fxAdjustedNotional (
		final int iDate,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs)
		throws java.lang.Exception
	{
		org.drip.analytics.cashflow.CompositePeriod cpLeft = _lsPeriod.get (0);

		int iLeftStartDate = cpLeft.startDate();

		if (iDate <= iLeftStartDate)
			return cpLeft.notional (iLeftStartDate) * cpLeft.couponFactor (iLeftStartDate) * cpLeft.fx
				(csqs);

		for (org.drip.analytics.cashflow.CompositePeriod cp : _lsPeriod) {
			if (cp.contains (iDate))
				return cp.notional (iDate) * cp.couponFactor (iDate) * cp.fx (csqs);
		}

		org.drip.analytics.cashflow.CompositePeriod cpRight = _lsPeriod.get (_lsPeriod.size() - 1);

		int iRightEndDate = cpRight.endDate();

		return cpRight.notional (iRightEndDate) * cpRight.couponFactor (iRightEndDate) * cpRight.fx (csqs);
	}

	/**
	 * Stream constructor
	 * 
	 * @param lsPeriod List of the Coupon Periods
	 * 
	 * @throws java.lang.Exception Thrown if inputs are invalid
	 */

	public Stream (
		final java.util.List<org.drip.analytics.cashflow.CompositePeriod> lsPeriod)
		throws java.lang.Exception
	{
		if (null == (_lsPeriod = lsPeriod) || 0 == _lsPeriod.size())
			throw new java.lang.Exception ("Stream ctr => Invalid Input params!");
	}

	/**
	 * Retrieve a list of the component's coupon periods
	 * 
	 * @return List of Coupon Period
	 */

	public java.util.List<org.drip.analytics.cashflow.CompositePeriod> periods()
	{
		return _lsPeriod;
	}

	/**
	 * Retrieve the Stream Frequency
	 * 
	 * @return The Stream Frequency
	 */

	public int freq()
	{
		return _lsPeriod.get (0).freq();
	}

	/**
	 * Retrieve the Coupon Day Count
	 * 
	 * @return The Coupon Day Count
	 */

	public java.lang.String couponDC()
	{
		return _lsPeriod.get (0).periods().get (0).couponDC();
	}

	/**
	 * Retrieve the Coupon EOM Adjustment
	 * 
	 * @return The Coupon EOM Adjustment
	 */

	public boolean couponEOMAdjustment()
	{
		return _lsPeriod.get (0).periods().get (0).couponEOMAdjustment();
	}

	/**
	 * Retrieve the Calendar
	 * 
	 * @return The Calendar
	 */

	public java.lang.String calendar()
	{
		return _lsPeriod.get (0).periods().get (0).calendar();
	}

	/**
	 * Retrieve the Accrual Day Count
	 * 
	 * @return The Accrual Day Count
	 */

	public java.lang.String accrualDC()
	{
		return _lsPeriod.get (0).periods().get (0).accrualDC();
	}

	/**
	 * Retrieve the Accrual EOM Adjustment
	 * 
	 * @return The Accrual EOM Adjustment
	 */

	public boolean accrualEOMAdjustment()
	{
		return _lsPeriod.get (0).periods().get (0).accrualEOMAdjustment();
	}

	/**
	 * Retrieve the Credit Label
	 * 
	 * @return The Credit Label
	 */

	public org.drip.state.identifier.EntityCDSLabel creditLabel()
	{
		return _lsPeriod.get (0).creditLabel();
	}

	/**
	 * Retrieve the Floater Label
	 * 
	 * @return The Floater Label
	 */

	public org.drip.state.identifier.FloaterLabel floaterLabel()
	{
		return _lsPeriod.get (0).floaterLabel();
	}

	/**
	 * Retrieve the Forward Label, if Present
	 * 
	 * @return The Forward Label
	 */

	public org.drip.state.identifier.ForwardLabel forwardLabel()
	{
		org.drip.state.identifier.FloaterLabel floaterLabel = floaterLabel();

		return null != floaterLabel && floaterLabel instanceof org.drip.state.identifier.ForwardLabel ?
			(org.drip.state.identifier.ForwardLabel) floaterLabel : null;
	}

	/**
	 * Retrieve the OTC Fix Float Label, if Present
	 * 
	 * @return The OTC Fix Float Label
	 */

	public org.drip.state.identifier.OTCFixFloatLabel otcFixFloatLabel()
	{
		org.drip.state.identifier.FloaterLabel floaterLabel = floaterLabel();

		return null != floaterLabel && floaterLabel instanceof org.drip.state.identifier.OTCFixFloatLabel ?
			(org.drip.state.identifier.OTCFixFloatLabel) floaterLabel : null;
	}

	/**
	 * Retrieve the Funding Label
	 * 
	 * @return The Funding Label
	 */

	public org.drip.state.identifier.FundingLabel fundingLabel()
	{
		return _lsPeriod.get (0).fundingLabel();
	}

	/**
	 * Retrieve the FX Label
	 * 
	 * @return The FX Label
	 */

	public org.drip.state.identifier.FXLabel fxLabel()
	{
		return _lsPeriod.get (0).fxLabel();
	}

	/**
	 * Retrieve the Coupon Period List
	 * 
	 * @return The Coupon Period List
	 */

	public java.util.List<org.drip.analytics.cashflow.CompositePeriod> cashFlowPeriod()
	{
		return _lsPeriod;
	}

	/**
	 * Retrieve the Period Instance enveloping the specified Date
	 * 
	 * @param iDate The Date
	 * 
	 * @return The Period Instance enveloping the specified Date
	 */

	public org.drip.analytics.cashflow.CompositePeriod containingPeriod (
		final int iDate)
	{
		try {
			for (org.drip.analytics.cashflow.CompositePeriod cp : _lsPeriod) {
				if (cp.contains (iDate)) return cp;
			}
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Retrieve the Initial Notional
	 * 
	 * @return The Initial Notional
	 */

	public double initialNotional()
	{
		return _lsPeriod.get (0).baseNotional();
	}

	/**
	 * Retrieve the Notional corresponding to the specified Date
	 * 
	 * @param iDate The Date
	 * 
	 * @return The Notional corresponding to the specified Date
	 * 
	 * @throws java.lang.Exception Thrown if the Notional cannot be computed
	 */

	public double notional (
		final int iDate)
		throws java.lang.Exception
	{
		int iEffectiveDate = effective().julian();

		int iAdjustedDate = iEffectiveDate > iDate ? iEffectiveDate : iDate;

		org.drip.analytics.cashflow.CompositePeriod cp = containingPeriod (iAdjustedDate);

		if (null == cp) throw new java.lang.Exception ("Stream::notional => Invalid Input");

		return cp.notional (iAdjustedDate);
	}

	/**
	 * Retrieve the Notional aggregated over the Date Pairs
	 * 
	 * @param iDate1 The Date #1
	 * @param iDate2 The Date #2
	 * 
	 * @return The Notional aggregated over the Date Pairs
	 * 
	 * @throws java.lang.Exception Thrown if the Notional cannot be computed
	 */

	public double notional (
		final int iDate1,
		final int iDate2)
		throws java.lang.Exception
	{
		org.drip.analytics.cashflow.CompositePeriod cp = containingPeriod (iDate1);

		if (null == cp || !cp.contains (iDate2))
			throw new java.lang.Exception ("Stream::notional => Invalid Inputs");

		org.drip.numerical.common.Array2D notlSchedule = cp.notionalSchedule();

		return initialNotional() * (null == notlSchedule ? 1. : notlSchedule.y (iDate1, iDate2));
	}

	/**
	 * Retrieve the Effective Date
	 * 
	 * @return The Effective Date
	 */

	public org.drip.analytics.date.JulianDate effective()
	{
		try {
			return new org.drip.analytics.date.JulianDate (_lsPeriod.get (0).startDate());
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Retrieve the Maturity Date
	 * 
	 * @return The Maturity Date
	 */

	public org.drip.analytics.date.JulianDate maturity()
	{
		try {
			return new org.drip.analytics.date.JulianDate (_lsPeriod.get (_lsPeriod.size() - 1).endDate());
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Retrieve the First Coupon Pay Date
	 * 
	 * @return The First Coupon Pay Date
	 */

	public org.drip.analytics.date.JulianDate firstCouponDate()
	{
		try {
			return new org.drip.analytics.date.JulianDate (_lsPeriod.get (0).endDate());
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Retrieve the Coupon Currency
	 * 
	 * @return The Coupon Currency
	 */

	public java.lang.String couponCurrency()
	{
		return _lsPeriod.get (_lsPeriod.size() - 1).couponCurrency();
	}

	/**
	 * Retrieve the Pay Currency
	 * 
	 * @return The Pay Currency
	 */

	public java.lang.String payCurrency()
	{
		return _lsPeriod.get (_lsPeriod.size() - 1).payCurrency();
	}

	/**
	 * Retrieve the Cash Flow Currency Set
	 * 
	 * @return The Cash Flow Currency Set
	 */

	public java.util.Set<java.lang.String> cashflowCurrencySet()
	{
		java.util.Set<java.lang.String> setCcy = new java.util.HashSet<java.lang.String>();

		setCcy.add (payCurrency());

		setCcy.add (couponCurrency());

		return setCcy;
	}

	/**
	 * Retrieve the Stream Name
	 * 
	 * @return The Stream Name
	 */

	public java.lang.String name()
	{
		org.drip.state.identifier.FloaterLabel floaterLabel = floaterLabel();

		java.lang.String strTrailer = "::{" + effective() + "->" + maturity() + "}";

		if (null != floaterLabel)
			return "FLOATSTREAM::" + payCurrency() + "::" + floaterLabel.fullyQualifiedName() + strTrailer;

		return "FIXEDSTREAM::" + payCurrency() + "/" + couponCurrency() + "::" + (12 / freq()) + strTrailer;
	}

	/**
	 * Get the Coupon Metrics for the period corresponding to the specified accrual end date
	 * 
	 * @param iAccrualEndDate The Accrual End Date
	 * @param valParams Valuation parameters
	 * @param csqs Market Parameters
	 * 
	 * @return The Coupon Metrics for the period corresponding to the specified accrual end date
	 */

	public org.drip.analytics.output.CompositePeriodCouponMetrics coupon (
		final int iAccrualEndDate,
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs)
	{
		if (null == valParams) return null;

		org.drip.analytics.cashflow.CompositePeriod cp = containingPeriod (iAccrualEndDate);

		return null == cp ? null : cp.couponMetrics (valParams.valueDate(), csqs);
	}

	/**
	 * Generate the Calibration Quote Set corresponding to the specified Latent State Array
	 * 
	 * @param aLSS The Latent State Array
	 * 
	 * @return The Calibration Quote Set corresponding to the specified Latent State Array
	 */

	public org.drip.product.calib.ProductQuoteSet calibQuoteSet (
		final org.drip.state.representation.LatentStateSpecification[] aLSS)
	{
		try {
			return null == floaterLabel() ? new org.drip.product.calib.FixedStreamQuoteSet (aLSS) : new
				org.drip.product.calib.FloatingStreamQuoteSet (aLSS);
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Retrieve the Stream Coupon Basis
	 * 
	 * @return The Stream Coupon Basis
	 */

	public double basis()
	{
		return _lsPeriod.get (0).basis();
	}

	/**
	 * Generate a Value Map for the Stream
	 * 
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * 
	 * @return The Value Map for the Stream
	 */

	public org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> value (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp)
	{
		if (null == valParams || null == csqs) return null;

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

		if (null == dcFunding) return null;

		long lStart = System.nanoTime();

		int iValueDate = valParams.valueDate();

		double dblAccrued01 = 0.;
		double dblTotalCoupon = 0.;
		double dblCumulativeCouponDCF = 0.;
		double dblCumulativeCouponAmount = 0.;
		double dblAccrualCoupon = java.lang.Double.NaN;
		double dblUnadjustedDirtyPV = 0.;
		double dblUnadjustedDirtyDV01 = 0.;
		double dblCompoundingAdjustedDirtyPV = 0.;
		double dblCompoundingAdjustedDirtyDV01 = 0.;
		double dblCashPayDF = java.lang.Double.NaN;
		int iResetDate = java.lang.Integer.MIN_VALUE;
		double dblFXAdjustedValueNotional = java.lang.Double.NaN;
		double dblCreditForwardConvexityAdjustedDirtyPV = 0.;
		double dblCreditForwardConvexityAdjustedDirtyDV01 = 0.;
		double dblCreditFundingConvexityAdjustedDirtyPV = 0.;
		double dblCreditFundingConvexityAdjustedDirtyDV01 = 0.;
		double dblCreditFXConvexityAdjustedDirtyPV = 0.;
		double dblCreditFXConvexityAdjustedDirtyDV01 = 0.;
		double dblCumulativeConvexityAdjustedDirtyPV = 0.;
		double dblCumulativeConvexityAdjustedDirtyDV01 = 0.;
		double dblForwardFundingConvexityAdjustedDirtyPV = 0.;
		double dblForwardFundingConvexityAdjustedDirtyDV01 = 0.;
		double dblForwardFXConvexityAdjustedDirtyPV = 0.;
		double dblForwardFXConvexityAdjustedDirtyDV01 = 0.;
		double dblFundingFXConvexityAdjustedDirtyPV = 0.;
		double dblFundingFXConvexityAdjustedDirtyDV01 = 0.;

		if (iValueDate >= maturity().julian()) return null;

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			double dblPeriodFX = java.lang.Double.NaN;
			double dblPeriodNotional = java.lang.Double.NaN;
			double dblUnadjustedDirtyPeriodDV01 = java.lang.Double.NaN;

			int iPeriodPayDate = period.payDate();

			int iPeriodEndDate = period.endDate();

			try {
				dblPeriodNotional = period.notional (iPeriodEndDate) * period.couponFactor (iPeriodEndDate);

				dblPeriodFX = period.fx (csqs);
			} catch (java.lang.Exception e) {
				e.printStackTrace();

				return null;
			}

			if (iPeriodPayDate < iValueDate) {
				org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = period.couponMetrics
					(iPeriodEndDate, csqs);

				if (null == cpcm) return null;

				double dblPeriodDCF = cpcm.dcf();

				dblCumulativeCouponDCF += dblPeriodDCF;

				dblCumulativeCouponAmount += dblPeriodNotional * dblPeriodFX * cpcm.rate() * dblPeriodDCF;

				continue;
			}

			org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = period.couponMetrics (iValueDate,
				csqs);

			if (null == cpcm) return null;

			double dblPeriodDCF = cpcm.dcf();

			double dblPeriodFullRate = cpcm.rate();

			org.drip.analytics.output.CompositePeriodAccrualMetrics cpam = period.accrualMetrics (iValueDate,
				csqs);

			try {
				if (null != cpam) {
					dblAccrualCoupon = cpam.rate();

					iResetDate = cpam.resetDate();

					double dblPeriodAccrualDCF = cpam.dcf();

					dblCumulativeCouponDCF += dblPeriodAccrualDCF;
					dblAccrued01 = 0.0001 * dblPeriodAccrualDCF * dblPeriodNotional * dblPeriodFX;

					dblCumulativeCouponAmount += dblPeriodNotional * dblPeriodFX * dblAccrualCoupon *
						dblPeriodAccrualDCF;
				}

				dblUnadjustedDirtyPeriodDV01 = 0.0001 * dblPeriodDCF * dblPeriodNotional * dblPeriodFX *
					period.survival (csqs) * period.df (csqs);
			} catch (java.lang.Exception e) {
				e.printStackTrace();

				return null;
			}

			double dblCompoundingAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 * cpcm.compounding();

			double dblCreditForwardConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.creditForward();

			double dblCreditFundingConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.creditFunding();

			double dblCreditFXConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.creditFX();

			double dblCumulativeConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.cumulative();

			double dblForwardFundingConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.forwardFunding();

			double dblForwardFXConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.forwardFX();

			double dblFundingFXConvexityAdjustedDirtyPeriodDV01 = dblUnadjustedDirtyPeriodDV01 *
				cpcm.fundingFX();

			dblTotalCoupon += dblPeriodFullRate;
			dblUnadjustedDirtyDV01 += dblUnadjustedDirtyPeriodDV01;
			dblUnadjustedDirtyPV += dblUnadjustedDirtyPeriodDV01 * 10000. * dblPeriodFullRate;
			dblCompoundingAdjustedDirtyDV01 += dblCompoundingAdjustedDirtyPeriodDV01;
			dblCompoundingAdjustedDirtyPV += dblCompoundingAdjustedDirtyPeriodDV01 * 10000. *
				dblPeriodFullRate;
			dblCreditForwardConvexityAdjustedDirtyDV01 += dblCreditForwardConvexityAdjustedDirtyPeriodDV01;
			dblCreditForwardConvexityAdjustedDirtyPV += dblCreditForwardConvexityAdjustedDirtyPeriodDV01 *
				10000. * dblPeriodFullRate;
			dblCreditFundingConvexityAdjustedDirtyDV01 += dblCreditFundingConvexityAdjustedDirtyPeriodDV01;
			dblCreditFundingConvexityAdjustedDirtyPV += dblCreditFundingConvexityAdjustedDirtyPeriodDV01 *
				10000. * dblPeriodFullRate;
			dblCreditFXConvexityAdjustedDirtyDV01 += dblCreditFXConvexityAdjustedDirtyPeriodDV01;
			dblCreditFXConvexityAdjustedDirtyPV += dblCreditFXConvexityAdjustedDirtyPeriodDV01 * 10000. *
				dblPeriodFullRate;
			dblCumulativeConvexityAdjustedDirtyDV01 += dblCumulativeConvexityAdjustedDirtyPeriodDV01;
			dblCumulativeConvexityAdjustedDirtyPV += dblCumulativeConvexityAdjustedDirtyPeriodDV01 * 10000. *
				dblPeriodFullRate;
			dblForwardFundingConvexityAdjustedDirtyDV01 += dblForwardFundingConvexityAdjustedDirtyPeriodDV01;
			dblForwardFundingConvexityAdjustedDirtyPV += dblForwardFundingConvexityAdjustedDirtyPeriodDV01 *
				10000. * dblPeriodFullRate;
			dblForwardFXConvexityAdjustedDirtyDV01 += dblForwardFXConvexityAdjustedDirtyPeriodDV01;
			dblForwardFXConvexityAdjustedDirtyPV += dblForwardFXConvexityAdjustedDirtyPeriodDV01 * 10000. *
				dblPeriodFullRate;
			dblFundingFXConvexityAdjustedDirtyDV01 += dblFundingFXConvexityAdjustedDirtyPeriodDV01;
			dblFundingFXConvexityAdjustedDirtyPV += dblFundingFXConvexityAdjustedDirtyPeriodDV01 * 10000. *
				dblPeriodFullRate;
		}

		try {
			dblCashPayDF = dcFunding.df (iValueDate);

			dblFXAdjustedValueNotional = fxAdjustedNotional (iValueDate, csqs);
		} catch (java.lang.Exception e) {
			e.printStackTrace();

			return null;
		}

		dblUnadjustedDirtyPV /= dblCashPayDF;
		dblUnadjustedDirtyDV01 /= dblCashPayDF;
		dblCompoundingAdjustedDirtyPV /= dblCashPayDF;
		dblCompoundingAdjustedDirtyDV01 /= dblCashPayDF;
		dblCreditForwardConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblCreditForwardConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblCreditFundingConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblCreditFundingConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblCreditFXConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblCreditFXConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblCumulativeConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblCumulativeConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblForwardFundingConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblForwardFundingConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblForwardFXConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblForwardFXConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		dblFundingFXConvexityAdjustedDirtyPV /= dblCashPayDF;
		dblFundingFXConvexityAdjustedDirtyDV01 /= dblCashPayDF;
		double dblAccrued = 0. == dblAccrued01 ? 0. : dblAccrued01 * 10000. * dblAccrualCoupon;
		double dblUnadjustedCleanPV = dblUnadjustedDirtyPV - dblAccrued;
		double dblUnadjustedCleanDV01 = dblUnadjustedDirtyDV01 - dblAccrued01;
		double dblUnadjustedFairPremium = 0.0001 * dblUnadjustedCleanPV / dblUnadjustedCleanDV01;
		double dblCompoundingAdjustedCleanPV = dblCompoundingAdjustedDirtyPV - dblAccrued;
		double dblCompoundingAdjustedCleanDV01 = dblCompoundingAdjustedDirtyDV01 - dblAccrued01;
		double dblCompoundingAdjustedFairPremium = 0.0001 * dblCompoundingAdjustedCleanPV /
			dblCompoundingAdjustedCleanDV01;
		double dblCreditForwardConvexityAdjustedCleanPV = dblCreditForwardConvexityAdjustedDirtyPV -
			dblAccrued;
		double dblCreditForwardConvexityAdjustedCleanDV01 = dblCreditForwardConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblCreditForwardConvexityAdjustedFairPremium = 0.0001 *
			dblCreditForwardConvexityAdjustedCleanPV / dblCreditForwardConvexityAdjustedCleanDV01;
		double dblCreditFundingConvexityAdjustedCleanPV = dblCreditFundingConvexityAdjustedDirtyPV -
			dblAccrued;
		double dblCreditFundingConvexityAdjustedCleanDV01 = dblCreditFundingConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblCreditFundingConvexityAdjustedFairPremium = 0.0001 *
			dblCreditFundingConvexityAdjustedCleanPV / dblCreditFundingConvexityAdjustedCleanDV01;
		double dblCreditFXConvexityAdjustedCleanPV = dblCreditFXConvexityAdjustedDirtyPV - dblAccrued;
		double dblCreditFXConvexityAdjustedCleanDV01 = dblCreditFXConvexityAdjustedDirtyDV01 - dblAccrued01;
		double dblCreditFXConvexityAdjustedFairPremium = 0.0001 * dblCreditFXConvexityAdjustedCleanPV /
			dblCreditFXConvexityAdjustedCleanDV01;
		double dblCumulativeConvexityAdjustedCleanPV = dblCumulativeConvexityAdjustedDirtyPV - dblAccrued;
		double dblCumulativeConvexityAdjustedCleanDV01 = dblCumulativeConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblCumulativeConvexityAdjustedFairPremium = 0.0001 * dblCumulativeConvexityAdjustedCleanPV /
			dblCumulativeConvexityAdjustedCleanDV01;
		double dblForwardFundingConvexityAdjustedCleanPV = dblForwardFundingConvexityAdjustedDirtyPV -
			dblAccrued;
		double dblForwardFundingConvexityAdjustedCleanDV01 = dblForwardFundingConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblForwardFundingConvexityAdjustedFairPremium = 0.0001 *
			dblForwardFundingConvexityAdjustedCleanPV / dblForwardFundingConvexityAdjustedCleanDV01;
		double dblForwardFXConvexityAdjustedCleanPV = dblForwardFXConvexityAdjustedDirtyPV - dblAccrued;
		double dblForwardFXConvexityAdjustedCleanDV01 = dblForwardFXConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblForwardFXConvexityAdjustedFairPremium = 0.0001 * dblForwardFXConvexityAdjustedCleanPV /
			dblForwardFXConvexityAdjustedCleanDV01;
		double dblFundingFXConvexityAdjustedCleanPV = dblFundingFXConvexityAdjustedDirtyPV - dblAccrued;
		double dblFundingFXConvexityAdjustedCleanDV01 = dblFundingFXConvexityAdjustedDirtyDV01 -
			dblAccrued01;
		double dblFundingFXConvexityAdjustedFairPremium = 0.0001 * dblFundingFXConvexityAdjustedCleanPV /
			dblFundingFXConvexityAdjustedCleanDV01;

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

		mapResult.put ("AccrualCoupon", dblAccrualCoupon);

		mapResult.put ("Accrued", dblAccrued);

		mapResult.put ("Accrued01", dblAccrued01);

		mapResult.put ("CleanDV01", dblCumulativeConvexityAdjustedCleanDV01);

		mapResult.put ("CleanPV", dblCumulativeConvexityAdjustedCleanPV);

		mapResult.put ("CompoundingAdjustedCleanDV01", dblCompoundingAdjustedCleanDV01);

		mapResult.put ("CompoundingAdjustedCleanPV", dblCompoundingAdjustedCleanPV);

		mapResult.put ("CompoundingAdjustedDirtyPV", dblCompoundingAdjustedDirtyPV);

		mapResult.put ("CompoundingAdjustedDirtyDV01", dblCompoundingAdjustedDirtyDV01);

		mapResult.put ("CompoundingAdjustedDirtyPV", dblCompoundingAdjustedDirtyPV);

		mapResult.put ("CompoundingAdjustedFairPremium", dblCompoundingAdjustedFairPremium);

		mapResult.put ("CompoundingAdjustedParRate", dblCompoundingAdjustedFairPremium);

		mapResult.put ("CompoundingAdjustedPV", dblCompoundingAdjustedCleanPV);

		mapResult.put ("CompoundingAdjustedRate", dblCompoundingAdjustedFairPremium);

		mapResult.put ("CompoundingAdjustedUpfront", dblCompoundingAdjustedCleanPV);

		mapResult.put ("CompoundingAdjustmentFactor", dblCompoundingAdjustedDirtyDV01 /
			dblUnadjustedDirtyDV01);

		mapResult.put ("CompoundingAdjustmentPremium", dblCompoundingAdjustedCleanPV - dblUnadjustedCleanPV);

		mapResult.put ("CompoundingAdjustmentPremiumUpfront", (dblCompoundingAdjustedCleanPV -
			dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("CreditForwardConvexityAdjustedCleanDV01",
			dblCreditForwardConvexityAdjustedCleanDV01);

		mapResult.put ("CreditForwardConvexityAdjustedCleanPV", dblCreditForwardConvexityAdjustedCleanPV);

		mapResult.put ("CreditForwardConvexityAdjustedDirtyDV01",
			dblCreditForwardConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditForwardConvexityAdjustedDirtyPV", dblCreditForwardConvexityAdjustedDirtyPV);

		mapResult.put ("CreditForwardConvexityAdjustedDV01", dblCreditForwardConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditForwardConvexityAdjustedFairPremium",
			dblCreditForwardConvexityAdjustedFairPremium);

		mapResult.put ("CreditForwardConvexityAdjustedParRate",
			dblCreditForwardConvexityAdjustedFairPremium);

		mapResult.put ("CreditForwardConvexityAdjustedPV", dblCreditForwardConvexityAdjustedCleanPV);

		mapResult.put ("CreditForwardConvexityAdjustedRate", dblCreditForwardConvexityAdjustedFairPremium);

		mapResult.put ("CreditForwardConvexityAdjustedUpfront", dblCreditForwardConvexityAdjustedCleanPV);

		mapResult.put ("CreditForwardConvexityAdjustmentFactor", dblCreditForwardConvexityAdjustedDirtyDV01
			/ dblUnadjustedDirtyDV01);

		mapResult.put ("CreditForwardConvexityAdjustmentPremium", dblCreditForwardConvexityAdjustedCleanPV
			- dblUnadjustedCleanPV);

		mapResult.put ("CreditForwardConvexityAdjustmentPremiumUpfront",
			(dblCreditForwardConvexityAdjustedCleanPV - dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("CreditFundingConvexityAdjustedCleanDV01",
			dblCreditFundingConvexityAdjustedCleanDV01);

		mapResult.put ("CreditFundingConvexityAdjustedCleanPV", dblCreditFundingConvexityAdjustedCleanPV);

		mapResult.put ("CreditFundingConvexityAdjustedDirtyDV01",
			dblCreditFundingConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditFundingConvexityAdjustedDirtyPV", dblCreditFundingConvexityAdjustedDirtyPV);

		mapResult.put ("CreditFundingConvexityAdjustedDV01", dblCreditFundingConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditFundingConvexityAdjustedFairPremium",
			dblCreditFundingConvexityAdjustedFairPremium);

		mapResult.put ("CreditFundingConvexityAdjustedParRate",
			dblCreditFundingConvexityAdjustedFairPremium);

		mapResult.put ("CreditFundingConvexityAdjustedPV", dblCreditFundingConvexityAdjustedCleanPV);

		mapResult.put ("CreditFundingConvexityAdjustedRate", dblCreditFundingConvexityAdjustedFairPremium);

		mapResult.put ("CreditFundingConvexityAdjustedUpfront", dblCreditFundingConvexityAdjustedCleanPV);

		mapResult.put ("CreditFundingConvexityAdjustmentFactor", dblCreditFundingConvexityAdjustedDirtyDV01
			/ dblUnadjustedDirtyDV01);

		mapResult.put ("CreditFundingConvexityAdjustmentPremium", dblCreditFundingConvexityAdjustedCleanPV
			- dblUnadjustedCleanPV);

		mapResult.put ("CreditFundingConvexityAdjustmentPremiumUpfront",
			(dblCreditFundingConvexityAdjustedCleanPV - dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("CreditFXConvexityAdjustedCleanDV01", dblCreditFXConvexityAdjustedCleanDV01);

		mapResult.put ("CreditFXConvexityAdjustedCleanPV", dblCreditFXConvexityAdjustedCleanPV);

		mapResult.put ("CreditFXConvexityAdjustedDirtyDV01", dblCreditFXConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditFXConvexityAdjustedDirtyPV", dblCreditFXConvexityAdjustedDirtyPV);

		mapResult.put ("CreditFXConvexityAdjustedDV01", dblCreditFXConvexityAdjustedDirtyDV01);

		mapResult.put ("CreditFXConvexityAdjustedFairPremium", dblCreditFXConvexityAdjustedFairPremium);

		mapResult.put ("CreditFXConvexityAdjustedParRate", dblCreditFXConvexityAdjustedFairPremium);

		mapResult.put ("CreditFXConvexityAdjustedPV", dblCreditFXConvexityAdjustedCleanPV);

		mapResult.put ("CreditFXConvexityAdjustedRate", dblCreditFXConvexityAdjustedFairPremium);

		mapResult.put ("CreditFXConvexityAdjustedUpfront", dblCreditFXConvexityAdjustedCleanPV);

		mapResult.put ("CreditFXConvexityAdjustmentFactor", dblCreditFXConvexityAdjustedDirtyDV01 /
			dblUnadjustedDirtyDV01);

		mapResult.put ("CreditFXConvexityAdjustmentPremium", dblCreditFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV);

		mapResult.put ("CreditFXConvexityAdjustmentPremiumUpfront", (dblCreditFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("CumulativeConvexityAdjustedCleanDV01", dblCumulativeConvexityAdjustedCleanDV01);

		mapResult.put ("CumulativeConvexityAdjustedCleanPV", dblCumulativeConvexityAdjustedCleanPV);

		mapResult.put ("CumulativeConvexityAdjustedDirtyDV01", dblCumulativeConvexityAdjustedDirtyDV01);

		mapResult.put ("CumulativeConvexityAdjustedDirtyPV", dblCumulativeConvexityAdjustedDirtyPV);

		mapResult.put ("CumulativeConvexityAdjustedDV01", dblCumulativeConvexityAdjustedDirtyDV01);

		mapResult.put ("CumulativeConvexityAdjustedFairPremium", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("CumulativeConvexityAdjustedParRate", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("CumulativeConvexityAdjustedPV", dblCumulativeConvexityAdjustedCleanPV);

		mapResult.put ("CumulativeConvexityAdjustedRate", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("CumulativeConvexityAdjustedUpfront", dblCumulativeConvexityAdjustedCleanPV);

		mapResult.put ("CumulativeConvexityAdjustmentFactor", dblCumulativeConvexityAdjustedDirtyDV01 /
			dblUnadjustedDirtyDV01);

		mapResult.put ("CumulativeConvexityAdjustmentPremium", dblCumulativeConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV);

		mapResult.put ("CumulativeConvexityAdjustmentPremiumUpfront", (dblCumulativeConvexityAdjustedCleanPV
			- dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("CumulativeCouponAmount", dblCumulativeCouponAmount);

		mapResult.put ("CumulativeCouponDCF", dblCumulativeCouponDCF);

		mapResult.put ("CV01", dblCumulativeConvexityAdjustedCleanDV01);

		mapResult.put ("DirtyDV01", dblCumulativeConvexityAdjustedDirtyDV01);

		mapResult.put ("DirtyPV", dblCumulativeConvexityAdjustedDirtyPV);

		mapResult.put ("DV01", dblCumulativeConvexityAdjustedCleanDV01);

		mapResult.put ("FairPremium", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("Fixing01", dblAccrued01);

		mapResult.put ("ForwardFundingConvexityAdjustedCleanDV01",
			dblForwardFundingConvexityAdjustedCleanDV01);

		mapResult.put ("ForwardFundingConvexityAdjustedCleanPV", dblForwardFundingConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFundingConvexityAdjustedDirtyDV01",
			dblForwardFundingConvexityAdjustedDirtyDV01);

		mapResult.put ("ForwardFundingConvexityAdjustedDirtyPV", dblForwardFundingConvexityAdjustedDirtyPV);

		mapResult.put ("ForwardFundingConvexityAdjustedDV01", dblForwardFundingConvexityAdjustedDirtyDV01);

		mapResult.put ("ForwardFundingConvexityAdjustedFairPremium",
			dblForwardFundingConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFundingConvexityAdjustedParRate",
			dblForwardFundingConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFundingConvexityAdjustedPV", dblForwardFundingConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFundingConvexityAdjustedRate", dblForwardFundingConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFundingConvexityAdjustedUpfront", dblForwardFundingConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFundingConvexityAdjustmentFactor", dblForwardFundingConvexityAdjustedDirtyDV01
			/ dblUnadjustedDirtyDV01);

		mapResult.put ("ForwardFundingConvexityAdjustmentPremium", dblForwardFundingConvexityAdjustedCleanPV
			- dblUnadjustedCleanPV);

		mapResult.put ("ForwardFundingConvexityAdjustmentPremiumUpfront",
			(dblForwardFundingConvexityAdjustedCleanPV - dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("ForwardFXConvexityAdjustedCleanDV01", dblForwardFXConvexityAdjustedCleanDV01);

		mapResult.put ("ForwardFXConvexityAdjustedCleanPV", dblForwardFXConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFXConvexityAdjustedDirtyDV01", dblForwardFXConvexityAdjustedDirtyDV01);

		mapResult.put ("ForwardFXConvexityAdjustedDirtyPV", dblForwardFXConvexityAdjustedDirtyPV);

		mapResult.put ("ForwardFXConvexityAdjustedDV01", dblForwardFXConvexityAdjustedDirtyDV01);

		mapResult.put ("ForwardFXConvexityAdjustedFairPremium", dblForwardFXConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFXConvexityAdjustedParRate", dblForwardFXConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFXConvexityAdjustedPV", dblForwardFXConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFXConvexityAdjustedRate", dblForwardFXConvexityAdjustedFairPremium);

		mapResult.put ("ForwardFXConvexityAdjustedUpfront", dblForwardFXConvexityAdjustedCleanPV);

		mapResult.put ("ForwardFXConvexityAdjustmentFactor", dblForwardFXConvexityAdjustedDirtyDV01 /
			dblUnadjustedDirtyDV01);

		mapResult.put ("ForwardFXConvexityAdjustmentPremium", dblForwardFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV);

		mapResult.put ("ForwardFXConvexityAdjustmentPremiumUpfront", (dblForwardFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("FundingFXConvexityAdjustedCleanDV01", dblFundingFXConvexityAdjustedCleanDV01);

		mapResult.put ("FundingFXConvexityAdjustedCleanPV", dblFundingFXConvexityAdjustedCleanPV);

		mapResult.put ("FundingFXConvexityAdjustedDirtyDV01", dblFundingFXConvexityAdjustedDirtyDV01);

		mapResult.put ("FundingFXConvexityAdjustedDirtyPV", dblFundingFXConvexityAdjustedDirtyPV);

		mapResult.put ("FundingFXConvexityAdjustedDV01", dblFundingFXConvexityAdjustedDirtyDV01);

		mapResult.put ("FundingFXConvexityAdjustedFairPremium", dblFundingFXConvexityAdjustedFairPremium);

		mapResult.put ("FundingFXConvexityAdjustedParRate", dblFundingFXConvexityAdjustedFairPremium);

		mapResult.put ("FundingFXConvexityAdjustedPV", dblFundingFXConvexityAdjustedCleanPV);

		mapResult.put ("FundingFXConvexityAdjustedRate", dblFundingFXConvexityAdjustedFairPremium);

		mapResult.put ("FundingFXConvexityAdjustedUpfront", dblFundingFXConvexityAdjustedCleanPV);

		mapResult.put ("FundingFXConvexityAdjustmentFactor", dblFundingFXConvexityAdjustedDirtyDV01 /
			dblUnadjustedDirtyDV01);

		mapResult.put ("FundingFXConvexityAdjustmentPremium", dblFundingFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV);

		mapResult.put ("FundingFXConvexityAdjustmentPremiumUpfront", (dblFundingFXConvexityAdjustedCleanPV -
			dblUnadjustedCleanPV) / dblFXAdjustedValueNotional);

		mapResult.put ("ParRate", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("PV", dblCumulativeConvexityAdjustedCleanPV);

		mapResult.put ("Rate", dblCumulativeConvexityAdjustedFairPremium);

		mapResult.put ("ResetDate", (double) iResetDate);

		mapResult.put ("ResetRate", dblAccrualCoupon - basis());

		mapResult.put ("TotalCoupon", dblTotalCoupon);

		mapResult.put ("UnadjustedCleanDV01", dblUnadjustedCleanDV01);

		mapResult.put ("UnadjustedCleanPV", dblUnadjustedCleanPV);

		mapResult.put ("UnadjustedDirtyDV01", dblUnadjustedDirtyDV01);

		mapResult.put ("UnadjustedDirtyPV", dblUnadjustedDirtyPV);

		mapResult.put ("UnadjustedFairPremium", dblUnadjustedFairPremium);

		mapResult.put ("UnadjustedParRate", dblUnadjustedFairPremium);

		mapResult.put ("UnadjustedPV", dblUnadjustedCleanPV);

		mapResult.put ("UnadjustedRate", dblUnadjustedFairPremium);

		mapResult.put ("UnadjustedUpfront", dblUnadjustedCleanPV);

		mapResult.put ("Upfront", dblCumulativeConvexityAdjustedCleanPV);

		double dblCompoundingAdjustedCleanPrice = 100. * (1. + (dblCompoundingAdjustedCleanPV /
			dblFXAdjustedValueNotional));
		double dblCreditForwardConvexityAdjustedCleanPrice = 100. * (1. +
			(dblCreditForwardConvexityAdjustedCleanPV / dblFXAdjustedValueNotional));
		double dblCreditFundingConvexityAdjustedCleanPrice = 100. * (1. +
			(dblCreditFundingConvexityAdjustedCleanPV / dblFXAdjustedValueNotional));
		double dblCreditFXConvexityAdjustedCleanPrice = 100. * (1. + (dblCreditFXConvexityAdjustedCleanPV
			/ dblFXAdjustedValueNotional));
		double dblCumulativeConvexityAdjustedCleanPrice = 100. * (1. + (dblCumulativeConvexityAdjustedCleanPV
			/ dblFXAdjustedValueNotional));
		double dblForwardFundingConvexityAdjustedCleanPrice = 100. * (1. +
			(dblForwardFundingConvexityAdjustedCleanPV / dblFXAdjustedValueNotional));
		double dblForwardFXConvexityAdjustedCleanPrice = 100. * (1. + (dblForwardFXConvexityAdjustedCleanPV /
			dblFXAdjustedValueNotional));
		double dblFundingFXConvexityAdjustedCleanPrice = 100. * (1. + (dblFundingFXConvexityAdjustedCleanPV /
			dblFXAdjustedValueNotional));
		double dblUnadjustedCleanPrice = 100. * (1. + (dblUnadjustedCleanPV / dblFXAdjustedValueNotional));

		mapResult.put ("CleanPrice", dblCumulativeConvexityAdjustedCleanPrice);

		mapResult.put ("CompoundingAdjustedCleanPrice", dblCompoundingAdjustedCleanPrice);

		mapResult.put ("CompoundingAdjustedDirtyPrice", 100. * (1. + (dblCompoundingAdjustedDirtyPV /
			dblFXAdjustedValueNotional)));

		mapResult.put ("CompoundingAdjustedPrice", dblCompoundingAdjustedCleanPrice);

		mapResult.put ("CreditForwardConvexityAdjustedCleanPrice",
			dblCreditForwardConvexityAdjustedCleanPrice);

		mapResult.put ("CreditForwardConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblCreditForwardConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("CreditForwardConvexityAdjustedPrice", dblCreditForwardConvexityAdjustedCleanPrice);

		mapResult.put ("CreditFundingConvexityAdjustedCleanPrice",
			dblCreditFundingConvexityAdjustedCleanPrice);

		mapResult.put ("CreditFundingConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblCreditFundingConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("CreditFundingConvexityAdjustedPrice", dblCreditFundingConvexityAdjustedCleanPrice);

		mapResult.put ("CreditFXConvexityAdjustedCleanPrice", dblCreditFXConvexityAdjustedCleanPrice);

		mapResult.put ("CreditFXConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblCreditFXConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("CreditFXConvexityAdjustedPrice", dblCreditFXConvexityAdjustedCleanPrice);

		mapResult.put ("CumulativeConvexityAdjustedCleanPrice", dblCumulativeConvexityAdjustedCleanPrice);

		mapResult.put ("CumulativeConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblCumulativeConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("CumulativeConvexityAdjustedPrice", dblCumulativeConvexityAdjustedCleanPrice);

		mapResult.put ("DirtyPrice", 100. * (1. + (dblCumulativeConvexityAdjustedDirtyPV /
			dblFXAdjustedValueNotional)));

		mapResult.put ("ForwardFundingConvexityAdjustedCleanPrice",
			dblForwardFundingConvexityAdjustedCleanPrice);

		mapResult.put ("ForwardFundingConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblForwardFundingConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("ForwardFundingConvexityAdjustedPrice", dblForwardFundingConvexityAdjustedCleanPrice);

		mapResult.put ("ForwardFXConvexityAdjustedCleanPrice", dblForwardFXConvexityAdjustedCleanPrice);

		mapResult.put ("ForwardFXConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblForwardFXConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("ForwardFXConvexityAdjustedPrice", dblForwardFXConvexityAdjustedCleanPrice);

		mapResult.put ("FundingFXConvexityAdjustedCleanPrice", dblFundingFXConvexityAdjustedCleanPrice);

		mapResult.put ("FundingFXConvexityAdjustedDirtyPrice", 100. * (1. +
			(dblFundingFXConvexityAdjustedDirtyPV / dblFXAdjustedValueNotional)));

		mapResult.put ("FundingFXConvexityAdjustedPrice", dblFundingFXConvexityAdjustedCleanPrice);

		mapResult.put ("Price", dblCumulativeConvexityAdjustedCleanPrice);

		mapResult.put ("UnadjustedCleanPrice", dblUnadjustedCleanPrice);

		mapResult.put ("UnadjustedDirtyPrice", 100. * (1. + (dblUnadjustedDirtyPV /
			dblFXAdjustedValueNotional)));

		mapResult.put ("UnadjustedPrice", dblUnadjustedCleanPrice);

		mapResult.put ("CalcTime", (System.nanoTime() - lStart) * 1.e-09);

		return mapResult;
	}

	/**
	 * Retrieve the set of the implemented measures
	 * 
	 * @return The set of the implemented measures
	 */

	public java.util.Set<java.lang.String> availableMeasures()
	{
		java.util.Set<java.lang.String> setstrMeasures = new java.util.TreeSet<java.lang.String>();

		setstrMeasures.add ("AccrualCoupon");

		setstrMeasures.add ("Accrued");

		setstrMeasures.add ("Accrued01");

		setstrMeasures.add ("CleanDV01");

		setstrMeasures.add ("CleanPV");

		setstrMeasures.add ("CompoundingAdjustedCleanDV01");

		setstrMeasures.add ("CompoundingAdjustedCleanPV");

		setstrMeasures.add ("CompoundingAdjustedDirtyDV01");

		setstrMeasures.add ("CompoundingAdjustedDirtyPV");

		setstrMeasures.add ("CompoundingAdjustedFairPremium");

		setstrMeasures.add ("CompoundingAdjustedParRate");

		setstrMeasures.add ("CompoundingAdjustedPV");

		setstrMeasures.add ("CompoundingAdjustedRate");

		setstrMeasures.add ("CompoundingAdjustedUpfront");

		setstrMeasures.add ("CompoundingAdjustmentFactor");

		setstrMeasures.add ("CompoundingAdjustmentPremium");

		setstrMeasures.add ("CompoundingAdjustmentPremiumUpfront");

		setstrMeasures.add ("CreditForwardConvexityAdjustedCleanDV01");

		setstrMeasures.add ("CreditForwardConvexityAdjustedCleanPV");

		setstrMeasures.add ("CreditForwardConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("CreditForwardConvexityAdjustedDirtyPV");

		setstrMeasures.add ("CreditForwardConvexityAdjustedDV01");

		setstrMeasures.add ("CreditForwardConvexityAdjustedFairPremium");

		setstrMeasures.add ("CreditForwardConvexityAdjustedParRate");

		setstrMeasures.add ("CreditForwardConvexityAdjustedPV");

		setstrMeasures.add ("CreditForwardConvexityAdjustedRate");

		setstrMeasures.add ("CreditForwardConvexityAdjustedUpfront");

		setstrMeasures.add ("CreditForwardConvexityAdjustmentFactor");

		setstrMeasures.add ("CreditForwardConvexityAdjustmentPremium");

		setstrMeasures.add ("CreditForwardConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("CreditFundingConvexityAdjustedCleanDV01");

		setstrMeasures.add ("CreditFundingConvexityAdjustedCleanPV");

		setstrMeasures.add ("CreditFundingConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("CreditFundingConvexityAdjustedDirtyPV");

		setstrMeasures.add ("CreditFundingConvexityAdjustedDV01");

		setstrMeasures.add ("CreditFundingConvexityAdjustedFairPremium");

		setstrMeasures.add ("CreditFundingConvexityAdjustedParRate");

		setstrMeasures.add ("CreditFundingConvexityAdjustedPV");

		setstrMeasures.add ("CreditFundingConvexityAdjustedRate");

		setstrMeasures.add ("CreditFundingConvexityAdjustedUpfront");

		setstrMeasures.add ("CreditFundingConvexityAdjustmentFactor");

		setstrMeasures.add ("CreditFundingConvexityAdjustmentPremium");

		setstrMeasures.add ("CreditFundingConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("CreditFXConvexityAdjustedCleanDV01");

		setstrMeasures.add ("CreditFXConvexityAdjustedCleanPV");

		setstrMeasures.add ("CreditFXConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("CreditFXConvexityAdjustedDirtyPV");

		setstrMeasures.add ("CreditFXConvexityAdjustedDV01");

		setstrMeasures.add ("CreditFXConvexityAdjustedFairPremium");

		setstrMeasures.add ("CreditFXConvexityAdjustedParRate");

		setstrMeasures.add ("CreditFXConvexityAdjustedPV");

		setstrMeasures.add ("CreditFXConvexityAdjustedRate");

		setstrMeasures.add ("CreditFXConvexityAdjustedUpfront");

		setstrMeasures.add ("CreditFXConvexityAdjustmentFactor");

		setstrMeasures.add ("CreditFXConvexityAdjustmentPremium");

		setstrMeasures.add ("CreditFXConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("CumulativeConvexityAdjustedCleanDV01");

		setstrMeasures.add ("CumulativeConvexityAdjustedCleanPV");

		setstrMeasures.add ("CumulativeConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("CumulativeConvexityAdjustedDirtyPV");

		setstrMeasures.add ("CumulativeConvexityAdjustedDV01");

		setstrMeasures.add ("CumulativeConvexityAdjustedFairPremium");

		setstrMeasures.add ("CumulativeConvexityAdjustedParRate");

		setstrMeasures.add ("CumulativeConvexityAdjustedPV");

		setstrMeasures.add ("CumulativeConvexityAdjustedRate");

		setstrMeasures.add ("CumulativeConvexityAdjustedUpfront");

		setstrMeasures.add ("CumulativeConvexityAdjustmentFactor");

		setstrMeasures.add ("CumulativeConvexityAdjustmentPremium");

		setstrMeasures.add ("CumulativeConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("CumulativeCouponAmount");

		setstrMeasures.add ("CV01");

		setstrMeasures.add ("DirtyDV01");

		setstrMeasures.add ("DirtyPV");

		setstrMeasures.add ("DV01");

		setstrMeasures.add ("FairPremium");

		setstrMeasures.add ("Fixing01");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedCleanDV01");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedCleanPV");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedDirtyPV");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedDV01");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedFairPremium");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedParRate");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedPV");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedRate");

		setstrMeasures.add ("ForwardFundingConvexityAdjustedUpfront");

		setstrMeasures.add ("ForwardFundingConvexityAdjustmentFactor");

		setstrMeasures.add ("ForwardFundingConvexityAdjustmentPremium");

		setstrMeasures.add ("ForwardFundingConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("ForwardFXConvexityAdjustedCleanDV01");

		setstrMeasures.add ("ForwardFXConvexityAdjustedCleanPV");

		setstrMeasures.add ("ForwardFXConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("ForwardFXConvexityAdjustedDirtyPV");

		setstrMeasures.add ("ForwardFXConvexityAdjustedDV01");

		setstrMeasures.add ("ForwardFXConvexityAdjustedFairPremium");

		setstrMeasures.add ("ForwardFXConvexityAdjustedParRate");

		setstrMeasures.add ("ForwardFXConvexityAdjustedPV");

		setstrMeasures.add ("ForwardFXConvexityAdjustedRate");

		setstrMeasures.add ("ForwardFXConvexityAdjustedUpfront");

		setstrMeasures.add ("ForwardFXConvexityAdjustmentFactor");

		setstrMeasures.add ("ForwardFXConvexityAdjustmentPremium");

		setstrMeasures.add ("ForwardFXConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("FundingFXConvexityAdjustedCleanDV01");

		setstrMeasures.add ("FundingFXConvexityAdjustedCleanPV");

		setstrMeasures.add ("FundingFXConvexityAdjustedDirtyDV01");

		setstrMeasures.add ("FundingFXConvexityAdjustedDirtyPV");

		setstrMeasures.add ("FundingFXConvexityAdjustedDV01");

		setstrMeasures.add ("FundingFXConvexityAdjustedFairPremium");

		setstrMeasures.add ("FundingFXConvexityAdjustedParRate");

		setstrMeasures.add ("FundingFXConvexityAdjustedPV");

		setstrMeasures.add ("FundingFXConvexityAdjustedRate");

		setstrMeasures.add ("FundingFXConvexityAdjustedUpfront");

		setstrMeasures.add ("FundingFXConvexityAdjustmentFactor");

		setstrMeasures.add ("FundingFXConvexityAdjustmentPremium");

		setstrMeasures.add ("FundingFXConvexityAdjustmentPremiumUpfront");

		setstrMeasures.add ("ParRate");

		setstrMeasures.add ("PV");

		setstrMeasures.add ("Rate");

		setstrMeasures.add ("ResetDate");

		setstrMeasures.add ("ResetRate");

		setstrMeasures.add ("TotalCoupon");

		setstrMeasures.add ("UnadjustedCleanDV01");

		setstrMeasures.add ("UnadjustedCleanPV");

		setstrMeasures.add ("UnadjustedDirtyDV01");

		setstrMeasures.add ("UnadjustedDirtyPV");

		setstrMeasures.add ("UnadjustedFairPremium");

		setstrMeasures.add ("UnadjustedParRate");

		setstrMeasures.add ("UnadjustedPV");

		setstrMeasures.add ("UnadjustedRate");

		setstrMeasures.add ("UnadjustedUpfront");

		setstrMeasures.add ("Upfront");

		return setstrMeasures;
	}

	/**
	 * Compute the PV for the specified Market Parameters
	 * 
	 * @param valParams ValuationParams
	 * @param pricerParams PricerParams
	 * @param csqc Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * 
	 * @return The PV
	 * 
	 * @throws java.lang.Exception Thrown if the PV cannot be computed
	 */

	public double pv (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqc,
		final org.drip.param.valuation.ValuationCustomizationParams vcp)
		throws java.lang.Exception
	{
		if (null == valParams || null == csqc)
			throw new java.lang.Exception ("Stream::pv => Invalid Inputs");

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

		if (null == dcFunding) throw new java.lang.Exception ("Stream::pv => Invalid Inputs");

		int iValueDate = valParams.valueDate();

		double dblCumulativeConvexityAdjustedDirtyPV = 0.;

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

			if (iPeriodPayDate < iValueDate) continue;

			org.drip.analytics.output.CompositePeriodCouponMetrics cpcm = period.couponMetrics (iValueDate,
				csqc);

			if (null == cpcm) throw new java.lang.Exception ("Stream::pv => Invalid Inputs");

			int iPeriodEndDate = period.endDate();

			dblCumulativeConvexityAdjustedDirtyPV += cpcm.dcf() * period.notional (iPeriodEndDate) *
				period.couponFactor (iPeriodEndDate) * period.fx (csqc) * period.survival (csqc) *
					period.df (csqc) * cpcm.cumulative() * cpcm.rate();
		}

		return dblCumulativeConvexityAdjustedDirtyPV / dcFunding.df (iValueDate);
	}

	/**
	 * Generate the State Loading Constraints for the Forward Latent State
	 * 
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs The Product Calibration Quote Set
	 * 
	 * @return The State Loading Constraints for the Forward Latent State
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint forwardPRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		if (null == valParams || null == pqs) return null;

		org.drip.state.identifier.FloaterLabel floaterLabel = floaterLabel();

		org.drip.state.identifier.ForwardLabel forwardLabel = null != floaterLabel && floaterLabel instanceof
			org.drip.state.identifier.ForwardLabel ? (org.drip.state.identifier.ForwardLabel) floaterLabel :
				null;

		if ((null != forwardLabel && !(pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet)) ||
			(null == forwardLabel && !(pqs instanceof org.drip.product.calib.FixedStreamQuoteSet)))
			return null;

		int iValueDate = valParams.valueDate();

		if (iValueDate >= maturity().julian()) return null;

		double dblCleanPV = 0.;

		try {
			if (pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet) {
				org.drip.product.calib.FloatingStreamQuoteSet fsqs =
					(org.drip.product.calib.FloatingStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			} else if (pqs instanceof org.drip.product.calib.FixedStreamQuoteSet) {
				org.drip.product.calib.FixedStreamQuoteSet fsqs =
					(org.drip.product.calib.FixedStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			}
		} catch (java.lang.Exception e) {
			e.printStackTrace();

			return null;
		}

		org.drip.state.estimator.PredictorResponseWeightConstraint prwc = new
			org.drip.state.estimator.PredictorResponseWeightConstraint();

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			int iPeriodEndDate = period.endDate();

			if (iPeriodEndDate < iValueDate) continue;

			org.drip.state.estimator.PredictorResponseWeightConstraint prwcPeriod = period.forwardPRWC
				(iValueDate, csqs, pqs);

			if (null == prwcPeriod || !prwc.absorb (prwcPeriod)) return null;
		}

		if (!prwc.updateValue (dblCleanPV)) return null;

		if (!prwc.updateDValueDManifestMeasure ("PV", 1.)) return null;

		return prwc;
	}

	/**
	 * Generate the State Loading Constraints for the Funding Latent State
	 * 
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs The Product Calibration Quote Set
	 * 
	 * @return The State Loading Constraints for the Funding Latent State
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint fundingPRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		if (null == valParams || null == pqs) return null;

		org.drip.state.identifier.ForwardLabel forwardLabel = forwardLabel();

		if ((null != forwardLabel && !(pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet)) ||
			(null == forwardLabel && !(pqs instanceof org.drip.product.calib.FixedStreamQuoteSet)))
			return null;

		int iValueDate = valParams.valueDate();

		if (iValueDate >= maturity().julian()) return null;

		double dblCleanPV = 0.;

		try {
			if (pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet) {
				org.drip.product.calib.FloatingStreamQuoteSet fsqs =
					(org.drip.product.calib.FloatingStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			} else if (pqs instanceof org.drip.product.calib.FixedStreamQuoteSet) {
				org.drip.product.calib.FixedStreamQuoteSet fsqs =
					(org.drip.product.calib.FixedStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			}
		} catch (java.lang.Exception e) {
			e.printStackTrace();

			return null;
		}

		org.drip.state.estimator.PredictorResponseWeightConstraint prwc = new
			org.drip.state.estimator.PredictorResponseWeightConstraint();

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			int iPeriodEndDate = period.endDate();

			if (iPeriodEndDate < iValueDate) continue;

			org.drip.state.estimator.PredictorResponseWeightConstraint prwcPeriod = period.fundingPRWC
				(iValueDate, csqs, pqs);

			if (null == prwcPeriod || !prwc.absorb (prwcPeriod)) return null;
		}

		if (!prwc.updateValue (dblCleanPV)) return null;

		if (!prwc.updateDValueDManifestMeasure ("PV", 1.)) return null;

		return prwc;
	}

	/**
	 * Generate the State Loading Constraints for the Merged Forward/Funding Latent State
	 * 
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs The Product Calibration Quote Set
	 * 
	 * @return The State Loading Constraints for the Merged Forward/Funding Latent State
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint fundingForwardPRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		if (null == valParams || null == pqs) return null;

		org.drip.state.identifier.ForwardLabel forwardLabel = forwardLabel();

		if ((null != forwardLabel && !(pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet)) ||
			(null == forwardLabel && !(pqs instanceof org.drip.product.calib.FixedStreamQuoteSet)))
			return null;

		int iValueDate = valParams.valueDate();

		if (iValueDate >= maturity().julian()) return null;

		double dblCleanPV = 0.;

		try {
			if (pqs instanceof org.drip.product.calib.FloatingStreamQuoteSet) {
				org.drip.product.calib.FloatingStreamQuoteSet fsqs =
					(org.drip.product.calib.FloatingStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			} else if (pqs instanceof org.drip.product.calib.FixedStreamQuoteSet) {
				org.drip.product.calib.FixedStreamQuoteSet fsqs =
					(org.drip.product.calib.FixedStreamQuoteSet) pqs;

				if (fsqs.containsPV()) dblCleanPV = fsqs.pv();
			}
		} catch (java.lang.Exception e) {
			e.printStackTrace();

			return null;
		}

		org.drip.state.estimator.PredictorResponseWeightConstraint prwc = new
			org.drip.state.estimator.PredictorResponseWeightConstraint();

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			int iPeriodEndDate = period.endDate();

			if (iPeriodEndDate < iValueDate) continue;

			org.drip.state.estimator.PredictorResponseWeightConstraint prwcPeriod = period.forwardFundingPRWC
				(iValueDate, csqs, pqs);

			if (null == prwcPeriod || !prwc.absorb (prwcPeriod)) return null;
		}

		if (!prwc.updateValue (dblCleanPV)) return null;

		if (!prwc.updateDValueDManifestMeasure ("PV", 1.)) return null;

		return prwc;
	}

	/**
	 * Generate the Calibratable Linearized Predictor/Response Constraint Weights for the Non-merged FX Curve
	 *  FX Forward Latent State from the Component's Cash Flows. The Constraints here typically correspond to
	 *  Date/Cash Flow pairs and the corresponding leading PV.
	 * 
	 * @param valParams Valuation Parameters
	 * @param pricerParams Pricer Parameters
	 * @param csqs Component Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs Product Quote Set
	 * 
	 * @return The Calibratable Linearized Predictor/Response Constraints (Date/Cash Flow pairs and the
	 * 	corresponding FX Forward)
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint fxPRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		if (null == valParams) return null;

		int iValueDate = valParams.valueDate();

		org.drip.state.estimator.PredictorResponseWeightConstraint prwc = new
			org.drip.state.estimator.PredictorResponseWeightConstraint();

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			int iPeriodEndDate = period.endDate();

			if (iPeriodEndDate < iValueDate) continue;

			org.drip.state.estimator.PredictorResponseWeightConstraint prwcPeriod = period.fxPRWC
				(iValueDate, csqs, pqs);

			if (null == prwcPeriod || !prwc.absorb (prwcPeriod)) return null;
		}

		return prwc;
	}

	/**
	 * Generate the Calibratable Linearized Predictor/Response Constraint Weights for the Non-merged Govvie
	 * 	Curve Yield Latent State from the Component's Cash Flows. The Constraints here typically correspond
	 *  to Date/Cash Flow pairs and the corresponding leading PV.
	 * 
	 * @param valParams Valuation Parameters
	 * @param pricerParams Pricer Parameters
	 * @param csqs Component Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs Product Quote Set
	 * 
	 * @return The Calibratable Linearized Predictor/Response Constraints (Date/Cash Flow pairs and the
	 * 	corresponding Yield)
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint govviePRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		return null;
	}

	/**
	 * Generate the Calibratable Linearized Predictor/Response Constraint Weights for the Non-merged
	 *  Volatility Curve Volatility Latent State from the Component's Cash Flows. The Constraints here
	 *  typically correspond tovDate/Cash Flow pairs and the corresponding leading PV.
	 * 
	 * @param valParams Valuation Parameters
	 * @param pricerParams Pricer Parameters
	 * @param csqs Component Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * @param pqs Product Quote Set
	 * 
	 * @return The Calibratable Linearized Predictor/Response Constraints (Date/Cash Flow pairs and the
	 * 	corresponding Volatility)
	 */

	public org.drip.state.estimator.PredictorResponseWeightConstraint volatilityPRWC (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp,
		final org.drip.product.calib.ProductQuoteSet pqs)
	{
		if (null == valParams) return null;

		int iValueDate = valParams.valueDate();

		org.drip.state.estimator.PredictorResponseWeightConstraint prwc = new
			org.drip.state.estimator.PredictorResponseWeightConstraint();

		for (org.drip.analytics.cashflow.CompositePeriod period : _lsPeriod) {
			int iPeriodEndDate = period.endDate();

			if (iPeriodEndDate < iValueDate) continue;

			org.drip.state.estimator.PredictorResponseWeightConstraint prwcPeriod = period.volatilityPRWC
				(iValueDate, csqs, pqs);

			if (null == prwcPeriod || !prwc.absorb (prwcPeriod)) return null;
		}

		return prwc;
	}

	/**
	 * Generate the Jacobian of the Dirty PV to the Manifest Measure
	 * 
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * 
	 * @return The Jacobian of the Dirty PV to the Manifest Measure
	 */

	public org.drip.numerical.differentiation.WengertJacobian jackDDirtyPVDManifestMeasure (
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp)
	{
		if (null == valParams || valParams.valueDate() >= maturity().julian() || null == csqs) return null;

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

		if (null == dcFunding) return null;

		try {
			org.drip.numerical.differentiation.WengertJacobian jackDDirtyPVDManifestMeasure = null;

			for (org.drip.analytics.cashflow.CompositePeriod p : _lsPeriod) {
				int iPeriodPayDate = p.payDate();

				if (p.startDate() < valParams.valueDate()) continue;

				org.drip.numerical.differentiation.WengertJacobian jackDDFDManifestMeasure =
					dcFunding.jackDDFDManifestMeasure (iPeriodPayDate, "PV");

				if (null == jackDDFDManifestMeasure) continue;

				int iNumQuote = jackDDFDManifestMeasure.numParameters();

				if (0 == iNumQuote) continue;

				if (null == jackDDirtyPVDManifestMeasure)
					jackDDirtyPVDManifestMeasure = new org.drip.numerical.differentiation.WengertJacobian (1,
						iNumQuote);

				double dblPeriodNotional = p.notional (p.startDate(), p.endDate()) * p.fx (csqs);

				double dblPeriodDCF = p.couponMetrics (valParams.valueDate(), csqs).dcf();

				for (int k = 0; k < iNumQuote; ++k) {
					if (!jackDDirtyPVDManifestMeasure.accumulatePartialFirstDerivative (0, k,
						dblPeriodNotional * dblPeriodDCF * jackDDFDManifestMeasure.firstDerivative (0, k)))
						return null;
				}
			}

			return jackDDirtyPVDManifestMeasure;
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * Generate the micro-Jacobian of the Manifest Measure to the Discount Factor
	 * 
	 * @param strManifestMeasure The Manifest Measure
	 * @param valParams The Valuation Parameters
	 * @param pricerParams The Pricer parameters
	 * @param csqs The Market Parameters
	 * @param vcp Valuation Customization Parameters
	 * 
	 * @return The micro-Jacobian of the Manifest Measure to the Discount Factor
	 */

	public org.drip.numerical.differentiation.WengertJacobian manifestMeasureDFMicroJack (
		final java.lang.String strManifestMeasure,
		final org.drip.param.valuation.ValuationParams valParams,
		final org.drip.param.pricer.CreditPricerParams pricerParams,
		final org.drip.param.market.CurveSurfaceQuoteContainer csqs,
		final org.drip.param.valuation.ValuationCustomizationParams vcp)
	{
		if (null == valParams || valParams.valueDate() >= _lsPeriod.get (_lsPeriod.size() - 1).endDate() ||
			null == strManifestMeasure)
			return null;

		org.drip.state.discount.MergedDiscountForwardCurve dcFunding = csqs.fundingState
			(org.drip.state.identifier.FundingLabel.Standard (payCurrency()));

		if (null == dcFunding) return null;

		if ("Rate".equalsIgnoreCase (strManifestMeasure) || "SwapRate".equalsIgnoreCase (strManifestMeasure))
		{
			org.drip.analytics.support.CaseInsensitiveTreeMap<java.lang.Double> mapMeasures = value
				(valParams, pricerParams, csqs, vcp);

			if (null == mapMeasures) return null;

			double dblDirtyDV01 = mapMeasures.get ("DirtyDV01");

			double dblParSwapRate = mapMeasures.get ("SwapRate");

			try {
				org.drip.numerical.differentiation.WengertJacobian wjSwapRateDFMicroJack = null;

				for (org.drip.analytics.cashflow.CompositePeriod p : _lsPeriod) {
					int iPeriodPayDate = p.payDate();

					if (iPeriodPayDate < valParams.valueDate()) continue;

					double dblPeriodDCF = p.couponMetrics (valParams.valueDate(), csqs).dcf();

					org.drip.numerical.differentiation.WengertJacobian wjPeriodFwdRateDF =
						dcFunding.jackDForwardDManifestMeasure (p.startDate(), p.endDate(), "Rate",
							dblPeriodDCF);

					org.drip.numerical.differentiation.WengertJacobian wjPeriodPayDFDF =
						dcFunding.jackDDFDManifestMeasure (iPeriodPayDate, "Rate");

					if (null == wjPeriodFwdRateDF || null == wjPeriodPayDFDF) continue;

					double dblForwardRate = dcFunding.libor (p.startDate(), p.endDate());

					double dblPeriodPayDF = dcFunding.df (iPeriodPayDate);

					if (null == wjSwapRateDFMicroJack)
						wjSwapRateDFMicroJack = new org.drip.numerical.differentiation.WengertJacobian (1,
							wjPeriodFwdRateDF.numParameters());

					double dblPeriodNotional = notional (p.startDate(), p.endDate());

					for (int k = 0; k < wjPeriodFwdRateDF.numParameters(); ++k) {
						double dblPeriodMicroJack = (dblForwardRate - dblParSwapRate) *
							wjPeriodPayDFDF.firstDerivative (0, k) + dblPeriodPayDF *
								wjPeriodFwdRateDF.firstDerivative (0, k);

						if (!wjSwapRateDFMicroJack.accumulatePartialFirstDerivative (0, k, dblPeriodNotional
							* dblPeriodDCF * dblPeriodMicroJack / dblDirtyDV01))
							return null;
					}
				}

				return wjSwapRateDFMicroJack;
			} catch (java.lang.Exception e) {
				e.printStackTrace();
			}
		}

		return null;
	}
}