--- imach/src/imach.c 2018/12/13 09:16:26 1.289 +++ imach/src/imach.c 2019/05/18 09:52:50 1.295 @@ -1,6 +1,26 @@ -/* $Id: imach.c,v 1.289 2018/12/13 09:16:26 brouard Exp $ +/* $Id: imach.c,v 1.295 2019/05/18 09:52:50 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.295 2019/05/18 09:52:50 brouard + Summary: doxygen tex bug + + Revision 1.294 2019/05/16 14:54:33 brouard + Summary: There was some wrong lines added + + Revision 1.293 2019/05/09 15:17:34 brouard + *** empty log message *** + + Revision 1.292 2019/05/09 14:17:20 brouard + Summary: Some updates + + Revision 1.291 2019/05/09 13:44:18 brouard + Summary: Before ncovmax + + Revision 1.290 2019/05/09 13:39:37 brouard + Summary: 0.99r18 unlimited number of individuals + + The number n which was limited to 20,000 cases is now unlimited, from firstobs to lastobs. If the number is too for the virtual memory, probably an error will occur. + Revision 1.289 2018/12/13 09:16:26 brouard Summary: Bug for young ages (<-30) will be in r17 @@ -1049,11 +1069,11 @@ typedef struct { #define NINTERVMAX 8 #define NLSTATEMAX 8 /**< Maximum number of live states (for func) */ #define NDEATHMAX 8 /**< Maximum number of dead states (for func) */ -#define NCOVMAX 20 /**< Maximum number of covariates, including generated covariates V1*V2 */ +#define NCOVMAX 20 /**< Maximum number of covariates, including generated covariates V1*V2 */ #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 /*#define decodtabm(h,k,cptcoveff)= (h <= (1<> (k-1)) & 1) +1 : -1)*/ #define decodtabm(h,k,cptcoveff) (((h-1) >> (k-1)) & 1) +1 -#define MAXN 20000 +/*#define MAXN 20000 */ /* Should by replaced by nobs, real number of observations and unlimited */ #define YEARM 12. /**< Number of months per year */ /* #define AGESUP 130 */ /* #define AGESUP 150 */ @@ -1073,12 +1093,12 @@ typedef struct { #define ODIRSEPARATOR '\\' #endif -/* $Id: imach.c,v 1.289 2018/12/13 09:16:26 brouard Exp $ */ +/* $Id: imach.c,v 1.295 2019/05/18 09:52:50 brouard Exp $ */ /* $State: Exp $ */ #include "version.h" char version[]=__IMACH_VERSION__; char copyright[]="April 2018,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2018"; -char fullversion[]="$Revision: 1.289 $ $Date: 2018/12/13 09:16:26 $"; +char fullversion[]="$Revision: 1.295 $ $Date: 2019/05/18 09:52:50 $"; char strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ @@ -1101,6 +1121,7 @@ int nqfveff=0; /**< nqfveff Number of Qu int ntveff=0; /**< ntveff number of effective time varying variables */ int nqtveff=0; /**< ntqveff number of effective time varying quantitative variables */ int cptcov=0; /* Working variable */ +int nobs=10; /* Number of observations in the data lastobs-firstobs */ int ncovcombmax=NCOVMAX; /* Maximum calculated number of covariate combination = pow(2, cptcoveff) */ int npar=NPARMAX; int nlstate=2; /* Number of live states */ @@ -2954,8 +2975,8 @@ double **pmij(double **ps, double *cov, ps[ii][ii]=1; } } - - + + /* for(ii=1; ii<= nlstate+ndeath; ii++){ */ /* for(jj=1; jj<= nlstate+ndeath; jj++){ */ /* printf(" pmij ps[%d][%d]=%lf ",ii,jj,ps[ii][jj]); */ @@ -2983,7 +3004,7 @@ double **pmij(double **ps, double *cov, double **out, **pmij(); double sumnew=0.; double agefin; - double k3=0.; /* constant of the w_x diagonal matrixe (in order for B to sum to 1 even for death state) */ + double k3=0.; /* constant of the w_x diagonal matrix (in order for B to sum to 1 even for death state) */ double **dnewm, **dsavm, **doldm; double **bbmij; @@ -3002,7 +3023,7 @@ double **pmij(double **ps, double *cov, /* outputs pmmij which is a stochastic matrix in row */ /* Diag(w_x) */ - /* Problem with prevacurrent which can be zero */ + /* Rescaling the cross-sectional prevalence: Problem with prevacurrent which can be zero */ sumnew=0.; /*for (ii=1;ii<=nlstate+ndeath;ii++){*/ for (ii=1;ii<=nlstate;ii++){ /* Only on live states */ @@ -3029,10 +3050,10 @@ double **pmij(double **ps, double *cov, } /* End doldm, At the end doldm is diag[(w_i)] */ - /* left Product of this diag matrix by pmmij=Px (dnewm=dsavm*doldm) */ - bbmij=matprod2(dnewm, doldm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, pmmij); /* Bug Valgrind */ + /* Left product of this diag matrix by pmmij=Px (dnewm=dsavm*doldm): diag[(w_i)*Px */ + bbmij=matprod2(dnewm, doldm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, pmmij); /* was a Bug Valgrind */ - /* Diag(Sum_i w^i_x p^ij_x */ + /* Diag(Sum_i w^i_x p^ij_x, should be the prevalence at age x+stepm */ /* w1 p11 + w2 p21 only on live states N1./N..*N11/N1. + N2./N..*N21/N2.=(N11+N21)/N..=N.1/N.. */ for (j=1;j<=nlstate+ndeath;j++){ sumnew=0.; @@ -3050,7 +3071,7 @@ double **pmij(double **ps, double *cov, } /*End ii */ } /* End j, At the end dsavm is diag[1/(w_1p1i+w_2 p2i)] for ALL states even if the sum is only for live states */ - ps=matprod2(ps, dnewm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, dsavm); /* Bug Valgrind */ + ps=matprod2(ps, dnewm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, dsavm); /* was a Bug Valgrind */ /* ps is now diag[w_i] * Px * diag [1/(w_1p1i+w_2 p2i)] */ /* end bmij */ return ps; /*pointer is unchanged */ @@ -3882,7 +3903,7 @@ return -l; /*************** function likelione ***********/ -void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpri, long *ipmx, double *sw, double *fretone, double (*funcone)(double [])) +void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpri, long *ipmx, double *sw, double *fretone, double (*func)(double [])) { /* This routine should help understanding what is done with the selection of individuals/waves and @@ -3906,7 +3927,7 @@ void likelione(FILE *ficres,double p[], fprintf(ficresilk," -2*gipw/gsw*weight*ll(total)\n"); } - *fretone=(*funcone)(p); + *fretone=(*func)(p); if(*globpri !=0){ fclose(ficresilk); if (mle ==0) @@ -5997,10 +6018,10 @@ void concatwav(int wav[], int **dh, int prlim[i][i]=mobaverage[(int)age][i][ij]; } } - /**< Computes the shifted transition matrix \f$ {}{h}_p^{ij}_x\f$ at horizon h. + /**< Computes the shifted transition matrix \f$ {}{h}_p^{ij}x\f$ at horizon h. */ hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij,nres); /* Returns p3mat[i][j][h] for h=0 to nhstepm */ - /**< And for each alive state j, sums over i \f$ w^i_x {}{h}_p^{ij}_x\f$, which are the probability + /**< And for each alive state j, sums over i \f$ w^i_x {}{h}_p^{ij}x\f$, which are the probability * at horizon h in state j including mortality. */ for(j=1; j<= nlstate; j++){ @@ -6922,13 +6943,13 @@ divided by h: hPij ",stepm,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres); /* Survival functions (period) in state j */ for(cpt=1; cpt<=nlstate;cpt++){ - fprintf(fichtm,"
\n- Survival functions in state %d. Or probability to survive in state %d being in state (1 to %d) at different ages. %s_%d-%d-%d.svg
\ + fprintf(fichtm,"
\n- Survival functions in state %d. And probability to be observed in state %d being in state (1 to %d) at different ages. %s_%d-%d-%d.svg
\ ", cpt, cpt, nlstate, subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres); } /* State specific survival functions (period) */ for(cpt=1; cpt<=nlstate;cpt++){ - fprintf(fichtm,"
\n- Survival functions from state %d in each live state and total.\ - Or probability to survive in various states (1 to %d) being in state %d at different ages. \ + fprintf(fichtm,"
\n- Survival functions in state %d and in any other live state (total).\ + And probability to be observed in various states (up to %d) being in state %d at different ages. \ %s_%d-%d-%d.svg
", cpt, nlstate, cpt, subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres); } /* Period (forward stable) prevalence in each health state */ @@ -10190,8 +10211,10 @@ BOOL IsWow64() #endif void syscompilerinfo(int logged) - { - /* #include "syscompilerinfo.h"*/ +{ +#include + + /* #include "syscompilerinfo.h"*/ /* command line Intel compiler 32bit windows, XP compatible:*/ /* /GS /W3 /Gy /Zc:wchar_t /Zi /O2 /Fd"Release\vc120.pdb" /D "WIN32" /D "NDEBUG" /D @@ -10226,6 +10249,8 @@ void syscompilerinfo(int logged) /ManifestFile:"Release\IMaCh.exe.intermediate.manifest" /OPT:ICF /NOLOGO /TLBID:1 */ + + #if defined __INTEL_COMPILER #if defined(__GNUC__) struct utsname sysInfo; /* For Intel on Linux and OS/X */ @@ -10242,8 +10267,6 @@ void syscompilerinfo(int logged) } #endif -#include - printf("Compiled with:");if(logged)fprintf(ficlog,"Compiled with:"); #if defined(__clang__) printf(" Clang/LLVM");if(logged)fprintf(ficlog," Clang/LLVM"); /* Clang/LLVM. ---------------------------------------------- */ @@ -10729,7 +10752,8 @@ int main(int argc, char *argv[]) double ssval; #endif int movingaverage(double ***probs, double bage,double fage, double ***mobaverage, int mobilav); - int i,j, k, n=MAXN,iter=0,m,size=100, cptcod; + int i,j, k, iter=0,m,size=100, cptcod; /* Suppressing because nobs */ + /* int i,j, k, n=MAXN,iter=0,m,size=100, cptcod; */ int ncvyear=0; /* Number of years needed for the period prevalence to converge */ int jj, ll, li, lj, lk; int numlinepar=0; /* Current linenumber of parameter file */ @@ -10764,7 +10788,7 @@ int main(int argc, char *argv[]) char pathr[MAXLINE], pathimach[MAXLINE]; char *tok, *val; /* pathtot */ - int firstobs=1, lastobs=10; + int firstobs=1, lastobs=10; /* nobs = lastobs-firstobs declared globally ;*/ int c, h , cpt, c2; int jl=0; int i1, j1, jk, stepsize=0; @@ -10772,7 +10796,7 @@ int main(int argc, char *argv[]) int *tab; int mobilavproj=0 , prevfcast=0 ; /* moving average of prev, If prevfcast=1 prevalence projection */ - int backcast=0; + int backcast=0; /* defined as global for mlikeli and mle*/ int mobilav=0,popforecast=0; int hstepm=0, nhstepm=0; int agemortsup; @@ -11131,10 +11155,10 @@ int main(int argc, char *argv[]) ungetc(c,ficpar); - covar=matrix(0,NCOVMAX,1,n); /**< used in readdata */ - if(nqv>=1)coqvar=matrix(1,nqv,1,n); /**< Fixed quantitative covariate */ - if(nqtv>=1)cotqvar=ma3x(1,maxwav,1,nqtv,1,n); /**< Time varying quantitative covariate */ - if(ntv+nqtv>=1)cotvar=ma3x(1,maxwav,1,ntv+nqtv,1,n); /**< Time varying covariate (dummy and quantitative)*/ + covar=matrix(0,NCOVMAX,firstobs,lastobs); /**< used in readdata */ + if(nqv>=1)coqvar=matrix(1,nqv,firstobs,lastobs); /**< Fixed quantitative covariate */ + if(nqtv>=1)cotqvar=ma3x(1,maxwav,1,nqtv,firstobs,lastobs); /**< Time varying quantitative covariate */ + if(ntv+nqtv>=1)cotvar=ma3x(1,maxwav,1,ntv+nqtv,firstobs,lastobs); /**< Time varying covariate (dummy and quantitative)*/ cptcovn=0; /*Number of covariates, i.e. number of '+' in model statement plus one, indepently of n in Vn*/ /* v1+v2+v3+v2*v4+v5*age makes cptcovn = 5 v1+v2*age+v2*v3 makes cptcovn = 3 @@ -11197,6 +11221,15 @@ int main(int argc, char *argv[]) for(jj=1; jj <=nlstate+ndeath; jj++){ if(jj==i) continue; j++; + while((c=getc(ficpar))=='#' && c!= EOF){ + ungetc(c,ficpar); + fgets(line, MAXLINE, ficpar); + numlinepar++; + fputs(line,stdout); + fputs(line,ficparo); + fputs(line,ficlog); + } + ungetc(c,ficpar); fscanf(ficpar,"%1d%1d",&i1,&j1); if ((i1 != i) || (j1 != jj)){ printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n \ @@ -11337,16 +11370,25 @@ Please run with mle=-1 to get a correct /* Main data */ - n= lastobs; - num=lvector(1,n); - moisnais=vector(1,n); - annais=vector(1,n); - moisdc=vector(1,n); - andc=vector(1,n); - weight=vector(1,n); - agedc=vector(1,n); - cod=ivector(1,n); - for(i=1;i<=n;i++){ + nobs=lastobs-firstobs+1; /* was = lastobs;*/ + /* num=lvector(1,n); */ + /* moisnais=vector(1,n); */ + /* annais=vector(1,n); */ + /* moisdc=vector(1,n); */ + /* andc=vector(1,n); */ + /* weight=vector(1,n); */ + /* agedc=vector(1,n); */ + /* cod=ivector(1,n); */ + /* for(i=1;i<=n;i++){ */ + num=lvector(firstobs,lastobs); + moisnais=vector(firstobs,lastobs); + annais=vector(firstobs,lastobs); + moisdc=vector(firstobs,lastobs); + andc=vector(firstobs,lastobs); + weight=vector(firstobs,lastobs); + agedc=vector(firstobs,lastobs); + cod=ivector(firstobs,lastobs); + for(i=firstobs;i<=lastobs;i++){ num[i]=0; moisnais[i]=0; annais[i]=0; @@ -11356,9 +11398,9 @@ Please run with mle=-1 to get a correct cod[i]=0; weight[i]=1.0; /* Equal weights, 1 by default */ } - mint=matrix(1,maxwav,1,n); - anint=matrix(1,maxwav,1,n); - s=imatrix(1,maxwav+1,1,n); /* s[i][j] health state for wave i and individual j */ + mint=matrix(1,maxwav,firstobs,lastobs); + anint=matrix(1,maxwav,firstobs,lastobs); + s=imatrix(1,maxwav+1,firstobs,lastobs); /* s[i][j] health state for wave i and individual j */ tab=ivector(1,NCOVMAX); ncodemax=ivector(1,NCOVMAX); /* Number of code per covariate; if O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */ ncodemaxwundef=ivector(1,NCOVMAX); /* Number of code per covariate; if - 1 O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */ @@ -11460,8 +11502,8 @@ Please run with mle=-1 to get a correct agegomp=(int)agemin; - free_vector(moisnais,1,n); - free_vector(annais,1,n); + free_vector(moisnais,firstobs,lastobs); + free_vector(annais,firstobs,lastobs); /* free_matrix(mint,1,maxwav,1,n); free_matrix(anint,1,maxwav,1,n);*/ /* free_vector(moisdc,1,n); */ @@ -11487,8 +11529,8 @@ Please run with mle=-1 to get a correct concatwav(wav, dh, bh, mw, s, agedc, agev, firstpass, lastpass, imx, nlstate, stepm); /* Concatenates waves */ - free_vector(moisdc,1,n); - free_vector(andc,1,n); + free_vector(moisdc,firstobs,lastobs); + free_vector(andc,firstobs,lastobs); /* Routine tricode is to calculate cptcoveff (real number of unique covariates) and to associate covariable number and modality */ nbcode=imatrix(0,NCOVMAX,0,NCOVMAX); @@ -11678,10 +11720,10 @@ Title=%s
Datafile=%s Firstpass=%d La fprintf(fichtm,"\n
  • Number of fixed quantitative variables: nqv=%d ", nqv); ncurrv=i; for(i=ncurrv; i <=ncurrv-1+nqv; i++) fprintf(fichtm,"V%d ", i); - fprintf(fichtm,"\n
  • Number of time varying (wave varying) covariates: ntv=%d ", ntv); + fprintf(fichtm,"\n
  • Number of time varying (wave varying) dummy covariates: ntv=%d ", ntv); ncurrv=i; for(i=ncurrv; i <=ncurrv-1+ntv; i++) fprintf(fichtm,"V%d ", i); - fprintf(fichtm,"\n
  • Number of quantitative time varying covariates: nqtv=%d ", nqtv); + fprintf(fichtm,"\n
  • Number of time varying quantitative covariates: nqtv=%d ", nqtv); ncurrv=i; for(i=ncurrv; i <=ncurrv-1+nqtv; i++) fprintf(fichtm,"V%d ", i); fprintf(fichtm,"\n
  • Weights column \n
    Number of alive states: nlstate=%d
    Number of death states (not really implemented): ndeath=%d \n
  • Number of waves: maxwav=%d \n
  • Parameter for maximization (1), using parameter values (0), for design of parameters and variance-covariance matrix: mle=%d \n
  • Does the weight column be taken into account (1), or not (0): weight=%d\n", \ @@ -11713,10 +11755,10 @@ Interval (in months) between two waves: for(j=1;j<=NDIM;j++) ximort[i][j]=0.; /* ximort=gsl_matrix_alloc(1,NDIM,1,NDIM); */ - cens=ivector(1,n); - ageexmed=vector(1,n); - agecens=vector(1,n); - dcwave=ivector(1,n); + cens=ivector(firstobs,lastobs); + ageexmed=vector(firstobs,lastobs); + agecens=vector(firstobs,lastobs); + dcwave=ivector(firstobs,lastobs); for (i=1; i<=imx; i++){ dcwave[i]=-1; @@ -11930,9 +11972,10 @@ Please run with mle=-1 to get a correct free_vector(lpop,1,AGESUP); free_vector(tpop,1,AGESUP); free_matrix(ximort,1,NDIM,1,NDIM); - free_ivector(cens,1,n); - free_vector(agecens,1,n); - free_ivector(dcwave,1,n); + free_ivector(dcwave,firstobs,lastobs); + free_vector(agecens,firstobs,lastobs); + free_vector(ageexmed,firstobs,lastobs); + free_ivector(cens,firstobs,lastobs); #ifdef GSL #endif } /* Endof if mle==-3 mortality only */ @@ -12338,8 +12381,8 @@ Please run with mle=-1 to get a correct /* free_imatrix(dh,1,lastpass-firstpass+2,1,imx); */ /* free_imatrix(bh,1,lastpass-firstpass+2,1,imx); */ /* free_imatrix(mw,1,lastpass-firstpass+2,1,imx); */ - free_lvector(num,1,n); - free_vector(agedc,1,n); + free_lvector(num,firstobs,lastobs); + free_vector(agedc,firstobs,lastobs); /*free_matrix(covar,0,NCOVMAX,1,n);*/ /*free_matrix(covar,1,NCOVMAX,1,n);*/ fclose(ficparo); @@ -12653,12 +12696,12 @@ Please run with mle=-1 to get a correct varprlim(fileresu, nresult, mobaverage, mobilavproj, bage, fage, prlim, &ncvyear, ftolpl, p, matcov, delti, stepm, cptcoveff); - free_vector(weight,1,n); + free_vector(weight,firstobs,lastobs); free_imatrix(Tvard,1,NCOVMAX,1,2); - free_imatrix(s,1,maxwav+1,1,n); - free_matrix(anint,1,maxwav,1,n); - free_matrix(mint,1,maxwav,1,n); - free_ivector(cod,1,n); + free_imatrix(s,1,maxwav+1,firstobs,lastobs); + free_matrix(anint,1,maxwav,firstobs,lastobs); + free_matrix(mint,1,maxwav,firstobs,lastobs); + free_ivector(cod,firstobs,lastobs); free_ivector(tab,1,NCOVMAX); fclose(ficresstdeij); fclose(ficrescveij); @@ -12678,10 +12721,10 @@ Please run with mle=-1 to get a correct free_matrix(oldms, 1,nlstate+ndeath,1,nlstate+ndeath); free_matrix(newms, 1,nlstate+ndeath,1,nlstate+ndeath); free_matrix(savms, 1,nlstate+ndeath,1,nlstate+ndeath); - if(ntv+nqtv>=1)free_ma3x(cotvar,1,maxwav,1,ntv+nqtv,1,n); - if(nqtv>=1)free_ma3x(cotqvar,1,maxwav,1,nqtv,1,n); - if(nqv>=1)free_matrix(coqvar,1,nqv,1,n); - free_matrix(covar,0,NCOVMAX,1,n); + if(ntv+nqtv>=1)free_ma3x(cotvar,1,maxwav,1,ntv+nqtv,firstobs,lastobs); + if(nqtv>=1)free_ma3x(cotqvar,1,maxwav,1,nqtv,firstobs,lastobs); + if(nqv>=1)free_matrix(coqvar,1,nqv,firstobs,lastobs); + free_matrix(covar,0,NCOVMAX,firstobs,lastobs); free_matrix(matcov,1,npar,1,npar); free_matrix(hess,1,npar,1,npar); /*free_vector(delti,1,npar);*/ @@ -12801,13 +12844,16 @@ Please run with mle=-1 to get a correct sprintf(plotcmd,"%s %s",pplotcmd, optionfilegnuplot); printf("Starting graphs with: '%s'\n",plotcmd);fflush(stdout); + strcpy(pplotcmd,plotcmd); if((outcmd=system(plotcmd)) != 0){ - printf("gnuplot command might not be in your path: '%s', err=%d\n", plotcmd, outcmd); + printf("Error in gnuplot, command might not be in your path: '%s', err=%d\n", plotcmd, outcmd); printf("\n Trying if gnuplot resides on the same directory that IMaCh\n"); sprintf(plotcmd,"%sgnuplot %s", pathimach, optionfilegnuplot); - if((outcmd=system(plotcmd)) != 0) + if((outcmd=system(plotcmd)) != 0){ printf("\n Still a problem with gnuplot command %s, err=%d\n", plotcmd, outcmd); + strcpy(plotcmd,pplotcmd); + } } printf(" Successful, please wait..."); while (z[0] != 'q') {