1 /*************************************************************************\
2 *
3 * Package: TestU01
4 * File: fcho.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 "fcho.h"
33 #include "ftab.h"
34 #include "swrite.h"
35
36 #include <stdio.h>
37 #include <string.h>
38 #include <math.h>
39
40
41
42 #define EPS2 1.0E-10
43 #define LEN 7
44
45
46
47
48 typedef struct {
49 double a;
50 double b;
51 double c;
52 fcho_FuncType F;
53 char *name;
54 } Sample_Param;
55
56
57
58 int fcho_Resolution = 30;
59
60
61 /*-------------------------------- Functions ------------------------------*/
62
63
64
fcho_Linear(double x)65 double fcho_Linear (double x)
66 {
67 return x;
68 }
69
70
71 /*=========================================================================*/
72
fcho_LinearInv(double x)73 double fcho_LinearInv (double x)
74 {
75 return 1.0/x;
76 }
77
78
79 /*=========================================================================*/
80
fcho_2Pow(double x)81 double fcho_2Pow (double x)
82 {
83 return pow (2.0, x);
84 }
85
86
87 /*=========================================================================*/
88
WriteSample(void * vpar,long junk,long j)89 static void WriteSample (void *vpar, long junk, long j)
90 {
91 Sample_Param *param = vpar;
92 const double a = param->a;
93 const double b = param->b;
94 const double c = param->c;
95
96 printf ("Choose ");
97 if (ftab_Style == ftab_Latex)
98 printf ("$");
99 if (param->name)
100 printf ("%s", param->name);
101
102 if (param->F == fcho_2Pow)
103 printf (" = 2^{ ");
104 else if (param->F == fcho_Linear)
105 printf (" = ");
106 else
107 printf (" = F(");
108
109 if (a > EPS2)
110 printf ("%4.2f*i ", a);
111
112 if (fabs (b*j) > EPS2) {
113 if (b*j > EPS2)
114 printf ("+ ");
115 else
116 printf ("- ");
117 if (fabs (b - 1.0) > EPS2)
118 printf ("%4.2f*%1ld ", fabs (b), labs (j));
119 else
120 printf ("%1ld ", labs (j));
121 }
122
123 if (c > EPS2)
124 printf ("+ %4.2f", fabs (c));
125 else if (c < -EPS2)
126 printf ("- %4.2f", fabs (c));
127
128 if (param->F == fcho_2Pow)
129 printf ("}");
130 else if (param->F == fcho_Linear)
131 ;
132 else
133 printf (")");
134
135 if (ftab_Style == ftab_Latex)
136 printf ("$");
137 printf ("\n\n");
138 }
139
140
141 /*-------------------------------------------------------------------------*/
142
ChooseSample(void * vpar,long i,long j)143 static double ChooseSample (void *vpar, long i, long j)
144 {
145 Sample_Param *param = vpar;
146 double x, y;
147
148 if (swrite_Basic)
149 WriteSample (vpar, 0, j);
150 x = i * param->a + j * param->b + param->c;
151 y = param->F(x);
152 return y;
153 }
154
155
156 /*-------------------------------------------------------------------------*/
157
fcho_CreateSampleSize(double a,double b,double c,fcho_FuncType F,char * name)158 fcho_Cho * fcho_CreateSampleSize (double a, double b, double c,
159 fcho_FuncType F, char *name)
160 {
161 fcho_Cho *cho;
162 Sample_Param *param;
163 size_t len;
164 char *name0 = "n";
165
166 cho = util_Malloc (sizeof (fcho_Cho));
167 param = util_Malloc (sizeof (Sample_Param));
168 param->a = a;
169 param->b = b;
170 param->c = c;
171 if (NULL == F)
172 param->F = fcho_2Pow;
173 else
174 param->F = F;
175
176 if (NULL == name)
177 name = name0;
178 len = strlen (name);
179 cho->name = util_Calloc (len + 1, sizeof (char));
180 strncpy (cho->name, name, (size_t) len);
181 cho->param = param;
182 cho->Write = WriteSample;
183 cho->Choose = ChooseSample;
184 param->name = cho->name;
185 return cho;
186 }
187
188
189 /*-------------------------------------------------------------------------*/
190
fcho_DeleteSampleSize(fcho_Cho * cho)191 void fcho_DeleteSampleSize (fcho_Cho *cho)
192 {
193 if (NULL == cho)
194 return;
195 cho->name = util_Free (cho->name);
196 cho->param = util_Free (cho->param);
197 util_Free (cho);
198 }
199
200
201 /*=========================================================================*/
202
fcho_ChooseParamL(fcho_Cho * cho,long min,long max,long i,long j)203 long fcho_ChooseParamL (fcho_Cho *cho, long min, long max, long i, long j)
204 {
205 double n;
206
207 util_Assert (cho, "fcho_ChooseParamL: cho is NULL");
208 n = cho->Choose (cho->param, i, j);
209
210 if (n < min) {
211 if (cho->name)
212 printf ("%s < %ld\n\n", cho->name, min);
213 return -1;
214 }
215 if (n > max) {
216 if (cho->name)
217 printf ("%s > %ld\n\n", cho->name, max);
218 return -1;
219 }
220 return (long) n;
221 }
222
223
224 /*=========================================================================*/
225
fcho_Chooses(int r,int s,int prec)226 int fcho_Chooses (int r, int s, int prec)
227 {
228 int s1;
229
230 if (r + s <= prec)
231 return s;
232
233 s1 = prec - r;
234 if (s1 <= 0)
235 printf ("r >= Resolution of generator\n\n");
236
237 return s1;
238 }
239
240
241 /*=========================================================================*/
242
fcho_CreateCho2(fcho_Cho * Chon,fcho_Cho * Chop2)243 fcho_Cho2 * fcho_CreateCho2 (fcho_Cho *Chon, fcho_Cho *Chop2)
244 {
245 fcho_Cho2 *cho;
246 cho = util_Malloc (sizeof (fcho_Cho2));
247 memset (cho, 0, sizeof (fcho_Cho2));
248 cho->Chon = Chon;
249 cho->Chop2 = Chop2;
250 return cho;
251 }
252
253 /*-------------------------------------------------------------------------*/
254
fcho_DeleteCho2(fcho_Cho2 * cho)255 void fcho_DeleteCho2 (fcho_Cho2 *cho)
256 {
257 if (NULL == cho)
258 return;
259 util_Free (cho);
260 }
261
262 /*=========================================================================*/
263