/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility.discrete;
import com.opengamma.analytics.financial.model.volatility.surface.InterpolatedVolatilityTermStructureProvider;
import com.opengamma.analytics.math.function.InterpolatedVectorFunctionProvider;
import com.opengamma.analytics.math.function.VectorFunction;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.tuple.DoublesPair;
/**
* This is the discrete equivalent of {@link InterpolatedVolatilityTermStructureProvider}. The volatility depends on
* time-to-expiry only, and is described by an interpolated curve.
*/
public class DiscreteVolatilityFunctionProviderFromInterpolatedTermStructure extends DiscreteVolatilityFunctionProvider {
private final InterpolatedVectorFunctionProvider _funcPro;
/**
* set up the {@link DiscreteVolatilityFunctionProvider}
* @param knotPoints position of knots
* @param interpolator The interpolator
*/
public DiscreteVolatilityFunctionProviderFromInterpolatedTermStructure(final double[] knotPoints, final Interpolator1D interpolator) {
_funcPro = new InterpolatedVectorFunctionProvider(interpolator, knotPoints);
}
/**
* {@inheritDoc}
* <b>Note:</b> The strike values are ignored.
*/
@Override
public DiscreteVolatilityFunction from(final DoublesPair[] expiryStrikePoints) {
ArgumentChecker.noNulls(expiryStrikePoints, "expiryStrikePoints");
final int n = expiryStrikePoints.length;
final Double[] expiries = new Double[n];
for (int i = 0; i < n; i++) {
expiries[i] = expiryStrikePoints[i].first;
}
final VectorFunction vf = _funcPro.from(expiries);
return new DiscreteVolatilityFunction() {
@Override
public int getLengthOfRange() {
return vf.getLengthOfRange();
}
@Override
public int getLengthOfDomain() {
return vf.getLengthOfDomain();
}
@Override
public DoubleMatrix2D calculateJacobian(final DoubleMatrix1D x) {
return vf.calculateJacobian(x);
}
@Override
public DoubleMatrix1D evaluate(final DoubleMatrix1D x) {
return vf.evaluate(x);
}
};
}
}