package edu.umd.cloud9.math;
import static org.junit.Assert.assertEquals;
import junit.framework.JUnit4TestAdapter;
import org.junit.Test;
public class GammaTest {
public static double PRECISION_3 = 1e-3f;
public static double PRECISION_6 = 1e-6f;
public static double PRECISION_9 = 1e-9f;
public static double PRECISION_12 = 1e-12f;
@Test
public void testDigamma() {
assertEquals(Gamma.digamma(1000000), 13.81551005796419, PRECISION_12);
assertEquals(Gamma.digamma(100000), 11.512920464961896, PRECISION_12);
assertEquals(Gamma.digamma(10000), 9.21029037114285, PRECISION_12);
assertEquals(Gamma.digamma(1000), 6.907255195648812, PRECISION_12);
assertEquals(Gamma.digamma(100), 4.600161852738087, PRECISION_12);
assertEquals(Gamma.digamma(10), 2.2517525890667214, PRECISION_12);
assertEquals(Gamma.digamma(1), -0.5772156649015328, PRECISION_12);
assertEquals(Gamma.digamma(0.1), -10.42375494041107, PRECISION_12);
assertEquals(Gamma.digamma(0.01), -100.56088545786886, PRECISION_12);
// precision drops down accordingly when computing digamma function for small value
assertEquals(Gamma.digamma(0.001), -1000.5755719318336, PRECISION_9);
assertEquals(Gamma.digamma(0.0001), -10000.57705117741, PRECISION_6);
assertEquals(Gamma.digamma(0.00001), -100000.57719922789, PRECISION_6);
assertEquals(Gamma.digamma(-0.001), 999.4211381980015, PRECISION_9);
assertEquals(Gamma.digamma(-0.01), 99.4062136959443, PRECISION_12);
assertEquals(Gamma.digamma(-0.1), 9.245073050052941, PRECISION_12);
}
@Test
public void testTrigamma() {
assertEquals(Gamma.trigamma(1000000), 1.0000005000001667E-6, PRECISION_12);
assertEquals(Gamma.trigamma(100000), 1.0000050000166667E-5, PRECISION_12);
assertEquals(Gamma.trigamma(10000), 1.0000500016666666E-4, PRECISION_12);
assertEquals(Gamma.trigamma(1000), 0.0010005001666666333, PRECISION_12);
assertEquals(Gamma.trigamma(100), 0.010050166663333571, PRECISION_12);
assertEquals(Gamma.trigamma(10), 0.10516633568168571, PRECISION_12);
// precision drops down accordingly when computing digamma function for small value
assertEquals(Gamma.trigamma(1), 1.6449340668482264, PRECISION_9);
assertEquals(Gamma.trigamma(0.1), 101.4332991507927, PRECISION_9);
assertEquals(Gamma.trigamma(0.01), 10001.62121352835, PRECISION_9);
assertEquals(Gamma.trigamma(0.001), 1000001.6425332422, PRECISION_6);
assertEquals(Gamma.trigamma(-0.001), 1000001.6473416518, PRECISION_6);
assertEquals(Gamma.trigamma(-0.01), 10001.669304101055, PRECISION_9);
assertEquals(Gamma.trigamma(-0.1), 101.92253995947704, PRECISION_9);
}
@Test
public void testLogGamma() {
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(1000000), cern.jet.stat.Gamma.logGamma(1000000),
PRECISION_12);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(100000), cern.jet.stat.Gamma.logGamma(100000),
PRECISION_12);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(10000), cern.jet.stat.Gamma.logGamma(10000),
PRECISION_9);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(1000), cern.jet.stat.Gamma.logGamma(1000),
PRECISION_12);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(100), cern.jet.stat.Gamma.logGamma(100),
PRECISION_12);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(10), cern.jet.stat.Gamma.logGamma(10),
PRECISION_12);
// precision drops down accordingly when computing digamma function for small value
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(1), cern.jet.stat.Gamma.logGamma(1), PRECISION_9);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(0.1), cern.jet.stat.Gamma.logGamma(0.1),
PRECISION_9);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(0.01), cern.jet.stat.Gamma.logGamma(0.01),
PRECISION_9);
assertEquals(edu.umd.cloud9.math.Gamma.lgamma(0.001), cern.jet.stat.Gamma.logGamma(0.001),
PRECISION_6);
}
@Test
public void logGammaSpeedTest() {
long time = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {
edu.umd.cloud9.math.Gamma.lgamma(i + 1);
}
System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {
edu.umd.cloud9.math.Gamma.lanczosLGamma9(i + 1);
}
System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {
edu.umd.cloud9.math.Gamma.lanczosLGamma15(i + 1);
}
System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {
edu.umd.cloud9.math.Gamma.stirlingLGamma(i + 1);
}
System.out.println(System.currentTimeMillis() - time);
// time = System.currentTimeMillis();
// for (int i = 0; i < 99999; i++) {
// cc.mrlda.util.Gamma.logGamma(0.5);
// }
// System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
for (int i = 0; i < 99999; i++) {
cern.jet.stat.Gamma.logGamma(i + 1);
}
System.out.println(System.currentTimeMillis() - time);
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(GammaTest.class);
}
}