]> henry.ined.fr Git - .git/commitdiff
* imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not...
authorN. Brouard <brouard@ined.fr>
Sun, 26 Jan 2014 02:42:01 +0000 (02:42 +0000)
committerN. Brouard <brouard@ined.fr>
Sun, 26 Jan 2014 02:42:01 +0000 (02:42 +0000)
src/imach.c

index 5b5be6e66232e004792240bb4f7c1ad07d70c565..5e341e4e6f05d4d98e4d901b98f8fed1a350af87 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.140  2011/09/02 10:37:54  brouard
+  Summary: times.h is ok with mingw32 now.
+
   Revision 1.139  2010/06/14 07:50:17  brouard
   After the theft of my laptop, I probably lost some lines of codes which were not uploaded to the CVS tree.
   I remember having already fixed agemin agemax which are pointers now but not cvs saved.
 #include <errno.h>
 extern int errno;
 
-#include <sys/time.h>
-/*
+#ifdef LINUX
 #include <time.h>
 #include "timeval.h"
+#else
+#include <sys/time.h>
+#endif
 
 #ifdef GSL
 #include <gsl/gsl_errno.h>
@@ -401,7 +406,7 @@ extern int errno;
 /* #include <libintl.h> */
 /* #define _(String) gettext (String) */
 
-#define MAXLINE 256
+#define MAXLINE 1024 /* Was 256. Overflow with 312 with 2 states and 4 covariates. Should be ok */
 
 #define GNUPLOTPROGRAM "gnuplot"
 /*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/
@@ -435,7 +440,7 @@ extern int errno;
 /* $Id$ */
 /* $State$ */
 
-char version[]="Imach version 0.98m, April 2010, INED-EUROREVES-Institut de longevite ";
+char version[]="Imach version 0.98n, January 2014,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Sicentific Research 25293121)";
 char fullversion[]="$Revision$ $Date$"; 
 char strstart[80];
 char optionfilext[10], optionfilefiname[FILENAMELENGTH];
@@ -559,8 +564,14 @@ double dateintmean=0;
 
 double *weight;
 int **s; /* Status */
-double *agedc, **covar, idx;
-int **nbcode, *Tvar, **codtab, **Tvard, *Tprod, cptcovprod, *Tvaraff;
+double *agedc;
+double  **covar; /**< covar[i,j], value of jth covariate for individual i,
+                 * covar=matrix(0,NCOVMAX,1,n); 
+                 * cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2]; */
+double  idx; 
+int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
+int **codtab; /**< codtab=imatrix(1,100,1,10); */
+int **Tvard, *Tprod, cptcovprod, *Tvaraff;
 double *lsurv, *lpop, *tpop;
 
 double ftol=FTOL; /* Tolerance for computing Max Likelihood */
@@ -1091,7 +1102,7 @@ char *asc_diff_time(long time_sec, char ascdiff[])
   sec_left = (sec_left) %(60*60);
   minutes = (sec_left) /60;
   sec_left = (sec_left) % (60);
-  sprintf(ascdiff,"%d day(s) %d hour(s) %d minute(s) %d second(s)",days, hours, minutes, sec_left);  
+  sprintf(ascdiff,"%ld day(s) %ld hour(s) %ld minute(s) %ld second(s)",days, hours, minutes, sec_left);  
   return ascdiff;
 }
 
@@ -1797,7 +1808,7 @@ double funcone( double *x)
       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
       /*printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */
       if(globpr){
-       fprintf(ficresilk,"%9d %6d %2d %2d %1d %1d %3d %11.6f %8.4f\
+       fprintf(ficresilk,"%9ld %6d %2d %2d %1d %1d %3d %11.6f %8.4f\
  %11.6f %11.6f %11.6f ", \
                num[i],i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],
                2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
@@ -2539,7 +2550,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
   }
   jmean=sum/k;
   printf("Delay (in months) between two waves Min=%d (for indiviudal %ld) Max=%d (%ld) Mean=%f\n\n ",jmin, num[ijmin], jmax, num[ijmax], jmean);
-  fprintf(ficlog,"Delay (in months) between two waves Min=%d (for indiviudal %ld) Max=%d (%ld) Mean=%f\n\n ",jmin, ijmin, jmax, ijmax, jmean);
+  fprintf(ficlog,"Delay (in months) between two waves Min=%d (for indiviudal %d) Max=%d (%d) Mean=%f\n\n ",jmin, ijmin, jmax, ijmax, jmean);
  }
 
 /*********** Tricode ****************************/
