1 /*************************************************************************\
2  *
3  * Package:        TestU01
4  * File:           sres.c
5  * Environment:    ANSI C
6  *
7  * Copyright (c) 2002 Pierre L'Ecuyer, DIRO, Université de Montréal.
8  * e-mail: lecuyer@iro.umontreal.ca
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted without a fee for private, research,
13  * academic, or other non-commercial purposes.
14  * Any use of this software in a commercial environment requires a
15  * written licence from the copyright owner.
16  *
17  * Any changes made to this package must be clearly identified as such.
18  *
19  * In scientific publications which used this software, a reference to it
20  * would be appreciated.
21  *
22  * Redistributions of source code must retain this copyright notice
23  * and the following disclaimer.
24  *
25  * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
26  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
27  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28  *
29 \*************************************************************************/
30 
31 #include "util.h"
32 #include "sres.h"
33 #include "fbar.h"
34 
35 #include <string.h>
36 #include <math.h>
37 
38 
39 
40 
41 /*-------------------------------- Functions ------------------------------*/
42 
43 
44 
sres_InitChi2(sres_Chi2 * res,long N,long jmax,char * nam)45 void sres_InitChi2 (sres_Chi2 *res, long N, long jmax, char *nam)
46 {
47    statcoll_Init (res->sVal1, N);
48    statcoll_Init (res->pVal1, N);
49 
50    if (jmax < 0) {
51       if (res->jmax > 0) {
52          res->NbExp = util_Free (res->NbExp);
53          res->Count = util_Free (res->Count);
54          res->Loc = util_Free (res->Loc);
55       }
56    } else {
57       if (res->jmax < 0) {
58          res->NbExp = util_Calloc ((size_t) (jmax + 1), sizeof (double));
59          res->Count = util_Calloc ((size_t) (jmax + 1), sizeof (long));
60          res->Loc = util_Calloc ((size_t) (jmax + 1), sizeof (long));
61       } else {
62          int j;
63          res->NbExp =
64             util_Realloc (res->NbExp, (jmax + 1) * sizeof (double));
65          res->Count = util_Realloc (res->Count, (jmax + 1) * sizeof (long));
66          res->Loc = util_Realloc (res->Loc, (jmax + 1) * sizeof (long));
67          for (j = 0; j <= jmax; j++) {
68             res->NbExp[j] = 0.0;
69             res->Count[j] = 0;
70             res->Loc[j] = 0;
71          }
72       }
73    }
74    res->degFree = 0;
75    res->jmin = 0;
76    res->jmax = jmax;
77    gofw_InitTestArray (res->sVal2, -1.0);
78    gofw_InitTestArray (res->pVal2, -1.0);
79    res->name = util_Realloc (res->name, 1 + strlen (nam) * sizeof (char));
80    strcpy (res->name, nam);
81 }
82 
83 
84 /*-------------------------------------------------------------------------*/
85 
sres_CreateChi2(void)86 sres_Chi2 *sres_CreateChi2 (void)
87 {
88    sres_Chi2 *res;
89    res = util_Malloc (sizeof (sres_Chi2));
90    memset (res, 0, sizeof (sres_Chi2));
91    res->sVal1 = statcoll_Create (1, "");
92    res->pVal1 = statcoll_Create (1, "");
93    res->name = util_Calloc (1, sizeof (char));
94    res->jmin = 0;
95    res->jmax = -1;
96    res->NbExp = NULL;
97    res->Count = NULL;
98    res->Loc = NULL;
99    return res;
100 }
101 
102 
103 /*-------------------------------------------------------------------------*/
104 
sres_DeleteChi2(sres_Chi2 * res)105 void sres_DeleteChi2 (sres_Chi2 * res)
106 {
107    if (res == NULL)
108       return;
109    statcoll_Delete (res->sVal1);
110    statcoll_Delete (res->pVal1);
111    util_Free (res->NbExp);
112    util_Free (res->Count);
113    util_Free (res->Loc);
114    util_Free (res->name);
115    util_Free (res);
116 }
117 
118 
119 /*-------------------------------------------------------------------------*/
120 
sres_GetChi2SumStat(sres_Chi2 * res)121 void sres_GetChi2SumStat (sres_Chi2 *res)
122 {
123    const long N = res->sVal1->NObs;
124    double sum = N * statcoll_Average (res->sVal1);
125    res->sVal2[gofw_Sum] = sum;
126    if (N <= 1) {
127       res->pVal2[gofw_Sum] = res->sVal1->V[1];
128       res->sVal2[gofw_Var] = 0;
129       return;
130    }
131    res->pVal2[gofw_Sum] = fbar_ChiSquare2 (N*res->degFree, 12, sum);
132 }
133 
134 
135 /*=========================================================================*/
136 
sres_InitBasic(sres_Basic * res,long N,char * nam)137 void sres_InitBasic (sres_Basic *res, long N, char *nam)
138 {
139    statcoll_Init (res->sVal1, N);
140    statcoll_Init (res->pVal1, N);
141    gofw_InitTestArray (res->sVal2, -1.0);
142    gofw_InitTestArray (res->pVal2, -1.0);
143    res->name = util_Realloc (res->name, 1 + strlen (nam) * sizeof (char));
144    strcpy (res->name, nam);
145 }
146 
147 
148 /*-------------------------------------------------------------------------*/
149 
sres_CreateBasic(void)150 sres_Basic *sres_CreateBasic (void)
151 {
152    sres_Basic *res;
153    res = util_Malloc (sizeof (sres_Basic));
154    memset (res, 0, sizeof (sres_Basic));
155    res->sVal1 = statcoll_Create (1, "");
156    res->pVal1 = statcoll_Create (1, "");
157    res->name = util_Calloc (1, sizeof (char));
158    return res;
159 }
160 
161 
162 /*-------------------------------------------------------------------------*/
163 
sres_DeleteBasic(sres_Basic * res)164 void sres_DeleteBasic (sres_Basic * res)
165 {
166    if (res == NULL)
167       return;
168    statcoll_Delete (res->sVal1);
169    statcoll_Delete (res->pVal1);
170    util_Free (res->name);
171    util_Free (res);
172 }
173 
174 
175 /*-------------------------------------------------------------------------*/
176 
sres_GetNormalSumStat(sres_Basic * res)177 void sres_GetNormalSumStat (sres_Basic *res)
178 {
179    const long N = res->sVal1->NObs;
180    double sum = N * statcoll_Average (res->sVal1);
181    res->sVal2[gofw_Sum] = sum;
182    if (N <= 1) {
183       res->pVal2[gofw_Sum] = res->sVal1->V[1];
184       res->sVal2[gofw_Var] = 0;
185       return;
186    }
187    res->pVal2[gofw_Sum] = fbar_Normal1 (sum/sqrt((double)N));
188    sum = statcoll_Variance (res->sVal1);
189    res->sVal2[gofw_Var] = sum;
190    res->pVal2[gofw_Var] = fbar_ChiSquare2 (N - 1, 12, (N - 1)*sum);
191 }
192 
193 
194 /*=========================================================================*/
195 
sres_InitPoisson(sres_Poisson * res,long N,double Lambda,char * nam)196 void sres_InitPoisson (sres_Poisson *res, long N, double Lambda, char *nam)
197 {
198    statcoll_Init (res->sVal1, N);
199    res->Lambda = Lambda;
200    res->Mu = N * Lambda;
201    res->sVal2 = -1.0;
202    res->pLeft = -1.0;
203    res->pRight = -1.0;
204    res->pVal2 = -1.0;
205    res->name = util_Realloc (res->name, 1 + strlen (nam) * sizeof (char));
206    strcpy (res->name, nam);
207 
208 }
209 
210 
211 /*-------------------------------------------------------------------------*/
212 
sres_CreatePoisson(void)213 sres_Poisson * sres_CreatePoisson (void)
214 {
215    sres_Poisson *res;
216    res = util_Malloc (sizeof (sres_Poisson));
217    memset (res, 0, sizeof (sres_Poisson));
218    res->sVal1 = statcoll_Create (1, "");
219    res->name = util_Calloc (1, sizeof (char));
220    return res;
221 }
222 
223 
224 /*-------------------------------------------------------------------------*/
225 
sres_DeletePoisson(sres_Poisson * res)226 void sres_DeletePoisson (sres_Poisson *res)
227 {
228    if (res == NULL)
229       return;
230    statcoll_Delete (res->sVal1);
231    util_Free (res->name);
232    util_Free (res);
233 }
234 
235 
236 /*=========================================================================*/
237 
sres_InitDisc(sres_Disc * res,long N,char * nam)238 void sres_InitDisc (sres_Disc *res, long N, char *nam)
239 {
240    statcoll_Init (res->sVal1, N);
241    res->sVal2 = -1.0;
242    res->pLeft = -1.0;
243    res->pRight = -1.0;
244    res->pVal2 = -1.0;
245    res->name = util_Realloc (res->name, 1 + strlen (nam) * sizeof (char));
246    strcpy (res->name, nam);
247 
248 }
249 
250 
251 /*-------------------------------------------------------------------------*/
252 
sres_CreateDisc(void)253 sres_Disc * sres_CreateDisc (void)
254 {
255    sres_Disc *res;
256    res = util_Malloc (sizeof (sres_Disc));
257    memset (res, 0, sizeof (sres_Disc));
258    res->sVal1 = statcoll_Create (1, "");
259    res->name = util_Calloc (1, sizeof (char));
260    return res;
261 }
262 
263 
264 /*-------------------------------------------------------------------------*/
265 
sres_DeleteDisc(sres_Disc * res)266 void sres_DeleteDisc (sres_Disc *res)
267 {
268    if (res == NULL)
269       return;
270    statcoll_Delete (res->sVal1);
271    util_Free (res->name);
272    util_Free (res);
273 }
274