]> henry.ined.fr Git - .git/commitdiff
Summary: saving but not running
authorN. Brouard <brouard@ined.fr>
Tue, 12 Jul 2016 08:40:03 +0000 (08:40 +0000)
committerN. Brouard <brouard@ined.fr>
Tue, 12 Jul 2016 08:40:03 +0000 (08:40 +0000)
src/imach.c

index 1ebc38a6ab27d1181a58fa9513772e28d9f9af70..26afa594c83dea306d456562c9ef49d3e42e688f 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.224  2016/07/01 13:16:01  brouard
+  Summary: Fixes
+
   Revision 1.223  2016/02/19 09:23:35  brouard
   Summary: temporary
 
@@ -850,12 +853,13 @@ int nagesqr=0, nforce=0; /* nagesqr=1 if model is including age*age, number of f
 /* Number of covariates model=V2+V1+ V3*age+V2*V4 */
 int cptcovn=0; /**< cptcovn number of covariates added in the model (excepting constant and age and age*product) */
 int cptcovt=0; /**< cptcovt number of covariates added in the model (excepting constant and age) */
-int cptcovs=0; /**< cptcovs number of simple covariates V2+V1 =2 */
+int cptcovs=0; /**< cptcovs number of simple covariates in the model V2+V1 =2 */
+int cptcovsnq=0; /**< cptcovsnq number of simple covariates in the model but non quantitative V2+V1 =2 */
 int cptcovage=0; /**< Number of covariates with age: V3*age only =1 */
 int cptcovprodnoage=0; /**< Number of covariate products without age */   
 int cptcoveff=0; /* Total number of covariates to vary for printing results */
 int ncoveff=0; /* Total number of effective covariates in the model */
-int nqveff=0; /**< nqveff number of effective quantitative variables */
+int nqfveff=0; /**< nqfveff Number of Quantitative Fixed Variables Effective */
 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 */
@@ -1003,11 +1007,12 @@ double *agedc;
 double  **covar; /**< covar[j,i], value of jth covariate for individual i,
                  * covar=matrix(0,NCOVMAX,1,n); 
                  * cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*age; */
-double **coqvar; /* Fixed quantitative covariate */
-double ***cotvar; /* Time varying covariate */
-double ***cotqvar; /* Time varying quantitative covariate */
+double **coqvar; /* Fixed quantitative covariate iqv */
+double ***cotvar; /* Time varying covariate itv */
+double ***cotqvar; /* Time varying quantitative covariate itqv */
 double  idx; 
 int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
+int *Typevar; /**< 1 for qualitative fixed, 2 for quantitative fixed, 3 for qualitive varying, 4 for quanti varying*/
 int *Tage;
 int *Ndum; /** Freq of modality (tricode */
 /* int **codtab;*/ /**< codtab=imatrix(1,100,1,10); */
@@ -1873,7 +1878,7 @@ function value at p , and iter is the number of iterations taken. The routine li
 #ifdef LINMINORIGINAL
 #else
        int *flatdir; /* Function is vanishing in that direction */
-       int flat=0; /* Function is vanishing in that direction */
+       int flat=0, flatd=0; /* Function is vanishing in that direction */
 #endif
 void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret, 
            double (*func)(double [])) 
@@ -1977,8 +1982,8 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
                                fprintf(ficlog," x(%d)=%.12e",j,xit[j]);
       }
       for(j=1;j<=n;j++) {
-                       printf(" p(%d)=%lf ",j,p[j]);
-                       fprintf(ficlog," p(%d)=%lf ",j,p[j]);
+                               printf(" p(%d)=%.12e",j,p[j]);
+                               fprintf(ficlog," p(%d)=%.12e",j,p[j]);
       }
       printf("\n");
       fprintf(ficlog,"\n");
@@ -1988,12 +1993,13 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit  */
     /* New value of last point Pn is not computed, P(n-1) */
       for(j=1;j<=n;j++) {
-                         printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
-                         fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
-      }
-      printf("\n");
-      fprintf(ficlog,"\n");
-
+                               if(flatdir[j] >0){
+                                       printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+                                       fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+                               }
+                               /* printf("\n"); */
+                               /* fprintf(ficlog,"\n"); */
+                       }
     if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) { /* Did we reach enough precision? */
       /* We could compare with a chi^2. chisquare(0.95,ddl=1)=3.84 */
       /* By adding age*age in a model, the new -2LL should be lower and the difference follows a */
@@ -2049,7 +2055,8 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     fptt=(*func)(ptt); /* f_3 */
 #ifdef NODIRECTIONCHANGEDUNTILNITER  /* No change in drections until some iterations are done */
                if (*iter <=4) {
-#else                  
+#else
+#endif
 #ifdef POWELLNOF3INFF1TEST    /* skips test F3 <F1 */
 #else
     if (fptt < fp) { /* If extrapolated point is better, decide if we keep that new direction or not */
@@ -2131,14 +2138,22 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
                                }
 #ifdef LINMINORIGINAL
 #else
-                               printf("Flat directions\n");
-                               fprintf(ficlog,"Flat directions\n");
-                               for (j=1;j<=n;j++) { 
-                                       printf("flatdir[%d]=%d ",j,flatdir[j]);
-                                       fprintf(ficlog,"flatdir[%d]=%d ",j,flatdir[j]);
-        }
-                               printf("\n");
-                               fprintf(ficlog,"\n");
+                               for (j=1, flatd=0;j<=n;j++) {
+                                       if(flatdir[j]>0)
+                                               flatd++;
+                               }
+                               if(flatd >0){
+                                       printf("%d flat directions\n",flatd);
+                                       fprintf(ficlog,"%d flat directions\n",flatd);
+                                       for (j=1;j<=n;j++) { 
+                                               if(flatdir[j]>0){
+                                                       printf("%d ",j);
+                                                       fprintf(ficlog,"%d ",j);
+                                               }
+                                       }
+                                       printf("\n");
+                                       fprintf(ficlog,"\n");
+                               }
 #endif
                                printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
                                fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
@@ -2158,7 +2173,9 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
 #else
     } /* end if (fptt < fp)  */
 #endif
+#ifdef NODIRECTIONCHANGEDUNTILNITER  /* No change in drections until some iterations are done */
                } /*NODIRECTIONCHANGEDUNTILNITER  No change in drections until some iterations are done */
+#else
 #endif
   } /* loop iteration */ 
 } 
@@ -2877,7 +2894,7 @@ double func( double *x)
        double sw; /* Sum of weights */
        double lli; /* Individual log likelihood */
        int s1, s2;
-       int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate */
+       int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate, quatitative time varying covariate */
        double bbh, survp;
        long ipmx;
        double agexact;
@@ -2906,7 +2923,7 @@ double func( double *x)
                        for (k=1; k<=ncoveff;k++){ /* Simple and product covariates without age* products */
                                cov[++ioffset]=covar[Tvar[k]][i];
                        }
-                       for(iqv=1; iqv <= nqveff; iqv++){ /* Quantitatives covariates */
+                       for(iqv=1; iqv <= nqfveff; iqv++){ /* Quantitatives and Fixed covariates */
                                cov[++ioffset]=coqvar[iqv][i];
                        }
 
@@ -2927,6 +2944,9 @@ double func( double *x)
                                        cov[ioffset+itv]=cotvar[mw[mi][i]][itv][i];
                                }
                                for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */
+                                       if(cotqvar[mw[mi][i]][iqtv][i] == -1){
+                                               printf("i=%d, mi=%d, iqtv=%d, cotqvar[mw[mi][i]][iqtv][i]=%f",i,mi,iqtv,cotqvar[mw[mi][i]][iqtv][i]);
+                                       }
                                        cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][iqtv][i];
                                }
                                /* ioffset=2+nagesqr+cptcovn+nqv+ntv+nqtv; */
@@ -3223,49 +3243,49 @@ double funcone( double *x)
   for(k=1; k<=nlstate; k++) ll[k]=0.;
   ioffset=0;
   for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-               ioffset=2+nagesqr+cptcovage;
+    ioffset=2+nagesqr+cptcovage;
     /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */
-               for (k=1; k<=ncoveff;k++){ /* Simple and product covariates without age* products */
-                       cov[++ioffset]=covar[Tvar[k]][i];
-               }
-               for(iqv=1; iqv <= nqveff; iqv++){ /* Quantitatives covariates */
-                       cov[++ioffset]=coqvar[iqv][i];
-               }
-
+    for (k=1; k<=ncoveff;k++){ /* Simple and product covariates without age* products */
+      cov[++ioffset]=covar[Tvar[k]][i];
+    }
+    for(iqv=1; iqv <= nqfveff; iqv++){ /* Quantitatives Fixed covariates */
+      cov[++ioffset]=coqvar[iqv][i];
+    }
+    
     for(mi=1; mi<= wav[i]-1; mi++){
-                       for(itv=1; itv <= ntveff; itv++){ /* Varying dummy covariates */
-                               cov[ioffset+itv]=cotvar[mw[mi][i]][itv][i];
-                       }
-                       for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */
-                               cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][iqtv][i];
-                       }
+      for(itv=1; itv <= ntveff; itv++){ /* Varying dummy covariates */
+       cov[ioffset+itv]=cotvar[mw[mi][i]][itv][i];
+      }
+      for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */
+       cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][iqtv][i];
+      }
       for (ii=1;ii<=nlstate+ndeath;ii++)
-                               for (j=1;j<=nlstate+ndeath;j++){
-                                       oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-                                       savm[ii][j]=(ii==j ? 1.0 : 0.0);
-                               }
+       for (j=1;j<=nlstate+ndeath;j++){
+         oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+         savm[ii][j]=(ii==j ? 1.0 : 0.0);
+       }
       
       agebegin=agev[mw[mi][i]][i]; /* Age at beginning of effective wave */
       ageend=agev[mw[mi][i]][i] + (dh[mi][i])*stepm/YEARM; /* Age at end of effective wave and at the end of transition */
       for(d=0; d<dh[mi][i]; d++){  /* Delay between two effective waves */
-                               /*dh[m][i] or dh[mw[mi][i]][i] is the delay between two effective waves m=mw[mi][i]
-                                       and mw[mi+1][i]. dh depends on stepm.*/
-                               newm=savm;
-                               agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-                               cov[2]=agexact;
-                               if(nagesqr==1)
-                                       cov[3]= agexact*agexact;
-                               for (kk=1; kk<=cptcovage;kk++) {
-                                       cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-                               }
-                               
-                               /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
-                               out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
-                                                                                1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
-                               /* out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, */
-                               /*           1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); */
-                               savm=oldm;
-                               oldm=newm;
+       /*dh[m][i] or dh[mw[mi][i]][i] is the delay between two effective waves m=mw[mi][i]
+         and mw[mi+1][i]. dh depends on stepm.*/
+       newm=savm;
+       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+       cov[2]=agexact;
+       if(nagesqr==1)
+         cov[3]= agexact*agexact;
+       for (kk=1; kk<=cptcovage;kk++) {
+         cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+       }
+       /* printf("i=%d,mi=%d,d=%d,mw[mi][i]=%d\n",i, mi,d,mw[mi][i]); */
+       /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
+       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                    1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+       /* out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, */
+       /*           1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); */
+       savm=oldm;
+       oldm=newm;
       } /* end mult */
       
       s1=s[mw[mi][i]][i];
