/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.cube;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.Validate;
/**
* Parent class for a family of curves that have real <i>(x, y, z, value)</i> points.
*/
public abstract class DoublesCube extends Cube<Double, Double, Double, Double> {
private final int _n;
private final double[] _xData;
private final double[] _yData;
private final double[] _zData;
private final double[] _values;
private Double[] _xDataObject;
private Double[] _yDataObject;
private Double[] _zDataObject;
private Double[] _valuesObject;
/**
* @param xData An array of <i>x</i> data, not null
* @param yData An array of <i>y</i> data, not null, must be the same length as the <i>x</i> data array
* @param zData An array of <i>z</i> data, not null, must be the same length as the <i>x</i> data array
* @param values An array of <i>values</i> , not null, must be the same length as the <i>x</i> data array
*/
public DoublesCube(final double[] xData, final double[] yData, final double[] zData, final double[] values) {
super();
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "values");
_n = xData.length;
Validate.isTrue(_n == yData.length);
Validate.isTrue(_n == zData.length);
Validate.isTrue(_n == values.length);
_xData = Arrays.copyOf(xData, _n);
_yData = Arrays.copyOf(yData, _n);
_zData = Arrays.copyOf(zData, _n);
_values = Arrays.copyOf(values, _n);
}
/**
* @param xData An array of <i>x</i> data, not null
* @param yData An array of <i>y</i> data, not null, must be the same length as the <i>x</i> data array
* @param zData An array of <i>z</i> data, not null, must be the same length as the <i>x</i> data array
* @param values An array of <i>values</i> , not null, must be the same length as the <i>x</i> data array
*/
public DoublesCube(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] values) {
super();
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "data");
_n = xData.length;
Validate.isTrue(_n == yData.length);
Validate.isTrue(_n == zData.length);
Validate.isTrue(_n == values.length);
_xData = new double[_n];
_yData = new double[_n];
_zData = new double[_n];
_values = new double[_n];
for (int i = 0; i < _n; i++) {
Validate.notNull(xData[i], "element " + i + " of x data");
Validate.notNull(yData[i], "element " + i + " of y data");
Validate.notNull(zData[i], "element " + i + " of z data");
Validate.notNull(values[i], "element " + i + " of data");
_xData[i] = xData[i];
_yData[i] = yData[i];
_zData[i] = zData[i];
_values[i] = values[i];
}
}
/**
* @param xData A list of <i>x</i> data, not null
* @param yData A list of <i>y</i> data, not null, must be the same length as the <i>x</i> data list
* @param zData A list of <i>z</i> data, not null, must be the same length as the <i>x</i> data list
* @param values A list of <i>values</i> , not null, must be the same length as the <i>x</i> data list
*/
public DoublesCube(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> values) {
super();
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "data");
_n = xData.size();
Validate.isTrue(_n == yData.size());
Validate.isTrue(_n == zData.size());
Validate.isTrue(_n == values.size());
_xData = new double[_n];
_yData = new double[_n];
_zData = new double[_n];
_values = 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);
final Double value = values.get(i);
Validate.notNull(x, "element " + i + " of x data");
Validate.notNull(y, "element " + i + " of y data");
Validate.notNull(z, "element " + i + " of z data");
Validate.notNull(value, "element " + i + " of data");
_xData[i] = x;
_yData[i] = y;
_zData[i] = z;
_values[i] = value;
}
}
/**
* @param xData An array of <i>x</i> data, not null
* @param yData An array of <i>y</i> data, not null, must be the same length as the <i>x</i> data array
* @param zData An array of <i>z</i> data, not null, must be the same length as the <i>x</i> data array
* @param values An array of <i>values</i> , not null, must be the same length as the <i>x</i> data array
* @param name The name of the cube
*/
public DoublesCube(final double[] xData, final double[] yData, final double[] zData, final double[] values, final String name) {
super(name);
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "data");
_n = xData.length;
Validate.isTrue(_n == yData.length);
Validate.isTrue(_n == zData.length);
Validate.isTrue(_n == values.length);
_xData = Arrays.copyOf(xData, _n);
_yData = Arrays.copyOf(yData, _n);
_zData = Arrays.copyOf(zData, _n);
_values = Arrays.copyOf(values, _n);
}
/**
* @param xData An array of <i>x</i> data, not null
* @param yData An array of <i>y</i> data, not null, must be the same length as the <i>x</i> data array
* @param zData An array of <i>z</i> data, not null, must be the same length as the <i>x</i> data array
* @param values An array of <i>values</i> , not null, must be the same length as the <i>x</i> data array
* @param name The name of the cube
*/
public DoublesCube(final Double[] xData, final Double[] yData, final Double[] zData, final Double[] values, final String name) {
super(name);
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "data");
_n = xData.length;
Validate.isTrue(_n == yData.length);
Validate.isTrue(_n == zData.length);
Validate.isTrue(_n == values.length);
_xData = new double[_n];
_yData = new double[_n];
_zData = new double[_n];
_values = new double[_n];
for (int i = 0; i < _n; i++) {
Validate.notNull(xData[i], "element " + i + " of x data");
Validate.notNull(yData[i], "element " + i + " of y data");
Validate.notNull(zData[i], "element " + i + " of z data");
Validate.notNull(values[i], "element " + i + " of data");
_xData[i] = xData[i];
_yData[i] = yData[i];
_zData[i] = zData[i];
_values[i] = values[i];
}
}
/**
* @param xData A list of <i>x</i> data, not null
* @param yData A list of <i>y</i> data, not null, must be the same length as the <i>x</i> data list
* @param zData A list of <i>z</i> data, not null, must be the same length as the <i>x</i> data list
* @param values A list of <i>values</i> , not null, must be the same length as the <i>x</i> data list
* @param name The name of the cube
*/
public DoublesCube(final List<Double> xData, final List<Double> yData, final List<Double> zData, final List<Double> values, final String name) {
super(name);
Validate.notNull(xData, "x data");
Validate.notNull(yData, "y data");
Validate.notNull(zData, "z data");
Validate.notNull(values, "data");
_n = xData.size();
Validate.isTrue(_n == yData.size());
Validate.isTrue(_n == zData.size());
Validate.isTrue(_n == values.size());
_xData = new double[_n];
_yData = new double[_n];
_zData = new double[_n];
_values = 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);
final Double value = values.get(i);
Validate.notNull(x, "element " + i + " of x data");
Validate.notNull(y, "element " + i + " of y data");
Validate.notNull(z, "element " + i + " of z data");
Validate.notNull(value, "element " + i + " of data");
_xData[i] = x;
_yData[i] = y;
_zData[i] = z;
_values[i] = value;
}
}
@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;
}
@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;
}
@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;
}
@Override
public Double[] getValues() {
if (_valuesObject != null) {
return _valuesObject;
}
_valuesObject = new Double[_n];
for (int i = 0; i < _n; i++) {
_valuesObject[i] = _values[i];
}
return _valuesObject;
}
/**
* Returns the <i>x</i> data points as a primitive array
* @return The <i>x</i> data
*/
public double[] getXDataAsPrimitive() {
return _xData;
}
/**
* Returns the <i>y</i> data points as a primitive array
* @return The <i>y</i> data
*/
public double[] getYDataAsPrimitive() {
return _yData;
}
/**
* Returns the <i>z</i> data points as a primitive array
* @return The <i>z</i> data
*/
public double[] getZDataAsPrimitive() {
return _zData;
}
/**
* Returns the values as a primitive array
* @return The values
*/
public double[] getValuesAsPrimitive() {
return _values;
}
@Override
public int size() {
return _n;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Arrays.hashCode(_values);
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 DoublesCube other = (DoublesCube) obj;
if (!Arrays.equals(_values, other._values)) {
return false;
}
if (!Arrays.equals(_xData, other._xData)) {
return false;
}
if (!Arrays.equals(_yData, other._yData)) {
return false;
}
return Arrays.equals(_zData, other._zData);
}
}