use of uk.ac.sussex.gdsc.test.junit5.SeededTest in project GDSC-SMLM by aherbert.
the class PoissonGradientProcedureTest method crlbIsHigherWithPrecomputed.
@SeededTest
void crlbIsHigherWithPrecomputed(RandomSeed seed) {
final int iter = 10;
final UniformRandomProvider rng = RngUtils.create(seed.getSeed());
final ErfGaussian2DFunction func = (ErfGaussian2DFunction) GaussianFunctionFactory.create2D(1, 10, 10, GaussianFunctionFactory.FIT_ERF_FREE_CIRCLE, null);
final double[] a = new double[1 + Gaussian2DFunction.PARAMETERS_PER_PEAK];
final int n = func.getNumberOfGradients();
// Get a background
final double[] b = new double[func.size()];
for (int i = 0; i < b.length; i++) {
b[i] = nextUniform(rng, 1, 2);
}
for (int i = 0; i < iter; i++) {
a[Gaussian2DFunction.BACKGROUND] = nextUniform(rng, 0.1, 0.3);
a[Gaussian2DFunction.SIGNAL] = nextUniform(rng, 100, 300);
a[Gaussian2DFunction.X_POSITION] = nextUniform(rng, 4, 6);
a[Gaussian2DFunction.Y_POSITION] = nextUniform(rng, 4, 6);
a[Gaussian2DFunction.X_SD] = nextUniform(rng, 1, 1.3);
a[Gaussian2DFunction.Y_SD] = nextUniform(rng, 1, 1.3);
final PoissonGradientProcedure p1 = PoissonGradientProcedureUtils.create(func);
p1.computeFisherInformation(a);
final PoissonGradientProcedure p2 = PoissonGradientProcedureUtils.create(OffsetGradient1Function.wrapGradient1Function(func, b));
p2.computeFisherInformation(a);
final FisherInformationMatrix m1 = new FisherInformationMatrix(p1.getLinear(), n);
final FisherInformationMatrix m2 = new FisherInformationMatrix(p2.getLinear(), n);
final double[] crlb1 = m1.crlb();
final double[] crlb2 = m2.crlb();
Assertions.assertNotNull(crlb1);
Assertions.assertNotNull(crlb2);
// Arrays.toString(crlb2));
for (int j = 0; j < n; j++) {
Assertions.assertTrue(crlb1[j] < crlb2[j]);
}
}
}
use of uk.ac.sussex.gdsc.test.junit5.SeededTest in project GDSC-SMLM by aherbert.
the class PoissonGradientProcedureTest method gradientProcedureFactoryCreatesOptimisedProcedures.
@SeededTest
void gradientProcedureFactoryCreatesOptimisedProcedures() {
Assertions.assertEquals(PoissonGradientProcedureUtils.create(new DummyGradientFunction(6)).getClass(), PoissonGradientProcedure6.class);
Assertions.assertEquals(PoissonGradientProcedureUtils.create(new DummyGradientFunction(5)).getClass(), PoissonGradientProcedure5.class);
Assertions.assertEquals(PoissonGradientProcedureUtils.create(new DummyGradientFunction(4)).getClass(), PoissonGradientProcedure4.class);
}
use of uk.ac.sussex.gdsc.test.junit5.SeededTest in project GDSC-SMLM by aherbert.
the class LogFactorialTest method testLogFactorialDouble.
/**
* Test the factorial of a fractional number against Commons Math logGamma(1+n).
*/
@SeededTest
void testLogFactorialDouble(RandomSeed seed) {
final UniformRandomProvider rng = RngUtils.create(seed.getSeed());
final DoubleDoubleBiPredicate tol = TestHelper.doublesAreClose(1e-14);
for (int i = 0; i < 200; i++) {
final double n = rng.nextDouble() * 200;
final double expected = n <= 1.5 ? Gamma.logGamma1p(n) : Gamma.logGamma(1 + n);
TestAssertions.assertTest(expected, LogFactorial.value(n), tol, () -> Double.toString(n));
}
}
use of uk.ac.sussex.gdsc.test.junit5.SeededTest in project GDSC-SMLM by aherbert.
the class PoissonCalculatorTest method instanceAndFastMethodIsApproximatelyEqualToStaticMethod.
@SeededTest
void instanceAndFastMethodIsApproximatelyEqualToStaticMethod(RandomSeed seed) {
final DoubleEquality eq = new DoubleEquality(3e-4, 0);
final UniformRandomProvider rg = RngUtils.create(seed.getSeed());
// Test for different x. The calculator approximation begins
final int n = 100;
final double[] u = new double[n];
final double[] x = new double[n];
double expected;
double observed;
for (final double testx : new double[] { Math.nextDown(PoissonCalculator.APPROXIMATION_X), PoissonCalculator.APPROXIMATION_X, Math.nextUp(PoissonCalculator.APPROXIMATION_X), PoissonCalculator.APPROXIMATION_X * 1.1, PoissonCalculator.APPROXIMATION_X * 2, PoissonCalculator.APPROXIMATION_X * 10 }) {
final String X = Double.toString(testx);
Arrays.fill(x, testx);
final PoissonCalculator pc = new PoissonCalculator(x);
expected = PoissonCalculator.maximumLogLikelihood(x);
observed = pc.getMaximumLogLikelihood();
logger.log(TestLogUtils.getRecord(LOG_LEVEL, "[%s] Instance MaxLL = %g vs %g (error = %g)", X, expected, observed, DoubleEquality.relativeError(expected, observed)));
Assertions.assertTrue(eq.almostEqualRelativeOrAbsolute(expected, observed), () -> "Instance Max LL not equal: x=" + X);
observed = PoissonCalculator.fastMaximumLogLikelihood(x);
logger.log(TestLogUtils.getRecord(LOG_LEVEL, "[%s] Fast MaxLL = %g vs %g (error = %g)", X, expected, observed, DoubleEquality.relativeError(expected, observed)));
Assertions.assertTrue(eq.almostEqualRelativeOrAbsolute(expected, observed), () -> "Fast Max LL not equal: x=" + X);
// Generate data around the value
for (int i = 0; i < n; i++) {
u[i] = x[i] + rg.nextDouble() - 0.5;
}
expected = PoissonCalculator.logLikelihood(u, x);
observed = pc.logLikelihood(u);
logger.log(TestLogUtils.getRecord(LOG_LEVEL, "[%s] Instance LL = %g vs %g (error = %g)", X, expected, observed, DoubleEquality.relativeError(expected, observed)));
Assertions.assertTrue(eq.almostEqualRelativeOrAbsolute(expected, observed), () -> "Instance LL not equal: x=" + X);
observed = PoissonCalculator.fastLogLikelihood(u, x);
logger.log(TestLogUtils.getRecord(LOG_LEVEL, "[%s] Fast LL = %g vs %g (error = %g)", X, expected, observed, DoubleEquality.relativeError(expected, observed)));
Assertions.assertTrue(eq.almostEqualRelativeOrAbsolute(expected, observed), () -> "Fast LL not equal: x=" + X);
expected = PoissonCalculator.logLikelihoodRatio(u, x);
observed = pc.getLogLikelihoodRatio(observed);
logger.log(TestLogUtils.getRecord(LOG_LEVEL, "[%s] Instance LLR = %g vs %g (error = %g)", X, expected, observed, DoubleEquality.relativeError(expected, observed)));
Assertions.assertTrue(eq.almostEqualRelativeOrAbsolute(expected, observed), () -> "Instance LLR not equal: x=" + X);
}
}
use of uk.ac.sussex.gdsc.test.junit5.SeededTest in project GDSC-SMLM by aherbert.
the class FastMleGradient2ProcedureTest method gradientCalculatorComputesGradient.
@SeededTest
void gradientCalculatorComputesGradient(RandomSeed seed) {
gradientCalculatorComputesGradient(seed, new SingleFreeCircularErfGaussian2DFunction(blockWidth, blockWidth));
// Use a reasonable z-depth function from the Smith, et al (2010) paper (page 377)
final double sx = 1.08;
final double sy = 1.01;
final double gamma = 0.389;
final double d = 0.531;
final double Ax = -0.0708;
final double Bx = -0.073;
final double Ay = 0.164;
final double By = 0.0417;
final HoltzerAstigmatismZModel zModel = HoltzerAstigmatismZModel.create(sx, sy, gamma, d, Ax, Bx, Ay, By);
gradientCalculatorComputesGradient(seed, new SingleAstigmatismErfGaussian2DFunction(blockWidth, blockWidth, zModel));
}
Aggregations