com.opengamma.analytics.math.surface.NodalObjectsSurface.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.math.surface.NodalObjectsSurface.java

Source

/**
 * 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.Arrays;

import org.apache.commons.lang.Validate;

import com.opengamma.util.tuple.Pair;

/**
 * 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.
 * @param <T> The type of the x-axis data
 * @param <U> The type of the y-axis data
 * @param <V> The type of the z-axis data
 */
public class NodalObjectsSurface<T, U, V> extends ObjectsSurface<T, U, V> {

    /**
     * @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 <T> The type of the x-axis data
     * @param <U> The type of the y-axis data
     * @param <V> The type of the z-axis data
     * @return A nodal surface with automatically-generated name
     */
    public static <T, U, V> NodalObjectsSurface<T, U, V> from(final T[] xData, final U[] yData, final V[] zData) {
        return new NodalObjectsSurface<T, U, V>(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>
     * @param <T> The type of the x-axis data
     * @param <U> The type of the y-axis data
     * @param <V> The type of the z-axis data
     * @param name The name of the surface
     * @return A nodal surface with automatically-generated name
     */
    public static <T, U, V> NodalObjectsSurface<T, U, V> from(final T[] xData, final U[] yData, final V[] zData,
            final String name) {
        return new NodalObjectsSurface<T, U, V>(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>
     */
    public NodalObjectsSurface(final T[] xData, final U[] yData, final V[] 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>
     * @param name The name of the surface
     */
    public NodalObjectsSurface(final T[] xData, final U[] yData, final V[] zData, final String name) {
        super(xData, yData, zData, name);
    }

    /**
     * {@inheritDoc}
     * @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point 
     */
    @Override
    public V getZValue(final T x, final U y) {
        Validate.notNull(x, "x");
        Validate.notNull(y, "y");
        final T[] xArray = getXData();
        final int index = Arrays.binarySearch(xArray, x);
        if (index < 0) {
            throw new IllegalArgumentException("No x-y-z data in surface for (" + x + ", " + y + ")");
        }
        final U[] yArray = getYData();
        if (yArray[index].equals(y)) {
            final V[] zArray = getZData();
            return zArray[index];
        }
        throw new IllegalArgumentException("No x-y-z data in surface for (" + x + ", " + y + ")");
    }

    /**
     * {@inheritDoc}
     * @throws IllegalArgumentException If the <i>(x, y)</i> value is not a nodal point 
     */
    @Override
    public V getZValue(final Pair<T, U> xy) {
        Validate.notNull(xy, "x-y pair");
        return getZValue(xy.getFirst(), xy.getSecond());
    }

}