Permuted1DConfiguration.java

package neureka.ndim.config.types.permuted;

import neureka.ndim.config.types.D1C;

public class Permuted1DConfiguration extends D1C {
    /**
     *  The shape of the NDArray.
     */
    protected final int _shape;
    /**
     *  The translation from a shape index (indices) to the index of the underlying data array.
     */
    private final int _stride;
    /**
     *  The mapping of the indices array.
     */
    private final int _indicesMap; // Maps index integer to array like translation. Used to avoid distortion when slicing!


    public static Permuted1DConfiguration construct(
            int[] shape,
            int[] strides,
            int[] indicesMap
    ) {
        return _cached( new Permuted1DConfiguration(shape[ 0 ], strides[ 0 ],  indicesMap[ 0 ]) );
    }

    protected Permuted1DConfiguration(
            int shape,
            int stride,
            int indicesMap
    ) {
        _shape      = shape;
        _stride     = stride;
        _indicesMap = indicesMap;
        assert stride != 0;
        assert indicesMap != 0;
    }

    /** {@inheritDoc} */
    @Override public final int rank() { return 1; }

    /** {@inheritDoc} */
    @Override public final int[] shape() { return new int[]{_shape}; }

    /** {@inheritDoc} */
    @Override public final int shape( int i ) { return _shape; }

    /** {@inheritDoc} */
    @Override public final int[] indicesMap() { return new int[]{_indicesMap}; }

    /** {@inheritDoc} */
    @Override public final int indicesMap( int i ) { return _indicesMap; }

    /** {@inheritDoc} */
    @Override public final int[] strides() { return new int[]{_stride}; }

    /** {@inheritDoc} */
    @Override public final int strides(int i ) { return _stride; }

    /** {@inheritDoc} */
    @Override public final int[] spread() { return new int[]{1}; }

    /** {@inheritDoc} */
    @Override public final int spread( int i ) { return 1; }

    /** {@inheritDoc} */
    @Override public final int[] offset() { return new int[]{0}; }

    /** {@inheritDoc} */
    @Override public final int offset( int i ) { return 0; }

    /** {@inheritDoc} */
    @Override public final int indexOfIndex( int index ) { return ( index / _indicesMap ) * _stride; }

    /** {@inheritDoc} */
    @Override public final int[] indicesOfIndex( int index ) { return new int[]{index / _indicesMap}; }

    /** {@inheritDoc} */
    @Override public final int indexOfIndices( int[] indices ) { return indices[ 0 ] * _stride; }

    /** {@inheritDoc} */
    @Override public final int indexOfIndices( int d1 ) { return d1 * _stride; }

}