void ftab_MakeTables (ffam_Fam *fam, void *res, void *cho, void *par, ftab_CalcType Calc, int Nr, int f1, int f2, int fstep) { int i, j; /* Row and column of matrices for results of one test */ int f; chrono_Chrono *Timer; unif01_Gen *gen; SuspectLog2pval = 1.0 / (num_TwoExp[ftab_SuspectLog2p] - 1.0); Timer = chrono_Create (); Nr = util_Min (Nr, fam->Ng); for (i = 0; i < Nr; i++) { if (swrite_Basic) { printf ("CPU cumulative time: "); chrono_Write (Timer, chrono_hms); printf ("\n\n=============================================" "==============\n\nLSize = i = %2d\n\n", fam->LSize[i]); } if ((gen = fam->Gen[i])) { f = f1; j = 0; while (f <= f2) { Calc (fam, res, cho, par, fam->LSize[i], f, i, j); f += fstep; j++; } } } if (swrite_Basic) { printf ("Total CPU time: "); chrono_Write (Timer, chrono_hms); printf ("\n\n======================================================\n"); } chrono_Delete (Timer); }
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); }