diff --git a/java/src/org/broadinstitute/sting/utils/MathUtils.java b/java/src/org/broadinstitute/sting/utils/MathUtils.java index f79af2ed2..50aa0f707 100755 --- a/java/src/org/broadinstitute/sting/utils/MathUtils.java +++ b/java/src/org/broadinstitute/sting/utils/MathUtils.java @@ -1270,4 +1270,12 @@ public class MathUtils { return log10MultinomialCoefficient(n, k) + log10Prod; } + public static double factorial (int x) { + return Math.pow(10, log10Gamma(x+1)); + } + + public static double log10Factorial (int x) { + return log10Gamma(x+1); + } + } \ No newline at end of file diff --git a/java/test/org/broadinstitute/sting/utils/MathUtilsUnitTest.java b/java/test/org/broadinstitute/sting/utils/MathUtilsUnitTest.java index b69eba969..251c105c3 100755 --- a/java/test/org/broadinstitute/sting/utils/MathUtilsUnitTest.java +++ b/java/test/org/broadinstitute/sting/utils/MathUtilsUnitTest.java @@ -50,13 +50,13 @@ public class MathUtilsUnitTest extends BaseTest { public void testBinomialProbability() { logger.warn("Executing testBinomialProbability"); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(3, 2, 0.5), 0.375, 0.0001) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(100, 10, 0.5), 1.365543e-17, 1e-18) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(217, 73, 0.02), 4.521904e-67, 1e-68) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(300, 100, 0.02), 9.27097e-91, 1e-92) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(300, 150, 0.98), 6.462892e-168, 1e-169) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(300, 120, 0.98), 3.090054e-221, 1e-222) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.binomialProbability(300, 112, 0.98), 2.34763e-236, 1e-237) == 0); + Assert.assertEquals(MathUtils.binomialProbability(3, 2, 0.5), 0.375, 0.0001); + Assert.assertEquals(MathUtils.binomialProbability(100, 10, 0.5), 1.365543e-17, 1e-18); + Assert.assertEquals(MathUtils.binomialProbability(217, 73, 0.02), 4.521904e-67, 1e-68); + Assert.assertEquals(MathUtils.binomialProbability(300, 100, 0.02), 9.27097e-91, 1e-92); + Assert.assertEquals(MathUtils.binomialProbability(300, 150, 0.98), 6.462892e-168, 1e-169); + Assert.assertEquals(MathUtils.binomialProbability(300, 120, 0.98), 3.090054e-221, 1e-222); + Assert.assertEquals(MathUtils.binomialProbability(300, 112, 0.98), 2.34763e-236, 1e-237); } /** @@ -68,19 +68,19 @@ public class MathUtilsUnitTest extends BaseTest { int[] counts0 = { 2, 0, 1 }; double[] probs0 = { 0.33, 0.33, 0.34 }; - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.multinomialProbability(counts0, probs0), 0.111078, 1e-6) == 0); + Assert.assertEquals(MathUtils.multinomialProbability(counts0, probs0), 0.111078, 1e-6); int[] counts1 = { 10, 20, 30 }; double[] probs1 = { 0.25, 0.25, 0.50 }; - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.multinomialProbability(counts1, probs1), 0.002870301, 1e-9) == 0); + Assert.assertEquals(MathUtils.multinomialProbability(counts1, probs1), 0.002870301, 1e-9); int[] counts2 = { 38, 82, 50, 36 }; double[] probs2 = { 0.25, 0.25, 0.25, 0.25 }; - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.multinomialProbability(counts2, probs2), 1.88221e-09, 1e-10) == 0); + Assert.assertEquals(MathUtils.multinomialProbability(counts2, probs2), 1.88221e-09, 1e-10); int[] counts3 = { 1, 600, 1 }; double[] probs3 = { 0.33, 0.33, 0.34 }; - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.multinomialProbability(counts3, probs3), 5.20988e-285, 1e-286) == 0); + Assert.assertEquals(MathUtils.multinomialProbability(counts3, probs3), 5.20988e-285, 1e-286); } /** @@ -142,17 +142,36 @@ public class MathUtilsUnitTest extends BaseTest { public void testLog10Gamma() { logger.warn("Executing testLog10Gamma"); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10Gamma(4.0), 0.7781513) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10Gamma(10), 5.559763) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10Gamma(10654), 38280.53, 1e-2) == 0); + Assert.assertEquals(MathUtils.log10Gamma(4.0), 0.7781513, 1e-6); + Assert.assertEquals(MathUtils.log10Gamma(10), 5.559763, 1e-6); + Assert.assertEquals(MathUtils.log10Gamma(10654), 38280.53, 1e-2); } @Test public void testLog10BinomialCoefficient() { logger.warn("Executing testLog10BinomialCoefficient"); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10BinomialCoefficient(4, 2), 0.7781513) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10BinomialCoefficient(10,3), 2.079181) == 0); - Assert.assertTrue(MathUtils.compareDoubles(MathUtils.log10BinomialCoefficient(103928, 119 ), 400.2156, 1e-4) == 0); + Assert.assertEquals(MathUtils.log10BinomialCoefficient(4, 2), 0.7781513, 1e-6); + Assert.assertEquals(MathUtils.log10BinomialCoefficient(10, 3), 2.079181, 1e-6); + Assert.assertEquals(MathUtils.log10BinomialCoefficient(103928, 119), 400.2156, 1e-4); } + + @Test + public void testFactorial() { + logger.warn("Executing testFactorial"); + Assert.assertEquals((int) MathUtils.factorial(4), 24); + Assert.assertEquals((int) MathUtils.factorial(10), 3628800); + Assert.assertEquals((int) MathUtils.factorial(12), 479001600); + } + + @Test + public void testLog10Factorial() { + logger.warn("Executing testLog10Factorial"); + Assert.assertEquals(MathUtils.log10Factorial(4), 1.380211, 1e-6); + Assert.assertEquals(MathUtils.log10Factorial(10), 6.559763, 1e-6); + Assert.assertEquals(MathUtils.log10Factorial(12), 8.680337, 1e-6); + Assert.assertEquals(MathUtils.log10Factorial(200), 374.8969, 1e-3); + Assert.assertEquals(MathUtils.log10Factorial(12342), 45138.26, 1e-1); + } + }