/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.function;
import java.util.Arrays;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.util.ArgumentChecker;
/**
* This is simply a {@link VectorFunction} backed by a {@link ParameterizedCurve}
*/
public class ParameterizedCurveVectorFunction extends VectorFunction {
private final double[] _samplePoints;
private final ParameterizedCurve _curve;
/**
* Set up a sampled (parameterised) curve
* @param samplePoints points where we sample the curve
* @param curve a parameterised curve
*/
public ParameterizedCurveVectorFunction(final double[] samplePoints, final ParameterizedCurve curve) {
ArgumentChecker.notEmpty(samplePoints, "samplePoints");
ArgumentChecker.notNull(curve, "curve");
_samplePoints = Arrays.copyOf(samplePoints, samplePoints.length);
_curve = curve;
}
@Override
public DoubleMatrix2D calculateJacobian(final DoubleMatrix1D x) {
final Function1D<Double, DoubleMatrix1D> sense = _curve.getYParameterSensitivity(x);
final int n = getLengthOfRange();
final DoubleMatrix2D jac = new DoubleMatrix2D(n, getLengthOfDomain());
for (int i = 0; i < n; i++) {
jac.getData()[i] = sense.evaluate(_samplePoints[i]).getData();
}
return jac;
}
@Override
public int getLengthOfDomain() {
return _curve.getNumberOfParameters();
}
@Override
public int getLengthOfRange() {
return _samplePoints.length;
}
/**
* Build a curve given the parameters, then return its value at the sample points
* @param curveParameters curve parameters
* @return the curve value at the sample points
*/
@Override
public DoubleMatrix1D evaluate(final DoubleMatrix1D curveParameters) {
final Function1D<Double, Double> func = _curve.asFunctionOfArguments(curveParameters);
final int n = _samplePoints.length;
final DoubleMatrix1D y = new DoubleMatrix1D(n);
for (int i = 0; i < n; i++) {
y.getData()[i] = func.evaluate(_samplePoints[i]);
}
return y;
}
}