/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.cube; import java.util.List; import org.apache.commons.lang.Validate; import com.opengamma.util.tuple.Triple; /** * A cube 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 NodalDoublesCube extends DoublesCube { /** * @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 vData An array of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final double[] xData, final double[] yData, final double[] zData, final double[] vData) { return new NodalDoublesCube(xData, yData, zData, vData); } /** * @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 vData An array of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] vData) { return new NodalDoublesCube(xData, yData, zData, vData); } /** * @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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> vData) { return new NodalDoublesCube(xData, yData, zData, vData); } /** * @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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final double[] xData, final double[] yData, final double[] zData, final double[] vData, final String name) { return new NodalDoublesCube(xData, yData, zData, vData, 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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] vData, final String name) { return new NodalDoublesCube(xData, yData, zData, vData, 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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube * @return A nodal cube with automatically-generated name */ public static NodalDoublesCube from(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> vData, final String name) { return new NodalDoublesCube(xData, yData, zData, vData, 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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> */ public NodalDoublesCube(final double[] xData, final double[] yData, final double[] zData, final double[] vData) { super(xData, yData, zData, vData); } /** * @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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> */ public NodalDoublesCube(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] vData) { super(xData, yData, zData, vData); } /** * @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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> */ public NodalDoublesCube(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> vData) { super(xData, yData, zData, vData); } /** * @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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube */ public NodalDoublesCube(final double[] xData, final double[] yData, final double[] zData, final double[] vData, final String name) { super(xData, yData, zData, vData, 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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube */ public NodalDoublesCube(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] vData, final String name) { super(xData, yData, zData, vData, 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 vData A list of <i>v</i> data points, not null, contains same number of entries as <i>x</i> * @param name The name of the cube */ public NodalDoublesCube(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> vData, final String name) { super(xData, yData, zData, vData, name); } /** * {@inheritDoc} * @throws IllegalArgumentException If the <i>(x, y, z)</i> value is not a nodal point */ @Override public Double getValue(final Double x, final Double y, final Double z) { Validate.notNull(x, "x"); Validate.notNull(y, "y"); Validate.notNull(y, "z"); final double[] xArray = getXDataAsPrimitive(); final double[] yArray = getYDataAsPrimitive(); final double[] zArray = getZDataAsPrimitive(); final int n = size(); for (int i = 0; i < n; i++) { if (Double.doubleToLongBits(xArray[i]) == Double.doubleToLongBits(x) && Double.doubleToLongBits(yArray[i]) == Double.doubleToLongBits(y) && Double.doubleToLongBits(zArray[i]) == Double.doubleToLongBits(z)) { return getValuesAsPrimitive()[i]; } } throw new IllegalArgumentException("No x-y-z data in cube for (" + x + ", " + y + ", " + z + ")"); } /** * {@inheritDoc} * @throws IllegalArgumentException If the <i>(x, y, z)</i> value is not a nodal point */ @Override public Double getValue(final Triple<Double, Double, Double> xyz) { Validate.notNull(xyz, "x-y-z triple"); return getValue(xyz.getFirst(), xyz.getSecond(), xyz.getThird()); } }