All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.finmath.marketdata.model.curves.PiecewiseCurve Maven / Gradle / Ivy

/*
 * (c) Copyright Christian P. Fries, Germany. Contact: [email protected].
 *
 * Created on 21.05.2014
 */

package net.finmath.marketdata.model.curves;

import java.time.LocalDate;

import net.finmath.marketdata.model.AnalyticModelInterface;

/**
 * A piecewise curve. The curve consists of a base curve and a second curve.
 * If the time parameter of the {@link #getValue(AnalyticModelInterface, double)}
 * method falls inside a pre-defined open interval, it is delegated to the second curve,
 * otherwise it is delegated to the base curve.
 * 
 * @author Christian Fries
 */
public class PiecewiseCurve extends AbstractCurve implements CurveInterface {

	private static final long serialVersionUID = 8846923173857477343L;

	private CurveInterface	baseCurve;
	private CurveInterface	fixedPartCurve;

	private double fixedPartStartTime;
	private double fixedPartEndTime;
	

	/**
	 * A builder (following the builder pattern) for PiecewiseCurve objects.
	 * Allows to successively construct a curve object by adding points to its base points.
	 * 
	 * @author Christian Fries
	 */
	public static class CurveBuilder extends Curve.CurveBuilder implements CurveBuilderInterface {

		private PiecewiseCurve			curve = null;
		
		/**
		 * Create a CurveBuilder from a given piecewiseCurve
		 * 
		 * @param piecewiseCurve The piecewise curve from which to copy the fixed part upon build().
		 * @throws CloneNotSupportedException Thrown, when the base curve could not be cloned.
		 */
		public CurveBuilder(PiecewiseCurve piecewiseCurve) throws CloneNotSupportedException {
			super((Curve)(piecewiseCurve.baseCurve));
			this.curve = piecewiseCurve;
		}
		
		@Override
		public CurveInterface build() throws CloneNotSupportedException {
			PiecewiseCurve buildCurve = curve.clone();
			buildCurve.baseCurve = super.build();
			curve = null;
			return buildCurve;
		}
	}

	public PiecewiseCurve(CurveInterface curveInterface,
			CurveInterface fixedPartCurve, double fixedPartStartTime,
			double fixedPartEndTime) {
		super(curveInterface.getName(), curveInterface.getReferenceDate());
		this.baseCurve = curveInterface;
		this.fixedPartCurve = fixedPartCurve;
		this.fixedPartStartTime = fixedPartStartTime;
		this.fixedPartEndTime = fixedPartEndTime;
	}

	@Override
	public double[] getParameter() {
		return baseCurve.getParameter();
	}

	@Override
	public void setParameter(double[] parameter) {
		baseCurve.setParameter(parameter);
	}

	@Override
	public String getName() {
		return baseCurve.getName();
	}

	@Override
	public LocalDate getReferenceDate() {
		return baseCurve.getReferenceDate();
	}

	/**
	 * @return the baseCurve
	 */
	public CurveInterface getBaseCurve() {
		return baseCurve;
	}

	/**
	 * @return the fixedPartCurve
	 */
	public CurveInterface getFixedPartCurve() {
		return fixedPartCurve;
	}

	/**
	 * @return the fixedPartStartTime
	 */
	public double getFixedPartStartTime() {
		return fixedPartStartTime;
	}

	/**
	 * @return the fixedPartEndTime
	 */
	public double getFixedPartEndTime() {
		return fixedPartEndTime;
	}

	@Override
	public double getValue(double time) {
		return getValue(null, time);
	}

	@Override
	public double getValue(AnalyticModelInterface model, double time) {
		if(time >fixedPartStartTime && time < this.fixedPartEndTime) {
			return fixedPartCurve.getValue(model, time);
		}
		else {
			return baseCurve.getValue(model, time);
		}
	}

	@Override
	public CurveInterface getCloneForParameter(double[] value) throws CloneNotSupportedException {
		PiecewiseCurve newCurve = clone();
		newCurve.baseCurve = (CurveInterface) baseCurve.getCloneForParameter(value);
		
		return newCurve;
	}

	@Override
	public PiecewiseCurve clone() throws CloneNotSupportedException {
		return new PiecewiseCurve((CurveInterface) baseCurve.clone(), fixedPartCurve, fixedPartStartTime, fixedPartEndTime);
	}

	@Override
	public CurveBuilderInterface getCloneBuilder() throws CloneNotSupportedException {
		return new CurveBuilder(this);
	}

	@Override
	public String toString() {
		return "ForwardCurveWithFixings [getBaseCurve()=" + getBaseCurve()
				+ ", getFixedPartCurve()=" + getFixedPartCurve()
				+ ", getFixedPartStartTime()=" + getFixedPartStartTime()
				+ ", getFixedPartEndTime()=" + getFixedPartEndTime()
				+ ", toString()=" + super.toString() + "]";
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy