package mikera.arrayz;
import java.io.Serializable;
import java.nio.DoubleBuffer;
import java.util.Iterator;
import java.util.List;
import mikera.indexz.AIndex;
import mikera.indexz.Index;
import mikera.matrixx.AMatrix;
import mikera.vectorz.AScalar;
import mikera.vectorz.AVector;
import mikera.vectorz.IOperator;
import mikera.vectorz.Op;
import mikera.vectorz.Vector;
/**
* Interface for general multi-dimensional arrays of doubles
*
* All Vectorz array types (including all vectors and matrices) must implement this interface.
*
* Arrays have the following properties:
* - They behave as an indexed, multi-dimensional array of doubles
* - They have a n-dimensional shape vector (conceptually equivalent to a list of integers)
* - The may sometimes have size 0 dimensions, but not all array types support this.
*
* @author Mike
*/
public interface INDArray extends Cloneable, Serializable {
/**
* Returns the dimensionality of the array (number of dimensions in the array shape)
* e.g. 0 for a scalar, 1 for a vector, 2 for a matrix etc.
*/
public int dimensionality();
/**
* Returns the shape of the array as an array of ints.
*
* WARNING: May return the internal int[] array describing the shape. Modifying this may cause undefined behaviour.
* If you want to guarantee a new int[] array that can be safely modified, use getShapeClone() instead
*/
public int[] getShape();
/**
* Returns the shape of the array as an array of ints, guaranteed to be a new array
* i.e. will perform a defensive copy of any internal shape array if required.
*/
public int[] getShapeClone();
/**
* Returns the dimension size for a specific dimension in the array's shape
* Throws an error if the dimension does not exist.
*/
public int getShape(int dim);
/**
* Returns the shape of the array as an array of longs.
*/
public long[] getLongShape();
/**
* Returns the double value at the specified position in the array
*/
public double get(AIndex ix);
/**
* Returns the double value at the specified position in the array
*/
public double get(Index ix);
/**
* Returns the double value of a scalar array
*/
public double get();
/**
* Returns the double value at the specified position in a 1D vector
*/
public double get(int x);
/**
* Returns the double value at the specified position in a 1D vector
*/
public double get(long x);
/**
* Returns the double value at the specified position in a 2D matrix
*/
public double get(int x, int y);
/**
* Returns the double value at the specified position in a 2D matrix
*/
public double get(long x, long y);
/**
* Returns the double value at the specified index position in an array
*/
public double get(int... indexes);
/**
* Returns the double value at the specified index position in an array
*/
public double get(long[] indexes);
/**
* Sets all elements of an array to a specific double value
*/
public void set(double value);
/**
* Sets a value at a given position in a mutable 1D array
*
* @param i
* @param value
*/
public void set(int i, double value);
/**
* Sets a value at a given position in a mutable 2D array
*
* @param i
* @param value
*/
public void set(int i, int j, double value);
/**
* Sets a value at a given indexed position in a mutable array
*
* @param i
* @param value
*/
public void set(int[] indexes, double value);
/**
* Sets this array to the element values contained in another array
*/
public void set(INDArray a);
/**
* Sets this array to the element values contained in the given object.
* Attempts to interpret the object as an array
*/
public void set(Object o);
/**
* Adds a double value to all elements in this array
*/
public void add(double a);
/**
* Creates a new array equal to the sum of this array with another array.
*
* @param a
* @return
*/
public INDArray addCopy(INDArray a);
/**
* Adds all the elements of this array to a double array, in row-major order
*/
public void addToArray(double[] data, int offset);
/**
* Subtracts a double value from all elements in this array
*/
public void sub(double a);
/**
* Creates a new array equal to the subtraction of another array from this array
*
* @param a
* @return
*/
public INDArray subCopy(INDArray a);
/**
* Adds all the elements of another array to this array, in an elementwise order.
*/
public void add(INDArray a);
/**
* Adds to a mutable array, indexed by element position.
* This is an unsafe operation: bounds are not checked
*/
public void addAt(int i, double v);
/**
* Subtracts all the elements of another array from this array, in an elementwise order.
*/
public void sub(INDArray a);
/**
* Fills the array with a single double value
*/
public void fill(double value);
/**
* Negates all elements in the array in place
*/
public void negate();
/**
* Negates all elements in the array, returning a new array
*/
public INDArray negateCopy();
/**
* Replaces all elements in the array with their reciprocal
*/
public void reciprocal();
/**
* Returns a new array where every element is the reciprocal of the corresponding element in this array
*/
public INDArray reciprocalCopy();
/**
* Clamps all the elements of this array within the specified [min,max] range
*/
public void clamp(double min, double max);
/**
* Calculates the inner product of this array with another array.
*/
public INDArray innerProduct(INDArray a);
/**
* Calculates the inner product of this array with a double value
*/
public INDArray innerProduct(double a);
/**
* Calculates the inner product of this array with a scalar
*/
public INDArray innerProduct(AScalar a);
/**
* Calculates the outer product of this array with another array.
*/
public INDArray outerProduct(INDArray a);
/**
* Constructs a view of the array as a single vector in row-major order.
*/
public AVector asVector();
/**
* Returns a list containing all elements of this array
*/
public List<Double> asElementList();
/**
* Returns a new array by rearranging the elements of this array into the desired shape
* Truncates or zero-pads the elements as required to fill the new shape
*/
public INDArray reshape(int... shape);
/**
* Returns a re-ordered array by taking the specified order of slices along a given dimension
*
* May or may not use views of underlying slices (i.e. may be a reordered view)
*/
public INDArray reorder(int dimension, int[] order);
/**
* Returns a re-ordered array by taking the specified order of slices along dimension 0
*/
public INDArray reorder(int[] order);
/**
* Returns rotated view of this array
*/
public INDArray rotateView(int dimension, int shift);
/**
* Returns a view of this array broadcasted up to a larger shape
*/
public INDArray broadcast(int... shape);
/**
* Broadcasts to match the shape of the target
*/
public INDArray broadcastLike(INDArray target);
public AMatrix broadcastLike(AMatrix target);
public AVector broadcastLike(AVector target);
/**
* Creates a mutable clone of the array, broadcasted if necessary to match the shape of the target
*/
public INDArray broadcastCloneLike(INDArray target);
/**
* Creates a copy of the array, broadcasted if necessary to match the shape of the target
* Like broadCastCloneLike, but does not guarantee a mutable clone - hence may be faster
* when used with immutable or specialised arrays
*/
public INDArray broadcastCopyLike(INDArray target);
/**
* Returns the specified major slice of this array as a view (slice along dimension 0)
*
* 0 dimensional slice results are permitted, but attempting to slice a 0 dimensional array
* will result in an error.
*/
public INDArray slice(int majorSlice);
/**
* Returns the value of a major slice of this array (slice along dimension 0)
*
* Like 'slice', except returns a Double value for slices of 1D vectors
*/
public Object sliceValue(int majorSlice);
/**
* Joins an array with another array along a specified dimension
*/
public INDArray join(INDArray a, int dimension);
/**
* Joins an array with another array along the major dimension
*/
public INDArray join(INDArray a);
/**
* Returns a slice view of this array along the specified dimension
*/
public INDArray slice(int dimension, int index);
/**
* Returns a subarray view of a larger array
*/
public INDArray subArray(int[] offsets, int[] shape);
/**
* Returns the transpose of this array. A transpose of an array is equivalent to
* reversing the order of dimensions.
*
* May or may not return a view depending on the array type.
*/
public INDArray getTranspose();
/**
* Returns a transposed view of the array. May throw UnsupportedOperationException
* if the array type does not support this capability
*/
public INDArray getTransposeView();
/**
* Returns a transposed copy of the array. Guarantees a new mutable defensive copy.
*/
public INDArray getTransposeCopy();
/**
* Returns the number of major slices in this array (i.e. the size of dimension 0)
*/
public int sliceCount();
/**
* Returns the total number of elements in this array. Equivalent to the product all dimension sizes.
*/
public long elementCount();
/**
* Returns the sum of all elements in this array.
*/
public double elementSum();
/**
* Returns the maximum element value in this array. Throws an error if there are no elements.
*/
public double elementMax();
/**
* Returns the maximum element value in this array. Throws an error if there are no elements.
*/
public double elementMin();
/**
* Returns the sum of squared elements in this array.
*/
public double elementSquaredSum();
/**
* Returns an iterator over all elements in this array, in row-major order
*/
public Iterator<Double> elementIterator();
/**
* Multiplies all elements by the equivalent elements in a second array, i.e. performs elementwise multiplication.
*
* If matrix-style multiplication is required, use innerProduct instead.
*/
public void multiply(INDArray a);
/**
* Multiplies all elements by the equivalent elements in a second array, i.e. performs elementwise multiplication.
* Returns a new array.
*
* If matrix-style multiplication is required, use innerProduct instead.
*/
public INDArray multiplyCopy(INDArray a);
/**
* Divides all elements in place by the equivalent elements in a second array
*/
public void divide(INDArray a);
/**
* Divides all elements by the equivalent elements in a second array. Returns a new array.
*/
public INDArray divideCopy(INDArray a);
/**
* Divides all elements by a given factor
*/
public void divide(double factor);
/**
* Returns the number of non-zero elements in the array.
*/
public long nonZeroCount();
/**
* Returns true if the INDArray is mutable (at least partially)
*/
public boolean isMutable();
/**
* Returns true if the array is boolean (contains only 0.0 or 1.0 values)
*/
public boolean isBoolean();
/**
* Returns true if the array is in a sparse format
*/
public boolean isSparse();
/**
* Returns true if the array is in a dense format.
*
* A dense format uses efficient storage proportional to the number of elements
*/
public boolean isDense();
/**
* If this method returns true, the INDArray is guaranteed to be fully mutable
* in all positions i.e. every position can store any valid double value
*/
public boolean isFullyMutable();
/**
* Returns true if this array has some constraints on element values
*/
public boolean isElementConstrained();
/**
* Returns true if this array is the same shape as another array
*/
public boolean isSameShape(INDArray a);
/**
* Return true if this array is a view type
*/
public boolean isView();
/**
* Returns true if the array is zero (all elements equal to zero)
*/
public boolean isZero();
/**
* Returns a clone of the array data, as a new array which will be fully mutable
* and may be of a different class to the original.
*
* Clone should attempt to return the most efficient possible array type.
*
* Clone should preserve sparsity property where possible, but this is not guaranteed.
*/
public INDArray clone();
/**
* Returns a defensive copy of the array data. Use this if the original array might change and you
* need a defensive copy.
*
* May return the same array if the original was immutable, otherwise will return a defensive copy.
*/
public INDArray copy();
/**
* Ensures the array is a fully mutable, efficient representation that is not
* a view. Returns either the same array or a new clone.
*/
@Deprecated
public INDArray ensureMutable();
/**
* Applies a unary operator to all elements of the array (in-place)
*/
void applyOp(Op op);
/**
* Applies a unary operator to all elements of the array (creating a new array)
*/
INDArray applyOpCopy(Op op);
/**
* Applies a unary operator to all elements of the array (in-place)
*/
void applyOp(IOperator op);
/**
* Returns true if the two arrays are exactly equal in value and shape
*/
public boolean equals(INDArray a);
/**
* Returns true if all elements are equal to a specific value
*/
public boolean elementsEqual(double value);
/**
* Returns an exact deep clone of an array (i.e. of the same class as the original).
*/
public INDArray exactClone();
/**
* Sets all elements in an array using the given double values
*/
public void setElements(double... values);
/**
* Sets all elements in an array using the given double values
*/
public void setElements(double[] values, int offset);
/**
* Sets elements in an array using the given double values
*/
public void setElements(int pos, double[] values, int offset, int length);
/**
* Gets all elements of the array, copying them into a double array at the specified offset
*/
public void getElements(double[] dest, int offset);
/**
* Gets all elements of the array, copying them into an object array at the specified offset
*/
public void getElements(Object[] dest, int offset);
/**
* Scales all elements of the array in place by a given double value
*/
public void scale(double factor);
/**
* Scales all elements of the array by a given double value, returning a new array
*/
public INDArray scaleCopy(double factor);
/**
* Scales all elements of the array by a given double value and adds a constant value
*/
public void scaleAdd(double factor, double constant);
/**
* Multiplies all elements of the array in place by a given double value
*/
public void multiply(double factor);
/**
* Raises all elements of the array to a specified power in place
*/
public void pow(double exponent);
/**
* Squares all elements of the array in place
*/
public void square();
/**
* Squares all elements of the array, returning a new array
*/
public INDArray squareCopy();
/**
* Computes the square root of all elements in the array
*/
public void sqrt();
/**
* Calculates the signum of all elements of the array
*/
public void signum();
/**
* Returns a list of all major slices of this array.
*
* Returns a list of Double values if a 1-dimensional array is sliced, otherwise a list of INDArray instances
*/
public List<?> getSlices();
/**
* Returns a list of all slices of this array along a given dimension.
*
* Returns a list of Double values if a 1-dimensional array is sliced, otherwise a list of INDArray instances
*/
public List<?> getSlices(int dimension);
/**
* Validates the internal data structure of the INDArray. Throws an exception on failure.
*
* Failure indicates a serious bug and/or data corruption.
*/
public void validate();
/**
* Copies all the elements of this INDArray to the specified double array
*/
public void copyTo(double[] arr);
/**
* Copies the elements of this INDArray to the specified double buffer
*/
public void toDoubleBuffer(DoubleBuffer dest);
/**
* Copies the elements of this INDArray to a new double array
*/
public double[] toDoubleArray();
/**
* Copies the slices of this array to a new INDArray[]
*/
public INDArray[] toSliceArray();
/**
* Returns the underlying double array representing the densely packed elements of this array
* Returns null if there is no such array
*/
public double[] asDoubleArray();
/**
* Returns a list of slices as mutable INDArray views.
*
* Note: will return a list of AScalar values when this array is a 1D vector
*
*/
public List<INDArray> getSliceViews();
/**
* Converts the array into a flattened dense Vector
*/
public Vector toVector();
/**
* Converts the array into a packed mutable Array instance
*/
public Array toArray();
/**
* Tests is this array is approximately equal to another array.
* The arrays must have the same shape
*/
public boolean epsilonEquals(INDArray a);
/**
* Tests is this array is approximately equal to another array, up to a given tolerance (epsilon)
* The arrays must have the same shape
*/
public boolean epsilonEquals(INDArray a, double epsilon);
/**
* Replaces all elements of this array with their absolute values, according to Math.abs(double)
*/
public void abs();
/**
* Computes the natural logarithm (in-place) for all array elements
*/
public void log();
/**
* Computes the function e^x (in-place) for all array elements
*/
public void exp();
/**
* Returns an immutable version of this INDArray's data. May return the same array if already immutable.
*/
public INDArray immutable();
/**
* Coerces this INDArray to a fully mutable format. May return the same INDArray if already fully mutable
*/
public INDArray mutable();
/**
* Creates a fully mutable clone of this array
*/
public INDArray mutableClone();
/**
* Coerces this INDArray to a sparse format, without changing its element values.
*
* May return the same INDArray if already sparse. May also mutate the internal structure of the original
* NDArray, or create a view over parts of the original INDArray. You should take a defensive copy of the original
* NDArray if any of this concerns you.
*
* The returned sparse array may not be fully mutable in all elements.
*/
public INDArray sparse();
/**
* Coerces this INDArray to a dense format, without changing its element values.
*
* May return the same INDArray if already dense. May also mutate the internal structure of the original
* NDArray, or create a view over parts of the original INDArray. You should take a defensive copy of the original
* NDArray if any of this concerns you.
*
* The returned dense array may not be fully mutable in all elements.
*/
public INDArray dense();
/**
* Creates a fully mutable clone of this array.
*
* Will use a sparse format if possible.
*/
public INDArray sparseClone();
/**
* Creates a fully mutable dense clone of this array.
*
* Will always use a dense format.
*/
public INDArray denseClone();
/**
* Returns true if the elements in this array exactly match the elements in the given array, in
* row-major order
*
* @param data
* @return
*/
public boolean equalsArray(double[] data);
/**
* Returns true if the elements in this array exactly match the elements in the given array, in
* row-major order
*
* @param data
* @return
*/
public boolean equalsArray(double[] data, int offset);
/**
* Computes the inner product of this array with a vector
* @param v
* @return
*/
public INDArray innerProduct(AVector v);
/**
* Returns a copy of the array with the abs operator applied to each element
* @return
*/
public INDArray absCopy();
/**
* Returns a copy of the array with the signum operator applied to each element
* @return
*/
public INDArray signumCopy();
/**
* Gets all elements of the array as a Java double[] array
* @return
*/
public double[] getElements();
/**
* Returns the product of all elements in the array.
* @return
*/
public double elementProduct();
/**
* Returns a copy of the array with all elements multiplied by a single constant value
* @param d
* @return
*/
public INDArray multiplyCopy(double d);
/**
* Returns true if any element is this array is NaN or infinite
* @return
*/
public boolean hasUncountable();
/**
* Returns the sum of all the elements raised to a specified power
* @return
*/
public double elementPowSum(double p);
/**
* Returns the sum of the absolute values of all the elements raised to a specified power
* @return
*/
public double elementAbsPowSum(double p);
/**
* Returns the number of components of this array.
*
* May return 0 if components are not supported
* @return
*/
public int componentCount();
/**
* Gets a component from the array at the specified index
*
* Will throw an error if components are not supported, or if the component is out of bounds as defined by 0 <= k <componentCount()
* @param k
* @return
*/
public INDArray getComponent(int k);
/**
* Returns a new array of the same shape/structure as the original but with the specified components.
*
* Components must be of a compatible type and identical shape to the original components.
*/
public INDArray withComponents(INDArray[] cs);
/**
* Gets all components in a new array, with length componentCount();
* @return
*/
INDArray[] getComponents();
}