protected DoubleMatrix1D finiteDiffNodeSensitivitiesDsc(final InstrumentDerivative ird, final InstrumentDerivativeVisitor<YieldCurveBundle, Double> valueCalculator,
final YieldCurveBundle fixedCurves, final YieldCurveBundle interpolatedCurves) {
int nNodes = 0;
for (final String curveName : interpolatedCurves.getAllNames()) {
ArgumentChecker.isTrue(interpolatedCurves.getCurve(curveName) instanceof DiscountCurve, "Curve should be DiscountCurve");
final Interpolator1DDataBundle dataBundle = ((InterpolatedDoublesCurve) ((DiscountCurve) interpolatedCurves.getCurve(curveName)).getCurve()).getDataBundle();
nNodes += dataBundle.size();
}
final double[] df = new double[nNodes];
int index = 0;
for (final String curveName : interpolatedCurves.getAllNames()) {
final Interpolator1DDataBundle dataBundle = ((InterpolatedDoublesCurve) ((DiscountCurve) interpolatedCurves.getCurve(curveName)).getCurve()).getDataBundle();
for (final double y : dataBundle.getValues()) {
df[index++] = y;
}
}
final Function1D<DoubleMatrix1D, Double> f = new Function1D<DoubleMatrix1D, Double>() {
@Override
public Double evaluate(final DoubleMatrix1D x) {
final YieldCurveBundle curves = interpolatedCurves.copy();
int index2 = 0;
for (final String name : interpolatedCurves.getAllNames()) {
final DiscountCurve curve = (DiscountCurve) interpolatedCurves.getCurve(name);
final Interpolator1DDataBundle dataBundle = ((InterpolatedDoublesCurve) curve.getCurve()).getDataBundle();
final int numberOfNodes = dataBundle.size();
final double[] df1 = Arrays.copyOfRange(x.getData(), index2, index2 + numberOfNodes);
index2 += numberOfNodes;
final YieldAndDiscountCurve newCurve = DiscountCurve.from(InterpolatedDoublesCurve.from(dataBundle.getKeys(), df1, ((InterpolatedDoublesCurve) curve.getCurve()).getInterpolator()));
curves.replaceCurve(name, newCurve);
}
if (fixedCurves != null) {
curves.addAll(fixedCurves);
}