/** * 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 java.util.List; import java.util.Map; import org.apache.commons.lang.Validate; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.DoublesPair; import com.opengamma.util.tuple.Triple; /** * Parent class for a family of surfaces that have real <i>x</i>, <i>y</i> and <i>z</i> values. */ public abstract class DoublesSurface extends Surface<Double, Double, Double> { private final int _n; private final double[] _xData; private final double[] _yData; private final double[] _zData; private Double[] _xDataObject; private Double[] _yDataObject; private Double[] _zDataObject; /** * @param xData An array of <i>x</i> data, not null * @param yData An array of <i>y</i> data, not null * @param zData An array of <i>z</i> data, not null */ public DoublesSurface(final double[] xData, final double[] yData, final double[] zData) { super(); ArgumentChecker.notNull(xData, "x data"); ArgumentChecker.notNull(yData, "y data"); ArgumentChecker.notNull(zData, "z data"); ArgumentChecker.isTrue(xData.length == yData.length, "X data size different from Y data size"); ArgumentChecker.isTrue(xData.length == zData.length, "X data size different from Z data size"); _n = xData.length; _xData = Arrays.copyOf(xData, _n); _yData = Arrays.copyOf(yData, _n); _zData = Arrays.copyOf(zData, _n); } /** * @param xData An array of <i>x</i> data, not null, no null elements. * @param yData An array of <i>y</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param zData An array of <i>z</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. */ public DoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData) { super(); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.length == yData.length); Validate.isTrue(xData.length == zData.length); _n = xData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { Validate.notNull(xData[i]); Validate.notNull(yData[i]); Validate.notNull(zData[i]); _xData[i] = xData[i]; _yData[i] = yData[i]; _zData[i] = zData[i]; } } /** * @param xData A list of <i>x</i> data, not null, no null elements. * @param yData A list of <i>y</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param zData A list of <i>z</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. */ public DoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData) { super(); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.size() == yData.size()); Validate.isTrue(xData.size() == zData.size()); _n = xData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final Double x = xData.get(i); final Double y = yData.get(i); final Double z = zData.get(i); Validate.notNull(x); Validate.notNull(y); Validate.notNull(z); _xData[i] = x; _yData[i] = y; _zData[i] = z; } } /** * @param xyData An array of <i>x-y</i> data, not null, no null elements. * @param zData An array of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. */ public DoublesSurface(final DoublesPair[] xyData, final double[] zData) { super(); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.length == zData.length); _n = xyData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = Arrays.copyOf(zData, _n); for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData[i]; Validate.notNull(pair); Validate.notNull(zData[i]); _xData[i] = pair.first; _yData[i] = pair.second; } } /** * @param xyData An array of <i>x-y</i> data, not null, no null elements. * @param zData An array of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. */ public DoublesSurface(final DoublesPair[] xyData, final Double[] zData) { super(); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.length == zData.length); _n = xyData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData[i]; Validate.notNull(pair); Validate.notNull(zData[i]); _xData[i] = pair.first; _yData[i] = pair.second; _zData[i] = zData[i]; } } /** * @param xyData A list of <i>x-y</i> data, not null, no null elements. * @param zData A list of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. */ public DoublesSurface(final List<DoublesPair> xyData, final List<Double> zData) { super(); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.size() == zData.size()); _n = xyData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData.get(i); final Double z = zData.get(i); Validate.notNull(pair); Validate.notNull(z); _xData[i] = pair.first; _yData[i] = pair.second; _zData[i] = z; } } /** * @param xyzData A map of <i>x-y</i> data to <i>z</i> data, not null, no null elements. */ public DoublesSurface(final Map<DoublesPair, Double> xyzData) { super(); Validate.notNull(xyzData, "x-y-z data"); _n = xyzData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; int i = 0; for (final Map.Entry<DoublesPair, Double> entry : xyzData.entrySet()) { Validate.notNull(entry.getKey()); Validate.notNull(entry.getValue()); _xData[i] = entry.getKey().first; _yData[i] = entry.getKey().second; _zData[i++] = entry.getValue(); } } /** * @param xyzData A list of <i>x-y-z</i> data, not null, no null elements. */ public DoublesSurface(final List<Triple<Double, Double, Double>> xyzData) { super(); Validate.notNull(xyzData, "x-y-z data"); _n = xyzData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; int i = 0; for (final Triple<Double, Double, Double> entry : xyzData) { Validate.notNull(entry); final double x = entry.getFirst(); final double y = entry.getSecond(); final double z = entry.getThird(); _xData[i] = x; _yData[i] = y; _zData[i] = z; i++; } } /** * @param xData An array of <i>x</i> data, not null * @param yData An array of <i>y</i> data, not null * @param zData An array of <i>z</i> data, not null * @param name The surface name */ public DoublesSurface(final double[] xData, final double[] yData, final double[] zData, final String name) { super(name); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.length == yData.length); Validate.isTrue(xData.length == zData.length); _n = xData.length; _xData = Arrays.copyOf(xData, _n); _yData = Arrays.copyOf(yData, _n); _zData = Arrays.copyOf(zData, _n); } /** * @param xData An array of <i>x</i> data, not null, no null elements. * @param yData An array of <i>y</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param zData An array of <i>z</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param name The surface name */ public DoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData, final String name) { super(name); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.length == yData.length); Validate.isTrue(xData.length == zData.length); _n = xData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { Validate.notNull(xData[i]); Validate.notNull(yData[i]); Validate.notNull(zData[i]); _xData[i] = xData[i]; _yData[i] = yData[i]; _zData[i] = zData[i]; } } /** * @param xData A list of <i>x</i> data, not null, no null elements. * @param yData A list of <i>y</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param zData A list of <i>z</i> data, not null, no null elements. Must be the same length as the <i>x</i> data. * @param name The surface name */ public DoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData, final String name) { super(name); Validate.notNull(xData, "x data"); Validate.notNull(yData, "y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xData.size() == yData.size()); Validate.isTrue(xData.size() == zData.size()); _n = xData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final Double x = xData.get(i); final Double y = yData.get(i); final Double z = zData.get(i); Validate.notNull(x); Validate.notNull(y); Validate.notNull(z); _xData[i] = x; _yData[i] = y; _zData[i] = z; } } /** * @param xyData An array of <i>x-y</i> data, not null, no null elements. * @param zData An array of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. * @param name The surface name */ public DoublesSurface(final DoublesPair[] xyData, final double[] zData, final String name) { super(name); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.length == zData.length); _n = xyData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = Arrays.copyOf(zData, _n); for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData[i]; Validate.notNull(pair); Validate.notNull(zData[i]); _xData[i] = pair.first; _yData[i] = pair.second; } } /** * @param xyData An array of <i>x-y</i> data, not null, no null elements. * @param zData An array of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. * @param name The surface name */ public DoublesSurface(final DoublesPair[] xyData, final Double[] zData, final String name) { super(name); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.length == zData.length); _n = xyData.length; _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData[i]; Validate.notNull(pair); Validate.notNull(zData[i]); _xData[i] = pair.first; _yData[i] = pair.second; _zData[i] = zData[i]; } } /** * @param xyData A list of <i>x-y</i> data, not null, no null elements. * @param zData A list of <i>z</i> data, not null. Must be the same length as the <i>x-y</i> data. * @param name The surface name */ public DoublesSurface(final List<DoublesPair> xyData, final List<Double> zData, final String name) { super(name); Validate.notNull(xyData, "x-y data"); Validate.notNull(zData, "z data"); Validate.isTrue(xyData.size() == zData.size()); _n = xyData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; for (int i = 0; i < _n; i++) { final DoublesPair pair = xyData.get(i); final Double z = zData.get(i); Validate.notNull(pair); Validate.notNull(z); _xData[i] = pair.first; _yData[i] = pair.second; _zData[i] = z; } } /** * @param xyzData A map of <i>x-y</i> data to <i>z</i> data, not null, no null elements. * @param name The surface name */ public DoublesSurface(final Map<DoublesPair, Double> xyzData, final String name) { super(name); Validate.notNull(xyzData, "x-y-z data"); _n = xyzData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; int i = 0; for (final Map.Entry<DoublesPair, Double> entry : xyzData.entrySet()) { Validate.notNull(entry.getKey()); Validate.notNull(entry.getValue()); _xData[i] = entry.getKey().first; _yData[i] = entry.getKey().second; _zData[i++] = entry.getValue(); } } /** * @param xyzData A list of <i>x-y-z</i> data, not null, no null elements. * @param name The surface name */ public DoublesSurface(final List<Triple<Double, Double, Double>> xyzData, final String name) { super(name); Validate.notNull(xyzData, "x-y-z data"); _n = xyzData.size(); _xData = new double[_n]; _yData = new double[_n]; _zData = new double[_n]; int i = 0; for (final Triple<Double, Double, Double> entry : xyzData) { Validate.notNull(entry); final double x = entry.getFirst(); final double y = entry.getSecond(); final double z = entry.getThird(); _xData[i] = x; _yData[i] = y; _zData[i] = z; i++; } } /** * {@inheritDoc} */ @Override public Double[] getXData() { if (_xDataObject != null) { return _xDataObject; } _xDataObject = new Double[_n]; for (int i = 0; i < _n; i++) { _xDataObject[i] = _xData[i]; } return _xDataObject; } /** * {@inheritDoc} */ @Override public Double[] getYData() { if (_yDataObject != null) { return _yDataObject; } _yDataObject = new Double[_n]; for (int i = 0; i < _n; i++) { _yDataObject[i] = _yData[i]; } return _yDataObject; } /** * {@inheritDoc} */ @Override public Double[] getZData() { if (_zDataObject != null) { return _zDataObject; } _zDataObject = new Double[_n]; for (int i = 0; i < _n; i++) { _zDataObject[i] = _zData[i]; } return _zDataObject; } /** * @return The <i>x</i> data as an array of primitives */ public double[] getXDataAsPrimitive() { return _xData; } /** * @return The <i>y</i> data as an array of primitives */ public double[] getYDataAsPrimitive() { return _yData; } /** * @return The <i>z</i> data as an array of primitives */ public double[] getZDataAsPrimitive() { return _zData; } /** * {@inheritDoc} */ @Override public int size() { return _n; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + Arrays.hashCode(_xData); result = prime * result + Arrays.hashCode(_yData); result = prime * result + Arrays.hashCode(_zData); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } final DoublesSurface other = (DoublesSurface) obj; if (!Arrays.equals(_xData, other._xData)) { return false; } if (!Arrays.equals(_yData, other._yData)) { return false; } if (!Arrays.equals(_zData, other._zData)) { return false; } return true; } }