/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.interpolation; import org.apache.commons.lang.Validate; import com.opengamma.analytics.math.function.PiecewisePolynomialWithSensitivityFunction1D; import com.opengamma.analytics.math.interpolation.data.ArrayInterpolator1DDataBundle; import com.opengamma.analytics.math.interpolation.data.Interpolator1DDataBundle; import com.opengamma.analytics.math.interpolation.data.Interpolator1DPiecewisePoynomialDataBundle; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; /** * Wrapper class for {@link PiecewisePolynomialInterpolator} */ public abstract class PiecewisePolynomialInterpolator1D extends Interpolator1D { /** Serialization version */ private static final long serialVersionUID = 1L; private PiecewisePolynomialInterpolator _baseMethod; private static final PiecewisePolynomialWithSensitivityFunction1D FUNC = new PiecewisePolynomialWithSensitivityFunction1D(); /** * Constructor * @param method Piecewise polynomial interpolation method */ public PiecewisePolynomialInterpolator1D(final PiecewisePolynomialInterpolator method) { _baseMethod = method; } @Override public Double interpolate(final Interpolator1DDataBundle data, final Double value) { Validate.notNull(value, "value"); Validate.notNull(data, "data bundle"); Validate.isTrue(data instanceof Interpolator1DPiecewisePoynomialDataBundle); final Interpolator1DPiecewisePoynomialDataBundle polyData = (Interpolator1DPiecewisePoynomialDataBundle) data; final DoubleMatrix1D res = FUNC.evaluate(polyData.getPiecewisePolynomialResultsWithSensitivity(), value); return res.getEntry(0); } @Override public double firstDerivative(final Interpolator1DDataBundle data, final Double value) { Validate.notNull(value, "value"); Validate.notNull(data, "data bundle"); Validate.isTrue(data instanceof Interpolator1DPiecewisePoynomialDataBundle); final Interpolator1DPiecewisePoynomialDataBundle polyData = (Interpolator1DPiecewisePoynomialDataBundle) data; final DoubleMatrix1D res = FUNC.differentiate(polyData.getPiecewisePolynomialResultsWithSensitivity(), value); return res.getEntry(0); } @Override public double[] getNodeSensitivitiesForValue(final Interpolator1DDataBundle data, final Double value) { Validate.notNull(value, "value"); Validate.notNull(data, "data bundle"); Validate.isTrue(data instanceof Interpolator1DPiecewisePoynomialDataBundle); final Interpolator1DPiecewisePoynomialDataBundle polyData = (Interpolator1DPiecewisePoynomialDataBundle) data; final DoubleMatrix1D res = FUNC.nodeSensitivity(polyData.getPiecewisePolynomialResultsWithSensitivity(), value); return res.getData(); } @Override public Interpolator1DDataBundle getDataBundle(final double[] x, final double[] y) { return new Interpolator1DPiecewisePoynomialDataBundle(new ArrayInterpolator1DDataBundle(x, y, false), this._baseMethod); } /** * Data bundle builder ONLY FOR cubic spline interpolator or hyman filters on cubic spline interpolator using Clamped endpoint conditions * @param x X values of data * @param y Y values of data * @param leftCond First derivative value at left endpoint * @param rightCond First derivative value at right endpoint * @return {@link Interpolator1DPiecewisePoynomialDataBundle} */ public Interpolator1DDataBundle getDataBundle(final double[] x, final double[] y, final double leftCond, final double rightCond) { if (!(_baseMethod.getPrimaryMethod() instanceof CubicSplineInterpolator)) { throw new IllegalArgumentException("No degrees of freedom at endpoints for this interpolation method"); } return new Interpolator1DPiecewisePoynomialDataBundle(new ArrayInterpolator1DDataBundle(x, y, false), this._baseMethod, leftCond, rightCond); } @Override public Interpolator1DDataBundle getDataBundleFromSortedArrays(final double[] x, final double[] y) { return new Interpolator1DPiecewisePoynomialDataBundle(new ArrayInterpolator1DDataBundle(x, y, true), this._baseMethod); } /** * Data bundle builder ONLY FOR cubic spline interpolator or hyman filters on cubic spline interpolator using Clamped endpoint conditions * @param x X values of data * @param y Y values of data * @param leftCond First derivative value at left endpoint * @param rightCond First derivative value at right endpoint * @return {@link Interpolator1DPiecewisePoynomialDataBundle} */ public Interpolator1DDataBundle getDataBundleFromSortedArrays(final double[] x, final double[] y, final double leftCond, final double rightCond) { if (!(_baseMethod.getPrimaryMethod() instanceof CubicSplineInterpolator)) { throw new IllegalArgumentException("No degrees of freedom at endpoints for this interpolation method"); } return new Interpolator1DPiecewisePoynomialDataBundle(new ArrayInterpolator1DDataBundle(x, y, true), this._baseMethod, leftCond, rightCond); } /** * Access interpolator * @return _baseMethod */ public PiecewisePolynomialInterpolator getInterpolator() { return _baseMethod; } }