summaryrefslogtreecommitdiff
path: root/test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java')
-rw-r--r--test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java b/test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java
new file mode 100644
index 00000000..fd975c15
--- /dev/null
+++ b/test/de/lmu/ifi/dbs/elki/math/statistics/distribution/AbstractDistributionTest.java
@@ -0,0 +1,77 @@
+package de.lmu.ifi.dbs.elki.math.statistics.distribution;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Abstract base class for distribution unit testing.
+ *
+ * @author Erich Schubert
+ */
+public class AbstractDistributionTest {
+ public void checkPDF(Distribution d, double[] x, double[] expected, double err) {
+ int maxerrlev = Integer.MIN_VALUE;
+ for(int i = 0; i < x.length; i++) {
+ double val = d.pdf(x[i]);
+ if(val == expected[i]) {
+ continue;
+ }
+ double diff = Math.abs(val - expected[i]);
+ final int errlev = (int) Math.ceil(Math.log10(diff / expected[i]));
+ maxerrlev = Math.max(errlev, maxerrlev);
+ if(diff < err || diff / expected[i] < err) {
+ continue;
+ }
+ assertEquals("Error magnitude: 1e" + errlev + " at " + x[i], expected[i], val, err);
+ }
+ int given = (int) Math.floor(Math.log10(err * 1.1));
+ // if (given > maxerrlev) {
+ // System.err.println("PDF Error for "+d+" magnitude is not tight: expected "+maxerrlev+" got "+given);
+ // }
+ assertTrue("Error magnitude is not tight: expected " + maxerrlev + " got " + given, given <= maxerrlev);
+ }
+
+ public void checkCDF(Distribution d, double[] x, double[] expected, double err) {
+ int maxerrlev = Integer.MIN_VALUE;
+ for(int i = 0; i < x.length; i++) {
+ double val = d.cdf(x[i]);
+ if(val == expected[i]) {
+ continue;
+ }
+ double diff = Math.abs(val - expected[i]);
+ final int errlev = (int) Math.ceil(Math.log10(diff / expected[i]));
+ maxerrlev = Math.max(errlev, maxerrlev);
+ if(diff < err || diff / expected[i] < err) {
+ continue;
+ }
+ assertEquals("Error magnitude: 1e" + errlev + " at " + x[i], expected[i], val, err);
+ }
+ int given = (int) Math.floor(Math.log10(err * 1.1));
+ // if (given > maxerrlev) {
+ // System.err.println("CDF Error for "+d+" magnitude is not tight: expected "+maxerrlev+" got "+given);
+ // }
+ assertTrue("Error magnitude is not tight: expected " + maxerrlev + " got " + given, given <= maxerrlev);
+ }
+
+ public void checkQuantile(Distribution d, double[] x, double[] expected, double err) {
+ int maxerrlev = Integer.MIN_VALUE;
+ for(int i = 0; i < x.length; i++) {
+ double val = d.quantile(x[i]);
+ if(val == expected[i]) {
+ continue;
+ }
+ double diff = Math.abs(val - expected[i]);
+ final int errlev = (int) Math.ceil(Math.log10(diff / expected[i]));
+ maxerrlev = Math.max(errlev, maxerrlev);
+ if(diff < err || diff / expected[i] < err) {
+ continue;
+ }
+ assertEquals("Error magnitude: 1e" + errlev + " at " + x[i], expected[i], val, err);
+ }
+ int given = (int) Math.floor(Math.log10(err * 1.1));
+ // if (given > maxerrlev) {
+ // System.err.println("Probit Error for "+d+" magnitude is not tight: expected "+maxerrlev+" got "+given);
+ // }
+ assertTrue("Error magnitude is not tight: expected " + maxerrlev + " got " + given, given <= maxerrlev);
+ }
+} \ No newline at end of file