@@ -3933,7 +3944,7 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdi
               fprintf(ficgp," %f*exp(p%d+p%d*x",YEARM/stepm,i,i+1);
             else
               fprintf(ficgp," exp(p%d+p%d*x",i,i+1);
-            ij=1;
+            ij=1;/* To be checked else nbcode[0][0] wrong */
             for(j=3; j <=ncovmodel; j++) {
               if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) {
                 fprintf(ficgp,"+p%d*%d*x",i+j-1,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);
@@ -4605,8 +4616,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
        lval=strtol(strb,&endptr,10); 
       /*       if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN))*/
        if( strb[0]=='\0' || (*endptr != '\0')){
-         printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,j,maxwav);
-         fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,j,maxwav);fflush(ficlog);
+         printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,j,maxwav);
+         fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,j,maxwav);fflush(ficlog);
          return 1;
        }
       }
@@ -4620,8 +4631,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
        month=99;
        year=9999;
       }else{
-       printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d.  Exiting.\n",strb, linei,i, line,j);
-       fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d.  Exiting.\n",strb, linei,i, line,j);fflush(ficlog);
+       printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d.  Exiting.\n",strb, linei,i, line,j);
+       fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d.  Exiting.\n",strb, linei,i, line,j);fflush(ficlog);
        return 1;
       }
       anint[j][i]= (double) year; 
@@ -4636,8 +4647,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
       month=99;
       year=9999;
     }else{
-      printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of death (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);
-       fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of death (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);fflush(ficlog);
+      printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of death (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);
+       fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of death (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);fflush(ficlog);
        return 1;
     }
     andc[i]=(double) year; 
@@ -4651,13 +4662,13 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
       month=99;
       year=9999;
     }else{
-      printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);
-      fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);fflush(ficlog);
+      printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);
+      fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .).  Exiting.\n",strb, linei,i,line);fflush(ficlog);
        return 1;
     }
     if (year==9999) {
-      printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given.  Exiting.\n",strb, linei,i,line);
-      fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);fflush(ficlog);
+      printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given.  Exiting.\n",strb, linei,i,line);
+      fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);fflush(ficlog);
        return 1;
 
     }
@@ -4669,8 +4680,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     errno=0;
     dval=strtod(strb,&endptr); 
     if( strb[0]=='\0' || (*endptr != '\0')){
-      printf("Error reading data around '%f' at line number %ld, \"%s\" for individual %d\nShould be a weight.  Exiting.\n",dval, i,line,linei);
-      fprintf(ficlog,"Error reading data around '%f' at line number %ld, \"%s\" for individual %d\nShould be a weight.  Exiting.\n",dval, i,line,linei);
+      printf("Error reading data around '%f' at line number %d, \"%s\" for individual %d\nShould be a weight.  Exiting.\n",dval, i,line,linei);
+      fprintf(ficlog,"Error reading data around '%f' at line number %d, \"%s\" for individual %d\nShould be a weight.  Exiting.\n",dval, i,line,linei);
       fflush(ficlog);
       return 1;
     }
