use of uk.ac.sussex.gdsc.smlm.function.FakeGradientFunction in project GDSC-SMLM by aherbert.
the class LvmGradientProcedureTest method gradientProcedureUnrolledComputesSameAsGradientProcedure.
private void gradientProcedureUnrolledComputesSameAsGradientProcedure(RandomSeed seed, int nparams, Type type, boolean precomputed) {
final int iter = 10;
final ArrayList<double[]> paramsList = new ArrayList<>(iter);
final ArrayList<double[]> yList = new ArrayList<>(iter);
createFakeData(RngUtils.create(seed.getSeed()), nparams, iter, paramsList, yList);
Gradient1Function func = new FakeGradientFunction(blockWidth, nparams);
if (precomputed) {
final double[] b = SimpleArrayUtils.newArray(func.size(), 0.1, 1.3);
func = OffsetGradient1Function.wrapGradient1Function(func, b);
}
final FastLog fastLog = type == Type.FAST_LOG_MLE ? getFastLog() : null;
final String name = String.format("[%d] %b", nparams, type);
// Create messages
final IndexSupplier msgR = new IndexSupplier(1, name + "Result: Not same ", null);
final IndexSupplier msgOb = new IndexSupplier(1, name + "Observations: Not same beta ", null);
final IndexSupplier msgOal = new IndexSupplier(1, name + "Observations: Not same alpha linear ", null);
final IndexSupplier msgOam = new IndexSupplier(1, name + "Observations: Not same alpha matrix ", null);
for (int i = 0; i < paramsList.size(); i++) {
final LvmGradientProcedure p1 = createProcedure(type, yList.get(i), func, fastLog);
p1.gradient(paramsList.get(i));
final LvmGradientProcedure p2 = LvmGradientProcedureUtils.create(yList.get(i), func, type, fastLog);
p2.gradient(paramsList.get(i));
// Exactly the same ...
Assertions.assertEquals(p1.value, p2.value, msgR.set(0, i));
Assertions.assertArrayEquals(p1.beta, p2.beta, msgOb.set(0, i));
Assertions.assertArrayEquals(p1.getAlphaLinear(), p2.getAlphaLinear(), msgOal.set(0, i));
final double[][] am1 = p1.getAlphaMatrix();
final double[][] am2 = p2.getAlphaMatrix();
Assertions.assertArrayEquals(am1, am2, msgOam.set(0, i));
}
}
use of uk.ac.sussex.gdsc.smlm.function.FakeGradientFunction in project GDSC-SMLM by aherbert.
the class WPoissonGradientProcedureTest method poissonGradientProcedureComputesSameAsWLsqGradientProcedure.
private void poissonGradientProcedureComputesSameAsWLsqGradientProcedure(RandomSeed seed, int nparams) {
final double[] var = dataCache.computeIfAbsent(seed, WPoissonGradientProcedureTest::createData);
final int iter = 10;
final ArrayList<double[]> paramsList = new ArrayList<>(iter);
final UniformRandomProvider rng = RngUtils.create(seed.getSeed());
createFakeParams(rng, nparams, iter, paramsList);
final FakeGradientFunction func = new FakeGradientFunction(blockWidth, nparams);
final IntArrayFormatSupplier msgOa = getMessage(nparams, "[%d] Observations: Not same alpha @ %d");
final IntArrayFormatSupplier msgOal = getMessage(nparams, "[%d] Observations: Not same alpha linear @ %d");
for (int i = 0; i < paramsList.size(); i++) {
final double[] y = createFakeData(rng);
final WPoissonGradientProcedure p1 = WPoissonGradientProcedureUtils.create(y, var, func);
p1.computeFisherInformation(paramsList.get(i));
final WLsqLvmGradientProcedure p2 = new WLsqLvmGradientProcedure(y, var, func);
p2.gradient(paramsList.get(i));
// Exactly the same ...
Assertions.assertArrayEquals(p1.data, p2.alpha, msgOa.set(1, i));
Assertions.assertArrayEquals(p1.getLinear(), p2.getAlphaLinear(), msgOal.set(1, i));
}
}
use of uk.ac.sussex.gdsc.smlm.function.FakeGradientFunction in project GDSC-SMLM by aherbert.
the class WPoissonGradientProcedureTest method gradientProcedureIsFasterUnrolledThanGradientProcedure.
private void gradientProcedureIsFasterUnrolledThanGradientProcedure(RandomSeed seed, final int nparams, final boolean precomputed) {
Assumptions.assumeTrue(TestSettings.allow(TestComplexity.MEDIUM));
final int iter = 100;
final ArrayList<double[]> paramsList = new ArrayList<>(iter);
final ArrayList<double[]> yList = new ArrayList<>(iter);
createFakeData(RngUtils.create(seed.getSeed()), nparams, iter, paramsList, yList);
// Remove the timing of the function call by creating a dummy function
final FakeGradientFunction func = new FakeGradientFunction(blockWidth, nparams);
final double[] v = (precomputed) ? dataCache.computeIfAbsent(seed, WPoissonGradientProcedureTest::createData) : null;
final IntArrayFormatSupplier msg = new IntArrayFormatSupplier("M [%d]", 1);
for (int i = 0; i < paramsList.size(); i++) {
final double[] y = yList.get(i);
final WPoissonGradientProcedure p1 = new WPoissonGradientProcedure(y, v, func);
p1.computeFisherInformation(paramsList.get(i));
final WPoissonGradientProcedure p2 = WPoissonGradientProcedureUtils.create(y, v, func);
p2.computeFisherInformation(paramsList.get(i));
// Check they are the same
Assertions.assertArrayEquals(p1.getLinear(), p2.getLinear(), msg.set(0, i));
}
// Realistic loops for an optimisation
final int loops = 15;
// Run till stable timing
final Timer t1 = new Timer() {
@Override
void run() {
for (int i = 0, k = 0; i < paramsList.size(); i++) {
final WPoissonGradientProcedure p1 = new WPoissonGradientProcedure(yList.get(i), v, func);
for (int j = loops; j-- > 0; ) {
p1.computeFisherInformation(paramsList.get(k++ % iter));
}
}
}
};
final long time1 = t1.getTime();
final Timer t2 = new Timer(t1.loops) {
@Override
void run() {
for (int i = 0, k = 0; i < paramsList.size(); i++) {
final WPoissonGradientProcedure p2 = WPoissonGradientProcedureUtils.create(yList.get(i), v, func);
for (int j = loops; j-- > 0; ) {
p2.computeFisherInformation(paramsList.get(k++ % iter));
}
}
}
};
final long time2 = t2.getTime();
logger.log(TestLogUtils.getTimingRecord("precomputed=" + precomputed + " Standard " + nparams, time1, "Unrolled", time2));
}
use of uk.ac.sussex.gdsc.smlm.function.FakeGradientFunction in project GDSC-SMLM by aherbert.
the class LsqVarianceGradientProcedureTest method gradientProcedureComputesSameAsGradientCalculator.
private void gradientProcedureComputesSameAsGradientCalculator(RandomSeed seed, int nparams) {
final int iter = 10;
final ArrayList<double[]> paramsList = new ArrayList<>(iter);
createFakeParams(RngUtils.create(seed.getSeed()), nparams, iter, paramsList);
final int n = blockWidth * blockWidth;
final FakeGradientFunction func = new FakeGradientFunction(blockWidth, nparams);
final GradientCalculator calc = GradientCalculatorUtils.newCalculator(nparams, false);
final IntArrayFormatSupplier msg = new IntArrayFormatSupplier("[%d] Observations: Not same variance @ %d", 2);
msg.set(0, nparams);
for (int i = 0; i < paramsList.size(); i++) {
final LsqVarianceGradientProcedure p = LsqVarianceGradientProcedureUtils.create(func);
p.variance(paramsList.get(i));
final double[] e = calc.variance(n, paramsList.get(i), func);
Assertions.assertArrayEquals(e, p.variance, msg.set(1, i));
}
}
use of uk.ac.sussex.gdsc.smlm.function.FakeGradientFunction in project GDSC-SMLM by aherbert.
the class PoissonGradientProcedureTest method gradientProcedureIsNotSlowerThanGradientCalculator.
private void gradientProcedureIsNotSlowerThanGradientCalculator(RandomSeed seed, final int nparams) {
Assumptions.assumeTrue(TestSettings.allow(TestComplexity.MEDIUM));
final int iter = 1000;
final ArrayList<double[]> paramsList = new ArrayList<>(iter);
createFakeParams(RngUtils.create(seed.getSeed()), nparams, iter, paramsList);
final int n = blockWidth * blockWidth;
final FakeGradientFunction func = new FakeGradientFunction(blockWidth, nparams);
final GradientCalculator calc = GradientCalculatorUtils.newCalculator(nparams, false);
for (int i = 0; i < paramsList.size(); i++) {
calc.fisherInformationMatrix(n, paramsList.get(i), func);
}
for (int i = 0; i < paramsList.size(); i++) {
final PoissonGradientProcedure p = PoissonGradientProcedureUtils.create(func);
p.computeFisherInformation(paramsList.get(i));
}
// Realistic loops for an optimisation
final int loops = 15;
// Run till stable timing
final Timer t1 = new Timer() {
@Override
void run() {
for (int i = 0, k = 0; i < iter; i++) {
final GradientCalculator calc = GradientCalculatorUtils.newCalculator(nparams, false);
for (int j = loops; j-- > 0; ) {
calc.fisherInformationMatrix(n, paramsList.get(k++ % iter), func);
}
}
}
};
final long time1 = t1.getTime();
final Timer t2 = new Timer(t1.loops) {
@Override
void run() {
for (int i = 0, k = 0; i < iter; i++) {
final PoissonGradientProcedure p = PoissonGradientProcedureUtils.create(func);
for (int j = loops; j-- > 0; ) {
p.computeFisherInformation(paramsList.get(k++ % iter));
}
}
}
};
final long time2 = t2.getTime();
logger.log(TestLogUtils.getTimingRecord("GradientCalculator " + nparams, time1, "PoissonGradientProcedure", time2));
}
Aggregations