@@ -3279,37 +3299,37 @@ double funcone( double *x)
        * is higher than the multiple of stepm and negative otherwise.
        */
       if( s2 > nlstate && (mle <5) ){  /* Jackson */
-                               lli=log(out[s1][s2] - savm[s1][s2]);
+       lli=log(out[s1][s2] - savm[s1][s2]);
       } else if  ( s2==-1 ) { /* alive */
-                               for (j=1,survp=0. ; j<=nlstate; j++) 
-                                       survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-                               lli= log(survp);
+       for (j=1,survp=0. ; j<=nlstate; j++) 
+         survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+       lli= log(survp);
       }else if (mle==1){
-                               lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+       lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
       } else if(mle==2){
-                               lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
+       lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
       } else if(mle==3){  /* exponential inter-extrapolation */
-                               lli= (savm[s1][s2]>(double)1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
+       lli= (savm[s1][s2]>(double)1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
       } else if (mle==4){  /* mle=4 no inter-extrapolation */
-                               lli=log(out[s1][s2]); /* Original formula */
+       lli=log(out[s1][s2]); /* Original formula */
       } else{  /* mle=0 back to 1 */
-                               lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
-                               /*lli=log(out[s1][s2]); */ /* Original formula */
+       lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+       /*lli=log(out[s1][s2]); */ /* Original formula */
       } /* End of if */
       ipmx +=1;
       sw += weight[i];
       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,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %15.6f %8.4f %8.3f\
+       fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %15.6f %8.4f %8.3f\
  %11.6f %11.6f %11.6f ", \
-                                                               num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw,
-                                                               2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
-                               for(k=1,llt=0.,l=0.; k<=nlstate; k++){
-                                       llt +=ll[k]*gipmx/gsw;
-                                       fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw);
-                               }
-                               fprintf(ficresilk," %10.6f\n", -llt);
+               num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw,
+               2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
+       for(k=1,llt=0.,l=0.; k<=nlstate; k++){
+         llt +=ll[k]*gipmx/gsw;
+         fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw);
+       }
+       fprintf(ficresilk," %10.6f\n", -llt);
       }
     } /* end of wave */
   } /* end of individual */
@@ -3838,7 +3858,7 @@ void pstamp(FILE *fichier)
         posprop=vector(1,nlstate); /* Counting the number of transition starting from a live state per age */ 
         pospropt=vector(1,nlstate); /* Counting the number of transition starting from a live state */ 
         /* prop=matrix(1,nlstate,iagemin,iagemax+3); */
-        meanq=vector(1,nqveff);
+        meanq=vector(1,nqfveff); /* Number of Quantitative Fixed Variables Effective */
         meanqt=matrix(1,lastpass,1,nqtveff);
         strcpy(fileresp,"P_");
         strcat(fileresp,fileresu);
@@ -3909,7 +3929,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
                         posprop[i]=0;
                         pospropt[i]=0;
                 }