@@ -4685,13 +4696,13 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
        errno=0;
        lval=strtol(strb,&endptr,10); 
        if( strb[0]=='\0' || (*endptr != '\0')){
-         printf("Error reading data around '%d' at line number %ld for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative).  Exiting.\n",lval, linei,i, line);
-         fprintf(ficlog,"Error reading data around '%d' at line number %ld for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative).  Exiting.\n",lval, linei,i, line);fflush(ficlog);
+         printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative).  Exiting.\n",lval, linei,i, line);
+         fprintf(ficlog,"Error reading data around '%ld' at line number %d for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative).  Exiting.\n",lval, linei,i, line);fflush(ficlog);
          return 1;
        }
       }
       if(lval <-1 || lval >1){
-       printf("Error reading data around '%d' at line number %ld for individual %d, '%s'\n \
+       printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\n \
  Should be a value of %d(nth) covariate (0 should be the value for the reference and 1\n \
  for the alternative. IMaCh does not build design variables automatically, do it yourself.\n \
  For example, for multinomial values like 1, 2 and 3,\n \
@@ -4700,7 +4711,7 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
  and V1=0 V2=1 for (3). V1=1 V2=1 should not exist and the corresponding\n \
  output of IMaCh is often meaningless.\n \
  Exiting.\n",lval,linei, i,line,j);
-       fprintf(ficlog,"Error reading data around '%d' at line number %ld for individual %d, '%s'\n \
+       fprintf(ficlog,"Error reading data around '%ld' at line number %d for individual %d, '%s'\n \
  Should be a value of %d(nth) covariate (0 should be the value for the reference and 1\n \
  for the alternative. IMaCh does not build design variables automatically, do it yourself.\n \
  For example, for multinomial values like 1, 2 and 3,\n \
@@ -4762,6 +4773,11 @@ int decodemodel ( char model[], int lastobs)
       fprintf(ficlog,"Error. AGE must be in lower case model=%s ",model);fflush(ficlog);
       return 1;
     }
+    if (strstr(model,"v") !=0){
+      printf("Error. 'v' must be in upper case 'V' model=%s ",model);
+      fprintf(ficlog,"Error. 'v' must be in upper case model=%s ",model);fflush(ficlog);
+      return 1;
+    }
     
     /* This loop fills the array Tvar from the string 'model'.*/
     /* j is the number of + signs in the model V1+V2+V3 j=2 i=3 to 1 */
@@ -5158,7 +5174,7 @@ int main(int argc, char *argv[])
     ungetc(c,ficpar);
     fgets(line, MAXLINE, ficpar);
     numlinepar++;
-    puts(line);
+    fputs(line,stdout);
     fputs(line,ficparo);
     fputs(line,ficlog);
   }
@@ -5174,7 +5190,8 @@ int main(int argc, char *argv[])
     ungetc(c,ficpar);
     fgets(line, MAXLINE, ficpar);
     numlinepar++;
-    puts(line);
+    fputs(line, stdout);
+    //puts(line);
     fputs(line,ficparo);
     fputs(line,ficlog);
   }
@@ -5227,7 +5244,7 @@ int main(int argc, char *argv[])
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
       numlinepar++;
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
       fputs(line,ficlog);
     }
@@ -5277,7 +5294,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
       numlinepar++;
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
       fputs(line,ficlog);
     }
@@ -5318,7 +5335,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
       numlinepar++;
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
       fputs(line,ficlog);
     }
@@ -5409,12 +5426,14 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
     ncovcol + k1
     If already ncovcol=4 and model=V2+V1+V1*V4+age*V3
     Tvar[3=V1*V4]=4+1 etc */
-  Tprod=ivector(1,15); 
+  Tprod=ivector(1,15); /* Gives the position of a product */
   /* Tprod[k1=1]=3(=V1*V4) for V2+V1+V1*V4+age*V3
      if  V2+V1+V1*V4+age*V3+V3*V2   TProd[k1=2]=5 (V3*V2)
   */
   Tvaraff=ivector(1,15); 
