Evaluate the function values at specified x values.
41 {
42 if(verbose>0) {
43 printf("%s('%s', %d, p[], %d, x[], y[], %d)\n", __func__, fid, parNr, sampleNr, verbose);
44 fflush(stdout);
45 }
46 if(parNr<1 || p==NULL || sampleNr<1 || x==NULL || y==NULL) return(1);
47
48 if(strcasecmp(fid, "step")==0) {
49
50 if(parNr<2 || parNr&1) return(2);
51 for(int i=0; i<sampleNr; i++) {
52 y[i]=0.0;
53 for(int j=0; j<parNr; j+=2) if(x[i]>=p[j]) y[i]=p[j+1];
54 }
55 return(0);
56 }
57
58 if(strcasecmp(fid, "level")==0) {
59 for(int i=0; i<sampleNr; i++) y[i]=p[0];
60 return(0);
61 }
62
63 if(strcasecmp(fid, "fengm2")==0) {
64 if(parNr<6) return(2);
65 double delayt=0.0; if(parNr>6) delayt=p[6];
66 for(int i=0; i<sampleNr; i++) {
67 double xt=x[i]-delayt; y[i]=0.0; if(!(xt>0.0)) continue;
68 y[i] += (p[0]*xt-p[2]-p[4])*exp(p[1]*xt);
69 y[i] += p[2]*exp(p[3]*xt);
70 y[i] += p[4]*exp(p[5]*xt);
71 }
72 return(0);
73 }
74 if(strcasecmp(fid, "fengm2s")==0) {
75 if(parNr<4) return(2);
76 double delayt=0.0; if(parNr>4) delayt=p[4];
77 for(int i=0; i<sampleNr; i++) {
78 double xt=x[i]-delayt; y[i]=0.0; if(!(xt>0.0)) continue;
79 y[i] += (p[0]*xt-p[2])*exp(p[1]*xt);
80 y[i] += p[2]*exp(p[3]*xt);
81 }
82 return(0);
83 }
84 if(strcasecmp(fid, "fengm2e")==0) {
85 if(parNr<8) return(2);
86 double delayt=0.0; if(parNr>8) delayt=p[8];
87 for(int i=0; i<sampleNr; i++) {
88 double xt=x[i]-delayt; y[i]=0.0; if(!(xt>0.0)) continue;
89 y[i] += (p[0]*xt-p[2]-p[4]-p[6])*exp(p[1]*xt);
90 y[i] += p[2]*exp(p[3]*xt);
91 y[i] += p[4]*exp(p[5]*xt);
92 y[i] += p[6]*exp(p[7]*xt);
93 }
94 return(0);
95 }
96
97 if(strcasecmp(fid, "gammav")==0) {
98 if(parNr<3) return(2);
99 double delayt=0.0; if(parNr>3) delayt=p[3];
100 for(int i=0; i<sampleNr; i++) {
101 double xt=x[i]-delayt; y[i]=0.0;
102 if(!(xt>0.0) || fabs(p[2])<1.0E-10) continue;
103 y[i] = p[0]*pow(xt, p[1])*exp(-xt/p[2]);
104 }
105 return(0);
106 }
107
108 if(strcasecmp(fid, "1exp")==0) {
109 if(parNr<2) return(2);
110 for(int i=0; i<sampleNr; i++) {
111 y[i]=0.0;
112 y[i] += p[0]*exp(p[1]*x[i]);
113 }
114 return(0);
115 }
116
117 if(strcasecmp(fid, "2exp")==0) {
118 if(parNr<4) return(2);
119 for(int i=0; i<sampleNr; i++) {
120 y[i]=0.0;
121 y[i] += p[0]*exp(p[1]*x[i]);
122 y[i] += p[2]*exp(p[3]*x[i]);
123 }
124 return(0);
125 }
126
127 if(strcasecmp(fid, "3exp")==0) {
128 if(parNr<6) return(2);
129 for(int i=0; i<sampleNr; i++) {
130 y[i]=0.0;
131 y[i] += p[0]*exp(p[1]*x[i]);
132 y[i] += p[2]*exp(p[3]*x[i]);
133 y[i] += p[4]*exp(p[5]*x[i]);
134 }
135 return(0);
136 }
137
138 if(strcasecmp(fid, "4exp")==0) {
139 if(parNr<8) return(2);
140 for(int i=0; i<sampleNr; i++) {
141 y[i]=0.0;
142 y[i] += p[0]*exp(p[1]*x[i]);
143 y[i] += p[2]*exp(p[3]*x[i]);
144 y[i] += p[4]*exp(p[5]*x[i]);
145 y[i] += p[6]*exp(p[7]*x[i]);
146 }
147 return(0);
148 }
149
150 if(strcasecmp(fid, "5exp")==0) {
151 if(parNr<10) return(2);
152 for(int i=0; i<sampleNr; i++) {
153 y[i]=0.0;
154 y[i] += p[0]*exp(p[1]*x[i]);
155 y[i] += p[2]*exp(p[3]*x[i]);
156 y[i] += p[4]*exp(p[5]*x[i]);
157 y[i] += p[6]*exp(p[7]*x[i]);
158 y[i] += p[8]*exp(p[9]*x[i]);
159 }
160 return(0);
161 }
162
163
164 if(strcasecmp(fid, "ppfigamc")==0) {
165 if(parNr<4) return(2);
166 double delayt=0.0; if(parNr>4) delayt=p[4];
167 double a=p[0];
168 double b=p[1];
169 double c=p[2]; if(c<0.0) return(2);
170 double d=p[3]; if(d<=0.0) return(2);
171 for(int i=0; i<sampleNr; i++) {
172 double t=x[i]-delayt; if(t<0.0) t=0.0;
173 y[i]=a*(1.0-b*
igam(d, c*t));
174 }
175 return(0);
176 }
177
178
179 if(strcasecmp(fid, "weibullcdfd")==0) {
180 if(parNr<4) return(2);
181 double delayt=p[0];
182 for(int i=0; i<sampleNr; i++) {
183 double xt=x[i]-delayt; y[i]=0.0;
184 if(!(xt>0.0)) continue;
185 y[i] = p[1]*(1.0-exp(-pow(xt/p[2], p[3])));
186 }
187 return(0);
188 }
189
190
191 if(strcasecmp(fid, "weibullcdfdd")==0) {
192 if(parNr<5) return(2);
193 double delayt=p[0];
194 for(int i=0; i<sampleNr; i++) {
195 double xt=x[i]-delayt; y[i]=0.0;
196 if(!(xt>0.0)) continue;
197 double a=exp(-pow(xt/p[2], p[3]));
198 double b=(p[3]/p[2]) * pow(xt/p[2], p[3]-1.0) * a;
199 y[i] = p[1]*(b + p[4]*(1.0-a));
200 }
201 return(0);
202 }
203
204
205
206 if(strcasecmp(fid, "dmsurge")==0) {
207 if(parNr<3) return(2);
208 double delayt=p[0];
209 for(int i=0; i<sampleNr; i++) {
210 double xt=x[i]-delayt;
211 y[i]=0.0;
212 if(xt>0.0)
213 for(int pi=2; pi<parNr; pi+=2) {
214 double a, b;
215 a=p[pi-1]; b=p[pi];
216 y[i] += a*xt*exp(-b*xt);
217 }
218 }
219 return(0);
220 }
221
222
223
224 if(strcasecmp(fid, "surge")==0) {
225 if(parNr<2) return(2);
226 double f=p[0]*(p[1]*p[1]);
227 for(int i=0; i<sampleNr; i++) {
228 double xt=x[i]; y[i]=0.0;
229 if(!(xt>0.0)) continue;
230 y[i] = f*xt*exp(-p[1]*xt);
231 }
232 return(0);
233 }
234
235
236 if(strcasecmp(fid, "tradsurge")==0) {
237 if(parNr<2) return(2);
238 for(int i=0; i<sampleNr; i++) {
239 double xt=x[i]; y[i]=0.0;
240 if(!(xt>0.0)) continue;
241 y[i] = p[0]*xt*exp(-p[1]*xt);
242 }
243 return(0);
244 }
245
246
247
248 if(strcasecmp(fid, "surgerecirc")==0) {
249 if(parNr<2) return(2);
250 double c=0.0;
251 if(parNr>=3) c=p[2];
252 for(int i=0; i<sampleNr; i++) {
253 double xt=x[i]; y[i]=0.0;
254 if(!(xt>0.0)) continue;
255 double e=exp(-p[1]*xt);
256 y[i] = xt*e + (c/(p[1]*p[1]))*(1.0 - (p[1]*xt+1.0)*e);
257 y[i] *= p[0];
258 }
259 return(0);
260 }
261
262
263
264 if(strcasecmp(fid, "surgerecircd")==0) {
265 if(parNr<2) return(2);
266 double c=0.0; if(parNr>=3) c=p[2];
267 double delayt=0.0; if(parNr>=4) delayt=p[3];
268 for(int i=0; i<sampleNr; i++) {
269 double xt=x[i]-delayt; y[i]=0.0;
270 if(!(xt>0.0)) continue;
271 double e=exp(-p[1]*xt);
272 y[i] = xt*e + (c/(p[1]*p[1]))*(1.0 - (p[1]*xt+1.0)*e);
273 y[i] *= p[0];
274 }
275 return(0);
276 }
277
278
279
280
281 if(strcasecmp(fid, "p2bsrc")==0) {
282 if(parNr<3) return(2);
283 double c=0.0; if(parNr>=4) c=p[3];
284 double HCT=p[0];
285 double a=p[1];
286 double b=p[2];
287 for(int i=0; i<sampleNr; i++) {
288 double xt=x[i]; if(!(xt>0.0)) {y[i]=1.0/(1.0-HCT); continue;}
289 double e=exp(-b*xt);
290 double r=a*(xt*e + (c/(b*b))*(1.0 - (b*xt+1.0)*e));
291 y[i] = 1.0/(1.0-HCT*(1.0-r));
292 }
293 return(0);
294 }
295
296
297
298 if(strcasecmp(fid, "p2bfm2")==0) {
299 if(parNr<3) return(2);
300 double HCT=p[0];
301 double A1=p[1];
302 double L1=p[2];
303 double A2=0.0; if(parNr>3) A2=p[3];
304 double L2=0.0; if(parNr>4) L2=p[4];
305 double A3=0.0; if(parNr>5) A3=p[5];
306 double L3=0.0; if(parNr>6) L3=p[6];
307 for(int i=0; i<sampleNr; i++) {
308 double xt=x[i]; if(!(xt>0.0)) {y[i]=1.0/(1.0-HCT); continue;}
309 double r=(A1*xt - A2 - A3)*exp(-L1*xt) + A2*exp(-L2*xt) + A3*exp(-L3*xt);
310 y[i] = 1.0/(1.0-HCT*(1.0-r));
311 }
312 return(0);
313 }
314
315
316 if(strcasecmp(fid, "surgefdgaif")==0) {
317 if(parNr<5) return(2);
318 double delayt=p[0];
319 for(int i=0; i<sampleNr; i++) {
320 double xt=x[i]-delayt; y[i]=0.0;
321 if(!(xt>0.0)) continue;
322 y[i] = p[2]*(p[3]*xt*exp(-p[4]*p[1]*xt) + exp(-p[1]*xt));
323 }
324 return(0);
325 }
326
327
328 if(strcasecmp(fid, "erlangpdf")==0) {
329 if(parNr<3) return(2);
330 double A=p[0], k=p[1]; if(!(k>=0.0)) return(2);
331 int N=(int)round(p[2]); if(!(N>0)) return(2);
333 for(int i=0; i<sampleNr; i++) {
334 y[i]=0.0; if(!(x[i]>=0.0)) continue;
335 y[i] = A*pow(k, N)*pow(x[i], N-1)*exp(-k*x[i])/f;
336 }
337 return(0);
338 }
339
340
341 if(strcasecmp(fid, "ratf11")==0) {
342 if(parNr<4) return(2);
343 for(int i=0; i<sampleNr; i++) {
344 double a=p[0]+p[2]*x[i];
345 double b=p[1]+p[3]*x[i];
346 y[i]=a/b;
347 }
348 return(0);
349 }
350 if(strcasecmp(fid, "ratf21")==0) {
351 if(parNr<5) return(2);
352 for(int i=0; i<sampleNr; i++) {
353 double a=p[0]+p[2]*x[i]+p[4]*x[i]*x[i];
354 double b=p[1]+p[3]*x[i];
355 y[i]=a/b;
356 }
357 return(0);
358 }
359 if(strcasecmp(fid, "ratf22")==0) {
360 if(parNr<6) return(2);
361 for(int i=0; i<sampleNr; i++) {
362 double sqrx=x[i]*x[i];
363 double a=p[0]+p[2]*x[i]+p[4]*sqrx;
364 double b=p[1]+p[3]*x[i]+p[5]*sqrx;
365 y[i]=a/b;
366 }
367 return(0);
368 }
369 if(strcasecmp(fid, "ratf32")==0) {
370 if(parNr<7) return(2);
371 for(int i=0; i<sampleNr; i++) {
372 double sqrx=x[i]*x[i];
373 double a=p[0]+p[2]*x[i]+p[4]*sqrx+p[6]*sqrx*x[i];
374 double b=p[1]+p[3]*x[i]+p[5]*sqrx;
375 y[i]=a/b;
376 }
377 return(0);
378 }
379 if(strcasecmp(fid, "ratf33")==0) {
380 if(parNr<8) return(2);
381 for(int i=0; i<sampleNr; i++) {
382 double sqrx=x[i]*x[i];
383 double cubx=sqrx*x[i];
384 double a=p[0]+p[2]*x[i]+p[4]*sqrx+p[6]*cubx;
385 double b=p[1]+p[3]*x[i]+p[5]*sqrx+p[7]*cubx;
386 y[i]=a/b;
387 }
388 return(0);
389 }
390 if(strcasecmp(fid, "p2brf")==0) {
391 if(parNr<7) return(2);
392 for(int i=0; i<sampleNr; i++) {
393 if(x[i]<=0.0) {
394 y[i]=1.0/(1.0-p[0]);
395 } else {
396 double sqrx=x[i]*x[i];
397 double cubx=sqrx*x[i];
398 double a=0.0+p[1]*x[i]+p[3]*sqrx+p[5]*cubx;
399 double b=1.0+p[2]*x[i]+p[4]*sqrx+p[6]*cubx;
400 y[i]=1.0/(1.0-p[0]*(1.0-(a/b)));
401 }
402 }
403 return(0);
404 }
405
406
407 if(strcasecmp(fid, "mpfhill")==0) {
408 if(parNr<3) return(2);
409 for(int i=0; i<sampleNr; i++) {
410 y[i]=p[0]*pow(x[i], p[1]) / (pow(x[i], p[1]) + p[2]);
411 }
412 return(0);
413 }
414 if(strcasecmp(fid, "p2bhill")==0) {
415 if(parNr<4) return(2);
416 for(int i=0; i<sampleNr; i++) {
417 double cpr=p[1]*pow(x[i], p[2]) / (pow(x[i], p[2]) + p[3]);
418 y[i]=1.0/(1.0-p[0]*(1.0-cpr));
419 }
420 return(0);
421 }
422
423
424 if(verbose>1) printf("function '%s' not supported by %s()\n", fid, __func__);
425 return(10);
426}