-                for (z1=1; z1<= nqveff; z1++) {  
+                for (z1=1; z1<= nqfveff; z1++) {  
                         meanq[z1]+=0.;
                         for(m=1;m<=lastpass;m++){
                                 meanqt[m][z1]=0.;
@@ -3921,8 +3941,8 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
      /* For that comination of covariate j1, we count and print the frequencies */
                 for (iind=1; iind<=imx; iind++) { /* For each individual iind */
                         bool=1;
-                        if (nqveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
-                                for (z1=1; z1<= nqveff; z1++) {  
+                        if (nqfveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
+                                for (z1=1; z1<= nqfveff; z1++) {  
                                         meanq[z1]+=coqvar[Tvar[z1]][iind];
                                 }
                                 for (z1=1; z1<=ncoveff; z1++) {  
@@ -4146,7 +4166,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
         fclose(ficresp);
         fclose(ficresphtm);
         fclose(ficresphtmfr);
-        free_vector(meanq,1,nqveff);
+        free_vector(meanq,1,nqfveff);
         free_matrix(meanqt,1,lastpass,1,nqtveff);
         free_ma3x(freq,-5,nlstate+ndeath,-5,nlstate+ndeath, iagemin-AGEMARGE, iagemax+3+AGEMARGE);
         free_vector(pospropt,1,nlstate);
@@ -4186,7 +4206,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
    if (cptcovn<1) {j=1;ncodemax[1]=1;}
   
    first=1;
-   for(j1=1; j1<= (int) pow(2,nqveff);j1++){ /* For each combination of covariate */
+   for(j1=1; j1<= (int) pow(2,cptcoveff);j1++){ /* For each combination of covariate */
      for (i=1; i<=nlstate; i++)  
        for(iage=iagemin-AGEMARGE; iage <= iagemax+3+AGEMARGE; iage++)
         prop[i][iage]=0.0;
@@ -4194,7 +4214,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
      for (i=1; i<=imx; i++) { /* Each individual */
        bool=1;
        if  (cptcovn>0) {  /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
-        for (z1=1; z1<=nqveff; z1++) /* For each covariate, look at the value for individual i and checks if it is equal to the corresponding value of this covariate according to current combination j1*/
+        for (z1=1; z1<=cptcoveff; z1++) /* For each covariate, look at the value for individual i and checks if it is equal to the corresponding value of this covariate according to current combination j1*/
           if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) 
             bool=0;
        } 
@@ -4488,55 +4508,60 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
 
   /* Loop on covariates without age and products and no quantitative variable */
   /* for (j=1; j<=(cptcovs); j++) { /\* From model V1 + V2*age+ V3 + V3*V4 keeps V1 + V3 = 2 only *\/ */
-  for (j=1; j<=(*cptcov); j++) { /* From model V1 + V2*age + V3 + V3*V4 keeps V1 + V3 = 2 only */
+  for (j=1; j<=cptcovsnq; j++) { /* From model V1 + V2*age + V3 + V3*V4 keeps V1 + V3 = 2 only */
     for (k=-1; k < maxncov; k++) Ndum[k]=0;
     for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the 
-                                                                                                                               modality of this covariate Vj*/
-                       if(Tvar[j]  >=1 && Tvar[j]  <= *cptcov){ /* A real fixed covariate */
-                               ij=(int)(covar[Tvar[j]][i]); /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i
-                                                                                                                                                       * If product of Vn*Vm, still boolean *:
-                                                                                                                                                       * If it was coded 1, 2, 3, 4 should be splitted into 3 boolean variables
-                                                                                                                                                       * 1 => 0 0 0, 2 => 0 0 1, 3 => 0 1 1, 4=1 0 0   */
-                               /* Finds for covariate j, n=Tvar[j] of Vn . ij is the
-                                        modality of the nth covariate of individual i. */
-                               if (ij > modmaxcovj)
-                                       modmaxcovj=ij; 
-                               else if (ij < modmincovj) 
-                                       modmincovj=ij; 
-                               if ((ij < -1) && (ij > NCOVMAX)){
-                                       printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX );
-                                       exit(1);
-                               }else
-                                       Ndum[ij]++; /*counts and stores the occurence of this modality 0, 1, -1*/
-      /*  If coded 1, 2, 3 , counts the number of 1 Ndum[1], number of 2, Ndum[2], etc */
-      /*printf("i=%d ij=%d Ndum[ij]=%d imx=%d",i,ij,Ndum[ij],imx);*/
-      /* getting the maximum value of the modality of the covariate
-                                (should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
-                                female ies 1, then modmaxcovj=1.*/
-                       }
-               } /* end for loop on individuals i */
+                               modality of this covariate Vj*/
+      switch(Typevar[j]) {
+      case 1: /* A real fixed dummy covariate */
+       ij=(int)(covar[Tvar[j]][i]); /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i
+                                     * If product of Vn*Vm, still boolean *:
+                                     * If it was coded 1, 2, 3, 4 should be splitted into 3 boolean variables
+                                     * 1 => 0 0 0, 2 => 0 0 1, 3 => 0 1 1, 4=1 0 0   */
+       /* Finds for covariate j, n=Tvar[j] of Vn . ij is the
+          modality of the nth covariate of individual i. */
+       if (ij > modmaxcovj)
+         modmaxcovj=ij; 
+       else if (ij < modmincovj) 
+         modmincovj=ij; 
+       if ((ij < -1) && (ij > NCOVMAX)){
+         printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX );
+         exit(1);
+       }else
+         Ndum[ij]++; /*counts and stores the occurence of this modality 0, 1, -1*/
+       /*  If coded 1, 2, 3 , counts the number of 1 Ndum[1], number of 2, Ndum[2], etc */
+       /*printf("i=%d ij=%d Ndum[ij]=%d imx=%d",i,ij,Ndum[ij],imx);*/
+       /* getting the maximum value of the modality of the covariate
+          (should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
+          female ies 1, then modmaxcovj=1.*/
+       break;
+      case 2:
+       break;
+
+      }
+    } /* end for loop on individuals i */
     printf(" Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
     fprintf(ficlog," Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
     cptcode=modmaxcovj;
     /* Ndum[0] = frequency of 0 for model-covariate j, Ndum[1] frequency of 1 etc. */
-               /*for (i=0; i<=cptcode; i++) {*/
+    /*for (i=0; i<=cptcode; i++) {*/
     for (k=modmincovj;  k<=modmaxcovj; k++) { /* k=-1 ? 0 and 1*//* For each value k of the modality of model-cov j */
       printf("Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
       fprintf(ficlog, "Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
       if( Ndum[k] != 0 ){ /* Counts if nobody answered modality k ie empty modality, we skip it and reorder */
-                               if( k != -1){
-                                       ncodemax[j]++;  /* ncodemax[j]= Number of modalities of the j th
-                                                                                                                covariate for which somebody answered excluding 
-                                                                                                                undefined. Usually 2: 0 and 1. */
-                               }
-                               ncodemaxwundef[j]++; /* ncodemax[j]= Number of modalities of the j th
-                                                                                                                               covariate for which somebody answered including 
-                                                                                                                               undefined. Usually 3: -1, 0 and 1. */
+       if( k != -1){
+         ncodemax[j]++;  /* ncodemax[j]= Number of modalities of the j th
+                            covariate for which somebody answered excluding 
+                            undefined. Usually 2: 0 and 1. */
+       }
+       ncodemaxwundef[j]++; /* ncodemax[j]= Number of modalities of the j th
+                               covariate for which somebody answered including 
+                               undefined. Usually 3: -1, 0 and 1. */
       }
       /* In fact  ncodemax[j]=2 (dichotom. variables only) but it could be more for
-                        * historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
+       * historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
     } /* Ndum[-1] number of undefined modalities */
-               
+    
     /* j is a covariate, n=Tvar[j] of Vn; Fills nbcode */
     /* For covariate j, modalities could be 1, 2, 3, 4, 5, 6, 7. 
        If Ndum[1]=0, Ndum[2]=0, Ndum[3]= 635, Ndum[4]=0, Ndum[5]=0, Ndum[6]=27, Ndum[7]=125;
@@ -4552,14 +4577,14 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
     */
     ij=0; /* ij is similar to i but can jump over null modalities */
     for (i=modmincovj; i<=modmaxcovj; i++) { /* i= 1 to 2 for dichotomous, or from 1 to 3 or from -1 or 0 to 1 currently*/
-       if (Ndum[i] == 0) { /* If nobody responded to this modality k */
-                               break;
-                       }
-                       ij++;
-                       nbcode[Tvar[j]][ij]=i;  /* stores the original value of modality i in an array nbcode, ij modality from 1 to last non-nul modality.*/
-                       cptcode = ij; /* New max modality for covar j */
+      if (Ndum[i] == 0) { /* If nobody responded to this modality k */
+       break;
+      }
+      ij++;
+      nbcode[Tvar[j]][ij]=i;  /* stores the original value of modality i in an array nbcode, ij modality from 1 to last non-nul modality.*/
+      cptcode = ij; /* New max modality for covar j */
     } /* end of loop on modality i=-1 to 1 or more */
-               
+    
     /*   for (k=0; k<= cptcode; k++) { /\* k=-1 ? k=0 to 1 *\//\* Could be 1 to 4 *\//\* cptcode=modmaxcovj *\/ */
     /*         /\*recode from 0 *\/ */
     /*                                      k is a modality. If we have model=V1+V1*sex  */
@@ -4575,33 +4600,33 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
     /*   }  /\* end of loop on modality k *\/ */
   } /* end of loop on model-covariate j. nbcode[Tvarj][1]=0 and nbcode[Tvarj][2]=1 sets the value of covariate j*/  
   
-       for (k=-1; k< maxncov; k++) Ndum[k]=0; 
+  for (k=-1; k< maxncov; k++) Ndum[k]=0; 
   
   for (i=1; i<=ncovmodel-2-nagesqr; i++) { /* -2, cste and age and eventually age*age */ 
-               /* Listing of all covariables in statement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/ 
-               ij=Tvar[i]; /* Tvar might be -1 if status was unknown */ 
-               Ndum[ij]++; /* Might be supersed V1 + V1*age */
-       } /* V4+V3+V5, Ndum[1]@5={0, 0, 1, 1, 1} */
-       
-       ij=0;
-       for (i=0; i<=  maxncov-1; i++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
-               /*printf("Ndum[%d]=%d\n",i, Ndum[i]);*/
-               if((Ndum[i]!=0) && (i<=ncovcol)){
-                       /*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
-                       Tvaraff[++ij]=i; /*For printing (unclear) */
-               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv)){
-                       Tvaraff[++ij]=-10; /* Dont'n know how to treat quantitative variables yet */
-               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv)){
-                       Tvaraff[++ij]=i; /*For printing (unclear) */
-               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv+nqtv)){
-                Tvaraff[++ij]=-20; /* Dont'n know how to treat quantitative variables yet */
-               }
-       } /* Tvaraff[1]@5 {3, 4, -20, 0, 0} Very strange */
-       /* ij--; */
-       /* cptcoveff=ij; /\*Number of total covariates*\/ */
-       *cptcov=ij; /*Number of total real effective covariates: effective
-                                                        * because they can be excluded from the model and real
-                                                        * if in the model but excluded because missing values*/
+    /* Listing of all covariables in statement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/ 
+    ij=Tvar[i]; /* Tvar might be -1 if status was unknown */ 
+    Ndum[ij]++; /* Might be supersed V1 + V1*age */
+  } /* V4+V3+V5, Ndum[1]@5={0, 0, 1, 1, 1} */
+  
+  ij=0;
+  for (i=0; i<=  maxncov-1; i++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
+    /*printf("Ndum[%d]=%d\n",i, Ndum[i]);*/
+    if((Ndum[i]!=0) && (i<=ncovcol)){
+      /*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
+      Tvaraff[++ij]=i; /*For printing (unclear) */
+    }else if((Ndum[i]!=0) && (i<=ncovcol+nqv)){
+      Tvaraff[++ij]=-10; /* Dont'n know how to treat quantitative variables yet */
+    }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv)){
+      Tvaraff[++ij]=i; /*For printing (unclear) */
+    }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv+nqtv)){
+      Tvaraff[++ij]=-20; /* Dont'n know how to treat quantitative variables yet */
+    }
+  } /* Tvaraff[1]@5 {3, 4, -20, 0, 0} Very strange */
+  /* ij--; */
+  /* cptcoveff=ij; /\*Number of total covariates*\/ */
+  *cptcov=ij; /*Number of total real effective covariates: effective
+              * because they can be excluded from the model and real
+              * if in the model but excluded because missing values*/
 }
 
 
@@ -5449,29 +5474,29 @@ To be simple, these graphs help to understand the significativity of each parame
 
    cov[1]=1;
    /* tj=cptcoveff; */
-   tj = (int) pow(2,nqveff);
+   tj = (int) pow(2,cptcoveff);
    if (cptcovn<1) {tj=1;ncodemax[1]=1;}
    j1=0;
    for(j1=1; j1<=tj;j1++){  /* For each valid combination of covariates or only once*/
      if  (cptcovn>0) {
        fprintf(ficresprob, "\n#********** Variable "); 
-       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprob, "**********\n#\n");
        fprintf(ficresprobcov, "\n#********** Variable "); 
-       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprobcov, "**********\n#\n");
                        
        fprintf(ficgp, "\n#********** Variable "); 
-       for (z1=1; z1<=nqveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficgp, "**********\n#\n");
                        
                        
        fprintf(fichtmcov, "\n<hr  size=\"2\" color=\"#EC5E5E\">********** Variable "); 
-       for (z1=1; z1<=nqveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(fichtmcov, "**********\n<hr size=\"2\" color=\"#EC5E5E\">");
                        
        fprintf(ficresprobcor, "\n#********** Variable ");    
-       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprobcor, "**********\n#");    
        if(invalidvarcomb[j1]){
         fprintf(ficgp,"\n#Combination (%d) ignored because no cases \n",j1); 
@@ -5737,7 +5762,7 @@ void printinghtml(char fileresu[], char title[], char datafile[], int firstpass,
 
    fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
 
-   m=pow(2,nqveff);
+   m=pow(2,cptcoveff);
    if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
    jj1=0;
@@ -5747,7 +5772,7 @@ void printinghtml(char fileresu[], char title[], char datafile[], int firstpass,
      jj1++;
      if (cptcovn > 0) {
        fprintf(fichtm,"<hr  size=\"2\" color=\"#EC5E5E\">************ Results for covariates");
-       for (cpt=1; cpt<=nqveff;cpt++){ 
+       for (cpt=1; cpt<=cptcoveff;cpt++){ 
         fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);
         printf(" V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);fflush(stdout);
        }
@@ -5857,7 +5882,7 @@ See page 'Matrix of variance-covariance of one-step probabilities' below. \n", r
    fflush(fichtm);
    fprintf(fichtm," <ul><li><b>Graphs</b></li><p>");
 
-   m=pow(2,nqveff);
+   m=pow(2,cptcoveff);
    if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
    jj1=0;
@@ -5866,7 +5891,7 @@ See page 'Matrix of variance-covariance of one-step probabilities' below. \n", r
      jj1++;
      if (cptcovn > 0) {
        fprintf(fichtm,"<hr  size=\"2\" color=\"#EC5E5E\">************ Results for covariates");
-       for (cpt=1; cpt<=nqveff;cpt++) 
+       for (cpt=1; cpt<=cptcoveff;cpt++)  /**< cptcoveff number of variables */
         fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);
        fprintf(fichtm," ************\n<hr size=\"2\" color=\"#EC5E5E\">");
 
@@ -5911,7 +5936,7 @@ void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar,
   /*#ifdef windows */
   fprintf(ficgp,"cd \"%s\" \n",pathc);
   /*#endif */
-  m=pow(2,nqveff);
+  m=pow(2,cptcoveff);
 
   /* Contribution to likelihood */
   /* Plot the probability implied in the likelihood */
@@ -5949,8 +5974,8 @@ void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar,
     for (k1=1; k1<= m ; k1 ++) { /* For each valid combination of covariate */
       /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */
       fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' files ");
-      for (k=1; k<=nqveff; k++){    /* For each covariate k get corresponding value lv for combination k1 */
-       lv= decodtabm(k1,k,nqveff); /* Should be the value of the covariate corresponding to k1 combination */
+      for (k=1; k<=cptcoveff; k++){    /* For each covariate k get corresponding value lv for combination k1 */
+       lv= decodtabm(k1,k,cptcoveff); /* Should be the value of the covariate corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5989,12 +6014,12 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
       if(backcast==1){ /* We need to get the corresponding values of the covariates involved in this combination k1 */
        /* fprintf(ficgp,",\"%s\" every :::%d::%d u 1:($%d) t\"Backward stable prevalence\" w l lt 3",subdirf2(fileresu,"PLB_"),k1-1,k1-1,1+cpt); */
        fprintf(ficgp,",\"%s\" u 1:((",subdirf2(fileresu,"PLB_")); /* Age is in 1 */
-       if(nqveff ==0){
+       if(cptcoveff ==0){
          fprintf(ficgp,"$%d)) t 'Backward prevalence in state %d' with line ",  2+(cpt-1),  cpt );
        }else{
          kl=0;
-         for (k=1; k<=nqveff; k++){    /* For each combination of covariate  */
-           lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
+         for (k=1; k<=cptcoveff; k++){    /* For each combination of covariate  */
+           lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
            /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
            /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
            /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6004,7 +6029,7 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
            /*6+(cpt-1)*(nlstate+1)+1+(i-1)+(nlstate+1)*nlstate; 6+(1-1)*(2+1)+1+(1-1) +(2+1)*2=13 */ 
            /*6+1+(i-1)+(nlstate+1)*nlstate; 6+1+(1-1) +(2+1)*2=13 */ 
            /* ''  u 6:(($1==1 && $2==0 && $3==2 && $4==0)? $9/(1.-$15) : 1/0):($5==2000? 3:2) t 'p.1' with line lc variable*/
-           if(k==nqveff){
+           if(k==cptcoveff){
              fprintf(ficgp,"$%d==%d && $%d==%d)? $%d : 1/0) t 'Backward prevalence in state %d' with line ",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv], \
                      6+(cpt-1),  cpt );
            }else{
@@ -6021,8 +6046,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
   for (k1=1; k1<= m ; k1 ++) { 
 
     fprintf(ficgp,"\n# 2nd: Total life expectancy with CI: 't' files ");
-    for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-      lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+    for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+      lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
       /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
       /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
       /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6074,8 +6099,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
 
     for (cpt=1; cpt<= nlstate ; cpt ++) {
       fprintf(ficgp,"\n# 3d: Life expectancy with EXP_ files:  cov=%d state=%d",k1, cpt);
-      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6116,8 +6141,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subd
 
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
       fprintf(ficgp,"\n#\n#\n# Survival functions in state j : 'LIJ_' files, cov=%d state=%d",k1, cpt);
-      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6158,8 +6183,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each inital state  */
                        
       fprintf(ficgp,"\n#\n#\n# Survival functions in state j and all livestates from state i by final state j: 'lij' files, cov=%d state=%d",k1, cpt);
-      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-                               lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+                               lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
                                /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6208,8 +6233,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                        
       fprintf(ficgp,"\n#\n#\n#CV preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt);
-      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-                               lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+                               lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
                                /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6250,8 +6275,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */
       for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                                fprintf(ficgp,"\n#\n#\n#CV Back preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt);
-                               for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
-                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
+                               for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
+                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
          /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6297,8 +6322,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */
       for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                                fprintf(ficgp,"\n#\n#\n#Projection of prevalence to stable (period): 'PROJ_' files, covariatecombination#=%d state=%d",k1, cpt);
-                               for (k=1; k<=nqveff; k++){    /* For each correspondig covariate value  */
-                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
+                               for (k=1; k<=cptcoveff; k++){    /* For each correspondig covariate value  */
+                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6327,7 +6352,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                        }else{
                                                fprintf(ficgp,",\\\n '' ");
                                        }
-                                       if(nqveff ==0){ /* No covariate */
+                                       if(cptcoveff ==0){ /* No covariate */
                                                ioffset=2; /* Age is in 2 */
                                                /*# yearproj age p11 p21 p31 p.1 p12 p22 p32 p.2 p13 p23 p33 p.3 p14 p24 p34 p.4*/
                                                /*#   1       2   3   4   5  6    7  8   9   10  11  12  13  14  15  16  17  18 */
@@ -6341,7 +6366,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                        fprintf(ficgp," $%d/(1.-$%d)) t 'p%d%d' with line ",                    \
                                                                                        ioffset+(cpt-1)*(nlstate+1)+1+(i-1),  ioffset+1+(i-1)+(nlstate+1)*nlstate,i,cpt );
                                        }else{ /* more than 2 covariates */
-                                               if(nqveff ==1){
+                                               if(cptcoveff ==1){
                                                        ioffset=4; /* Age is in 4 */
                                                }else{
                                                        ioffset=6; /* Age is in 6 */
@@ -6351,8 +6376,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                fprintf(ficgp," u %d:(",ioffset); 
                                                kl=0;
                                                strcpy(gplotcondition,"(");
-                                               for (k=1; k<=nqveff; k++){    /* For each covariate writing the chain of conditions */
-                                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
+                                               for (k=1; k<=cptcoveff; k++){    /* For each covariate writing the chain of conditions */
+                                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
                                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                                        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6360,7 +6385,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                        kl++;
                                                        sprintf(gplotcondition+strlen(gplotcondition),"$%d==%d && $%d==%d " ,kl,Tvaraff[k], kl+1, nbcode[Tvaraff[k]][lv]);
                                                        kl++;
-                                                       if(k <nqveff && nqveff>1)
+                                                       if(k <cptcoveff && cptcoveff>1)
                                                                sprintf(gplotcondition+strlen(gplotcondition)," && ");
                                                }
                                                strcpy(gplotcondition+strlen(gplotcondition),")");
@@ -6417,7 +6442,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
   fprintf(ficgp,"#\n");
   for(ng=1; ng<=3;ng++){ /* Number of graphics: first is logit, 2nd is probabilities, third is incidences per year*/
     fprintf(ficgp,"# ng=%d\n",ng);
-    fprintf(ficgp,"#   jk=1 to 2^%d=%d\n",nqveff,m);
+    fprintf(ficgp,"#   jk=1 to 2^%d=%d\n",cptcoveff,m);
     for(jk=1; jk <=m; jk++) {
       fprintf(ficgp,"#    jk=%d\n",jk);
       fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" ",subdirf2(optionfilefiname,"PE_"),jk,ng);
@@ -6470,7 +6495,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                }
              }
              else
-               fprintf(ficgp,"+p%d*%d",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,j-2)]);
+                                       fprintf(ficgp,"+p%d*%d",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); /* Valgrind bug nbcode */
            }
          }else{
            i=i-ncovmodel;
@@ -6497,7 +6522,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                  }
                }
                else
-                 fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,j-2)]);
+                 fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,j-2)]);/* Valgrind bug nbcode */
              }
              fprintf(ficgp,")");
            }
@@ -6540,7 +6565,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
    double *agemingood, *agemaxgood; /* Currently identical for all covariates */
   
   
-   /* modcovmax=2*nqveff;/\* Max number of modalities. We suppose  */
+   /* modcovmax=2*cptcoveff;/\* Max number of modalities. We suppose  */
    /*             a covariate has 2 modalities, should be equal to ncovcombmax  *\/ */
 
    sumnewp = vector(1,ncovcombmax);
@@ -6681,7 +6706,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
  
 
 /************** Forecasting ******************/
-void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int nqveff){
+void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int cptcoveff){
   /* proj1, year, month, day of starting projection 
      agemin, agemax range of age
      dateprev1 dateprev2 range of dates during which prevalence is computed
@@ -6712,7 +6737,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
   printf("Computing forecasting: result on file '%s', please wait... \n", fileresf);
   fprintf(ficlog,"Computing forecasting: result on file '%s', please wait... \n", fileresf);
 
-  if (nqveff==0) ncodemax[nqveff]=1;
+  if (cptcoveff==0) ncodemax[cptcoveff]=1;
 
 
   stepsize=(int) (stepm+YEARM-1)/YEARM;
@@ -6733,7 +6758,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
   if(jprojmean==0) jprojmean=1;
   if(mprojmean==0) jprojmean=1;
 
-  i1=nqveff;
+  i1=cptcoveff;
   if (cptcovn < 1){i1=1;}
   
   fprintf(ficresf,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jprojmean,mprojmean,anprojmean,dateintmean,dateprev1,dateprev2); 
@@ -6742,10 +6767,10 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 
 /*           if (h==(int)(YEARM*yearp)){ */
   for(cptcov=1, k=0;cptcov<=i1;cptcov++){
-    for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){
+    for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){
       k=k+1;
       fprintf(ficresf,"\n#****** hpijx=probability over h years, hp.jx is weighted by observed prev \n#");
-      for(j=1;j<=nqveff;j++) {
+      for(j=1;j<=cptcoveff;j++) {
                                fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficresf," yearproj age");
@@ -6767,7 +6792,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
                                        for (h=0; h<=nhstepm; h++){
                                                if (h*hstepm/YEARM*stepm ==yearp) {
               fprintf(ficresf,"\n");
-              for(j=1;j<=nqveff;j++) 
+              for(j=1;j<=cptcoveff;j++) 
                 fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
                                                        fprintf(ficresf,"%.f %.f ",anproj1+yearp,agec+h*hstepm/YEARM*stepm);
                                                } 
@@ -6801,7 +6826,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 }
 
 /* /\************** Back Forecasting ******************\/ */
-/* void prevbackforecast(char fileres[], double anback1, double mback1, double jback1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anback2, double p[], int nqveff){ */
+/* void prevbackforecast(char fileres[], double anback1, double mback1, double jback1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anback2, double p[], int cptcoveff){ */
 /*   /\* back1, year, month, day of starting backection  */
 /*      agemin, agemax range of age */
 /*      dateprev1 dateprev2 range of dates during which prevalence is computed */
@@ -6833,7 +6858,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*   printf("Computing back forecasting: result on file '%s', please wait... \n", fileresfb); */
 /*   fprintf(ficlog,"Computing back forecasting: result on file '%s', please wait... \n", fileresfb); */
        
-/*   if (nqveff==0) ncodemax[nqveff]=1; */
+/*   if (cptcoveff==0) ncodemax[cptcoveff]=1; */
        
 /*   /\* if (mobilav!=0) { *\/ */
 /*   /\*   mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); *\/ */
@@ -6861,7 +6886,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*   if(jprojmean==0) jprojmean=1; */
 /*   if(mprojmean==0) jprojmean=1; */
        
-/*   i1=nqveff; */
+/*   i1=cptcoveff; */
 /*   if (cptcovn < 1){i1=1;} */
   
 /*   fprintf(ficresfb,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jprojmean,mprojmean,anprojmean,dateintmean,dateprev1,dateprev2);  */
@@ -6870,10 +6895,10 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
        
 /*     /\*           if (h==(int)(YEARM*yearp)){ *\/ */
 /*   for(cptcov=1, k=0;cptcov<=i1;cptcov++){ */
-/*     for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){ */
+/*     for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){ */
 /*       k=k+1; */
 /*       fprintf(ficresfb,"\n#****** hbijx=probability over h years, hp.jx is weighted by observed prev \n#"); */
-/*       for(j=1;j<=nqveff;j++) { */
+/*       for(j=1;j<=cptcoveff;j++) { */
 /*                             fprintf(ficresfb," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); */
 /*       } */
 /*       fprintf(ficresfb," yearbproj age"); */
@@ -6895,7 +6920,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*                                     for (h=0; h<=nhstepm; h++){ */
 /*                                             if (h*hstepm/YEARM*stepm ==yearp) { */
 /*               fprintf(ficresfb,"\n"); */
-/*               for(j=1;j<=nqveff;j++)  */
+/*               for(j=1;j<=cptcoveff;j++)  */
 /*                 fprintf(ficresfb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); */
 /*                                                     fprintf(ficresfb,"%.f %.f ",anback1+yearp,agec+h*hstepm/YEARM*stepm); */
 /*                                             }  */
@@ -6958,7 +6983,7 @@ void populforecast(char fileres[], double anpyram,double mpyram,double jpyram,do
   printf("Computing forecasting: result on file '%s' \n", filerespop);
   fprintf(ficlog,"Computing forecasting: result on file '%s' \n", filerespop);
 
-  if (nqveff==0) ncodemax[nqveff]=1;
+  if (cptcoveff==0) ncodemax[cptcoveff]=1;
 
   /* if (mobilav!=0) { */
   /*   mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
@@ -6993,10 +7018,10 @@ void populforecast(char fileres[], double anpyram,double mpyram,double jpyram,do
   }
   
   for(cptcov=1,k=0;cptcov<=i2;cptcov++){
-    for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){
+    for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){
       k=k+1;
       fprintf(ficrespop,"\n#******");
-      for(j=1;j<=nqveff;j++) {
+      for(j=1;j<=cptcoveff;j++) {
        fprintf(ficrespop," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficrespop,"******\n");
@@ -7393,101 +7418,107 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     /* Loops on waves */
     for (j=maxwav;j>=1;j--){
       for (iv=nqtv;iv>=1;iv--){  /* Loop  on time varying quantitative variables */
-                               cutv(stra, strb, line, ' '); 
-                               if(strb[0]=='.') { /* Missing value */
-                                       lval=-1;
-                               }else{
-                                       errno=0;
-                                       /* what_kind_of_number(strb); */
-                                       dval=strtod(strb,&endptr); 
-                                       /* if( strb[0]=='\0' || (*endptr != '\0')){ */
-                                       /* if(strb != endptr && *endptr == '\0') */
-                                       /*    dval=dlval; */
-                                       /* if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) */
-                                       if( strb[0]=='\0' || (*endptr != '\0')){
-                                               printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, nqtv, j,maxwav);
-                                               fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqtv, j,maxwav);fflush(ficlog);
-                                               return 1;
-                                       }
-                                       cotqvar[j][iv][i]=dval; 
-                               }
-                               strcpy(line,stra);
+       cutv(stra, strb, line, ' '); 
+       if(strb[0]=='.') { /* Missing value */
+         lval=-1;
+         cotqvar[j][iv][i]=-1; /* 0.0/0.0 */
+         if(isalpha(strb[1])) { /* .m or .d Really Missing value */
+           printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value.  Exiting.\n", strb, linei,i,line,iv, nqtv, j);
+           fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value.  Exiting.\n", strb, linei,i,line,iv, nqtv, j);fflush(ficlog);
+           return 1;
+         }
+       }else{
+         errno=0;
+         /* what_kind_of_number(strb); */
+         dval=strtod(strb,&endptr); 
+         /* if( strb[0]=='\0' || (*endptr != '\0')){ */
+         /* if(strb != endptr && *endptr == '\0') */
+         /*    dval=dlval; */
+         /* if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) */
+         if( strb[0]=='\0' || (*endptr != '\0')){
+           printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, nqtv, j,maxwav);
+           fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqtv, j,maxwav);fflush(ficlog);
+           return 1;
+         }
+         cotqvar[j][iv][i]=dval; 
+       }
+       strcpy(line,stra);
       }/* end loop ntqv */
-                       
+      
       for (iv=ntv;iv>=1;iv--){  /* Loop  on time varying dummies */
-                               cutv(stra, strb, line, ' '); 
-                               if(strb[0]=='.') { /* Missing value */
-                                       lval=-1;
-                               }else{
-                                       errno=0;
-                                       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 %d for individual %d, '%s'\nShould be the %d th dummy covariate out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, ntv, j,maxwav);
-                                               fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d dummy covariate out of %d measured wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, ntv,j,maxwav);fflush(ficlog);
-                                               return 1;
-                                       }
-                               }
-                               if(lval <-1 || lval >1){
-                                       printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\n \
+       cutv(stra, strb, line, ' '); 
+       if(strb[0]=='.') { /* Missing value */
+         lval=-1;
+       }else{
+         errno=0;
+         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 %d for individual %d, '%s'\nShould be the %d th dummy covariate out of %d measured at wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, ntv, j,maxwav);
+           fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d dummy covariate out of %d measured wave %d. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line,iv, ntv,j,maxwav);fflush(ficlog);
+           return 1;
+         }
+       }
+       if(lval <-1 || lval >1){
+         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                                                                        \
- build V1=0 V2=0 for the reference value (1),\n                                                                                                        \
-        V1=1 V2=0 for (2) \n                                                                                                                                                                           \
+ For example, for multinomial values like 1, 2 and 3,\n                        \
+ build V1=0 V2=0 for the reference value (1),\n                                \
+        V1=1 V2=0 for (2) \n                                           \
  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                                                                                                                               \
+ output of IMaCh is often meaningless.\n                               \
  Exiting.\n",lval,linei, i,line,j);
-                                       fprintf(ficlog,"Error reading data around '%ld' at line number %d 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                                                                        \
- build V1=0 V2=0 for the reference value (1),\n                                                                                                        \
-        V1=1 V2=0 for (2) \n                                                                                                                                                                           \
+ For example, for multinomial values like 1, 2 and 3,\n                        \
+ build V1=0 V2=0 for the reference value (1),\n                                \
+        V1=1 V2=0 for (2) \n                                           \
  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);fflush(ficlog);
-                                       return 1;
-                               }
-                               cotvar[j][iv][i]=(double)(lval);
-                               strcpy(line,stra);
+         return 1;
+       }
+       cotvar[j][iv][i]=(double)(lval);
+       strcpy(line,stra);
       }/* end loop ntv */
-
+      
       /* Statuses  at wave */
       cutv(stra, strb, line, ' '); 
       if(strb[0]=='.') { /* Missing value */
-                               lval=-1;
+       lval=-1;
       }else{
-                               errno=0;
-                               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 %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;
-                               }
+       errno=0;
+       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 %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;
+       }
       }
-     
+      
       s[j][i]=lval;
-
+      
       /* Date of Interview */
       strcpy(line,stra);
       cutv(stra, strb,line,' ');
       if( (iout=sscanf(strb,"%d/%d",&month, &year)) != 0){
       }
       else  if( (iout=sscanf(strb,"%s.",dummy)) != 0){
-                               month=99;
-                               year=9999;
+       month=99;
+       year=9999;
       }else{
-                               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;
+       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; 
       mint[j][i]= (double)month; 
       strcpy(line,stra);
     } /* End loop on waves */
-
+    
     /* Date of death */
     cutv(stra, strb,line,' '); 
     if( (iout=sscanf(strb,"%d/%d",&month, &year)) != 0){
@@ -7497,8 +7528,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
       year=9999;
     }else{
       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;
+      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; 
     moisdc[i]=(double) month; 
@@ -7514,18 +7545,18 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     }else{
       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;
+      return 1;
     }
     if (year==9999) {
       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;
-
+      return 1;
+      
     }
     annais[i]=(double)(year);
     moisnais[i]=(double)(month); 
     strcpy(line,stra);
-
+    
     /* Sample weight */
     cutv(stra, strb,line,' '); 
     errno=0;
@@ -7538,24 +7569,24 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     }
     weight[i]=dval; 
     strcpy(line,stra);
-
+    
     for (iv=nqv;iv>=1;iv--){  /* Loop  on fixed quantitative variables */
       cutv(stra, strb, line, ' '); 
       if(strb[0]=='.') { /* Missing value */
-                               lval=-1;
+       lval=-1;
       }else{
-                               errno=0;
-                               /* what_kind_of_number(strb); */
-                               dval=strtod(strb,&endptr);
-                               /* if(strb != endptr && *endptr == '\0') */
-                               /*   dval=dlval; */
-                               /* if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) */
-                               if( strb[0]=='\0' || (*endptr != '\0')){
-                                       printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value (out of %d) constant for all waves. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqv, maxwav);
-                                       fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value (out of %d) constant for all waves. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqv, maxwav);fflush(ficlog);
-                                       return 1;
-                               }
-                               coqvar[iv][i]=dval; 
+       errno=0;
+       /* what_kind_of_number(strb); */
+       dval=strtod(strb,&endptr);
+       /* if(strb != endptr && *endptr == '\0') */
+       /*   dval=dlval; */
+       /* if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) */
+       if( strb[0]=='\0' || (*endptr != '\0')){
+         printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value (out of %d) constant for all waves. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqv, maxwav);
+         fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value (out of %d) constant for all waves. Setting maxwav=%d might be wrong.  Exiting.\n", strb, linei,i,line, iv, nqv, maxwav);fflush(ficlog);
+         return 1;
+       }
+       coqvar[iv][i]=dval; 
       }
       strcpy(line,stra);
     }/* end loop nqv */
@@ -7564,42 +7595,42 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     for (j=ncovcol;j>=1;j--){
       cutv(stra, strb,line,' '); 
       if(strb[0]=='.') { /* Missing covariate value */
-                               lval=-1;
+       lval=-1;
       }else{
-                               errno=0;
-                               lval=strtol(strb,&endptr,10); 
-                               if( strb[0]=='\0' || (*endptr != '\0')){
-                                       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;
-                               }
+       errno=0;
+       lval=strtol(strb,&endptr,10); 
+       if( strb[0]=='\0' || (*endptr != '\0')){
+         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 '%ld' at line number %d 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 \
- build V1=0 V2=0 for the reference value (1),\n \
-        V1=1 V2=0 for (2) \n \
+ For example, for multinomial values like 1, 2 and 3,\n                        \
+ build V1=0 V2=0 for the reference value (1),\n                                \
+        V1=1 V2=0 for (2) \n                                           \
  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 \
+ output of IMaCh is often meaningless.\n                               \
  Exiting.\n",lval,linei, i,line,j);
-                               fprintf(ficlog,"Error reading data around '%ld' at line number %d 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 \
- build V1=0 V2=0 for the reference value (1),\n \
-        V1=1 V2=0 for (2) \n \
+ For example, for multinomial values like 1, 2 and 3,\n                        \
+ build V1=0 V2=0 for the reference value (1),\n                                \
+        V1=1 V2=0 for (2) \n                                           \
  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 \
+ output of IMaCh is often meaningless.\n                               \
  Exiting.\n",lval,linei, i,line,j);fflush(ficlog);
-                               return 1;
+       return 1;
       }
       covar[j][i]=(double)(lval);
       strcpy(line,stra);
     }  
     lstra=strlen(stra);
-     
+    
     if(lstra > 9){ /* More than 2**32 or max of what printf can write with %ld */
       stratrunc = &(stra[lstra-9]);
       num[i]=atol(stratrunc);
@@ -7611,15 +7642,15 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     
     i=i+1;
   } /* End loop reading  data */
-
+  
   *imax=i-1; /* Number of individuals */
   fclose(fic);
+  
   return (0);
   /* endread: */
-       printf("Exiting readdata: ");
-       fclose(fic);
-       return (1);
+  printf("Exiting readdata: ");
+  fclose(fic);
+  return (1);
 }
 
 void removespace(char *str) {
@@ -7669,22 +7700,21 @@ int decodemodel ( char model[], int lastobs)
     if ((strpt=strstr(model,"age*age")) !=0){
       printf(" strpt=%s, model=%s\n",strpt, model);
       if(strpt != model){
-                               printf("Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
+       printf("Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
  'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
  corresponding column of parameters.\n",model);
-                               fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
+       fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
  'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
  corresponding column of parameters.\n",model); fflush(ficlog);
-                               return 1;
-                       }
-
+       return 1;
+      }
       nagesqr=1;
       if (strstr(model,"+age*age") !=0)
-                               substrchaine(modelsav, model, "+age*age");
+       substrchaine(modelsav, model, "+age*age");
       else if (strstr(model,"age*age+") !=0)
-                               substrchaine(modelsav, model, "age*age+");
+       substrchaine(modelsav, model, "age*age+");
       else 
-                               substrchaine(modelsav, model, "age*age");
+       substrchaine(modelsav, model, "age*age");
     }else
       nagesqr=0;
     if (strlen(modelsav) >1){
@@ -7692,15 +7722,15 @@ int decodemodel ( char model[], int lastobs)
       j1=nbocc(modelsav,'*'); /**< j1=Number of '*' */
       cptcovs=j+1-j1; /**<  Number of simple covariates V1+V1*age+V3 +V3*V4+age*age=> V1 + V3 =5-3=2  */
       cptcovt= j+1; /* Number of total covariates in the model, not including
-                                                                                * cst, age and age*age 
-                                                                                * V1+V1*age+ V3 + V3*V4+age*age=> 3+1=4*/
-                       /* including age products which are counted in cptcovage.
-                        * but the covariates which are products must be treated 
-                        * separately: ncovn=4- 2=2 (V1+V3). */
+                    * cst, age and age*age 
+                    * V1+V1*age+ V3 + V3*V4+age*age=> 3+1=4*/
+      /* including age products which are counted in cptcovage.
+       * but the covariates which are products must be treated 
+       * separately: ncovn=4- 2=2 (V1+V3). */
       cptcovprod=j1; /**< Number of products  V1*V2 +v3*age = 2 */
       cptcovprodnoage=0; /**< Number of covariate products without age: V3*V4 =1  */
-
-    
+      
+      
       /*   Design
        *  V1   V2   V3   V4  V5  V6  V7  V8  V9 Weight
        *  <          ncovcol=8                >
@@ -7734,7 +7764,7 @@ int decodemodel ( char model[], int lastobs)
        *       {2,   1,     4,      8,    5,      6,     3,       7}
        * Struct []
        */
-
+      
       /* 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 */
       /*   modelsav=V2+V1+V4+age*V3 strb=age*V3 stra=V2+V1+V4  */
@@ -7749,97 +7779,115 @@ int decodemodel ( char model[], int lastobs)
       /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,Tvar[Tage[k])]]*cov[2]; */
       /*
        * Treating invertedly V2+V1+V3*age+V2*V4 is as if written V2*V4 +V3*age + V1 + V2 */
-      for(k=cptcovt; k>=1;k--) /**< Number of covariates */
+      for(k=cptcovt; k>=1;k--) /**< Number of covariates not including constant and age, neither age*age*/
         Tvar[k]=0;
       cptcovage=0;
       for(k=1; k<=cptcovt;k++){ /* Loop on total covariates of the model */
-                               cutl(stra,strb,modelsav,'+'); /* keeps in strb after the first '+' 
-                                                                                                                                                                modelsav==V2+V1+V4+V3*age strb=V3*age stra=V2+V1+V4 */ 
-                               if (nbocc(modelsav,'+')==0) strcpy(strb,modelsav); /* and analyzes it */
-                               /*      printf("i=%d a=%s b=%s sav=%s\n",i, stra,strb,modelsav);*/
-                               /*scanf("%d",i);*/
-                               if (strchr(strb,'*')) {  /**< Model includes a product V2+V1+V4+V3*age strb=V3*age */
-                                       cutl(strc,strd,strb,'*'); /**< strd*strc  Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */
-                                       if (strcmp(strc,"age")==0) { /**< Model includes age: Vn*age */
-                                               /* covar is not filled and then is empty */
-                                               cptcovprod--;
-                                               cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */
-                                               Tvar[k]=atoi(stre);  /* V2+V1+V4+V3*age Tvar[4]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */
-                                               cptcovage++; /* Sums the number of covariates which include age as a product */
-                                               Tage[cptcovage]=k;  /* Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */
-                                               /*printf("stre=%s ", stre);*/
-                                       } else if (strcmp(strd,"age")==0) { /* or age*Vn */
-                                               cptcovprod--;
-                                               cutl(stre,strb,strc,'V');
-                                               Tvar[k]=atoi(stre);
-                                               cptcovage++;
-                                               Tage[cptcovage]=k;
-                                       } else {  /* Age is not in the model product V2+V1+V1*V4+V3*age+V3*V2  strb=V3*V2*/
-                                               /* loops on k1=1 (V3*V2) and k1=2 V4*V3 */
-                                               cptcovn++;
-                                               cptcovprodnoage++;k1++;
-                                               cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
-                                               Tvar[k]=ncovcol+k1; /* For model-covariate k tells which data-covariate to use but
-                                                                                                                                        because this model-covariate is a construction we invent a new column
-                                                                                                                                        ncovcol + k1
-                                                                                                                                        If already ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2
-                                                                                                                                        Tvar[3=V1*V4]=4+1 Tvar[5=V3*V2]=4 + 2= 6, etc */
-                                               cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
-                                               Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2  */
-                                               Tvard[k1][1] =atoi(strc); /* m 1 for V1*/
-                                               Tvard[k1][2] =atoi(stre); /* n 4 for V4*/
-                                               k2=k2+2;
-                                               Tvar[cptcovt+k2]=Tvard[k1][1]; /* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) */
-                                               Tvar[cptcovt+k2+1]=Tvard[k1][2];  /* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) */
-                                               for (i=1; i<=lastobs;i++){
-                                                       /* Computes the new covariate which is a product of
-                                                                covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
-                                                       covar[ncovcol+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
-                                               }
-                                       } /* End age is not in the model */
-                               } /* End if model includes a product */
-                               else { /* no more sum */
-                                       /*printf("d=%s c=%s b=%s\n", strd,strc,strb);*/
-                                       /*  scanf("%d",i);*/
-                                       cutl(strd,strc,strb,'V');
-                                       ks++; /**< Number of simple covariates */
-                                       cptcovn++;
-                                       Tvar[k]=atoi(strd);
-                               }
-                               strcpy(modelsav,stra);  /* modelsav=V2+V1+V4 stra=V2+V1+V4 */ 
+       cutl(stra,strb,modelsav,'+'); /* keeps in strb after the first '+' 
+                                        modelsav==V2+V1+V4+V3*age strb=V3*age stra=V2+V1+V4 */ 
+       if (nbocc(modelsav,'+')==0) strcpy(strb,modelsav); /* and analyzes it */
+       /*      printf("i=%d a=%s b=%s sav=%s\n",i, stra,strb,modelsav);*/
+       /*scanf("%d",i);*/
+       if (strchr(strb,'*')) {  /**< Model includes a product V2+V1+V4+V3*age strb=V3*age */
+         cutl(strc,strd,strb,'*'); /**< strd*strc  Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */
+         if (strcmp(strc,"age")==0) { /**< Model includes age: Vn*age */
+           /* covar is not filled and then is empty */
+           cptcovprod--;
+           cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */
+           Tvar[k]=atoi(stre);  /* V2+V1+V4+V3*age Tvar[4]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */
+           Typevar[k]=1;  /* 2 for age product */
+           cptcovage++; /* Sums the number of covariates which include age as a product */
+           Tage[cptcovage]=k;  /* Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */
+           /*printf("stre=%s ", stre);*/
+         } else if (strcmp(strd,"age")==0) { /* or age*Vn */
+           cptcovprod--;
+           cutl(stre,strb,strc,'V');
+           Tvar[k]=atoi(stre);
+           Typevar[k]=1;  /* 1 for age product */
+           cptcovage++;
+           Tage[cptcovage]=k;
+         } else {  /* Age is not in the model product V2+V1+V1*V4+V3*age+V3*V2  strb=V3*V2*/
+           /* loops on k1=1 (V3*V2) and k1=2 V4*V3 */
+           cptcovn++;
+           cptcovprodnoage++;k1++;
+           cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
+           Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* For model-covariate k tells which data-covariate to use but
+                                  because this model-covariate is a construction we invent a new column
+                                  which is after existing variables ncovcol+nqv+ntv+nqtv + k1
+                                  If already ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2
+                                  Tvar[3=V1*V4]=4+1 Tvar[5=V3*V2]=4 + 2= 6, etc */
+           Typevar[k]=2;  /* 2 for double fixed dummy covariates */
+           cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
+           Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2  */
+           Tvard[k1][1] =atoi(strc); /* m 1 for V1*/
+           Tvard[k1][2] =atoi(stre); /* n 4 for V4*/
+           k2=k2+2;  /* k2 is initialize to -1, We want to store the n and m in Vn*Vm at the end of Tvar */
+           /* Tvar[cptcovt+k2]=Tvard[k1][1]; /\* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) *\/ */
+           /* Tvar[cptcovt+k2+1]=Tvard[k1][2];  /\* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) *\/ */
+            /*ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2, Tvar[3]=5, Tvar[4]=6, cptcovt=5 */
+           /*                     1  2   3      4     5 | Tvar[5+1)=1, Tvar[7]=2   */
+           for (i=1; i<=lastobs;i++){
+             /* Computes the new covariate which is a product of
+                covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
+             covar[ncovcol+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+           }
+         } /* End age is not in the model */
+       } /* End if model includes a product */
+       else { /* no more sum */
+         /*printf("d=%s c=%s b=%s\n", strd,strc,strb);*/
+         /*  scanf("%d",i);*/
+         cutl(strd,strc,strb,'V');
+         ks++; /**< Number of simple covariates*/
+         cptcovn++; /** V4+V3+V5: V4 and V3 timevarying dummy covariates, V5 timevarying quantitative */
+         Tvar[k]=atoi(strd);
+         Typevar[k]=0;  /* 0 for simple covariates */
+       }
+       strcpy(modelsav,stra);  /* modelsav=V2+V1+V4 stra=V2+V1+V4 */ 
                                /*printf("a=%s b=%s sav=%s\n", stra,strb,modelsav);
-                                       scanf("%d",i);*/
+                                 scanf("%d",i);*/
       } /* end of loop + on total covariates */
     } /* end if strlen(modelsave == 0) age*age might exist */
   } /* end if strlen(model == 0) */
   
   /*The number n of Vn is stored in Tvar. cptcovage =number of age covariate. Tage gives the position of age. cptcovprod= number of products.
     If model=V1+V1*age then Tvar[1]=1 Tvar[2]=1 cptcovage=1 Tage[1]=2 cptcovprod=0*/
-
+  
   /* printf("tvar1=%d tvar2=%d tvar3=%d cptcovage=%d Tage=%d",Tvar[1],Tvar[2],Tvar[3],cptcovage,Tage[1]);
-                printf("cptcovprod=%d ", cptcovprod);
-                fprintf(ficlog,"cptcovprod=%d ", cptcovprod);
-
-                scanf("%d ",i);*/
-/* Dispatching in quantitative and time varying covariates */
-
-       for(k=1, ncoveff=0, nqveff=0, ntveff=0, nqtveff=0;k<=cptcovn; k++){ /* or cptocvt */
-               if (Tvar[k] <=ncovcol){
-                       ncoveff++;
-               }else if( Tvar[k] <=ncovcol+nqv){
-                       nqveff++;
-               }else if( Tvar[k] <=ncovcol+nqv+ntv){
-                       ntveff++;
-               }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv){
-                       nqtveff++;
-               }else
-                       printf("Error in effective covariates \n");
-       }
-
+     printf("cptcovprod=%d ", cptcovprod);
+     fprintf(ficlog,"cptcovprod=%d ", cptcovprod);
+     scanf("%d ",i);*/
+
+
+/* Decodemodel knows only the grammar (simple, product, age*) of the model but not what kind
+   of variable (dummy vs quantitative, fixed vs time varying) is behind */
+/* ncovcol= 1, nqv=1, ntv=2, nqtv= 1  = 5 possible variables data
+   model=  V2 + V4 +V3 + V4*V3 + V5*age + V5 , V1 is not used saving its place
+   k =      1    2   3     4       5       6
+   Tvar[k]= 2    4   3 1+1+2+1+1=6 5       5
+   Typevar[k]=0  0   0     2       1       0
+*/  
+/* Dispatching between quantitative and time varying covariates */
+  /* Tvar[k] is the value n of Vn with n varying for 1 to nvcol, or p  Vp=Vn*Vm for product */
+  for(k=1, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0;k<=cptcovt; k++){ /* or cptocvt */
+    if (Tvar[k] <=ncovcol){ /* Simple fixed dummy covariatee */
+      ncoveff++;
+    }else if( Tvar[k] <=ncovcol+nqv && Typevar[k]==0){ /* Remind that product Vn*Vm are added in k*/
+      nqfveff++;  /* Only simple fixed quantitative variable */
+    }else if( Tvar[k] <=ncovcol+nqv+ntv && Typevar[k]==0){
+      ntveff++; /* Only simple time varying dummy variable */
+    }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv && Typevar[k]==0){
+      nqtveff++;/* Only simple time varying quantitative variable */
+    }else{
+      printf("Other types in effective covariates \n");
+    }
+  }
+  
+  printf("ncoveff=%d, nqfveff=%d, ntveff=%d, nqtveff=%d, cptcovn=%d\n",ncoveff,nqfveff,ntveff,nqtveff,cptcovn);
+  fprintf(ficlog,"ncoveff=%d, nqfveff=%d, ntveff=%d, nqtveff=%d, cptcovn=%d\n",ncoveff,nqfveff,ntveff,nqtveff,cptcovn);
   return (0); /* with covar[new additional covariate if product] and Tage if age */ 
   /*endread:*/
-       printf("Exiting decodemodel: ");
-       return (1);
+  printf("Exiting decodemodel: ");
+  return (1);
 }
 
 int calandcheckages(int imx, int maxwav, double *agemin, double *agemax, int *nberr, int *nbwarn )
@@ -8187,7 +8235,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
     fprintf(ficrespl,"#******");
     printf("#******");
     fprintf(ficlog,"#******");
-    for(j=1;j<=nqveff;j++) {
+    for(j=1;j<=nqfveff;j++) {
       fprintf(ficrespl," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
@@ -8203,7 +8251,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
                }
 
     fprintf(ficrespl,"#Age ");
-    for(j=1;j<=nqveff;j++) {
+    for(j=1;j<=nqfveff;j++) {
       fprintf(ficrespl,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     }
     for(i=1; i<=nlstate;i++) fprintf(ficrespl,"  %d-%d   ",i,i);
@@ -8213,7 +8261,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
       /* for (age=agebase; age<=agebase; age++){ */
       prevalim(prlim, nlstate, p, age, oldm, savm, ftolpl, ncvyearp, k);
       fprintf(ficrespl,"%.0f ",age );
-      for(j=1;j<=nqveff;j++)
+      for(j=1;j<=nqfveff;j++)
                                                        fprintf(ficrespl,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       tot=0.;
       for(i=1; i<=nlstate;i++){
@@ -8261,7 +8309,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
   agelim=agemaxpar;
   
   
-  i1=pow(2,nqveff);
+  i1=pow(2,nqfveff);
   if (cptcovn < 1){i1=1;}
 
        for(k=1; k<=i1;k++){ 
@@ -8274,7 +8322,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
     fprintf(ficresplb,"#******");
     printf("#******");
     fprintf(ficlog,"#******");
-    for(j=1;j<=nqveff;j++) {
+    for(j=1;j<=nqfveff;j++) {
       fprintf(ficresplb," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
@@ -8290,7 +8338,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
                }
     
     fprintf(ficresplb,"#Age ");
-    for(j=1;j<=nqveff;j++) {
+    for(j=1;j<=nqfveff;j++) {
       fprintf(ficresplb,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     }
     for(i=1; i<=nlstate;i++) fprintf(ficresplb,"  %d-%d   ",i,i);
@@ -8312,7 +8360,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
                                bprevalim(bprlim, probs, nlstate, p, age, ftolpl, ncvyearp, k);
       }
       fprintf(ficresplb,"%.0f ",age );
-      for(j=1;j<=nqveff;j++)
+      for(j=1;j<=nqfveff;j++)
                                fprintf(ficresplb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       tot=0.;
       for(i=1; i<=nlstate;i++){
@@ -8360,13 +8408,13 @@ int hPijx(double *p, int bage, int fage){
     /* hstepm=1;   aff par mois*/
     pstamp(ficrespij);
     fprintf(ficrespij,"#****** h Pij x Probability to be in state j at age x+h being in i at x ");
-    i1= pow(2,nqveff);
+    i1= pow(2,nqfveff);
                /* for(cptcov=1,k=0;cptcov<=i1;cptcov++){ */
                /*    /\*for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*\/ */
                /*      k=k+1;  */
-    for (k=1; k <= (int) pow(2,nqveff); k++){
+    for (k=1; k <= (int) pow(2,nqfveff); k++){
       fprintf(ficrespij,"\n#****** ");
-      for(j=1;j<=nqveff;j++) 
+      for(j=1;j<=nqfveff;j++) 
        fprintf(ficrespij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficrespij,"******\n");
       
@@ -8432,13 +8480,13 @@ int hPijx(double *p, int bage, int fage){
   /* hstepm=1;   aff par mois*/
   pstamp(ficrespijb);
   fprintf(ficrespijb,"#****** h Pij x Back Probability to be in state i at age x-h being in j at x ");
-  i1= pow(2,nqveff);
+  i1= pow(2,nqfveff);
   /* for(cptcov=1,k=0;cptcov<=i1;cptcov++){ */
   /*    /\*for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*\/ */
   /*   k=k+1;  */
-  for (k=1; k <= (int) pow(2,nqveff); k++){
+  for (k=1; k <= (int) pow(2,nqfveff); k++){
     fprintf(ficrespijb,"\n#****** ");
-    for(j=1;j<=nqveff;j++)
+    for(j=1;j<=nqfveff;j++)
       fprintf(ficrespijb,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     fprintf(ficrespijb,"******\n");
     if(invalidvarcomb[k]){
@@ -8833,9 +8881,9 @@ int main(int argc, char *argv[])
 
    
   covar=matrix(0,NCOVMAX,1,n);  /**< used in readdata */
-  coqvar=matrix(1,nqv,1,n);  /**< used in readdata */
-  cotvar=ma3x(1,maxwav,1,ntv,1,n);  /**< used in readdata */
-  cotqvar=ma3x(1,maxwav,1,nqtv,1,n);  /**< used in readdata */
+  coqvar=matrix(1,nqv,1,n);  /**< Fixed quantitative covariate */
+  cotvar=ma3x(1,maxwav,1,ntv,1,n);  /**< Time varying covariate */
+  cotqvar=ma3x(1,maxwav,1,nqtv,1,n);  /**< Time varying quantitative covariate */
   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
@@ -9078,6 +9126,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
        k=1 Tvar[1]=2 (from V2)
     */
   Tvar=ivector(1,NCOVMAX); /* Was 15 changed to NCOVMAX. */
+  Typevar=ivector(1,NCOVMAX); /* -1 to 4 */
   /*  V2+V1+V4+age*V3 is a model with 4 covariates (3 plus signs). 
       For each model-covariate stores the data-covariate id. Tvar[1]=2, Tvar[2]=1, Tvar[3]=4, 
       Tvar[4=age*V3] is 3 and 'age' is recorded in Tage.
@@ -9158,7 +9207,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   nbcode=imatrix(0,NCOVMAX,0,NCOVMAX); 
   ncodemax[1]=1;
   Ndum =ivector(-1,NCOVMAX);  
-       cptcoveff=0;
+  cptcoveff=0;
   if (ncovmodel-nagesqr > 2 ){ /* That is if covariate other than cst, age and age*age */
     tricode(&cptcoveff,Tvar,nbcode,imx, Ndum); /**< Fills nbcode[Tvar[j]][l]; */
        }
@@ -9613,20 +9662,20 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     fprintf(ficlog,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n");
     for(i=1,jk=1; i <=nlstate; i++){
       for(k=1; k <=(nlstate+ndeath); k++){
-                               if (k != i) {
-                                       printf("%d%d ",i,k);
-                                       fprintf(ficlog,"%d%d ",i,k);
-                                       fprintf(ficres,"%1d%1d ",i,k);
-                                       for(j=1; j <=ncovmodel; j++){
-                                               printf("%12.7f ",p[jk]);
-                                               fprintf(ficlog,"%12.7f ",p[jk]);
-                                               fprintf(ficres,"%12.7f ",p[jk]);
-                                               jk++; 
-                                       }
-                                       printf("\n");
-                                       fprintf(ficlog,"\n");
-                                       fprintf(ficres,"\n");
-                               }
+       if (k != i) {
+         printf("%d%d ",i,k);
+         fprintf(ficlog,"%d%d ",i,k);
+         fprintf(ficres,"%1d%1d ",i,k);
+         for(j=1; j <=ncovmodel; j++){
+           printf("%12.7f ",p[jk]);
+           fprintf(ficlog,"%12.7f ",p[jk]);
+           fprintf(ficres,"%12.7f ",p[jk]);
+           jk++; 
+         }
+         printf("\n");
+         fprintf(ficlog,"\n");
+         fprintf(ficres,"\n");
+       }
       }
     }
     if(mle != 0){
@@ -9636,42 +9685,42 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       printf("Parameters and 95%% confidence intervals\n W is simply the result of the division of the parameter by the square root of covariance of the parameter.\n And Wald-based confidence intervals plus and minus 1.96 * W .\n But be careful that parameters are highly correlated because incidence of disability is highly correlated to incidence of recovery.\n It might be better to visualize the covariance matrix. See the page 'Matrix of variance-covariance of one-step probabilities' and its graphs.\n");
       fprintf(ficlog, "Parameters, Wald tests and Wald-based confidence intervals\n W is simply the result of the division of the parameter by the square root of covariance of the parameter.\n And Wald-based confidence intervals plus and minus 1.96 * W \n  It might be better to visualize the covariance matrix. See the page 'Matrix of variance-covariance of one-step probabilities' and its graphs.\n");
       for(i=1,jk=1; i <=nlstate; i++){
-                               for(k=1; k <=(nlstate+ndeath); k++){
-                                       if (k != i) {
-                                               printf("%d%d ",i,k);
-                                               fprintf(ficlog,"%d%d ",i,k);
-                                               for(j=1; j <=ncovmodel; j++){
-                                                       printf("%12.7f W=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-1.96*sqrt(matcov[jk][jk]),p[jk]+1.96*sqrt(matcov[jk][jk]));
-                                                       fprintf(ficlog,"%12.7f W=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-1.96*sqrt(matcov[jk][jk]),p[jk]+1.96*sqrt(matcov[jk][jk]));
-                                                       jk++; 
-                                               }
-                                               printf("\n");
-                                               fprintf(ficlog,"\n");
-                                       }
-                               }
+       for(k=1; k <=(nlstate+ndeath); k++){
+         if (k != i) {
+           printf("%d%d ",i,k);
+           fprintf(ficlog,"%d%d ",i,k);
+           for(j=1; j <=ncovmodel; j++){
+             printf("%12.7f W=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-1.96*sqrt(matcov[jk][jk]),p[jk]+1.96*sqrt(matcov[jk][jk]));
+             fprintf(ficlog,"%12.7f W=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-1.96*sqrt(matcov[jk][jk]),p[jk]+1.96*sqrt(matcov[jk][jk]));
+             jk++; 
+           }
+           printf("\n");
+           fprintf(ficlog,"\n");
+         }
+       }
       }
     } /* end of hesscov and Wald tests */
-               
+    
     /*  */
     fprintf(ficres,"# Scales (for hessian or gradient estimation)\n");
     printf("# Scales (for hessian or gradient estimation)\n");
     fprintf(ficlog,"# Scales (for hessian or gradient estimation)\n");
     for(i=1,jk=1; i <=nlstate; i++){
       for(j=1; j <=nlstate+ndeath; j++){
-                               if (j!=i) {
-                                       fprintf(ficres,"%1d%1d",i,j);
-                                       printf("%1d%1d",i,j);
-                                       fprintf(ficlog,"%1d%1d",i,j);
-                                       for(k=1; k<=ncovmodel;k++){
-                                               printf(" %.5e",delti[jk]);
-                                               fprintf(ficlog," %.5e",delti[jk]);
-                                               fprintf(ficres," %.5e",delti[jk]);
-                                               jk++;
-                                       }
-                                       printf("\n");
-                                       fprintf(ficlog,"\n");
-                                       fprintf(ficres,"\n");
-                               }
+       if (j!=i) {
+         fprintf(ficres,"%1d%1d",i,j);
+         printf("%1d%1d",i,j);
+         fprintf(ficlog,"%1d%1d",i,j);
+         for(k=1; k<=ncovmodel;k++){
+           printf(" %.5e",delti[jk]);
+           fprintf(ficlog," %.5e",delti[jk]);
+           fprintf(ficres," %.5e",delti[jk]);
+           jk++;
+         }
+         printf("\n");
+         fprintf(ficlog,"\n");
+         fprintf(ficres,"\n");
+       }
       }
     }
     
@@ -9695,83 +9744,83 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     for(itimes=1;itimes<=2;itimes++){
       jj=0;
       for(i=1; i <=nlstate; i++){
-                               for(j=1; j <=nlstate+ndeath; j++){
-                                       if(j==i) continue;
-                                       for(k=1; k<=ncovmodel;k++){
-                                               jj++;
-                                               ca[0]= k+'a'-1;ca[1]='\0';
-                                               if(itimes==1){
-                                                       if(mle>=1)
-                                                               printf("#%1d%1d%d",i,j,k);
-                                                       fprintf(ficlog,"#%1d%1d%d",i,j,k);
-                                                       fprintf(ficres,"#%1d%1d%d",i,j,k);
-                                               }else{
-                                                       if(mle>=1)
-                                                               printf("%1d%1d%d",i,j,k);
-                                                       fprintf(ficlog,"%1d%1d%d",i,j,k);
-                                                       fprintf(ficres,"%1d%1d%d",i,j,k);
-                                               }
-                                               ll=0;
-                                               for(li=1;li <=nlstate; li++){
-                                                       for(lj=1;lj <=nlstate+ndeath; lj++){
-                                                               if(lj==li) continue;
-                                                               for(lk=1;lk<=ncovmodel;lk++){
-                                                                       ll++;
-                                                                       if(ll<=jj){
-                                                                               cb[0]= lk +'a'-1;cb[1]='\0';
-                                                                               if(ll<jj){
-                                                                                       if(itimes==1){
-                                                                                               if(mle>=1)
-                                                                                                       printf(" Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
-                                                                                               fprintf(ficlog," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
-                                                                                               fprintf(ficres," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
-                                                                                       }else{
-                                                                                               if(mle>=1)
-                                                                                                       printf(" %.5e",matcov[jj][ll]); 
-                                                                                               fprintf(ficlog," %.5e",matcov[jj][ll]); 
-                                                                                               fprintf(ficres," %.5e",matcov[jj][ll]); 
-                                                                                       }
-                                                                               }else{
-                                                                                       if(itimes==1){
-                                                                                               if(mle>=1)
-                                                                                                       printf(" Var(%s%1d%1d)",ca,i,j);
-                                                                                               fprintf(ficlog," Var(%s%1d%1d)",ca,i,j);
-                                                                                               fprintf(ficres," Var(%s%1d%1d)",ca,i,j);
-                                                                                       }else{
-                                                                                               if(mle>=1)
-                                                                                                       printf(" %.7e",matcov[jj][ll]); 
-                                                                                               fprintf(ficlog," %.7e",matcov[jj][ll]); 
-                                                                                               fprintf(ficres," %.7e",matcov[jj][ll]); 
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                               } /* end lk */
-                                                       } /* end lj */
-                                               } /* end li */
-                                               if(mle>=1)
-                                                       printf("\n");
-                                               fprintf(ficlog,"\n");
-                                               fprintf(ficres,"\n");
-                                               numlinepar++;
-                                       } /* end k*/
-                               } /*end j */
+       for(j=1; j <=nlstate+ndeath; j++){
+         if(j==i) continue;
+         for(k=1; k<=ncovmodel;k++){
+           jj++;
+           ca[0]= k+'a'-1;ca[1]='\0';
+           if(itimes==1){
+             if(mle>=1)
+               printf("#%1d%1d%d",i,j,k);
+             fprintf(ficlog,"#%1d%1d%d",i,j,k);
+             fprintf(ficres,"#%1d%1d%d",i,j,k);
+           }else{
+             if(mle>=1)
+               printf("%1d%1d%d",i,j,k);
+             fprintf(ficlog,"%1d%1d%d",i,j,k);
+             fprintf(ficres,"%1d%1d%d",i,j,k);
+           }
+           ll=0;
+           for(li=1;li <=nlstate; li++){
+             for(lj=1;lj <=nlstate+ndeath; lj++){
+               if(lj==li) continue;
+               for(lk=1;lk<=ncovmodel;lk++){
+                 ll++;
+                 if(ll<=jj){
+                   cb[0]= lk +'a'-1;cb[1]='\0';
+                   if(ll<jj){
+                     if(itimes==1){
+                       if(mle>=1)
+                         printf(" Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
+                       fprintf(ficlog," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
+                       fprintf(ficres," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj);
+                     }else{
+                       if(mle>=1)
+                         printf(" %.5e",matcov[jj][ll]); 
+                       fprintf(ficlog," %.5e",matcov[jj][ll]); 
+                       fprintf(ficres," %.5e",matcov[jj][ll]); 
+                     }
+                   }else{
+                     if(itimes==1){
+                       if(mle>=1)
+                         printf(" Var(%s%1d%1d)",ca,i,j);
+                       fprintf(ficlog," Var(%s%1d%1d)",ca,i,j);
+                       fprintf(ficres," Var(%s%1d%1d)",ca,i,j);
+                     }else{
+                       if(mle>=1)
+                         printf(" %.7e",matcov[jj][ll]); 
+                       fprintf(ficlog," %.7e",matcov[jj][ll]); 
+                       fprintf(ficres," %.7e",matcov[jj][ll]); 
+                     }
+                   }
+                 }
+               } /* end lk */
+             } /* end lj */
+           } /* end li */
+           if(mle>=1)
+             printf("\n");
+           fprintf(ficlog,"\n");
+           fprintf(ficres,"\n");
+           numlinepar++;
+         } /* end k*/
+       } /*end j */
       } /* end i */
     } /* end itimes */
     
     fflush(ficlog);
     fflush(ficres);
-               while(fgets(line, MAXLINE, ficpar)) {
-                       /* If line starts with a # it is a comment */
-                       if (line[0] == '#') {
-                               numlinepar++;
-                               fputs(line,stdout);
-                               fputs(line,ficparo);
-                               fputs(line,ficlog);
-                               continue;
-                       }else
-                               break;
-               }
-               
+    while(fgets(line, MAXLINE, ficpar)) {
+      /* If line starts with a # it is a comment */
+      if (line[0] == '#') {
+       numlinepar++;
+       fputs(line,stdout);
+       fputs(line,ficparo);
+       fputs(line,ficlog);
+       continue;
+      }else
+       break;
+    }
+    
     /* while((c=getc(ficpar))=='#' && c!= EOF){ */
     /*   ungetc(c,ficpar); */
     /*   fgets(line, MAXLINE, ficpar); */
@@ -9782,17 +9831,17 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     
     estepm=0;
     if((num_filled=sscanf(line,"agemin=%lf agemax=%lf bage=%lf fage=%lf estepm=%d ftolpl=%lf\n",&ageminpar,&agemaxpar, &bage, &fage, &estepm, &ftolpl)) !=EOF){
-                       
-                       if (num_filled != 6) {
-                               printf("Error: Not 6 parameters in line, for example:agemin=60 agemax=95 bage=55 fage=95 estepm=24 ftolpl=6e-4\n, your line=%s . Probably you are running an older format.\n",line);
-                               fprintf(ficlog,"Error: Not 6 parameters in line, for example:agemin=60 agemax=95 bage=55 fage=95 estepm=24 ftolpl=6e-4\n, your line=%s . Probably you are running an older format.\n",line);
-                               goto end;
-                       }
-                       printf("agemin=%lf agemax=%lf bage=%lf fage=%lf estepm=%d ftolpl=%lf\n",ageminpar,agemaxpar, bage, fage, estepm, ftolpl);
-               }
-               /* ftolpl=6*ftol*1.e5; /\* 6.e-3 make convergences in less than 80 loops for the prevalence limit *\/ */
-               /*ftolpl=6.e-4;*/ /* 6.e-3 make convergences in less than 80 loops for the prevalence limit */
-               
+      
+      if (num_filled != 6) {
+       printf("Error: Not 6 parameters in line, for example:agemin=60 agemax=95 bage=55 fage=95 estepm=24 ftolpl=6e-4\n, your line=%s . Probably you are running an older format.\n",line);
+       fprintf(ficlog,"Error: Not 6 parameters in line, for example:agemin=60 agemax=95 bage=55 fage=95 estepm=24 ftolpl=6e-4\n, your line=%s . Probably you are running an older format.\n",line);
+       goto end;
+      }
+      printf("agemin=%lf agemax=%lf bage=%lf fage=%lf estepm=%d ftolpl=%lf\n",ageminpar,agemaxpar, bage, fage, estepm, ftolpl);
+    }
+    /* ftolpl=6*ftol*1.e5; /\* 6.e-3 make convergences in less than 80 loops for the prevalence limit *\/ */
+    /*ftolpl=6.e-4;*/ /* 6.e-3 make convergences in less than 80 loops for the prevalence limit */
+    
     /* fscanf(ficpar,"agemin=%lf agemax=%lf bage=%lf fage=%lf estepm=%d ftolpl=%\n",&ageminpar,&agemaxpar, &bage, &fage, &estepm); */
     if (estepm==0 || estepm < stepm) estepm=stepm;
     if (fage <= 2) {
@@ -9881,11 +9930,11 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       printinggnuplot(fileresu, optionfilefiname,ageminpar,agemaxpar,fage, prevfcast, backcast, pathc,p);
     }
     printinghtml(fileresu,title,datafile, firstpass, lastpass, stepm, weightopt, \
-                                                                model,imx,jmin,jmax,jmean,rfileres,popforecast,prevfcast,backcast, estepm, \
-                                                                jprev1,mprev1,anprev1,dateprev1,jprev2,mprev2,anprev2,dateprev2);
+                model,imx,jmin,jmax,jmean,rfileres,popforecast,prevfcast,backcast, estepm, \
+                jprev1,mprev1,anprev1,dateprev1,jprev2,mprev2,anprev2,dateprev2);
                
-               /*------------ free_vector  -------------*/
-               /*  chdir(path); */
+    /*------------ free_vector  -------------*/
+    /*  chdir(path); */
                
     /* free_ivector(wav,1,imx); */  /* Moved after last prevalence call */
     /* free_imatrix(dh,1,lastpass-firstpass+2,1,imx); */
@@ -9922,8 +9971,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     probs= ma3x(1,AGESUP,1,nlstate+ndeath, 1,ncovcombmax);
     for(i=1;i<=AGESUP;i++)
       for(j=1;j<=nlstate+ndeath;j++) /* ndeath is useless but a necessity to be compared with mobaverages */
-                               for(k=1;k<=ncovcombmax;k++)
-                                       probs[i][j][k]=0.;
+       for(k=1;k<=ncovcombmax;k++)
+         probs[i][j][k]=0.;
     prevalence(probs, ageminpar, agemaxpar, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass);
     if (mobilav!=0 ||mobilavproj !=0 ) {
       mobaverages= ma3x(1, AGESUP,1,nlstate+ndeath, 1,ncovcombmax);
@@ -9952,7 +10001,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*if((stepm == 1) && (strcmp(model,".")==0)){*/
     if(prevfcast==1){
       /*    if(stepm ==1){*/
-      prevforecast(fileresu, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, nqveff);
+      prevforecast(fileresu, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, cptcoveff);
     }
     if(backcast==1){
       ddnewms=matrix(1,nlstate+ndeath,1,nlstate+ndeath);       
@@ -9970,7 +10019,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       free_matrix(bprlim,1,nlstate,1,nlstate); /*here or after loop ? */
 
       /* prevbackforecast(fileresu, anback1, mback1, jback1, agemin, agemax, dateprev1, dateprev2, mobilavproj,
-        bage, fage, firstpass, lastpass, anback2, p, nqveff); */
+        bage, fage, firstpass, lastpass, anback2, p, cptcoveff); */
       free_matrix(ddnewms, 1, nlstate+ndeath, 1, nlstate+ndeath);
       free_matrix(ddsavms, 1, nlstate+ndeath, 1, nlstate+ndeath);
       free_matrix(ddoldms, 1, nlstate+ndeath, 1, nlstate+ndeath);
@@ -9996,9 +10045,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     printf("Computing Health Expectancies: result on file '%s' ...", filerese);fflush(stdout);
     fprintf(ficlog,"Computing Health Expectancies: result on file '%s' ...", filerese);fflush(ficlog);
                
-    for (k=1; k <= (int) pow(2,nqveff); k++){
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
       fprintf(ficreseij,"\n#****** ");
-      for(j=1;j<=nqveff;j++) {
+      for(j=1;j<=cptcoveff;j++) {
                                fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficreseij,"******\n");
@@ -10056,15 +10105,15 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
       for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
           
-    for (k=1; k <= (int) pow(2,nqveff); k++){
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
       fprintf(ficrest,"\n#****** ");
-      for(j=1;j<=nqveff;j++) 
+      for(j=1;j<=cptcoveff;j++) 
                                fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficrest,"******\n");
       
       fprintf(ficresstdeij,"\n#****** ");
       fprintf(ficrescveij,"\n#****** ");
-      for(j=1;j<=nqveff;j++) {
+      for(j=1;j<=cptcoveff;j++) {
                                fprintf(ficresstdeij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
                                fprintf(ficrescveij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
@@ -10072,7 +10121,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficrescveij,"******\n");
       
       fprintf(ficresvij,"\n#****** ");
-      for(j=1;j<=nqveff;j++) 
+      for(j=1;j<=cptcoveff;j++) 
                                fprintf(ficresvij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficresvij,"******\n");
       
@@ -10182,9 +10231,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
       for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
           
-    for (k=1; k <= (int) pow(2,nqveff); k++){
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
        fprintf(ficresvpl,"\n#****** ");
-                       for(j=1;j<=nqveff;j++) 
+                       for(j=1;j<=cptcoveff;j++) 
                                fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
                        fprintf(ficresvpl,"******\n");
       
@@ -10223,6 +10272,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
 
     free_ivector(ncodemax,1,NCOVMAX);
     free_ivector(ncodemaxwundef,1,NCOVMAX);
+    free_ivector(Typevar,-1,NCOVMAX);
     free_ivector(Tvar,1,NCOVMAX);
     free_ivector(Tprod,1,NCOVMAX);
     free_ivector(Tvaraff,1,NCOVMAX);