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