/* ============ */
/* ksfreq.c */
/* ============ */
/* -------------------------------- */
/* WorkArea is defined in freqtst.c */
/* */
/* UINT WorkArea[32768u]; */
/* */
/* -------------------------------- */
#define RandNum WorkArea
#define MAX_SAMPS ((unsigned)RAND_MAX + 1u)
/* ---------------------------------------------------- */
/* IntCmprFun - Returns difference between Key and Elem */
/* ---------------------------------------------------- */
static int IntCmprFun(const void *Key, const void *Elem)
{
return (*(int *) Key - *(int *) Elem);
}
/* ============================================================== */
/* KSFreq - Kolmogorov-Smirnov Statistics Kn+ & Kn- and Probabilities */
/* ============================================================== */
void
KSFreq(KS_DATA_STRU *KSData)
{
UINT i, J, NumGen;
double KSVal, MaxKnMinus, MaxKnPlus, NextKn;
NumGen = (KSData->SampleSize <= MAX_SAMPS) ?
KSData->SampleSize : MAX_SAMPS;
for (i = 0; i < NumGen; ++i)
{
int NextRand = KSData->RandFun();
RandNum[i] = NextRand;
}
/* --------------------------- */
/* Counting Variates Generated */
/* --------------------------- */
KSData->TotNumGen += NumGen;
/* -------------------------------------- */
/* Calculate Statistics and Probabilities */
/* -------------------------------------- */
qsort((void *)RandNum, NumGen, sizeof(int), IntCmprFun);
MaxKnMinus = MaxKnPlus = 0;
for (J = 1; J <= NumGen; ++J)
{
KSVal = (double)RandNum[J-1]/(double)MAX_SAMPS;
NextKn = (double)J/(double)NumGen - KSVal;
MaxKnPlus = __max(MaxKnPlus, NextKn);
NextKn = 1.0/(double)NumGen - NextKn;
MaxKnMinus = __max(MaxKnMinus, NextKn);
}
KSData->KnMinus = MaxKnMinus;
KSData->KnPlus = MaxKnPlus;
KSData->KnMinusProb = KSmirnov(NumGen, MaxKnMinus);
KSData->KnPlusProb = KSmirnov(NumGen, MaxKnPlus);
}
/* End of File */