void sknuth_Gap (unif01_Gen *gen, sres_Chi2 *res, long N, long n, int r, double Alpha, double Beta) { int len; int t; long m; /* Number of observed Gaps */ long Seq; /* Current replication number */ double p; /* Probability of U01 in (Alpha, Beta) */ double X2; double U; double Mult; double V[1]; /* Number of degrees of freedom for Chi2 */ char str[LENGTH + 1]; lebool localRes = FALSE; chrono_Chrono *Timer; char *TestName = "sknuth_Gap test"; Timer = chrono_Create (); p = Beta - Alpha; t = (int)(log (gofs_MinExpected / n) / num2_log1p (-p)); len = (int)(1 + log (gofs_MinExpected / (n*p)) / num2_log1p (-p)); t = util_Min(t, len); t = util_Max(t, 0); Mult = p * n; if (swrite_Basic) WriteDataGap (gen, TestName, N, n, r, Alpha, Beta); util_Assert (Alpha >= 0.0 && Alpha <= 1.0, "sknuth_Gap: Alpha outside interval [0..1]"); util_Assert (Beta <= 1.0 && Beta > Alpha, "sknuth_Gap: Beta outside interval (Alpha..1]"); if (res == NULL) { localRes = TRUE; res = sres_CreateChi2 (); } sres_InitChi2 (res, N, t, "sknuth_Gap"); sprintf (str, "The N statistic values (a ChiSquare with %1d degrees" " of freedom):", t); statcoll_SetDesc (res->sVal1, str); res->degFree = t; if (res->degFree < 1) { util_Warning (TRUE, "Chi-square with 0 degree of freedom."); if (localRes) sres_DeleteChi2 (res); chrono_Delete (Timer); return; } /* Compute the probabilities for each gap length */ res->NbExp[0] = Mult; res->Loc[0] = 0; for (len = 1; len < t; len++) { Mult *= 1.0 - p; res->NbExp[len] = Mult; res->Loc[len] = len; } res->NbExp[t] = Mult * (1.0 - p) / p; res->Loc[t] = t; if (swrite_Classes) gofs_WriteClasses (res->NbExp, res->Count, 0, t, 0); /* Beginning of test */ for (Seq = 1; Seq <= N; Seq++) { for (len = 0; len <= t; len++) res->Count[len] = 0; for (m = 1; m <= n; m++) { /* Process one gap */ len = 0; U = unif01_StripD (gen, r); while ((U < Alpha || U >= Beta) && len < n) { ++len; U = unif01_StripD (gen, r); } if (len >= n) { util_Warning (TRUE, "sknuth_Gap: one gap of length > n\n********* Interrupting the test\n"); printf ("\n\n"); res->pVal2[gofw_Mean] = res->pVal2[gofw_AD] = res->pVal2[gofw_KSM] = res->pVal2[gofw_KSP] = 0.0; if (localRes) sres_DeleteChi2 (res); chrono_Delete (Timer); return; } if (len >= t) ++res->Count[t]; else ++res->Count[len]; } if (swrite_Counters) tables_WriteTabL (res->Count, 0, t, 5, 10, "Observed numbers:"); X2 = gofs_Chi2 (res->NbExp, res->Count, 0, t); statcoll_AddObs (res->sVal1, X2); } V[0] = t; gofw_ActiveTests2 (res->sVal1->V, res->pVal1->V, N, wdist_ChiSquare, V, res->sVal2, res->pVal2); sres_GetChi2SumStat (res); if (swrite_Collectors) statcoll_Write (res->sVal1, 5, 14, 4, 3); if (swrite_Basic) { swrite_AddStrChi (str, LENGTH, res->degFree); gofw_WriteActiveTests2 (N, res->sVal2, res->pVal2, str); swrite_Chi2SumTest (N, res); swrite_Final (gen, Timer); } if (localRes) sres_DeleteChi2 (res); chrono_Delete (Timer); }
void svaria_SumCollector (unif01_Gen * gen, sres_Chi2 * res, long N, long n, int r, double g) { const double gmax = 10.0; /* Maximal value of g */ const int jmax = 50; /* Maximal number of classes */ int j; /* Class index */ long Seq; long i; double X; double Y; double Sum; long NbClasses; long *Loc; double V[1]; lebool localRes = FALSE; chrono_Chrono *Timer; char *TestName = "svaria_SumCollector test"; char chaine[LEN1 + 1] = ""; char str[LEN2 + 1]; Timer = chrono_Create (); if (swrite_Basic) WriteDataSumColl (gen, TestName, N, n, r, g); if (g < 1.0 || g > gmax) { util_Error ("svaria_SumCollector: g < 1.0 or g > 10.0"); } if (res == NULL) { localRes = TRUE; res = sres_CreateChi2 (); } sres_InitChi2 (res, N, jmax, "svaria_SumCollector"); Loc = res->Loc; res->jmin = g; res->jmax = jmax; Sum = 0.0; for (j = res->jmin; j < jmax; j++) { res->NbExp[j] = n * ProbabiliteG (res->jmin, j, g); Sum += res->NbExp[j]; } res->NbExp[jmax] = util_Max (0.0, n - Sum); if (swrite_Classes) gofs_WriteClasses (res->NbExp, Loc, res->jmin, res->jmax, 0); gofs_MergeClasses (res->NbExp, Loc, &res->jmin, &res->jmax, &NbClasses); if (swrite_Classes) gofs_WriteClasses (res->NbExp, Loc, res->jmin, res->jmax, NbClasses); strncpy (chaine, "SumCollector sVal1: chi2 with ", (size_t) LEN1); sprintf (str, "%ld", NbClasses - 1); strncat (chaine, str, (size_t) LEN2); strncat (chaine, " degrees of freedom", (size_t) LEN1); statcoll_SetDesc (res->sVal1, chaine); res->degFree = NbClasses - 1; if (res->degFree < 1) { if (localRes) sres_DeleteChi2 (res); return; } for (Seq = 1; Seq <= N; Seq++) { for (j = 1; j <= jmax; j++) res->Count[j] = 0; for (i = 1; i <= n; i++) { X = 0.0; j = 0; do { X += unif01_StripD (gen, r); ++j; } while (X <= g); if (j > res->jmax) ++res->Count[res->jmax]; else ++res->Count[Loc[j - 1]]; } if (swrite_Counters) tables_WriteTabL (res->Count, res->jmin, res->jmax, 5, 10, "Observed numbers:"); Y = gofs_Chi2 (res->NbExp, res->Count, res->jmin, res->jmax); statcoll_AddObs (res->sVal1, Y); } V[0] = NbClasses - 1; gofw_ActiveTests2 (res->sVal1->V, res->pVal1->V, N, wdist_ChiSquare, V, res->sVal2, res->pVal2); res->pVal1->NObs = N; sres_GetChi2SumStat (res); if (swrite_Collectors) statcoll_Write (res->sVal1, 5, 14, 4, 3); if (swrite_Basic) { swrite_AddStrChi (str, LEN2, res->degFree); gofw_WriteActiveTests2 (N, res->sVal2, res->pVal2, str); swrite_Chi2SumTest (N, res); swrite_Final (gen, Timer); } if (localRes) sres_DeleteChi2 (res); chrono_Delete (Timer); }