package org.eclipse.dawnsci.analysis.dataset; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import java.util.stream.IntStream; import org.eclipse.january.dataset.ByteDataset; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.DoubleDataset; import org.eclipse.january.dataset.FloatDataset; import org.eclipse.january.dataset.IndexIterator; import org.eclipse.january.dataset.IntegerDataset; import org.eclipse.january.dataset.LongDataset; import org.eclipse.january.dataset.Random; import org.eclipse.january.dataset.ShortDataset; import org.eclipse.january.dataset.Slice; import org.junit.Test; public class FunctionalUtilsTest { @SuppressWarnings("unchecked") private static final Class <? extends Dataset>[] allDS = new Class[] { ByteDataset.class, ShortDataset.class, IntegerDataset.class, LongDataset.class, FloatDataset.class, DoubleDataset.class, }; private static final double TOLERANCE = 1e-15; @Test public void testDatasetIndexFunction() { Dataset a = DatasetFactory.createRange(144).reshape(12, -1); generateAndCheckFunction(a); generateAndCheckFunction(a.getTransposedView()); Dataset v = a.getSliceView(new Slice(3, 10), new Slice(null, null, -2)); generateAndCheckFunction(v); generateAndCheckFunction(v.getTransposedView()); Dataset z = a.getSliceView(new Slice(3, 3), new Slice(1, 1)); assertEquals(0, z.getSize()); generateAndCheckFunction(z); generateAndCheckFunction(z.getTransposedView()); } private int[] generateIndexes(Dataset v) { int size = v.getSize(); int[] eIndex = new int[size]; IndexIterator it = v.getIterator(); for (int i = 0; it.hasNext() || i < size ; i++) { // unnecessary check (is ORed) to keep SonarQube happy eIndex[i] = it.index; } return eIndex; } private void generateAndCheckFunction(Dataset v) { int[] eIndex = generateIndexes(v); int[] aIndex = IntStream.range(0, v.getSize()).map(DatasetStreamSupport.createDatasetIndexFunction(v)).toArray(); assertArrayEquals(eIndex, aIndex); } @Test public void testDatasetIndexStream() { testDatasetIndexStream(false); testDatasetIndexStream(true); } private void testDatasetIndexStream(boolean parallel) { Dataset a = DatasetFactory.createRange(144).reshape(12, -1); generateAndCheckStream(a, parallel); generateAndCheckStream(a.getTransposedView(), parallel); Dataset v = a.getSliceView(new Slice(3, 10), new Slice(null, null, -2)); generateAndCheckStream(v, parallel); generateAndCheckStream(v.getTransposedView(), parallel); Dataset z = a.getSliceView(new Slice(3, 3), new Slice(1, 1)); generateAndCheckStream(z, parallel); generateAndCheckStream(z.getTransposedView(), parallel); } private void generateAndCheckStream(Dataset v, boolean parallel) { int[] eIndex = generateIndexes(v); int[] aIndex = DatasetStreamSupport.createDatasetIndexStream(v, parallel).toArray(); assertArrayEquals(eIndex, aIndex); } private void testDatasetIntStream(Dataset a, boolean parallel) { int[] eArray = a.cast(IntegerDataset.class).getData(); int[] aArray = DatasetStreamSupport.createDatasetIntStream(a, parallel).toArray(); assertArrayEquals(eArray, aArray); Dataset v = a.getTransposedView(); eArray = v.copy(IntegerDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetIntStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); v = a.getSliceView(new Slice(3, 10), new Slice(null, null, -2)); eArray = v.copy(IntegerDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetIntStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); v = v.getTransposedView(); eArray = v.copy(IntegerDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetIntStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); Dataset z = a.getSliceView(new Slice(3, 3), new Slice(1, 1)); eArray = z.copy(IntegerDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetIntStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray); z = z.getTransposedView(); eArray = z.copy(IntegerDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetIntStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray); } private void testDatasetLongStream(Dataset a, boolean parallel) { long[] eArray = a.cast(LongDataset.class).getData(); long[] aArray = DatasetStreamSupport.createDatasetLongStream(a, parallel).toArray(); assertArrayEquals(eArray, aArray); Dataset v = a.getTransposedView(); eArray = v.copy(LongDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetLongStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); v = a.getSliceView(new Slice(3, 10), new Slice(null, null, -2)); eArray = v.copy(LongDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetLongStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); v = v.getTransposedView(); eArray = v.copy(LongDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetLongStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray); Dataset z = a.getSliceView(new Slice(3, 3), new Slice(1, 1)); eArray = z.copy(LongDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetLongStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray); z = z.getTransposedView(); eArray = z.copy(LongDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetLongStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray); } private void testDatasetDoubleStream(Dataset a, boolean parallel) { double[] eArray = a.cast(DoubleDataset.class).getData(); double[] aArray = DatasetStreamSupport.createDatasetDoubleStream(a, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); Dataset v = a.getTransposedView(); eArray = v.copy(DoubleDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetDoubleStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); v = a.getSliceView(new Slice(3, 10), new Slice(null, null, -2)); eArray = v.copy(DoubleDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetDoubleStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); v = v.getTransposedView(); eArray = v.copy(DoubleDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetDoubleStream(v, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); Dataset z = a.getSliceView(new Slice(3, 3), new Slice(1, 1)); eArray = z.copy(DoubleDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetDoubleStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); z = z.getTransposedView(); eArray = z.copy(DoubleDataset.class).getData(); aArray = DatasetStreamSupport.createDatasetDoubleStream(z, parallel).toArray(); assertArrayEquals(eArray, aArray, TOLERANCE); } @Test public void testDatasetIntStream() { Dataset a = Random.randn(0., 5000., 12, 12); for (Class<? extends Dataset> c : allDS) { Dataset v = a.cast(c); testDatasetIntStream(v, false); testDatasetIntStream(v, true); } } @Test public void testDatasetLongStream() { Dataset a = Random.randn(0., 5000., 12, 12); for (Class<? extends Dataset> c : allDS) { Dataset v = a.cast(c); testDatasetLongStream(v, false); testDatasetLongStream(v, true); } } @Test public void testDatasetDoubleStream() { Dataset a = Random.randn(0., 5000., 12, 12); for (Class<? extends Dataset> c : allDS) { Dataset v = a.cast(c); testDatasetDoubleStream(v, false); testDatasetDoubleStream(v, true); } } }