Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Calculates probability if the system of points is fortuitous.
- * @param x Chi squared.
- * @param n Degrees of freedom
- * @return Probability that the system of points is fortuitous.
- */
- private double calculateP(double x, int df) {
- double a = 0, y = 0, s = 0;
- double e = 0, c = 0, z = 0;
- Boolean even = false; /* True if df is an even number */
- final double LOG_SQRT_PI = 0.5723649429247000870717135; /* log(sqrt(pi)) */
- final double I_SQRT_PI = 0.5641895835477562869480795; /* 1 / sqrt(pi) */
- if (x <= 0.0 || df < 1) {
- return 1.0;
- }
- a = 0.5 * x;
- if (x % 2 == 0) even = true;
- if (df > 1) {
- y = ex(-a);
- }
- s = (even ? y : (2.0 * poz(-Math.sqrt(x))));
- if (df > 2) {
- x = 0.5 * (df - 1.0);
- z = (even ? 1.0 : 0.5);
- if (a > 20.0) {
- e = (even ? 0.0 : LOG_SQRT_PI);
- c = Math.log(a);
- while (z <= x) {
- e = Math.log(z) + e;
- s += ex(c * z - a - e);
- z += 1.0;
- }
- return s;
- } else {
- e = (even ? 1.0 : (I_SQRT_PI / Math.sqrt(a)));
- c = 0.0;
- while (z <= x) {
- e = e * (a / z);
- c = c + e;
- z += 1.0;
- }
- return c * y + s;
- }
- } else {
- return s;
- }
- }
- private double ex(double x) {
- return (x < -20.0) ? 0.0 : Math.exp(x);
- }
- private double poz(double z) {
- double y, x, w;
- final double Z_MAX = 6.0; /* Maximum meaningful z value */
- if (z == 0.0) {
- x = 0.0;
- } else {
- y = 0.5 * Math.abs(z);
- if (y >= (Z_MAX * 0.5)) {
- x = 1.0;
- } else if (y < 1.0) {
- w = y * y;
- x = ((((((((0.000124818987 * w
- - 0.001075204047) * w + 0.005198775019) * w
- - 0.019198292004) * w + 0.059054035642) * w
- - 0.151968751364) * w + 0.319152932694) * w
- - 0.531923007300) * w + 0.797884560593) * y * 2.0;
- } else {
- y -= 2.0;
- x = (((((((((((((-0.000045255659 * y
- + 0.000152529290) * y - 0.000019538132) * y
- - 0.000676904986) * y + 0.001390604284) * y
- - 0.000794620820) * y - 0.002034254874) * y
- + 0.006549791214) * y - 0.010557625006) * y
- + 0.011630447319) * y - 0.009279453341) * y
- + 0.005353579108) * y - 0.002141268741) * y
- + 0.000535310849) * y + 0.999936657524;
- }
- }
- return (z > 0.0) ? ((x + 1.0) * 0.5) : ((1.0 - x) * 0.5);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement