/**
* 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 java.util.List;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.util.tuple.Pair;
/**
*
*/
public class RadialBasisFunction {
public double evaluate(final Function1D<Double, Double> basisFunction, final List<Pair<double[], Double>> weights, final double[] x, final boolean isNormalized) {
validateInput(weights, x);
final int n = weights.size();
double sum = 0;
double normSum = 0;
double[] xi;
double wi;
double phi;
for (int i = 0; i < n; i++) {
final Pair<double[], Double> pair = weights.get(i);
xi = pair.getFirst();
wi = pair.getSecond();
phi = basisFunction.evaluate(DistanceCalculator.getDistance(x, xi));
sum += wi * phi;
normSum += phi;
}
return isNormalized ? sum / normSum : sum;
}
protected void validateInput(final List<Pair<double[], Double>> weights, final double[] x) {
Validate.notNull(x, "null position");
Validate.notNull(weights, "null data");
final int dim = x.length;
Validate.isTrue(dim > 0, "0 dimension");
Validate.isTrue(weights.get(0).getFirst().length == dim, "data and requested point different dimension");
}
}