jidt/java/unittests/infodynamics/utils/MathsUtilsTest.java

137 lines
6.2 KiB
Java
Executable File

package infodynamics.utils;
import infodynamics.utils.MathsUtils;
import junit.framework.TestCase;
/**
* Test functionality of the utility functions in MathsUtils
*
* @author Joseph Lizier.
*
*/
public class MathsUtilsTest extends TestCase {
/**
* Confirm that our erf() function is correct to 6 dp
*/
public void testErf() {
// Compare against the results supplied by octave
double[] octaveResults = {0.000000, 0.112463, 0.222703, 0.328627,
0.428392, 0.520500, 0.603856, 0.677801, 0.742101, 0.796908,
0.842701, 0.880205, 0.910314, 0.934008, 0.952285, 0.966105,
0.976348, 0.983790, 0.989091, 0.992790, 0.995322, 0.997021,
0.998137, 0.998857, 0.999311, 0.999593, 0.999764, 0.999866,
0.999925, 0.999959, 0.999978, 0.999988, 0.999994, 0.999997,
0.999998, 0.999999, 1.000000};
for (int n=0; n<octaveResults.length; n++) {
assertEquals(octaveResults[n], MathsUtils.erf(n*0.1), 0.000001);
}
}
/**
* Confirm that our chicdf() function is correct to 6 decimal places
*/
public void testChiCdf() {
// Compare against the results supplied by octave
// First for 1 degree of freedom (odd, base case)
double[] octaveResults1degFree = {0.000000, 0.248170, 0.345279, 0.416118,
0.472911, 0.520500, 0.561422, 0.597216, 0.628907, 0.657218,
0.682689, 0.705734, 0.726678, 0.745787, 0.763276, 0.779329,
0.794097, 0.807712, 0.820288, 0.831922, 0.842701, 0.852701,
0.861989, 0.870626, 0.878665, 0.886154, 0.893136, 0.899652,
0.905736, 0.911420, 0.916735, 0.921708, 0.926362, 0.930720,
0.934804, 0.938631, 0.942220, 0.945588, 0.948747, 0.951714,
0.954500, 0.957117, 0.959576, 0.961888, 0.964061, 0.966105,
0.968028, 0.969837, 0.971540, 0.973143, 0.974653, 0.976074,
0.977413, 0.978675, 0.979863, 0.980984, 0.982040, 0.983035,
0.983974, 0.984859, 0.985694, 0.986482, 0.987225, 0.987926,
0.988588, 0.989213, 0.989802, 0.990359, 0.990884, 0.991380,
0.991849, 0.992292, 0.992710, 0.993105, 0.993478, 0.993830,
0.994163, 0.994478, 0.994775, 0.995057, 0.995322, 0.995573,
0.995811, 0.996035, 0.996248, 0.996449, 0.996638, 0.996818,
0.996988, 0.997148, 0.997300, 0.997444, 0.997580, 0.997708,
0.997830, 0.997945, 0.998054, 0.998157, 0.998255, 0.998347,
0.998435};
for (int n=0; n<octaveResults1degFree.length; n++) {
assertEquals(octaveResults1degFree[n],
MathsUtils.chiSquareCdf(n*0.1, 1), 0.000001);
}
// Next for 2 degrees of freedom (even, base case)
double[] octaveResults2degFree = {0.000000, 0.048771, 0.095163, 0.139292,
0.181269, 0.221199, 0.259182, 0.295312, 0.329680, 0.362372,
0.393469, 0.423050, 0.451188, 0.477954, 0.503415, 0.527633,
0.550671, 0.572585, 0.593430, 0.613259, 0.632121, 0.650062,
0.667129, 0.683363, 0.698806, 0.713495, 0.727468, 0.740760,
0.753403, 0.765430, 0.776870, 0.787752, 0.798103, 0.807950,
0.817316, 0.826226, 0.834701, 0.842763, 0.850431, 0.857726,
0.864665, 0.871265, 0.877544, 0.883516, 0.889197, 0.894601,
0.899741, 0.904631, 0.909282, 0.913706, 0.917915, 0.921918,
0.925726, 0.929349, 0.932794, 0.936072, 0.939190, 0.942156,
0.944977, 0.947660, 0.950213, 0.952641, 0.954951, 0.957148,
0.959238, 0.961226, 0.963117, 0.964916, 0.966627, 0.968254,
0.969803, 0.971275, 0.972676, 0.974009, 0.975276, 0.976482,
0.977629, 0.978720, 0.979758, 0.980745, 0.981684, 0.982578,
0.983427, 0.984236, 0.985004, 0.985736, 0.986431, 0.987093,
0.987723, 0.988321, 0.988891, 0.989433, 0.989948, 0.990438,
0.990905, 0.991348, 0.991770, 0.992172, 0.992553, 0.992917,
0.993262};
for (int n=0; n<octaveResults2degFree.length; n++) {
assertEquals(octaveResults2degFree[n],
MathsUtils.chiSquareCdf(n*0.1, 2), 0.000001);
}
// Next for 3 degrees of freedom (odd, > 1)
double[] octaveResults3degFree = {0.000000, 0.008163, 0.022411, 0.039972,
0.059758, 0.081109, 0.103568, 0.126796, 0.150533, 0.174572,
0.198748, 0.222926, 0.246996, 0.270867, 0.294465, 0.317730,
0.340610, 0.363066, 0.385065, 0.406581, 0.427593, 0.448087,
0.468052, 0.487479, 0.506365, 0.524709, 0.542510, 0.559773,
0.576500, 0.592698, 0.608375, 0.623537, 0.638195, 0.652357,
0.666035, 0.679238, 0.691978, 0.704266, 0.716114, 0.727533,
0.738536, 0.749134, 0.759338, 0.769161, 0.778615, 0.787710,
0.796458, 0.804870, 0.812958, 0.820732, 0.828203, 0.835381,
0.842276, 0.848898, 0.855256, 0.861361, 0.867222, 0.872846,
0.878243, 0.883422, 0.888390, 0.893155, 0.897725, 0.902107,
0.906309, 0.910337, 0.914199, 0.917900, 0.921447, 0.924846,
0.928102, 0.931222, 0.934211, 0.937074, 0.939816, 0.942442,
0.944956, 0.947364, 0.949669, 0.951876, 0.953988, 0.956010,
0.957946, 0.959798, 0.961571, 0.963267, 0.964890, 0.966443,
0.967928, 0.969350, 0.970709, 0.972010, 0.973253, 0.974443,
0.975581, 0.976669, 0.977709, 0.978704, 0.979655, 0.980564,
0.981434};
for (int n=0; n<octaveResults3degFree.length; n++) {
assertEquals(octaveResults3degFree[n],
MathsUtils.chiSquareCdf(n*0.1, 3), 0.000001);
}
// Last for 10 degrees of freedom (even, > 2)
double[] octaveResults10degFree = {0.000000, 0.000000, 0.000000,
0.000001, 0.000002, 0.000007, 0.000016, 0.000033, 0.000061,
0.000106, 0.000172, 0.000266, 0.000394, 0.000565, 0.000786,
0.001065, 0.001411, 0.001835, 0.002344, 0.002949, 0.003660,
0.004485, 0.005435, 0.006519, 0.007746, 0.009124, 0.010663,
0.012370, 0.014253, 0.016320, 0.018576, 0.021028, 0.023682,
0.026543, 0.029615, 0.032902, 0.036407, 0.040133, 0.044081,
0.048255, 0.052653, 0.057277, 0.062126, 0.067200, 0.072496,
0.078014, 0.083751, 0.089703, 0.095869, 0.102243, 0.108822,
0.115601, 0.122577, 0.129742, 0.137092, 0.144621, 0.152324,
0.160193, 0.168223, 0.176406, 0.184737, 0.193207, 0.201811,
0.210540, 0.219387, 0.228347, 0.237410, 0.246569, 0.255818,
0.265149, 0.274555, 0.284028, 0.293562, 0.303148, 0.312781,
0.322452, 0.332156, 0.341886, 0.351635, 0.361396, 0.371163,
0.380930, 0.390692, 0.400441, 0.410173, 0.419882, 0.429562,
0.439208, 0.448816, 0.458380, 0.467896, 0.477360, 0.486766,
0.496111, 0.505391, 0.514602, 0.523741, 0.532804, 0.541788,
0.550690, 0.559507};
for (int n=0; n<octaveResults10degFree.length; n++) {
assertEquals(octaveResults10degFree[n],
MathsUtils.chiSquareCdf(n*0.1, 10), 0.000001);
}
}
}