204 char *cptr, line[1024], *lptr;
205 int i, ri, n, type=0;
209 if(verbose>0) printf(
"fitRead(%s)\n", filename);
210 if(fit==NULL)
return 1;
215 FILE *fp=fopen(filename,
"r");
216 if(fp==NULL) {strcpy(
fiterrmsg,
"cannot open file");
return 1;}
221 while(fgets(line, 1024, fp)!=NULL) {
223 if(strlen(line)<4 || line[0]==
'#')
continue;
225 if(!strncmp(line, FIT_VER, strlen(FIT_VER))) type=1;
else type=0;
228 if(type!=1) {fclose(fp);
return 3;}
229 lptr=line; cptr=strtok(lptr,
" \t\n\r");
230 if(cptr!=NULL) cptr=strtok(NULL,
" \t\n\r");
231 if(cptr!=NULL && strlen(cptr)<1024) strcpy(fit->
program, cptr);
236 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
238 if(strncasecmp(line,
"Nr of VOIs:", 11)==0)
break;
240 if(strncasecmp(line,
"Date:", 5)==0) {
241 cptr=line+5;
while(*cptr && !isdigit(*cptr)) cptr++;
246 if(strncasecmp(line,
"Data file:", 10)==0) {
247 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
248 if(cptr!=NULL && strlen(cptr)<FILENAME_MAX) strcpy(fit->
datafile, cptr);
252 if(strncasecmp(line,
"Study number:", 13)==0) {
253 lptr=&line[13]; cptr=strtok(lptr,
" \t\n\r");
258 if(strncasecmp(line,
"Data unit:", 10)==0) {
259 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
260 if(cptr!=NULL && strlen(cptr)<1024) strcpy(fit->
unit, cptr);
264 if(strncasecmp(line,
"Time unit:", 10)==0) {
265 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
269 if(strncasecmp(line,
"Distance unit:", 14)==0) {
270 lptr=&line[14]; cptr=strtok(lptr,
" \t\n\r");
274 fclose(fp);
return 8;
277 if(strncasecmp(line,
"Nr of VOIs:", 11)) {fclose(fp);
return 8;}
278 lptr=&line[11]; cptr=strtok(lptr,
" \t\n\r");
279 n=atoi(cptr);
if(n<1 || n>32000) {fclose(fp);
return 8;}
282 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
283 if(strncasecmp(line,
"Date:", 5)) {fclose(fp);
return 4;}
284 cptr=line+5;
while(*cptr && !isdigit(*cptr)) cptr++;
287 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
288 if(strncasecmp(line,
"Data file:", 10)) {fclose(fp);
return 5;}
289 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
290 if(cptr!=NULL && strlen(cptr)<FILENAME_MAX) strcpy(fit->
datafile, cptr);
292 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
293 if(strncasecmp(line,
"Data unit:", 10)) {fclose(fp);
return 6;}
294 lptr=&line[10]; cptr=strtok(lptr,
" \t\n\r");
295 if(cptr!=NULL && strlen(cptr)<1024) strcpy(fit->
unit, cptr);
297 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
298 if(strncasecmp(line,
"Time unit:", 10)==0) lptr=&line[10];
299 else if(strncasecmp(line,
"Distance unit:", 14)==0) lptr=&line[14];
300 else {fclose(fp);
return 7;}
301 cptr=strtok(lptr,
" \t\n\r");
304 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
305 if(strncasecmp(line,
"Nr of VOIs:", 11)) {fclose(fp);
return 8;}
306 lptr=&line[11]; cptr=strtok(lptr,
" \t\n\r");
307 n=atoi(cptr);
if(n<1 || n>32000) {fclose(fp);
return 8;}
314 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
315 if(strncasecmp(line,
"Region", 6)) {fclose(fp);
return 10;}
317 for(ri=0; ri<fit->
voiNr; ri++) {
320 while(fgets(line, 1024, fp)!=NULL)
if(strlen(line)>2 && line[0]!=
'#')
break;
322 int pindx=0;
char seps[8];
325 if(tn==sn || tn==sn-1 || tn==sn-2) {
326 strcpy(seps,
"\t\n\r"); n=tn;
329 int i=0, n=strlen(s);
333 cptr=s+i;
if(i<n) {cptr++; i++;}
337 cptr=s+i;
if(i<n) {cptr++; i++;}
343 strcpy(seps,
" \t\n\r"); n=sn;
361 for(i=0; i<fit->
voi[ri].
parNr; i++) {
365 if(ri==0) {fclose(fp);
fitEmpty(fit);
return(12);}
366 if(ri<fit->voiNr) fit->
voiNr=ri;
372 if(verbose>1) printf(
"done fitRead()\n");
653 double a, b, f, sqrx, cubx, xt;
656 double mf[]={0.0,0.0,0.0};
658 if(r==NULL)
return(1);
660 printf(
"fitEval(r, %g, %g): type=%d ;", x, *y, r->
type);
661 for(i=0; i<r->
parNr; i++) printf(
" %g", r->
p[i]);
664 if(y==NULL)
return(1);
677 n=r->
type-99; f=0.0;
for(i=n-1; i>0; i--) {f+=r->
p[i]; f*=x;} f+=r->
p[0];
681 a=r->
p[0]+r->
p[2]*x; b=r->
p[1]+r->
p[3]*x;
if(b==0.0)
break;
686 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx; b=r->
p[1]+r->
p[3]*x;
if(b==0.0)
break;
691 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx;
692 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx;
if(b==0.0)
break;
696 sqrx=x*x; cubx=sqrx*x;
697 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
698 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx;
if(b==0.0)
break;
702 sqrx=x*x; cubx=sqrx*x;
703 a=r->
p[0]+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
704 b=r->
p[1]+r->
p[3]*x+r->
p[5]*sqrx+r->
p[7]*cubx;
if(b==0.0)
break;
708 f=r->
p[0]*exp(r->
p[1]*x); *y=f;
712 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
713 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
718 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
719 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
720 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
725 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
726 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
727 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
728 a=r->
p[6]*exp(r->
p[7]*x); f+=a;
733 a=r->
p[0]*exp(r->
p[1]*x); f+=a;
734 a=r->
p[2]*exp(r->
p[3]*x); f+=a;
735 a=r->
p[4]*exp(r->
p[5]*x); f+=a;
736 a=r->
p[6]*exp(r->
p[7]*x); f+=a;
737 a=r->
p[8]*exp(r->
p[9]*x); f+=a;
741 f=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x));
746 a=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)); f+=a;
747 a=r->
p[3]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)); f+=a;
752 a=r->
p[0]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)); f+=a;
753 a=r->
p[3]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)); f+=a;
754 a=r->
p[6]*exp(r->
p[7]*x)*(1.0-exp(r->
p[8]*x)); f+=a;
759 xt=x-r->
p[4];
if(xt<=0.0) {
762 a=exp(-r->
p[2]*xt); f=r->
p[0]*exp(-r->
p[1]*xt)*(1.0-a);
764 f+=r->
p[3]*(r->
p[0]/(r->
p[1]*(r->
p[1]+r->
p[2])))
765 *(r->
p[2]-((r->
p[1]+r->
p[2])/a-r->
p[1])*exp(-(r->
p[1]+r->
p[2])*xt));
773 else if(x<r->p[0]+r->
p[1]) {
774 for(i=0, f=0.0; i<n; i++) {
775 if(r->
p[2*i+3]>1.0E-12) b=r->
p[2*i+2]/r->
p[2*i+3];
else b=r->
p[2*i+2];
776 f+=b*(1.0-exp(-r->
p[2*i+3]*(x-r->
p[0])));
778 if(r->
p[1]>0.0) f*=(1.0/r->
p[1]);
781 for(i=0, f=0.0; i<n; i++) {
782 if(r->
p[2*i+3]>1.0E-12) b=r->
p[2*i+2]/r->
p[2*i+3];
else b=r->
p[2*i+2];
783 f+=b*(exp(-r->
p[2*i+3]*(x-r->
p[0]-r->
p[1])) - exp(-r->
p[2*i+3]*(x-r->
p[0])));
785 if(r->
p[1]>0.0) f*=(1.0/r->
p[1]);
792 else if(x<=r->p[0]+r->
p[1]) {
793 f=exp(-r->
p[3]*(x-r->
p[0]));
794 *y=(r->
p[2]/(r->
p[3]*r->
p[3]))*(1.0-f);
796 f=exp(-r->
p[3]*r->
p[1]);
797 f+=exp(-r->
p[3]*(x-r->
p[0]-r->
p[1]));
798 f-=2.0*exp(-r->
p[3]*(x-r->
p[0]));
799 *y=(r->
p[2]/(r->
p[3]*r->
p[3]))*f;
805 else if(x>r->
p[0] && x<=r->p[1]) {
806 *y=r->
p[2]*(1.0-exp(r->
p[3]*(r->
p[0]-x)))/(1.0-exp(r->
p[3]*(r->
p[0]-r->
p[1])));
808 *y=r->
p[2]*(exp(r->
p[3]*(r->
p[1]-x))-exp(r->
p[3]*(r->
p[0]-x)))/(1.0-exp(r->
p[3]*(r->
p[0]-r->
p[1])));
812 f=1.0-r->
p[0]*(2.0-exp(-r->
p[1]*x)-exp(-r->
p[2]*x)); *y=f;
815 xt=x-r->
p[4];
if(xt<0.0) xt=0.0;
816 f=r->
p[0]*(1.0 - r->
p[1]*
igam(r->
p[3], r->
p[2]*xt));
820 xt=x-r->
p[0];
if(xt<=0.0) {
823 f=r->
p[2]*exp(-r->
p[3]*xt*xt*xt/(xt*xt+r->
p[4])) + (1.0-r->
p[2])*exp(-r->
p[5]*xt);
829 f=r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
833 f=1.0-r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
837 f=1.0 - r->
p[0]*(1.0+r->
p[3]*x)*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
841 if(r->
parNr>4) xt=x-r->
p[4];
else xt=x;
842 if(xt<=0.0) f=r->
p[3];
843 else {a=pow(xt, r->
p[1]); f=r->
p[0]*a/(a + r->
p[2]) + r->
p[3];}
847 f=r->
p[0] - r->
p[0]*pow(x, r->
p[1]) / (pow(x, r->
p[1]) + r->
p[2]);
851 xt=x-r->
p[4];
if(xt<=0.0) {
855 f=r->
p[3]+(r->
p[0]-r->
p[3])*a/(a+r->
p[2]);
860 xt=x-r->
p[4];
if(xt<=0.0) {
864 f=1.0-r->
p[3]-(r->
p[0]-r->
p[3])*a/(a+r->
p[2]);
869 xt=x-r->
p[4];
if(xt<=0.0) {
873 f=r->
p[3] * (1.0 - (1.0-r->
p[0])*a/(r->
p[2]+a));
878 xt=x-r->
p[4];
if(xt<=0.0) {
882 f=1.0 - r->
p[3] * (1.0 - (1.0-r->
p[0])*a/(r->
p[2]+a));
887 a=r->
p[0]*x; a*=a; f=1.0/pow(1.0+a, r->
p[1]);
891 a=r->
p[0]*x; a*=a; f=1.0 - 1.0/pow(1.0+a, r->
p[1]);
895 xt=x-r->
p[3];
if(xt<=0.0) {
898 f=pow(1.0+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
903 xt=x-r->
p[3];
if(xt<=0.0) {
906 f=pow(1.0+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
911 xt=x-r->
p[4];
if(xt<=0.0) {
914 f=pow(pow(r->
p[3],-1.0/r->
p[2])+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
919 xt=x-r->
p[4];
if(xt<=0.0) {
922 f=1.0-pow(pow(r->
p[3],-1.0/r->
p[2])+pow(r->
p[0]*xt, r->
p[1]), -r->
p[2]);
930 for(m=0; m<3; m++)
for(j=0; j<5; j++) mp[m][j]=0.0;
931 for(i=m=j=0; i<r->
parNr; i++) {mp[m][j]=r->
p[i]; j++;
if(j>4) {j=0; m++;}}
935 if(xt<=0.0) mf[m]=1.0-mp[m][3];
938 mf[m]=1.0-(mp[m][3]+(mp[m][0]-mp[m][3])*f/(mp[m][2]+f));
941 a=1.0-mf[0]*mf[1]-mf[0]*mf[2]-mf[1]*mf[2]+2.0*mf[0]*mf[1]*mf[2];
944 f-=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
945 f-=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
946 f-=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
948 }
else if(r->
type==872) {
949 *y=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
950 }
else if(r->
type==873) {
951 *y=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
952 }
else if(r->
type==874) {
953 *y=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
960 for(m=0; m<3; m++)
for(j=0; j<5; j++) mp[m][j]=0.0;
961 for(i=m=j=0; i<r->
parNr; i++) {mp[m][j]=r->
p[i]; j++;
if(j>4) {j=0; m++;}}
965 if(xt<=0.0) mf[m]=1.0-mp[m][3];
967 mf[m]=1.0 - pow(pow(mp[m][3], -1.0/mp[m][2]) + pow(mp[m][0]*(xt), mp[m][1]), -mp[m][2]);
970 a=1.0-mf[0]*mf[1]-mf[0]*mf[2]-mf[1]*mf[2]+2.0*mf[0]*mf[1]*mf[2];
973 f-=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
974 f-=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
975 f-=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
977 }
else if(r->
type==882) {
978 *y=mf[0]*(1.0-mf[1]-mf[2]+mf[1]*mf[2])/a;
979 }
else if(r->
type==883) {
980 *y=mf[1]*(1.0-mf[0]-mf[2]+mf[0]*mf[2])/a;
981 }
else if(r->
type==884) {
982 *y=mf[2]*(1.0-mf[0]-mf[1]+mf[0]*mf[1])/a;
989 for(
int i=0; i<r->
parNr; i+=2)
if(x>=r->
p[i]) *y=r->
p[i+1];
992 xt=x-r->
p[3]; a=sqrt(2.0)*(r->
p[2]/2.355);
993 f=r->
p[4]+(r->
p[0]/2.0)*(erf((xt+r->
p[1])/a)-erf((xt-r->
p[1])/a));
997 xt=x;
if(r->
parNr>7) xt-=r->
p[7];
1001 sqrx=xt*xt; cubx=sqrx*xt;
1002 a=r->
p[0]+r->
p[2]*xt+r->
p[4]*sqrx+r->
p[6]*cubx;
1003 b=r->
p[1]+r->
p[3]*xt+r->
p[5]*sqrx;
if(b==0.0)
break;
1009 xt=x;
if(r->
parNr>4) xt-=r->
p[4];
1014 a=(r->
p[0]*(xt)-r->
p[2])*exp(r->
p[1]*(xt)); f+=a;
1015 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
1020 xt=x;
if(r->
parNr>6) xt-=r->
p[6];
1025 a=(r->
p[0]*(xt)-r->
p[2]-r->
p[4])*exp(r->
p[1]*(xt)); f+=a;
1026 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
1027 a=r->
p[4]*exp(r->
p[5]*(xt)); f+=a;
1032 xt=x;
if(r->
parNr>8) xt-=r->
p[8];
1037 a=(r->
p[0]*(xt)-r->
p[2]-r->
p[4]-r->
p[6])*exp(r->
p[1]*(xt)); f+=a;
1038 a=r->
p[2]*exp(r->
p[3]*(xt)); f+=a;
1039 a=r->
p[4]*exp(r->
p[5]*(xt)); f+=a;
1040 a=r->
p[6]*exp(r->
p[7]*(xt)); f+=a;
1045 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1048 f=r->
p[0]*pow(xt, r->
p[1])*exp(-xt/r->
p[2]);
1053 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1056 f=r->
p[0]*pow(xt, r->
p[1])*exp(-xt/r->
p[2]) + r->
p[4];
1065 if(r->
p[1]>0.0) f += r->
p[1]*pow(xt, r->
p[2])*a;
1066 if(r->
parNr==6 && r->
p[4]>0.0) f += r->
p[4]*(1.0-a)*exp(-xt/r->
p[5]);
1071 xt=x-r->
p[0];
if(xt<=0.0) {
1074 f=r->
p[1]*(1.0-exp(-pow(xt/r->
p[2], r->
p[3])));
1079 xt=x-r->
p[0];
if(xt<=0.0) {
1082 a=xt/r->
p[2]; b=pow(a, r->
p[3]-1.0); f=exp(-b*a);
1083 a=r->
p[3]*b*f/r->
p[2]; b=1.0-f;
1084 f=r->
p[1]*(a+r->
p[4]*b);
1092 f=r->
p[0]*x*exp(-r->
p[1]*x)*r->
p[1]*r->
p[1];
1100 f=r->
p[0]*x*exp(-r->
p[1]*x);
1108 double e=exp(-r->
p[1]*x);
1109 f=x*e + (r->
p[2]/(r->
p[1]*r->
p[1]))*(1.0-(r->
p[1]*x+1.0)*e);
1116 f=1.0/(1.0-r->
p[0]);
1118 double e=exp(-r->
p[2]*x);
1119 double rcp=x*e + (r->
p[3]/(r->
p[2]*r->
p[2]))*(1.0-(r->
p[2]*x+1.0)*e);
1121 f=1.0/(1.0-r->
p[0]*(1.0-rcp));
1126 xt=x-r->
p[0];
if(xt<=0.0) {
1129 f=r->
p[2]*(r->
p[3]*xt*exp(-r->
p[4]*r->
p[1]*xt) + exp(-r->
p[1]*xt) );
1136 double A=r->
p[0], k=r->
p[1];
if(!(k>=0.0))
return(2);
1137 int N=(int)round(r->
p[2]);
if(!(N>0))
return(2);
1139 f = A*pow(k, N)*pow(x, N-1)*exp(-k*x)/f;
1144 xt=x-r->
p[0];
if(xt<=0.0) {
1147 f=r->
p[1]*pow(xt, r->
p[3])/(pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]));
1152 xt=x-r->
p[0];
if(xt<=0.0) {
1155 a=pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]);
1157 (pow(xt, r->
p[3]-1.0)/a - pow(xt, 2.0*r->
p[3]-1.0)/(a*a));
1162 xt=x-r->
p[0];
if(xt<=0.0) {
1165 double a, c, b, k, xb, cb, cbxb, hill, hilld;
1166 a=r->
p[1]; c=r->
p[2]; b=r->
p[3]; k=r->
p[4];
1167 cb=pow(c, b); xb=pow(xt, b); cbxb=cb+xb;
1168 hilld= b*pow(xt, b-1.0)/cbxb - b*pow(xt, 2.0*b-1.0)/(cbxb*cbxb);
1175 xt=x;
if(r->
parNr>3) xt-=r->
p[3];
1179 double c=0.0;
if(r->
parNr>2) c=r->
p[2];
1180 double e=exp(-r->
p[1]*xt);
1181 f=xt*e + (c/(r->
p[1]*r->
p[1]))*(1.0-(r->
p[1]*xt+1.0)*e);
1188 f=1.0/(1.0-r->
p[0]);
1190 sqrx=x*x; cubx=sqrx*x;
1191 a=0.0+r->
p[1]*x+r->
p[3]*sqrx+r->
p[5]*cubx;
1192 b=1.0+r->
p[2]*x+r->
p[4]*sqrx+r->
p[6]*cubx;
1193 f=1.0/(1.0-r->
p[0]*(1.0-(a/b)));
1198 if(r->
parNr<3)
return(2);
1204 double A2=0.0;
if(r->
parNr>3) A2=r->
p[3];
1205 double L2=0.0;
if(r->
parNr>4) L2=r->
p[4];
1206 double A3=0.0;
if(r->
parNr>5) A3=r->
p[5];
1207 double L3=0.0;
if(r->
parNr>6) L3=r->
p[6];
1208 f=(A1*x - A2 - A3)*exp(-L1*x) + A2*exp(-L2*x) + A3*exp(-L3*x);
1210 *y=1.0/(1.0-r->
p[0]*(1.0-f));
1214 double top, bottom, ec50, hillslope;
1215 top=r->
p[0]; bottom=r->
p[1]; ec50=r->
p[2]; hillslope=r->
p[3];
1216 if(x<=0.0) f=bottom;
1217 else f=bottom+(top-bottom)/(1.0+pow(ec50/x,hillslope));
1223 double top, bottom, logec50, hillslope;
1224 top=r->
p[0]; bottom=r->
p[1]; logec50=r->
p[2]; hillslope=r->
p[3];
1225 f=bottom+(top-bottom)/(1.0+pow(10.0, (logec50-x)*hillslope));
1230 a=r->
p[1]*pow(x, r->
p[2]) / (pow(x, r->
p[2]) + r->
p[3]);
1231 f=1.0/(1.0-r->
p[0]*(1.0-a));
1234 case 3331: *y=nan(
"");
break;
1235 case 9501: *y=nan(
"");
break;
1236 case 9502: *y=nan(
"");
break;
1237 case 9503: *y=nan(
"");
break;
1238 case 9701: *y=nan(
"");
break;
1242 if(isnan(*y))
return 1;
1318 if(r==NULL || yi==NULL)
return 1;
1322 if(fabs(r->
p[1])>1.0e-12) f=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1328 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1331 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1338 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1341 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1344 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1351 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1354 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1357 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1360 if(fabs(r->
p[7])>1.0e-12) a=(r->
p[6]/r->
p[7])*(exp(r->
p[7]*x)-1.0);
1367 if(fabs(r->
p[1])>1.0e-12) a=(r->
p[0]/r->
p[1])*(exp(r->
p[1]*x)-1.0);
1370 if(fabs(r->
p[3])>1.0e-12) a=(r->
p[2]/r->
p[3])*(exp(r->
p[3]*x)-1.0);
1373 if(fabs(r->
p[5])>1.0e-12) a=(r->
p[4]/r->
p[5])*(exp(r->
p[5]*x)-1.0);
1376 if(fabs(r->
p[7])>1.0e-12) a=(r->
p[6]/r->
p[7])*(exp(r->
p[7]*x)-1.0);
1379 if(fabs(r->
p[9])>1.0e-12) a=(r->
p[8]/r->
p[9])*(exp(r->
p[8]*x)-1.0);
1385 f=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1386 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]);
1391 a=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1392 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]); f+=a;
1393 a=(r->
p[3]/r->
p[4])*exp(r->
p[4]*x)
1394 - r->
p[3]*exp((r->
p[4]+r->
p[5])*x)/(r->
p[4]+r->
p[5]); f+=a;
1399 a=(r->
p[0]/r->
p[1])*exp(r->
p[1]*x)
1400 - r->
p[0]*exp((r->
p[1]+r->
p[2])*x)/(r->
p[1]+r->
p[2]); f+=a;
1401 a=(r->
p[3]/r->
p[4])*exp(r->
p[4]*x)
1402 - r->
p[3]*exp((r->
p[4]+r->
p[5])*x)/(r->
p[4]+r->
p[5]); f+=a;
1403 a=(r->
p[6]/r->
p[7])*exp(r->
p[7]*x)
1404 - r->
p[6]*exp((r->
p[7]+r->
p[8])*x)/(r->
p[7]+r->
p[8]); f+=a;
1407 case 331: *yi=nan(
"");
break;
1408 case 351: *yi=nan(
"");
break;
1410 t=r->
p[4]; xt=x-t; f=0.0;
1412 double A1, A2, L1, L2;
1413 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3];
1416 f+=(A2/L1)*(1.0 - a);
1417 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1419 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1424 t=r->
p[6]; xt=x-t; f=0.0;
1426 double A1, A2, A3, L1, L2, L3;
1427 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1430 f+=(A2/L1)*(1.0 - a);
1431 f+=(A3/L1)*(1.0 - a);
1432 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1434 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1435 if(L3!=0.0) f+=(A3/L3)*(exp(L3*xt) - 1.0);
else f+=A3*xt;
1440 t=r->
p[8]; xt=x-t; f=0.0;
1442 double A1, A2, A3, A4, L1, L2, L3, L4;
1443 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1444 A4=r->
p[6]; L4=r->
p[7];
1447 f+=(A2/L1)*(1.0 - a);
1448 f+=(A3/L1)*(1.0 - a);
1449 f+=(A4/L1)*(1.0 - a);
1450 f+=(A1/(L1*L1))*(1.0 + a*(L1*xt - 1.0));
1452 if(L2!=0.0) f+=(A2/L2)*(exp(L2*xt) - 1.0);
else f+=A2*xt;
1453 if(L3!=0.0) f+=(A3/L3)*(exp(L3*xt) - 1.0);
else f+=A3*xt;
1454 if(L4!=0.0) f+=(A4/L4)*(exp(L4*xt) - 1.0);
else f+=A4*xt;
1458 case 1401: *yi=nan(
"");
break;
1459 case 1402: *yi=nan(
"");
break;
1462 if(x>0.0) f=r->
p[0]*(1.0 - (r->
p[1]*x + 1.0)*exp(-r->
p[1]*x));
1468 a=r->
p[0]/(r->
p[1]*r->
p[1]);
1469 f=a*(1.0 - (r->
p[1]*x + 1.0)*exp(-r->
p[1]*x));
1474 xt=x-r->
p[0]; f=0.0;
1476 double a, b, m, n; a=r->
p[1]; b=r->
p[2]; m=r->
p[3]; n=r->
p[4];
1477 f+=m*((1.0-(n*a*xt+1.0)*exp(-n*a*xt)))/(n*n*a*a) + (1.0-exp(-a*xt))/a;
1486 double A, k; A=r->
p[0]; k=r->
p[1];
if(!(k>=0.0))
return(2);
1487 int N=(int)round(r->
p[2]);
if(!(N>=0) || N>20)
return(2);
1489 else if(N==1) f=A*(1.0-exp(-k*x));
1490 else if(N==2) f=A*(1.0 - exp(-k*x) - k*x*exp(-k*x));
1493 for(
int j=2; j<N; j++) s+=pow(k*x, j)/
lfactorial(j);
1494 f=A*(1.0-s*exp(-k*x));
1499 case 2111: *yi=nan(
"");
break;
1500 case 9501: *yi=nan(
"");
break;
1501 case 9502: *yi=nan(
"");
break;
1502 case 9503: *yi=nan(
"");
break;
1503 case 9701: *yi=nan(
"");
break;
1507 if(isnan(*yi))
return 3;
1550 if(r==NULL || yd==NULL)
return 1;
1564 f=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x);
1569 a=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x); f+=a;
1570 a=r->
p[3]*r->
p[4]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)) - r->
p[3]*r->
p[5]*exp((r->
p[4]+r->
p[5])*x); f+=a;
1575 a=r->
p[0]*r->
p[1]*exp(r->
p[1]*x)*(1.0-exp(r->
p[2]*x)) - r->
p[0]*r->
p[2]*exp((r->
p[1]+r->
p[2])*x); f+=a;
1576 a=r->
p[3]*r->
p[4]*exp(r->
p[4]*x)*(1.0-exp(r->
p[5]*x)) - r->
p[3]*r->
p[5]*exp((r->
p[4]+r->
p[5])*x); f+=a;
1577 a=r->
p[6]*r->
p[7]*exp(r->
p[7]*x)*(1.0-exp(r->
p[8]*x)) - r->
p[6]*r->
p[8]*exp((r->
p[7]+r->
p[8])*x); f+=a;
1583 t=r->
p[4]; xt=x-t; f=0.0;
1585 double A1, A2, L1, L2;
1586 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3];
1587 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + (A1*xt -A2)*L1*exp(L1*xt);
1592 t=r->
p[6]; xt=x-t; f=0.0;
1594 double A1, A2, A3, L1, L2, L3;
1595 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1596 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + A3*L3*exp(L3*xt) +
1597 (A1*xt -A2 -A3)*L1*exp(L1*xt);
1602 t=r->
p[8]; xt=x-t; f=0.0;
1604 double A1, A2, A3, A4, L1, L2, L3, L4;
1605 A1=r->
p[0]; L1=r->
p[1]; A2=r->
p[2]; L2=r->
p[3]; A3=r->
p[4]; L3=r->
p[5];
1606 A4=r->
p[6]; L4=r->
p[7];
1607 f= A1*exp(L1*xt) + A2*L2*exp(L2*xt) + A3*L3*exp(L3*xt) +
1608 A4*L4*exp(L4*xt) + (A1*xt -A2 -A3 -A4)*L1*exp(L1*xt);
1614 xt=x-r->
p[3];
if(xt<=0.0 || r->p[2]==0.0) {
1617 f=r->
p[0]*pow(xt, r->
p[1]-1.0)*exp(-xt/r->
p[2])*(r->
p[1]-(xt/r->
p[2]));
1622 xt=x-r->
p[0];
if(xt<=0.0) {
1625 a=pow(xt/r->
p[2], r->
p[3]-1.0);
1626 *yd=r->
p[1]*r->
p[3]*a*exp(-a*xt/r->
p[2])/r->
p[2];
1630 xt=x-r->
p[0];
if(xt<=0.0) {
1633 a=pow(r->
p[2], r->
p[3])+pow(xt, r->
p[3]);
1634 *yd=r->
p[1]*r->
p[3]*(pow(xt, r->
p[3]-1.0)/a - pow(xt, 2.0*r->
p[3]-1.0)/(a*a));
1637 case 2111: *yd=nan(
"");
break;
1638 case 9501: *yd=nan(
"");
break;
1639 case 9502: *yd=nan(
"");
break;
1640 case 9503: *yd=nan(
"");
break;
1641 case 9701: *yd=nan(
"");
break;
1645 if(isnan(*yd))
return(3);
1763 if((x<0.0) || (a<=0.0))
return(nan(
""));
1765 if((x<1.0) || (x<a))
return(1.0-
igam(a, x));
1767 double ans, ax, c, yc, r, t, y, z;
1768 double pk, pkm1, pkm2, qk, qkm1, qkm2;
1769 double big=4.503599627370496E+015;
1770 double biginv=2.22044604925031308085E-016;
1772 ax = a*log(x) - x - lgamma(a);
1773 if(ax < -DBL_MAX_10_EXP)
return(0.0);
1777 y=1.0-a; z=x+y+1.0; c=0.0;
1778 pkm2=1.0; qkm2=x; pkm1=x+1.0; qkm1=z*x;
1781 c+=1.0; y+=1.0; z+=2.0;
1782 yc=y*c; pk=pkm1*z - pkm2*yc; qk=qkm1*z - qkm2*yc;
1783 if(qk!=0.0) {r=pk/qk; t=fabs((ans-r)/r); ans=r;}
1785 pkm2=pkm1; pkm1=pk; qkm2=qkm1; qkm1=qk;
1786 if(fabs(pk)>big) {pkm2*=biginv; pkm1*=biginv; qkm2*=biginv; qkm1*=biginv;}
1787 }
while(t>DBL_EPSILON);