-  Tvard=imatrix(1,15,1,2); /* For V3*V2 Tvard[k1=2][1]=3 (V3) Tvard[k1=2][2]=2(V2) */
+  Tvard=imatrix(1,15,1,2); /* n=Tvard[k1][1]  and m=Tvard[k1][2] gives the couple n,m of the k1 th product Vn*Vm
+                           * For V3*V2 (in V2+V1+V1*V4+age*V3+V3*V2), V3*V2 position is 2nd. 
+                           * Tvard[k1=2][1]=3 (V3) Tvard[k1=2][2]=2(V2) */
   Tage=ivector(1,15); /* Gives the covariate id of covariates associated with age: V2 + V1 + age*V4 + V3*age
                         4 covariates (3 plus signs)
                         Tage[1=V3*age]= 4; Tage[2=age*V4] = 3
@@ -5473,11 +5492,10 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
       for(j=1; j <= ncodemax[k]; j++){ /* For each modality of this covariate */
        for(cpt=1; cpt <=(m/pow(2,cptcoveff+1-k)); cpt++){  /* cpt=1 to 8/2**(3+1-1 or 3+1-3) =1 or 4 */ 
          h++;
-         if (h>m) {
+         if (h>m) 
            h=1;
-           codtab[h][k]=j;
-           codtab[h][Tvar[k]]=j;
-         }
+         codtab[h][k]=j;
+         codtab[h][Tvar[k]]=j;
          printf("h=%d k=%d j=%d codtab[h][k]=%d Tvar[k]=%d codtab[h][Tvar[k]]=%d \n",h, k,j,codtab[h][k],Tvar[k],codtab[h][Tvar[k]]);
        } 
       }
@@ -5505,7 +5523,8 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
   else{
     fprintf(ficgp,"\n# %s\n", version); 
     fprintf(ficgp,"# %s\n", optionfilegnuplot); 
-    fprintf(ficgp,"set missing 'NaNq'\n");
+    //fprintf(ficgp,"set missing 'NaNq'\n");
+    fprintf(ficgp,"set datafile missing 'NaNq'\n");
   }
   /*  fclose(ficgp);*/
   /*--------- index.htm --------*/
@@ -5944,7 +5963,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     while((c=getc(ficpar))=='#' && c!= EOF){
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
     }
     ungetc(c,ficpar);
@@ -5964,7 +5983,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     while((c=getc(ficpar))=='#' && c!= EOF){
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
     }
     ungetc(c,ficpar);
@@ -5978,7 +5997,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     while((c=getc(ficpar))=='#' && c!= EOF){
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
     }
     ungetc(c,ficpar);
@@ -5994,7 +6013,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     while((c=getc(ficpar))=='#' && c!= EOF){
       ungetc(c,ficpar);
       fgets(line, MAXLINE, ficpar);
-      puts(line);
+      fputs(line,stdout);
       fputs(line,ficparo);
     }
     ungetc(c,ficpar);
@@ -6371,10 +6390,9 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     /*---------- End : free ----------------*/
     if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX);
     free_ma3x(probs,1,AGESUP,1,NCOVMAX, 1,NCOVMAX);
-
   }  /* mle==-3 arrives here for freeing */
  endfree:
-  free_matrix(prlim,1,nlstate,1,nlstate);
+    free_matrix(prlim,1,nlstate,1,nlstate); /*here or after loop ? */
     free_matrix(pmmij,1,nlstate+ndeath,1,nlstate+ndeath);
     free_matrix(oldms, 1,nlstate+ndeath,1,nlstate+ndeath);
     free_matrix(newms, 1,nlstate+ndeath,1,nlstate+ndeath);
@@ -6415,9 +6433,9 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
   fprintf(ficlog,"Local time at start %s\nLocal time at end   %s\n",strstart, strtend); 
   printf("Total time used %s\n", asc_diff_time(end_time.tv_sec -start_time.tv_sec,tmpout));
 
-  printf("Total time was %d Sec.\n", end_time.tv_sec -start_time.tv_sec);
+  printf("Total time was %ld Sec.\n", end_time.tv_sec -start_time.tv_sec);
   fprintf(ficlog,"Total time used %s\n", asc_diff_time(end_time.tv_sec -start_time.tv_sec,tmpout));
-  fprintf(ficlog,"Total time was %d Sec.\n", end_time.tv_sec -start_time.tv_sec);
+  fprintf(ficlog,"Total time was %ld Sec.\n", end_time.tv_sec -start_time.tv_sec);
   /*  printf("Total time was %d uSec.\n", total_usecs);*/
 /*   if(fileappend(fichtm,optionfilehtm)){ */
   fprintf(fichtm,"<br>Local time at start %s<br>Local time at end   %s<br>\n</body></html>",strstart, strtend);