/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.surface;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.Validate;
import com.opengamma.util.tuple.DoublesPair;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Triple;
/**
* A surface that is defined by a set of nodal points (i.e. <i>(x, y, z)</i> data). Any attempt to find a <i>z</i> value
* for which there is no <i>(x, y)</i> nodal point will result in failure.
*/
public class NodalDoublesSurface extends DoublesSurface {
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final double[] xData, final double[] yData, final double[] zData) {
return new NodalDoublesSurface(xData, yData, zData);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final Double[] xData, final Double[] yData, final Double[] zData) {
return new NodalDoublesSurface(xData, yData, zData);
}
/**
* @param xData A list of <i>x</i> data points, not null
* @param yData A list of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<Double> xData, final List<Double> yData, final List<Double> zData) {
return new NodalDoublesSurface(xData, yData, zData);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final DoublesPair[] xyData, final Double[] zData) {
return new NodalDoublesSurface(xyData, zData);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final DoublesPair[] xyData, final double[] zData) {
return new NodalDoublesSurface(xyData, zData);
}
/**
* @param xyData A list of <i>x-y</i> data points, not null
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<DoublesPair> xyData, final List<Double> zData) {
return new NodalDoublesSurface(xyData, zData);
}
/**
* @param data A map of <i>x-y</i> data points to <i>z</i> data points, not null
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final Map<DoublesPair, Double> data) {
return new NodalDoublesSurface(data);
}
/**
* @param xyzData A list of <i>x-y-z</i> data points, not null
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<Triple<Double, Double, Double>> xyzData) {
return new NodalDoublesSurface(xyzData);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final double[] xData, final double[] yData, final double[] zData, final String name) {
return new NodalDoublesSurface(xData, yData, zData, name);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final Double[] xData, final Double[] yData, final Double[] zData, final String name) {
return new NodalDoublesSurface(xData, yData, zData, name);
}
/**
* @param xData A list of <i>x</i> data points, not null
* @param yData A list of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<Double> xData, final List<Double> yData, final List<Double> zData, final String name) {
return new NodalDoublesSurface(xData, yData, zData, name);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final DoublesPair[] xyData, final double[] zData, final String name) {
return new NodalDoublesSurface(xyData, zData, name);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final DoublesPair[] xyData, final Double[] zData, final String name) {
return new NodalDoublesSurface(xyData, zData, name);
}
/**
* @param xyData A list of <i>x-y</i> data points, not null
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<DoublesPair> xyData, final List<Double> zData, final String name) {
return new NodalDoublesSurface(xyData, zData, name);
}
/**
* @param xyzData A map of <i>x-y</i> data points to <i>z</i> data points, not null
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final Map<DoublesPair, Double> xyzData, final String name) {
return new NodalDoublesSurface(xyzData, name);
}
/**
* @param xyzData A list of <i>x-y-z</i> data points, not null
* @param name The name of the surface
* @return A nodal surface with automatically-generated name
*/
public static NodalDoublesSurface from(final List<Triple<Double, Double, Double>> xyzData, final String name) {
return new NodalDoublesSurface(xyzData, name);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
*/
public NodalDoublesSurface(final double[] xData, final double[] yData, final double[] zData) {
super(xData, yData, zData);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
*/
public NodalDoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData) {
super(xData, yData, zData);
}
/**
* @param xData A list of <i>x</i> data points, not null
* @param yData A list of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
*/
public NodalDoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData) {
super(xData, yData, zData);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
*/
public NodalDoublesSurface(final DoublesPair[] xyData, final double[] zData) {
super(xyData, zData);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
*/
public NodalDoublesSurface(final DoublesPair[] xyData, final Double[] zData) {
super(xyData, zData);
}
/**
* @param xyData A list of <i>x-y</i> data points, not null
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
*/
public NodalDoublesSurface(final List<DoublesPair> xyData, final List<Double> zData) {
super(xyData, zData);
}
/**
* @param xyzData A map of <i>x-y</i> data points to <i>z</i> data points, not null
*/
public NodalDoublesSurface(final Map<DoublesPair, Double> xyzData) {
super(xyzData);
}
/**
* @param xyzData A list of <i>x-y-z</i> data points, not null
*/
public NodalDoublesSurface(final List<Triple<Double, Double, Double>> xyzData) {
super(xyzData);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final double[] xData, final double[] yData, final double[] zData, final String name) {
super(xData, yData, zData, name);
}
/**
* @param xData An array of <i>x</i> data points, not null
* @param yData An array of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData, final String name) {
super(xData, yData, zData, name);
}
/**
* @param xData A list of <i>x</i> data points, not null
* @param yData A list of <i>y</i> data points, not null, contains same number of entries as <i>x</i>
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData, final String name) {
super(xData, yData, zData, name);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final DoublesPair[] xyData, final double[] zData, final String name) {
super(xyData, zData, name);
}
/**
* @param xyData An array of <i>x-y</i> data points, not null
* @param zData An array of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final DoublesPair[] xyData, final Double[] zData, final String name) {
super(xyData, zData, name);
}
/**
* @param xyData A list of <i>x-y</i> data points, not null
* @param zData A list of <i>z</i> data points, not null, contains same number of entries as <i>x-y</i>
* @param name The name of the surface
*/
public NodalDoublesSurface(final List<DoublesPair> xyData, final List<Double> zData, final String name) {
super(xyData, zData, name);
}
/**
* @param xyzData A map of <i>x-y</i> data points to <i>z</i> data points, not null
* @param name The name of the surface
*/
public NodalDoublesSurface(final Map<DoublesPair, Double> xyzData, final String name) {
super(xyzData, name);
}
/**
* @param xyzData A list of <i>x-y-z</i> data points, not null
* @param name The name of the surface
*/
public NodalDoublesSurface(final List<Triple<Double, Double, Double>> xyzData, final String name) {
super(xyzData, name);
}
/**
* {@inheritDoc}
* @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point
*/
@Override
public Double getZValue(final Double x, final Double y) {
Validate.notNull(x, "x");
Validate.notNull(y, "y");
final double[] xArray = getXDataAsPrimitive();
final double[] yArray = getYDataAsPrimitive();
final int n = size();
for (int i = 0; i < n; i++) {
if (Double.doubleToLongBits(xArray[i]) == Double.doubleToLongBits(x)) {
if (Double.doubleToLongBits(yArray[i]) == Double.doubleToLongBits(y)) {
return getZDataAsPrimitive()[i];
}
}
}
throw new IllegalArgumentException("No x-y data in surface for (" + x + ", " + y + ")");
}
/**
* {@inheritDoc}
* @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point
*/
@Override
public Double getZValue(final Pair<Double, Double> xy) {
Validate.notNull(xy, "x-y pair");
return getZValue(xy.getFirst(), xy.getSecond());
}
}