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