/*- * Copyright (c) 2011, 2014, 2016 Diamond Light Source Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Jacob Filik - initial API and implementation and/or initial documentation * Matthew Gerring - initial API and implementation and/or initial documentation */ package org.eclipse.dawnsci.analysis.dataset; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; import org.eclipse.january.DatasetException; import org.eclipse.january.dataset.Comparisons; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.DoubleDataset; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.dataset.Random; import org.junit.Assert; import org.junit.Test; /** * @see the full slicing unit tests in plugin uk.ac.diamond.scisoft.analysis.test * package uk/ac/diamond/scisoft/analysis/dataset * @author Matthew Gerring * */ public class StreamTest { @Test public void testLazyDatasetStream() { Dataset original = DatasetFactory.createRange(DoubleDataset.class,10); Dataset a = original.getSlice().reshape(new int[]{1,1,10}); a = DatasetUtils.tile(a, new int[]{4,5,1}); Stream<ILazyDataset> lzStream = SliceStreamSupport.stream(a, false, 0, 1); doTest(lzStream.map(d -> safeSlice(d)), original); } @Test public void testDatasetStream() { Dataset original = DatasetFactory.createRange(DoubleDataset.class,10); Dataset a = original.getSlice().reshape(new int[]{1,1,10}); a = DatasetUtils.tile(a, new int[]{4,5,1}); Stream<IDataset> lzStream = SliceStreamSupport.sliceStream(a, false, 0, 1); doTest(lzStream,original); } private void doTest(Stream<IDataset> stream, Dataset original) { List<Double> collect = stream.map(d -> d.max().doubleValue()).collect(Collectors.toList()); Dataset d = DatasetFactory.createFromList(collect); Assert.assertTrue(Comparisons.equalTo(original, d).all()); } private static IDataset safeSlice(ILazyDataset lz) { try { return lz.getSlice(); } catch (DatasetException e) { throw new RuntimeException("Couldn't slice data"); } } @Test public void iterateImagesNDStream() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); // That is more like it! SliceStreamSupport.stream(lz, 2,3).forEach(image -> assertTrue(Arrays.equals(new int[]{1,1,100, 100}, image.getShape()))); } @Test public void iterateImageSumStream1() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, 2, 3).map(set->set.max()).collect(Collectors.toList()); assertEquals(64*64, maxes.size()); } @Test public void iterateImageSumStream2() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, 0, 1).map(set->set.max()).collect(Collectors.toList()); assertEquals(100*100, maxes.size()); } @Test public void iterateImageSumStream3() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, 0, 2).map(set->set.max()).collect(Collectors.toList()); assertEquals(64*100, maxes.size()); } @Test public void iterateImageSumStream1DotParallel() throws DatasetException { final ILazyDataset lz = DatasetFactory.ones(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, 2, 3).parallel().map(set->set.max()).collect(Collectors.toList()); assertEquals(64*64, maxes.size()); } @Test public void iterateImageSumStream2DotParallel() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, 0, 1).parallel().map(set->set.max()).collect(Collectors.toList()); assertEquals(100*100, maxes.size()); } @Test public void iterateImageSumStream1BooleanParallel() throws DatasetException { final ILazyDataset lz = DatasetFactory.ones(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, true, 2, 3).map(set->set.max()).collect(Collectors.toList()); assertEquals(64*64, maxes.size()); } @Test public void iterateImageSumStream2BooleanParallel() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); List<Number> maxes = SliceStreamSupport.sliceStream(lz, true, 0, 1).map(set->set.max()).collect(Collectors.toList()); assertEquals(100*100, maxes.size()); } @Test public void iterateImagesStreamMaxImage() throws DatasetException { final ILazyDataset lz = Random.lazyRand(64, 64, 100, 100); Dataset sum = DatasetFactory.zeros(1,1,100, 100); SliceStreamSupport.sliceStream(lz, 2, 3).forEach(image -> sum.iadd(image)); IntStream.range(0, sum.getSize()).forEach(i -> assertTrue("The sum is "+sum.getElementDoubleAbs(i), sum.getElementDoubleAbs(i)>1000)); } }