/*
* (c) Copyright Christian P. Fries, Germany. All rights reserved. Contact: email@christianfries.com.
*
* Created on 02.02.2017
*/
package net.finmath.montecarlo.interestrate.modelplugins;
import net.finmath.time.TimeDiscretizationInterface;
/**
* @author Christian Fries
*
*/
public class TermStructureTenorTimeScalingPicewiseConstant implements TermStructureTenorTimeScalingInterface {
private final TimeDiscretizationInterface timeDiscretization;
private final double timesIntegrated[];
private final double floor = 0.1-1.0, cap = 10.0-1.0;
private final double parameterScaling = 100.0;
public TermStructureTenorTimeScalingPicewiseConstant(TimeDiscretizationInterface timeDiscretization, double[] parameters) {
super();
this.timeDiscretization = timeDiscretization;
timesIntegrated = new double[timeDiscretization.getNumberOfTimes()];
for(int timeIntervallIndex=0; timeIntervallIndex<timeDiscretization.getNumberOfTimeSteps(); timeIntervallIndex++) {
timesIntegrated[timeIntervallIndex+1] = timesIntegrated[timeIntervallIndex] + (1.0+Math.min(Math.max(parameterScaling*parameters[timeIntervallIndex],floor),cap)) * (timeDiscretization.getTimeStep(timeIntervallIndex));
}
}
@Override
public double getScaledTenorTime(double periodStart, double periodEnd) {
int timeStartIndex = timeDiscretization.getTimeIndexNearestLessOrEqual(periodStart);
int timeEndIndex = timeDiscretization.getTimeIndexNearestLessOrEqual(periodEnd);
if(timeDiscretization.getTime(timeStartIndex) != periodStart) System.out.println("*****S" + (periodStart));
if(timeDiscretization.getTime(timeEndIndex) != periodEnd) System.out.println("*****E" + (periodStart));
double timeScaled = timesIntegrated[timeEndIndex] - timesIntegrated[timeStartIndex];
return timeScaled;
}
@Override
public TermStructureTenorTimeScalingInterface getCloneWithModifiedParameters(double[] parameters) {
return new TermStructureTenorTimeScalingPicewiseConstant(timeDiscretization, parameters);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.interestrate.modelplugins.TermStructureTenorTimeScalingInterface#getParameter()
*/
@Override
public double[] getParameter() {
double[] parameter = new double[timeDiscretization.getNumberOfTimeSteps()];
for(int timeIntervallIndex=0; timeIntervallIndex<timeDiscretization.getNumberOfTimeSteps(); timeIntervallIndex++) {
parameter[timeIntervallIndex] = ((timesIntegrated[timeIntervallIndex+1] - timesIntegrated[timeIntervallIndex]) / timeDiscretization.getTimeStep(timeIntervallIndex) - 1.0) / parameterScaling;
}
return parameter;
}
@Override
public TermStructureTenorTimeScalingInterface clone() {
return this;
}
}