/**
* Copyright (C) 2009 - 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.interpolation.data.Interpolator1DDataBundle;
/**
*
*/
public class CombinedInterpolatorExtrapolator extends Interpolator1D {
private static final long serialVersionUID = 1L;
private final Interpolator1D _interpolator;
private final Interpolator1D _leftExtrapolator;
private final Interpolator1D _rightExtrapolator;
public CombinedInterpolatorExtrapolator(final Interpolator1D interpolator) {
Validate.notNull(interpolator, "interpolator");
_interpolator = interpolator;
_leftExtrapolator = null;
_rightExtrapolator = null;
}
public CombinedInterpolatorExtrapolator(final Interpolator1D interpolator, final Interpolator1D extrapolator) {
Validate.notNull(interpolator, "interpolator");
Validate.notNull(extrapolator, "extrapolator");
_interpolator = interpolator;
_leftExtrapolator = extrapolator;
_rightExtrapolator = extrapolator;
}
public CombinedInterpolatorExtrapolator(final Interpolator1D interpolator, final Interpolator1D leftExtrapolator, final Interpolator1D rightExtrapolator) {
Validate.notNull(interpolator, "interpolator");
Validate.notNull(leftExtrapolator, "left extrapolator");
Validate.notNull(rightExtrapolator, "right extrapolator");
_interpolator = interpolator;
_leftExtrapolator = leftExtrapolator;
_rightExtrapolator = rightExtrapolator;
}
@Override
public Interpolator1DDataBundle getDataBundle(final double[] x, final double[] y) {
return _interpolator.getDataBundle(x, y);
}
@Override
public Interpolator1DDataBundle getDataBundleFromSortedArrays(final double[] x, final double[] y) {
return _interpolator.getDataBundleFromSortedArrays(x, y);
}
public Interpolator1D getInterpolator() {
return _interpolator;
}
public Interpolator1D getLeftExtrapolator() {
return _leftExtrapolator;
}
public Interpolator1D getRightExtrapolator() {
return _rightExtrapolator;
}
//TODO fail earlier if there's no extrapolators?
@Override
public Double interpolate(final Interpolator1DDataBundle data, final Double value) {
Validate.notNull(data, "data");
Validate.notNull(value, "value");
if (value < data.firstKey()) {
if (_leftExtrapolator != null) {
return _leftExtrapolator.interpolate(data, value);
}
} else if (value > data.lastKey()) {
if (_rightExtrapolator != null) {
return _rightExtrapolator.interpolate(data, value);
}
}
return _interpolator.interpolate(data, value);
}
@Override
public double firstDerivative(final Interpolator1DDataBundle data, final Double value) {
Validate.notNull(data, "data");
Validate.notNull(value, "value");
if (value < data.firstKey()) {
if (_leftExtrapolator != null) {
return _leftExtrapolator.firstDerivative(data, value);
}
} else if (value > data.lastKey()) {
if (_rightExtrapolator != null) {
return _rightExtrapolator.firstDerivative(data, value);
}
}
return _interpolator.firstDerivative(data, value);
}
@Override
public double[] getNodeSensitivitiesForValue(final Interpolator1DDataBundle data, final Double value) {
Validate.notNull(data, "data");
Validate.notNull(value, "value");
if (value < data.firstKey()) {
if (_leftExtrapolator != null) {
return _leftExtrapolator.getNodeSensitivitiesForValue(data, value);
}
} else if (value > data.lastKey()) {
if (_rightExtrapolator != null) {
return _rightExtrapolator.getNodeSensitivitiesForValue(data, value);
}
}
return _interpolator.getNodeSensitivitiesForValue(data, value);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Interpolator[interpolator=");
sb.append(_interpolator.toString());
sb.append(", left extrapolator=");
sb.append(_leftExtrapolator.toString());
sb.append(", right extrapolator=");
sb.append(_rightExtrapolator.toString());
sb.append("]");
return sb.toString();
}
}