package gdsc.smlm.ga; import org.junit.Assert; import org.junit.Test; import gdsc.core.test.TimingResult; import gdsc.core.test.TimingService; import gdsc.core.test.TimingTask; public class RampedSelectionStrategyTest { @Test public void canSearchUsingActualKey() { long[] sum = RampedSelectionStrategy.createSum(10); for (int i = 0; i < sum.length - 1; i++) { long key = sum[i]; int j = RampedSelectionStrategy.search(sum, key); Assert.assertEquals(i + 1, j); } } @Test public void canBinarySearchUsingActualKey() { long[] sum = RampedSelectionStrategy.createSum(10); for (int i = 0; i < sum.length - 1; i++) { long key = sum[i]; int j = RampedSelectionStrategy.binarySearch(sum, key); Assert.assertEquals(i + 1, j); } } @Test public void canSearchUsingNotActualKey() { long[] sum = RampedSelectionStrategy.createSum(10); for (int i = 0; i < sum.length; i++) { long key = sum[i] - 1; int j = RampedSelectionStrategy.search(sum, key); Assert.assertEquals(i, j); } } @Test public void canBinarySearchUsingNotActualKey() { long[] sum = RampedSelectionStrategy.createSum(10); for (int i = 0; i < sum.length; i++) { long key = sum[i] - 1; int j = RampedSelectionStrategy.binarySearch(sum, key); Assert.assertEquals(i, j); } } @Test public void binarySearchEqualsSearch() { long[] sum = RampedSelectionStrategy.createSum(100); for (int key = (int) sum[sum.length - 1]; key-- > 0;) { int i = RampedSelectionStrategy.search(sum, key); int j = RampedSelectionStrategy.binarySearch(sum, key); Assert.assertEquals(i, j); } } @Test public void speedTest50() { speedTest(50, false, 10); } @Test public void speedTest200() { speedTest(200, true, 5); } @Test public void speedTest1000() { speedTest(1000, true, 2); } // Too slow for common use //@Test public void speedTest5000() { speedTest(5000, true, 1); } private void speedTest(final int size, boolean faster, int runs) { final long[] sum = RampedSelectionStrategy.createSum(size); TimingService ts = new TimingService(runs); ts.execute(new TimingTask() { public Object getData(int i) { return sum; } public Object run(Object data) { for (int key = (int) sum[sum.length - 1]; key-- > 0;) RampedSelectionStrategy.search(sum, key); return null; } public void check(int i, Object result) { } public int getSize() { return 1; } public String getName() { return "search" + size; } }); ts.execute(new TimingTask() { public Object getData(int i) { return sum[i]; } public Object run(Object data) { for (int key = (int) sum[sum.length - 1]; key-- > 0;) RampedSelectionStrategy.binarySearch(sum, key); return null; } public void check(int i, Object result) { } public int getSize() { return 1; } public String getName() { return "binarySearch" + size; } }); int n = ts.repeat(); ts.repeat(n); ts.report(); TimingResult slow = ts.get((faster) ? ts.getSize() - 2 : ts.getSize() - 1); TimingResult fast = ts.get((faster) ? ts.getSize() - 1 : ts.getSize() - 2); Assert.assertTrue(slow.getMin() > fast.getMin()); } }