package gdsc.smlm.results.filter;
import org.apache.commons.math3.random.RandomGenerator;
import org.apache.commons.math3.random.Well19937c;
/*-----------------------------------------------------------------------------
* GDSC SMLM Software
*
* Copyright (C) 2016 Alex Herbert
* Genome Damage and Stability Centre
* University of Sussex, UK
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*---------------------------------------------------------------------------*/
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 FilterTest
{
@Test
public void canCompareMultiFilter()
{
RandomGenerator randomGenerator = new Well19937c(System.currentTimeMillis() + System.identityHashCode(this));
MultiFilter f = new MultiFilter(0, 0, 0, 0, 0, 0, 0);
for (int i = 1000; i-- > 0;)
{
MultiFilter f1 = (MultiFilter) f.create(random(f.getNumberOfParameters(), randomGenerator));
MultiFilter f2 = (MultiFilter) f.create(random(f.getNumberOfParameters(), randomGenerator));
int e = f1.weakest((Filter) f2);
int o = f1.weakest(f2);
Assert.assertEquals(e, o);
}
}
@Test
public void canCompareMultiFilter2()
{
RandomGenerator randomGenerator = new Well19937c(System.currentTimeMillis() + System.identityHashCode(this));
MultiFilter2 f = new MultiFilter2(0, 0, 0, 0, 0, 0, 0);
for (int i = 1000; i-- > 0;)
{
MultiFilter2 f1 = (MultiFilter2) f.create(random(f.getNumberOfParameters(), randomGenerator));
MultiFilter2 f2 = (MultiFilter2) f.create(random(f.getNumberOfParameters(), randomGenerator));
int e = f1.weakest((Filter) f2);
int o = f1.weakest(f2);
Assert.assertEquals(e, o);
}
}
@Test
public void directCompareMultiFilterIsFaster()
{
RandomGenerator randomGenerator = new Well19937c(System.currentTimeMillis() + System.identityHashCode(this));
final MultiFilter f1 = new MultiFilter(0, 0, 0, 0, 0, 0, 0);
final MultiFilter2 f2 = new MultiFilter2(0, 0, 0, 0, 0, 0, 0);
final double[][][] data = new double[1000][][];
for (int i = data.length; i-- > 0;)
{
data[i] = new double[][] { random(f1.getNumberOfParameters(), randomGenerator),
random(f1.getNumberOfParameters(), randomGenerator) };
}
TimingService ts = new TimingService();
ts.execute(new TimingTask()
{
public Object getData(int i)
{
return new MultiFilter[] { (MultiFilter) f1.create(data[i][0]), (MultiFilter) f1.create(data[i][1]) };
}
public Object run(Object data)
{
MultiFilter f1 = ((MultiFilter[]) data)[0];
MultiFilter f2 = ((MultiFilter[]) data)[1];
f1.weakest((Filter) f2);
return null;
}
public void check(int i, Object result)
{
}
public int getSize()
{
return data.length;
}
public String getName()
{
return "MultiFilter";
}
});
ts.execute(new TimingTask()
{
public Object getData(int i)
{
return new MultiFilter[] { (MultiFilter) f1.create(data[i][0]), (MultiFilter) f1.create(data[i][1]) };
}
public Object run(Object data)
{
MultiFilter f1 = ((MultiFilter[]) data)[0];
MultiFilter f2 = ((MultiFilter[]) data)[1];
f1.weakest(f2);
return null;
}
public void check(int i, Object result)
{
}
public int getSize()
{
return data.length;
}
public String getName()
{
return "MultiFilter direct";
}
});
ts.execute(new TimingTask()
{
public Object getData(int i)
{
return new MultiFilter2[] { (MultiFilter2) f2.create(data[i][0]),
(MultiFilter2) f2.create(data[i][1]) };
}
public Object run(Object data)
{
MultiFilter2 f1 = ((MultiFilter2[]) data)[0];
MultiFilter2 f2 = ((MultiFilter2[]) data)[1];
f1.weakest((Filter) f2);
return null;
}
public void check(int i, Object result)
{
}
public int getSize()
{
return data.length;
}
public String getName()
{
return "MultiFilter2";
}
});
ts.execute(new TimingTask()
{
public Object getData(int i)
{
return new MultiFilter2[] { (MultiFilter2) f2.create(data[i][0]),
(MultiFilter2) f2.create(data[i][1]) };
}
public Object run(Object data)
{
MultiFilter2 f1 = ((MultiFilter2[]) data)[0];
MultiFilter2 f2 = ((MultiFilter2[]) data)[1];
f1.weakest(f2);
return null;
}
public void check(int i, Object result)
{
}
public int getSize()
{
return data.length;
}
public String getName()
{
return "MultiFilter2 direct";
}
});
ts.check();
int size = ts.repeat();
ts.repeat(size);
ts.report();
for (int i = 0; i < ts.getSize(); i += 2)
{
TimingResult slow = ts.get(i);
TimingResult fast = ts.get(i + 1);
Assert.assertTrue(slow.getMin() > fast.getMin());
}
}
private double[] random(int n, RandomGenerator r)
{
double[] p = new double[n];
while (n-- > 0)
p[n] = r.nextInt(3);
return p;
}
}