/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.util.tuple.DoublesPair;
/**
* Jacobian matrix builder for multi-curves construction when the calculator returns an InterestRateCurveSensitivity object.
* @deprecated {@link YieldCurveBundle} is deprecated
*/
@Deprecated
public class MultipleYieldCurveFinderIRSJacobian extends Function1D<DoubleMatrix1D, DoubleMatrix2D> {
/**
* The sensitivity calculator.
*/
private final InstrumentDerivativeVisitor<YieldCurveBundle, InterestRateCurveSensitivity> _calculator;
/**
* The multi-curves data.
*/
private final MultipleYieldCurveFinderDataBundle _data;
private final YieldCurveBundleBuildingFunction _curveBuilderFunction;
/**
* Constructor.
* @param data The muti-curves data.
* @param calculator The sensitivity calculator.
*/
public MultipleYieldCurveFinderIRSJacobian(final MultipleYieldCurveFinderDataBundle data, final InstrumentDerivativeVisitor<YieldCurveBundle, InterestRateCurveSensitivity> calculator) {
Validate.notNull(data, "data");
Validate.notNull(calculator, "calculator");
_data = data;
_calculator = calculator;
_curveBuilderFunction = new InterpolatedYieldCurveBuildingFunction(data.getUnknownCurveNodePoints(), data.getUnknownCurveInterpolators());
}
@Override
public DoubleMatrix2D evaluate(final DoubleMatrix1D x) {
final YieldCurveBundle curves = _curveBuilderFunction.evaluate(x);
final YieldCurveBundle knownCurves = _data.getKnownCurves();
// set any known (i.e. fixed) curves
if (knownCurves != null) {
curves.addAll(knownCurves);
}
final int totalNodes = _data.getTotalNodes();
final List<String> curveNames = _data.getCurveNames();
final double[][] res = new double[_data.getNumInstruments()][totalNodes];
for (int i = 0; i < _data.getNumInstruments(); i++) { // loop over all instruments
final InstrumentDerivative deriv = _data.getDerivative(i);
final Map<String, List<DoublesPair>> senseMap = deriv.accept(_calculator, curves).getSensitivities();
int offset = 0;
for (final String name : curveNames) { // loop over all curves (by name)
if (senseMap.containsKey(name)) {
final YieldAndDiscountCurve curve = curves.getCurve(name);
final List<DoublesPair> senseList = senseMap.get(name);
if (senseList.size() != 0) {
final double[][] sensitivity = new double[senseList.size()][];
int k = 0;
for (final DoublesPair timeAndDF : senseList) {
sensitivity[k++] = curve.getInterestRateParameterSensitivity(timeAndDF.getFirst());
}
for (int j = 0; j < sensitivity[0].length; j++) {
double temp = 0.0;
k = 0;
for (final DoublesPair timeAndDF : senseList) {
temp += timeAndDF.getSecond() * sensitivity[k++][j];
}
res[i][j + offset] = temp;
}
}
}
offset += _data.getCurveNodePointsForCurve(name).length;
}
}
return new DoubleMatrix2D(res);
}
}