]> henry.ined.fr Git - .git/commitdiff
Summary: Debugging with valgrind
authorN. Brouard <brouard@ined.fr>
Tue, 10 Jun 2014 21:23:15 +0000 (21:23 +0000)
committerN. Brouard <brouard@ined.fr>
Tue, 10 Jun 2014 21:23:15 +0000 (21:23 +0000)
Author: Nicolas Brouard

Lot of changes in order to output the results with some covariates
After the Edimburgh REVES conference 2014, it seems mandatory to
improve the code.
No more memory valgrind error but a lot has to be done in order to
continue the work of splitting the code into subroutines.
Also, decodemodel has been improved. Tricode is still not
optimal. nbcode should be improved. Documentation has been added in
the source code.

src/imach.c

index 302eae1640a0a069fa6d112ac39434a632585c9e..bb6068556aeb1410c9fcdb62c99f4647e97310b9 100644 (file)
       begin-prev-date,...
   open gnuplot file
   open html file
-  period (stable) prevalence
-   for age prevalim()
-  h Pij x
-  variance of p varprob
+  period (stable) prevalence      | pl_nom    1-1 2-2 etc by covariate
+   for age prevalim()             | #****** V1=0  V2=1  V3=1  V4=0 ******
+                                  | 65 1 0 2 1 3 1 4 0  0.96326 0.03674
+    freexexit2 possible for memory heap.
+
+  h Pij x                         | pij_nom  ficrestpij
+   # Cov Agex agex+h hpijx with i,j= 1-1 1-2     1-3     2-1     2-2     2-3
+       1  85   85    1.00000             0.00000 0.00000 0.00000 1.00000 0.00000
+       1  85   86    0.68299             0.22291 0.09410 0.71093 0.00000 0.28907
+
+       1  65   99    0.00364             0.00322 0.99314 0.00350 0.00310 0.99340
+       1  65  100    0.00214             0.00204 0.99581 0.00206 0.00196 0.99597
+  variance of p one-step probabilities varprob  | prob_nom   ficresprob #One-step probabilities and stand. devi in ()
+   Standard deviation of one-step probabilities | probcor_nom   ficresprobcor #One-step probabilities and correlation matrix
+   Matrix of variance covariance of one-step probabilities |  probcov_nom ficresprobcov #One-step probabilities and covariance matrix
+
   forecasting if prevfcast==1 prevforecast call prevalence()
   health expectancies
   Variance-covariance of DFLE
@@ -436,6 +448,7 @@ extern int errno;
 #define NLSTATEMAX 8 /**< Maximum number of live states (for func) */
 #define NDEATHMAX 8 /**< Maximum number of dead states (for func) */
 #define NCOVMAX 20 /**< Maximum number of covariates, including generated covariates V1*V2 */
+#define codtabm(h,k)  1 & (h-1) >> (k-1) ;
 #define MAXN 20000
 #define YEARM 12. /**< Number of months per year */
 #define AGESUP 130
@@ -460,7 +473,14 @@ char strstart[80];
 char optionfilext[10], optionfilefiname[FILENAMELENGTH];
 int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings  */
 int nvar=0, nforce=0; /* Number of variables, number of forces */
-int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov=0; /* Number of covariates, of covariates with '*age' */
+/* 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 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 cptcov=0; /* Working variable */
 int npar=NPARMAX;
 int nlstate=2; /* Number of live states */
 int ndeath=1; /* Number of dead states */
@@ -479,6 +499,7 @@ int **dh; /* dh[mi][i] is number of steps between mi,mi+1 for this individual */
 int **bh; /* bh[mi][i] is the bias (+ or -) for this individual if the delay between
           * wave mi and wave mi+1 is not an exact multiple of stepm. */
 double jmean=1; /* Mean space between 2 waves */
+double **matprod2(); /* test */
 double **oldm, **newm, **savm; /* Working pointers to matrices */
 double **oldms, **newms, **savms; /* Fixed working pointers to matrices */
 /*FILE *fic ; */ /* Used in readdata only */
@@ -579,11 +600,12 @@ double dateintmean=0;
 double *weight;
 int **s; /* Status */
 double *agedc;
-double  **covar; /**< covar[i,j], value of jth covariate for individual i,
+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]*cov[2]; */
 double  idx; 
 int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
+int *Ndum; /** Freq of modality (tricode */
 int **codtab; /**< codtab=imatrix(1,100,1,10); */
 int **Tvard, *Tprod, cptcovprod, *Tvaraff;
 double *lsurv, *lpop, *tpop;
@@ -672,6 +694,34 @@ char *trimbb(char *out, char *in)
   return s;
 }
 
+char *cutl(char *blocc, char *alocc, char *in, char occ)
+{
+  /* cuts string in into blocc and alocc where blocc ends before first occurence of char 'occ' 
+     and alocc starts after first occurence of char 'occ' : ex cutv(blocc,alocc,"abcdef2ghi2j",'2')
+     gives blocc="abcdef2ghi" and alocc="j".
+     If occ is not found blocc is null and alocc is equal to in. Returns blocc
+  */
+  char *s, *t, *bl;
+  t=in;s=in;
+  while ((*in != occ) && (*in != '\0')){
+    *alocc++ = *in++;
+  }
+  if( *in == occ){
+    *(alocc)='\0';
+    s=++in;
+  }
+  if (s == t) {/* occ not found */
+    *(alocc-(in-s))='\0';
+    in=s;
+  }
+  while ( *in != '\0'){
+    *blocc++ = *in++;
+  }
+
+  *blocc='\0';
+  return t;
+}
 char *cutv(char *blocc, char *alocc, char *in, char occ)
 {
   /* cuts string in into blocc and alocc where blocc ends before last occurence of char 'occ' 
@@ -842,7 +892,9 @@ double **matrix(long nrl, long nrh, long ncl, long nch)
 
   for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol;
   return m;
-  /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1]) 
+  /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1]) or &(m[1][0])
+m[i] = address of ith row of the table. &(m[i]) is its value which is another adress
+that of m[i][0]. In order to get the value p m[i][0] but it is unitialized.
    */
 }
 
@@ -1277,7 +1329,7 @@ double **prevalim(double **prlim, int nlstate, double x[], double age, double **
 
   int i, ii,j,k;
   double min, max, maxmin, maxmax,sumnew=0.;
-  double **matprod2();
+  /* double **matprod2(); */ /* test */
   double **out, cov[NCOVMAX+1], **pmij();
   double **newm;
   double agefin, delaymax=50 ; /* Max number of years to converge */
@@ -1297,15 +1349,17 @@ double **prevalim(double **prlim, int nlstate, double x[], double age, double **
     
     for (k=1; k<=cptcovn;k++) {
       cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]];
-      /*       printf("ij=%d k=%d Tvar[k]=%d nbcode=%d cov=%lf codtab[ij][Tvar[k]]=%d \n",ij,k, Tvar[k],nbcode[Tvar[k]][codtab[ij][Tvar[k]]],cov[2+k], codtab[ij][Tvar[k]]);*/
+      /*printf("prevalim ij=%d k=%d Tvar[%d]=%d nbcode=%d cov=%lf codtab[%d][Tvar[%d]]=%d \n",ij,k, k, Tvar[k],nbcode[Tvar[k]][codtab[ij][Tvar[k]]],cov[2+k], ij, k, codtab[ij][Tvar[k]]);*/
     }
-    for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
-    for (k=1; k<=cptcovprod;k++)
-      cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]] * nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
+    /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
+    /* for (k=1; k<=cptcovprod;k++) /\* Useless *\/ */
+    /*   cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]] * nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]]; */
     
     /*printf("ij=%d cptcovprod=%d tvar=%d ", ij, cptcovprod, Tvar[1]);*/
     /*printf("ij=%d cov[3]=%lf cov[4]=%lf \n",ij, cov[3],cov[4]);*/
     /*printf("ij=%d cov[3]=%lf \n",ij, cov[3]);*/
+    /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
+    /* out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /\* Bug Valgrind *\/ */
     out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /* Bug Valgrind */
     
     savm=oldm;
@@ -1318,6 +1372,7 @@ double **prevalim(double **prlim, int nlstate, double x[], double age, double **
        sumnew=0;
        for(k=1; k<=ndeath; k++) sumnew+=newm[i][nlstate+k];
        prlim[i][j]= newm[i][j]/(1-sumnew);
+        /*printf(" prevalim i=%d, j=%d, prmlim[%d][%d]=%f, agefin=%d \n", i, j, i, j, prlim[i][j],(int)agefin);*/
        max=FMAX(max,prlim[i][j]);
        min=FMIN(min,prlim[i][j]);
       }
@@ -1398,15 +1453,15 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
       }
     }
     
-
-/*        for(ii=1; ii<= nlstate+ndeath; ii++){ */
-/*      for(jj=1; jj<= nlstate+ndeath; jj++){ */
-/*        printf("ddd %lf ",ps[ii][jj]); */
-/*      } */
-/*      printf("\n "); */
-/*        } */
-/*        printf("\n ");printf("%lf ",cov[2]); */
-       /*
+    
+    /* for(ii=1; ii<= nlstate+ndeath; ii++){ */
+    /*   for(jj=1; jj<= nlstate+ndeath; jj++){ */
+    /*         printf(" pmij  ps[%d][%d]=%lf ",ii,jj,ps[ii][jj]); */
+    /*   } */
+    /*   printf("\n "); */
+    /* } */
+    /* printf("\n ");printf("%lf ",cov[2]);*/
+    /*
       for(i=1; i<= npar; i++) printf("%f ",x[i]);
       goto end;*/
     return ps;
@@ -1414,19 +1469,20 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
 
 /**************** Product of 2 matrices ******************/
 
-double **matprod2(double **out, double **in,long nrl, long nrh, long ncl, long nch, long ncolol, long ncoloh, double **b)
+double **matprod2(double **out, double **in,int nrl, int nrh, int ncl, int nch, int ncolol, int ncoloh, double **b)
 {
   /* Computes the matrix product of in(1,nrh-nrl+1)(1,nch-ncl+1) times
      b(1,nch-ncl+1)(1,ncoloh-ncolol+1) into out(...) */
   /* in, b, out are matrice of pointers which should have been initialized 
      before: only the contents of out is modified. The function returns
      a pointer to pointers identical to out */
-  long i, j, k;
+  int i, j, k;
   for(i=nrl; i<= nrh; i++)
-    for(k=ncolol; k<=ncoloh; k++)
-      for(j=ncl,out[i][k]=0.; j<=nch; j++)
-       out[i][k] +=in[i][j]*b[j][k];
-
+    for(k=ncolol; k<=ncoloh; k++){
+      out[i][k]=0.;
+      for(j=ncl; j<=nch; j++)
+       out[i][k] +=in[i][j]*b[j][k];
+    }
   return out;
 }
 
@@ -1468,7 +1524,7 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in
        cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]];
       for (k=1; k<=cptcovage;k++)
        cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
-      for (k=1; k<=cptcovprod;k++)
+      for (k=1; k<=cptcovprod;k++) /* Useless because included in cptcovn */
        cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
 
 
@@ -1519,7 +1575,9 @@ double func( double *x)
         Then computes with function pmij which return a matrix p[i][j] giving the elementary probability
         to be observed in j being in i according to the model.
        */
-      for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i];
+      for (k=1; k<=cptcovn;k++){ /* Simple and product covariates without age* products */
+       cov[2+k]=covar[Tvar[k]][i];
+      }
       /* In model V2+V1*V4+age*V3+V3*V2 Tvar[1] is V2, Tvar[2=V1*V4] 
         is 6, Tvar[3=age*V3] should not be computed because of age Tvar[4=V3*V2] 
         has been calculated etc */
@@ -1787,8 +1845,11 @@ double funcone( double *x)
        for (kk=1; kk<=cptcovage;kk++) {
          cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2];
        }
+       /* 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 */
@@ -2034,13 +2095,13 @@ double hessii(double x[], double delta, int theta, double delti[], double (*func
 
   fx=func(x);
   for (i=1;i<=npar;i++) p2[i]=x[i];
-  for(l=0 ; l <=lmax; l++){
+  for(l=0 ; l <=lmax; l++){  /* Enlarging the zone around the Maximum */
     l1=pow(10,l);
     delts=delt;
     for(k=1 ; k <kmax; k=k+1){
       delt = delta*(l1*k);
       p2[theta]=x[theta] +delt;
-      k1=func(p2)-fx;
+      k1=func(p2)-fx;   /* Might be negative if too close to the theoretical maximum */
       p2[theta]=x[theta]-delt;
       k2=func(p2)-fx;
       /*res= (k1-2.0*fx+k2)/delt/delt; */
@@ -2209,9 +2270,11 @@ void  freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **ag
 
   first=1;
 
-  for(k1=1; k1<=j ; k1++){   /* Loop on covariates */
-    for(i1=1; i1<=ncodemax[k1];i1++){ /* Now it is 2 */
-      j1++;
+  /* for(k1=1; k1<=j ; k1++){   /* Loop on covariates */
+  /*  for(i1=1; i1<=ncodemax[k1];i1++){ /* Now it is 2 */
+  /*    j1++;
+*/
+  for (j1 = 1; j1 <= (int) pow(2,cptcoveff); j1++){
       /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
        scanf("%d", i);*/
       for (i=-5; i<=nlstate+ndeath; i++)  
@@ -2230,10 +2293,11 @@ void  freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **ag
        if  (cptcovn>0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
          for (z1=1; z1<=cptcoveff; z1++)       
             if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtab[j1][z1]]){
+                /* Tests if the value of each of the covariates of i is equal to filter j1 */
               bool=0;
-              printf("bool=%d i=%d, z1=%d, i1=%d, Tvaraff[%d]=%d, covar[Tvarff][%d]=%2f, codtab[%d][%d]=%d, nbcode[Tvaraff][codtab[%d][%d]=%d, j1=%d\n", 
-                bool,i,z1, i1, z1, Tvaraff[z1],i,covar[Tvaraff[z1]][i],j1,z1,codtab[j1][z1],
-                j1,z1,nbcode[Tvaraff[z1]][codtab[j1][z1]],j1);
+              /* printf("bool=%d i=%d, z1=%d, Tvaraff[%d]=%d, covar[Tvarff][%d]=%2f, codtab[%d][%d]=%d, nbcode[Tvaraff][codtab[%d][%d]=%d, j1=%d\n", 
+                bool,i,z1, z1, Tvaraff[z1],i,covar[Tvaraff[z1]][i],j1,z1,codtab[j1][z1],
+                j1,z1,nbcode[Tvaraff[z1]][codtab[j1][z1]],j1);*/
               /* For j1=7 in V1+V2+V3+V4 = 0 1 1 0 and codtab[7][3]=1 and nbcde[3][?]=1*/
             } 
        }
@@ -2257,7 +2321,7 @@ void  freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **ag
              /*}*/
          }
        }
-      }
+      } /* end i */
        
       /*      fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/
       pstamp(ficresp);
@@ -2344,7 +2408,7 @@ void  freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **ag
          printf("Others in log...\n");
        fprintf(ficlog,"\n");
       }
-    }
+      /*}*/
   }
   dateintmean=dateintsum/k2cpt; 
  
@@ -2369,6 +2433,7 @@ void prevalence(double ***probs, double agemin, double agemax, int **s, double *
   double pos,posprop; 
   double  y2; /* in fractional years */
   int iagemin, iagemax;
+  int first; /** to stop verbosity which is redirected to log file */
 
   iagemin= (int) agemin;
   iagemax= (int) agemax;
@@ -2377,12 +2442,13 @@ void prevalence(double ***probs, double agemin, double agemax, int **s, double *
   /*  freq=ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3);*/
   j1=0;
   
-  j=cptcoveff;
+  /*j=cptcoveff;*/
   if (cptcovn<1) {j=1;ncodemax[1]=1;}
   
-  for(k1=1; k1<=j;k1++){
-    for(i1=1; i1<=ncodemax[k1];i1++){
-      j1++;
+  first=1;
+  for(j1=1; j1<= (int) pow(2,cptcoveff);j1++){
+    /*for(i1=1; i1<=ncodemax[k1];i1++){
+      j1++;*/
       
       for (i=1; i<=nlstate; i++)  
        for(m=iagemin; m <= iagemax+3; m++)
@@ -2412,22 +2478,25 @@ void prevalence(double ***probs, double agemin, double agemax, int **s, double *
        }
       }
       for(i=iagemin; i <= iagemax+3; i++){  
-       
        for(jk=1,posprop=0; jk <=nlstate ; jk++) { 
          posprop += prop[jk][i]; 
        } 
-
+       
        for(jk=1; jk <=nlstate ; jk++){     
          if( i <=  iagemax){ 
            if(posprop>=1.e-5){ 
              probs[i][jk][j1]= prop[jk][i]/posprop;
-           } else
-             printf("Warning Observed prevalence probs[%d][%d][%d]=%lf because of lack of cases\n",jk,i,j1,probs[i][jk][j1]);
+           } else{
+             if(first==1){
+               first=0;
+               printf("Warning Observed prevalence probs[%d][%d][%d]=%lf because of lack of cases\nSee others on log file...\n",jk,i,j1,probs[i][jk][j1]);
+             }
+           }
          } 
        }/* end jk */ 
       }/* end i */ 
-    /* end i1 */
-  } /* end k1 */
+    /*} *//* end i1 */
+  } /* end j1 */
   
   /*  free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3);*/
   /*free_vector(pp,1,nlstate);*/
@@ -2577,46 +2646,80 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
  }
 
 /*********** Tricode ****************************/
-void tricode(int *Tvar, int **nbcode, int imx)
+void tricode(int *Tvar, int **nbcode, int imx, int *Ndum)
 {
   /**< Uses cptcovn+2*cptcovprod as the number of covariates */
   /*     Tvar[i]=atoi(stre);  find 'n' in Vn and stores in Tvar. If model=V2+V1 Tvar[1]=2 and Tvar[2]=1 
   /* Boring subroutine which should only output nbcode[Tvar[j]][k]
-  /* nbcode[Tvar[j][1]= 
+   * Tvar[5] in V2+V1+V3*age+V2*V4 is 2 (V2)
+  /* nbcode[Tvar[j]][1]= 
   */
 
-  int Ndum[20],ij=1, k=0, j=0, i=0, maxncov=NCOVMAX;
+  int ij=1, k=0, j=0, i=0, maxncov=NCOVMAX;
   int modmaxcovj=0; /* Modality max of covariates j */
+  int cptcode=0; /* Modality max of covariates j */
+  int modmincovj=0; /* Modality min of covariates j */
+
+
   cptcoveff=0; 
  
-  for (k=0; k < maxncov; k++) Ndum[k]=0;
+  for (k=-1; k < maxncov; k++) Ndum[k]=0;
   for (k=1; k <= maxncov; k++) ncodemax[k]=0; /* Horrible constant again replaced by NCOVMAX */
 
-  for (j=1; j<=(cptcovn+2*cptcovprod); j++) { /* For each covariate j */
-    for (i=1; i<=imx; i++) { /*reads the data file to get the maximum value of the 
+  /* Loop on covariates without age and products */
+  for (j=1; j<=(cptcovs); j++) { /* model V1 + V2*age+ V3 + V3*V4 : V1 + V3 = 2 only */
+    for (i=1; i<=imx; i++) { /* Lopp on individuals: reads the data file to get the maximum value of the 
                               modality of this covariate Vj*/ 
-      ij=(int)(covar[Tvar[j]][i]); /* ij=0 or 1 or -1. Finds for covariate j, n=Tvar[j] of Vn . ij is the
+      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);*/
-      if (ij > modmaxcovj) modmaxcovj=ij; 
       /* 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 is 1, then modmaxcovj=1.*/
     }
+    printf(" 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<=modmaxcovj; i++) { /* i=-1 ? 0 and 1*//* For each modality of model-cov j */
-      if( Ndum[i] != 0 )
-       ncodemax[j]++; 
-      /* Number of modalities of the j th covariate. In fact
-        ncodemax[j]=2 (dichotom. variables only) but it could be more for
-        historical reasons */
+   /*for (i=0; i<=cptcode; i++) {*/
+    for (i=modmincovj;  i<=modmaxcovj; i++) { /* i=-1 ? 0 and 1*//* For each value of the modality of model-cov j */
+      printf("Frequencies of covariates %d V%d %d\n", j, Tvar[j], Ndum[i]);
+      if( Ndum[i] != 0 ){ /* Counts if nobody answered, empty modality */
+       ncodemax[j]++;  /* ncodemax[j]= Number of non-null modalities of the j th covariate. */
+      }
+      /* 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 */
     } /* Ndum[-1] number of undefined modalities */
 
     /* j is a covariate, n=Tvar[j] of Vn; Fills nbcode */
-    ij=1; 
-    for (i=1; i<=ncodemax[j]; i++) { /* i= 1 to 2 for dichotomous */
-      for (k=0; k<= modmaxcovj; k++) { /* k=-1 ? NCOVMAX*//* maxncov or modmaxcovj */
+    /* For covariate j, modalities could be 1, 2, 3, 4. If Ndum[2]=0 ncodemax[j] is not 4 but 3 */
+    /* If Ndum[3}= 635; Ndum[4]=0; Ndum[5]=0; Ndum[6]=27; Ndum[7]=125;
+       modmincovj=3; modmaxcovj = 7;
+       There are only 3 modalities non empty (or 2 if 27 is too few) : ncodemax[j]=3;
+       which will be coded 0, 1, 2 which in binary on 3-1 digits are 0=00 1=01, 2=10; defining two dummy 
+       variables V1_1 and V1_2.
+       nbcode[Tvar[j]][ij]=k;
+       nbcode[Tvar[j]][1]=0;
+       nbcode[Tvar[j]][2]=1;
+       nbcode[Tvar[j]][3]=2;
+    */
+    ij=1; /* ij is similar to i but can jumps over null modalities */
+    for (i=modmincovj; i<=modmaxcovj; i++) { /* i= 1 to 2 for dichotomous, or from 1 to 3 */
+      for (k=0; k<= cptcode; k++) { /* k=-1 ? k=0 to 1 *//* Could be 1 to 4 */
+       /*recode from 0 */
        if (Ndum[k] != 0) { /* If at least one individual responded to this modality k */
          nbcode[Tvar[j]][ij]=k;  /* stores the modality in an array nbcode. 
                                     k is a modality. If we have model=V1+V1*sex 
@@ -2628,25 +2731,30 @@ void tricode(int *Tvar, int **nbcode, int imx)
     } /* end of loop on modality */ 
   } /* end of loop on model-covariate j. nbcode[Tvarj][1]=0 and nbcode[Tvarj][2]=1 sets the value of covariate j*/  
   
-  for (k=0; k< maxncov; k++) Ndum[k]=0;
+ for (k=-1; k< maxncov; k++) Ndum[k]=0; 
   
-  for (i=1; i<=ncovmodel-2; i++) { /* -2, cste and 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]++;
- }
+  for (i=1; i<=ncovmodel-2; i++) { /* -2, cste and 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]++; 
+ } 
 
  ij=1;
- for (i=1; i<= maxncov; i++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
+ 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)){
-     Tvaraff[ij]=i; /*For printing */
+     /*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
+     Tvaraff[ij]=i; /*For printing (unclear) */
      ij++;
-   }
+   }else
+       Tvaraff[ij]=0;
  }
  ij--;
  cptcoveff=ij; /*Number of total covariates*/
+
 }
 
+
 /*********** Health Expectancies ****************/
 
 void evsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,char strstart[] )
@@ -3242,15 +3350,15 @@ void varevsij(char optionfilefiname[], double ***vareij, double **matcov, double
   free_vector(gmp,nlstate+1,nlstate+ndeath);
   free_matrix(gradgp,1,npar,nlstate+1,nlstate+ndeath);
   free_matrix(trgradgp,nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
-  fprintf(ficgp,"\nunset parametric;unset label; set ter png small;set size 0.65, 0.65");
+  fprintf(ficgp,"\nunset parametric;unset label; set ter png small size 320, 240");
   /* for(j=nlstate+1; j<= nlstate+ndeath; j++){ *//* Only the first actually */
   fprintf(ficgp,"\n set log y; unset log x;set xlabel \"Age\"; set ylabel \"Force of mortality (year-1)\";");
 /*   fprintf(ficgp,"\n plot \"%s\"  u 1:($3*%6.3f) not w l 1 ",fileresprobmorprev,YEARM/estepm); */
 /*   fprintf(ficgp,"\n replot \"%s\"  u 1:(($3+1.96*$4)*%6.3f) t \"95\%% interval\" w l 2 ",fileresprobmorprev,YEARM/estepm); */
 /*   fprintf(ficgp,"\n replot \"%s\"  u 1:(($3-1.96*$4)*%6.3f) not w l 2 ",fileresprobmorprev,YEARM/estepm); */
-  fprintf(ficgp,"\n plot \"%s\"  u 1:($3) not w l lt 2 ",subdirf(fileresprobmorprev));
-  fprintf(ficgp,"\n replot \"%s\"  u 1:(($3+1.96*$4)) t \"95\%% interval\" w l lt 3 ",subdirf(fileresprobmorprev));
-  fprintf(ficgp,"\n replot \"%s\"  u 1:(($3-1.96*$4)) not w l lt 3 ",subdirf(fileresprobmorprev));
+  fprintf(ficgp,"\n plot \"%s\"  u 1:($3) not w l lt 1 ",subdirf(fileresprobmorprev));
+  fprintf(ficgp,"\n replot \"%s\"  u 1:(($3+1.96*$4)) t \"95\%% interval\" w l lt 2 ",subdirf(fileresprobmorprev));
+  fprintf(ficgp,"\n replot \"%s\"  u 1:(($3-1.96*$4)) not w l lt 2 ",subdirf(fileresprobmorprev));
   fprintf(fichtm,"\n<br> File (multiple files are possible if covariates are present): <A href=\"%s\">%s</a>\n",subdirf(fileresprobmorprev),subdirf(fileresprobmorprev));
   fprintf(fichtm,"\n<br> Probability is computed over estepm=%d months. <br> <img src=\"%s%s.png\"> <br>\n", estepm,subdirf3(optionfilefiname,"varmuptjgr",digitp),digit);
   /*  fprintf(fichtm,"\n<br> Probability is computed over estepm=%d months and then divided by estepm and multiplied by %.0f in order to have the probability to die over a year <br> <img src=\"varmuptjgr%s%s.png\"> <br>\n", stepm,YEARM,digitp,digit);
@@ -3360,20 +3468,19 @@ void varprob(char optionfilefiname[], double **matcov, double x[], double delti[
   int i, j=0,  i1, k1, l1, t, tj;
   int k2, l2, j1,  z1;
   int k=0,l, cptcode;
-  int first=1, first1;
+  int first=1, first1, first2;
   double cv12, mu1, mu2, lc1, lc2, v12, v21, v11, v22,v1,v2, c12, tnalp;
   double **dnewm,**doldm;
   double *xp;
   double *gp, *gm;
   double **gradg, **trgradg;
   double **mu;
-  double age,agelim, cov[NCOVMAX];
+  double age,agelim, cov[NCOVMAX+1];
   double std=2.0; /* Number of standard deviation wide of confidence ellipsoids */
   int theta;
   char fileresprob[FILENAMELENGTH];
   char fileresprobcov[FILENAMELENGTH];
   char fileresprobcor[FILENAMELENGTH];
-
   double ***varpij;
 
   strcpy(fileresprob,"prob"); 
@@ -3446,12 +3553,13 @@ standard deviations wide on each axis. <br>\
 To be simple, these graphs help to understand the significativity of each parameter in relation to a second other one.<br> \n");
 
   cov[1]=1;
-  tj=cptcoveff;
+  /* tj=cptcoveff; */
+  tj = (int) pow(2,cptcoveff);
   if (cptcovn<1) {tj=1;ncodemax[1]=1;}
   j1=0;
-  for(t=1; t<=tj;t++){
-    for(i1=1; i1<=ncodemax[t];i1++){ 
-      j1++;
+  for(j1=1; j1<=tj;j1++){
+    /*for(i1=1; i1<=ncodemax[t];i1++){ */
+    /*j1++;*/
       if  (cptcovn>0) {
        fprintf(ficresprob, "\n#********** Variable "); 
        for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
@@ -3474,19 +3582,24 @@ To be simple, these graphs help to understand the significativity of each parame
        fprintf(ficresprobcor, "**********\n#");    
       }
       
+      gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
+      trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
+      gp=vector(1,(nlstate)*(nlstate+ndeath));
+      gm=vector(1,(nlstate)*(nlstate+ndeath));
       for (age=bage; age<=fage; age ++){ 
        cov[2]=age;
        for (k=1; k<=cptcovn;k++) {
-         cov[2+k]=nbcode[Tvar[k]][codtab[j1][Tvar[k]]];
+         cov[2+k]=nbcode[Tvar[k]][codtab[j1][Tvar[k]]];/* j1 1 2 3 4
+                                                        * 1  1 1 1 1
+                                                        * 2  2 1 1 1
+                                                        * 3  1 2 1 1
+                                                        */
+         /* nbcode[1][1]=0 nbcode[1][2]=1;*/
        }
        for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
        for (k=1; k<=cptcovprod;k++)
          cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
        
-       gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
-       trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
-       gp=vector(1,(nlstate)*(nlstate+ndeath));
-       gm=vector(1,(nlstate)*(nlstate+ndeath));
     
        for(theta=1; theta <=npar; theta++){
          for(i=1; i<=npar; i++)
@@ -3524,10 +3637,6 @@ To be simple, these graphs help to understand the significativity of each parame
        
        matprod2(dnewm,trgradg,1,(nlstate)*(nlstate+ndeath),1,npar,1,npar,matcov); 
        matprod2(doldm,dnewm,1,(nlstate)*(nlstate+ndeath),1,npar,1,(nlstate)*(nlstate+ndeath),gradg);
-       free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
-       free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
-       free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
-       free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
 
        pmij(pmmij,cov,ncovmodel,x,nlstate);
        
@@ -3561,17 +3670,22 @@ To be simple, these graphs help to understand the significativity of each parame
        i=0;
        for (k=1; k<=(nlstate);k++){
          for (l=1; l<=(nlstate+ndeath);l++){ 
-           i=i++;
+           i++;
            fprintf(ficresprobcov,"\n%d %d-%d",(int)age,k,l);
            fprintf(ficresprobcor,"\n%d %d-%d",(int)age,k,l);
            for (j=1; j<=i;j++){
+             /* printf(" k=%d l=%d i=%d j=%d\n",k,l,i,j);fflush(stdout); */
              fprintf(ficresprobcov," %11.3e",varpij[i][j][(int)age]);
              fprintf(ficresprobcor," %11.3e",varpij[i][j][(int) age]/sqrt(varpij[i][i][(int) age])/sqrt(varpij[j][j][(int)age]));
            }
          }
        }/* end of loop for state */
       } /* end of loop for age */
-
+      free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
+      free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
+      free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+      free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+      
       /* Confidence intervalle of pij  */
       /*
        fprintf(ficgp,"\nunset parametric;unset label");
@@ -3584,7 +3698,7 @@ To be simple, these graphs help to understand the significativity of each parame
       */
 
       /* Drawing ellipsoids of confidence of two variables p(k1-l1,k2-l2)*/
-      first1=1;
+      first1=1;first2=2;
       for (k2=1; k2<=(nlstate);k2++){
        for (l2=1; l2<=(nlstate+ndeath);l2++){ 
          if(l2==k2) continue;
@@ -3606,10 +3720,13 @@ To be simple, these graphs help to understand the significativity of each parame
                  lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
                  lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
                  if ((lc2 <0) || (lc1 <0) ){
-                   printf("Error: One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Continuing by making them positive: WRONG RESULTS.\n", lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);
-                   fprintf(ficlog,"Error: One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e\n", lc1, lc2, v1, v2, cv12);fflush(ficlog);
-                   lc1=fabs(lc1);
-                   lc2=fabs(lc2);
+                   if(first2==1){
+                     first1=0;
+                   printf("Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS. See log file for details...\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);
+                   }
+                   fprintf(ficlog,"Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS.\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);fflush(ficlog);
+                   /* lc1=fabs(lc1); */ /* If we want to have them positive */
+                   /* lc2=fabs(lc2); */
                  }
 
                  /* Eigen vectors */
@@ -3631,7 +3748,7 @@ To be simple, these graphs help to understand the significativity of each parame
                    first=0;
                    fprintf(ficgp,"\nset parametric;unset label");
                    fprintf(ficgp,"\nset log y;set log x; set xlabel \"p%1d%1d (year-1)\";set ylabel \"p%1d%1d (year-1)\"",k1,l1,k2,l2);
-                   fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65");
+                   fprintf(ficgp,"\nset ter png small size 320, 240");
                    fprintf(fichtmcov,"\n<br>Ellipsoids of confidence cov(p%1d%1d,p%1d%1d) expressed in year<sup>-1</sup>\
  :<a href=\"%s%d%1d%1d-%1d%1d.png\">\
 %s%d%1d%1d-%1d%1d.png</A>, ",k1,l1,k2,l2,\
@@ -3662,7 +3779,7 @@ To be simple, these graphs help to understand the significativity of each parame
          } /* k12 */
        } /*l1 */
       }/* k1 */
-    } /* loop covariates */
+      /* } /* loop covariates */
   }
   free_ma3x(varpij,1,nlstate,1,nlstate+ndeath,(int) bage, (int)fage);
   free_matrix(mu,1,(nlstate+ndeath)*(nlstate+ndeath),(int) bage, (int)fage);
@@ -3708,7 +3825,7 @@ void printinghtml(char fileres[], char title[], char datafile[], int firstpass,
 
 fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
 
- m=cptcoveff;
+ m=pow(2,cptcoveff);
  if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
  jj1=0;
@@ -3722,16 +3839,16 @@ fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
        fprintf(fichtm," ************\n<hr size=\"2\" color=\"#EC5E5E\">");
      }
      /* Pij */
-     fprintf(fichtm,"<br>- Pij or Conditional probabilities to be observed in state j being in state i, %d (stepm) months before: <a href=\"%s%d1.png\">%s%d1.png</a><br> \
-<img src=\"%s%d1.png\">",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1);     
+     fprintf(fichtm,"<br>- Pij or Conditional probabilities to be observed in state j being in state i, %d (stepm) months before: <a href=\"%s%d_1.png\">%s%d_1.png</a><br> \
+<img src=\"%s%d_1.png\">",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1);     
      /* Quasi-incidences */
      fprintf(fichtm,"<br>- Pij or Conditional probabilities to be observed in state j being in state i %d (stepm) months\
- before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too: <a href=\"%s%d2.png\">%s%d2.png</a><br> \
-<img src=\"%s%d2.png\">",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1); 
+ before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too: <a href=\"%s%d_2.png\">%s%d_2.png</a><br> \
+<img src=\"%s%d_2.png\">",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1); 
        /* Period (stable) prevalence in each health state */
        for(cpt=1; cpt<nlstate;cpt++){
-        fprintf(fichtm,"<br>- Period (stable) prevalence in each health state : <a href=\"%s%d%d.png\">%s%d%d.png</a><br> \
-<img src=\"%s%d%d.png\">",subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1);
+        fprintf(fichtm,"<br>- Period (stable) prevalence in each health state : <a href=\"%s%d_%d.png\">%s%d_%d.png</a><br> \
+<img src=\"%s%d_%d.png\">",subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1);
        }
      for(cpt=1; cpt<=nlstate;cpt++) {
         fprintf(fichtm,"\n<br>- Life expectancy by health state (%d) at initial age and its decomposition into health expectancies : <a href=\"%s%d%d.png\">%s%d%d.png</a> <br> \
@@ -3782,7 +3899,7 @@ fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
  fflush(fichtm);
  fprintf(fichtm," <ul><li><b>Graphs</b></li><p>");
 
- m=cptcoveff;
+ m=pow(2,cptcoveff);
  if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
  jj1=0;
@@ -3797,8 +3914,8 @@ fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
      }
      for(cpt=1; cpt<=nlstate;cpt++) {
        fprintf(fichtm,"<br>- Observed (cross-sectional) and period (incidence based) \
-prevalence (with 95%% confidence interval) in state (%d): %s%d%d.png <br>\
-<img src=\"%s%d%d.png\">",cpt,subdirf2(optionfilefiname,"v"),cpt,jj1,subdirf2(optionfilefiname,"v"),cpt,jj1);  
+prevalence (with 95%% confidence interval) in state (%d): %s%d_%d.png <br>\
+<img src=\"%s%d_%d.png\">",cpt,subdirf2(optionfilefiname,"v"),cpt,jj1,subdirf2(optionfilefiname,"v"),cpt,jj1);  
      }
      fprintf(fichtm,"\n<br>- Total life expectancy by age and \
 health expectancies in states (1) and (2). If popbased=1 the smooth (due to the model) \
@@ -3832,37 +3949,36 @@ void printinggnuplot(char fileres[], char optionfilefiname[], double ageminpar,
   strcpy(optfileres,"vpl");
  /* 1eme*/
   for (cpt=1; cpt<= nlstate ; cpt ++) {
-   for (k1=1; k1<= m ; k1 ++) {
-     fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"v"),cpt,k1);
-     fprintf(ficgp,"\n#set out \"v%s%d%d.png\" \n",optionfilefiname,cpt,k1);
+    for (k1=1; k1<= m ; k1 ++) { /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */
+     fprintf(ficgp,"\nset out \"%s%d_%d.png\" \n",subdirf2(optionfilefiname,"v"),cpt,k1);
+     fprintf(ficgp,"\n#set out \"v%s%d_%d.png\" \n",optionfilefiname,cpt,k1);
      fprintf(ficgp,"set xlabel \"Age\" \n\
 set ylabel \"Probability\" \n\
-set ter png small\n\
-set size 0.65,0.65\n\
+set ter png small size 320, 240\n\
 plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"\%%lf",ageminpar,fage,subdirf2(fileres,"vpl"),k1-1,k1-1);
 
      for (i=1; i<= nlstate ; i ++) {
        if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)");
        else        fprintf(ficgp," \%%*lf (\%%*lf)");
      }
-     fprintf(ficgp,"\" t\"Period (stable) prevalence\" w l lt 1,\"%s\" every :::%d::%d u 1:($2+1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1);
+     fprintf(ficgp,"\" t\"Period (stable) prevalence\" w l lt 0,\"%s\" every :::%d::%d u 1:($2+1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1);
      for (i=1; i<= nlstate ; i ++) {
        if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)");
        else fprintf(ficgp," \%%*lf (\%%*lf)");
      } 
-     fprintf(ficgp,"\" t\"95\%% CI\" w l lt 2,\"%s\" every :::%d::%d u 1:($2-1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1); 
+     fprintf(ficgp,"\" t\"95\%% CI\" w l lt 1,\"%s\" every :::%d::%d u 1:($2-1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1); 
      for (i=1; i<= nlstate ; i ++) {
        if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)");
        else fprintf(ficgp," \%%*lf (\%%*lf)");
      }  
-     fprintf(ficgp,"\" t\"\" w l lt 2,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l lt 3",subdirf2(fileres,"p"),k1-1,k1-1,2+4*(cpt-1));
+     fprintf(ficgp,"\" t\"\" w l lt 1,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l lt 2",subdirf2(fileres,"p"),k1-1,k1-1,2+4*(cpt-1));
    }
   }
   /*2 eme*/
   
   for (k1=1; k1<= m ; k1 ++) { 
     fprintf(ficgp,"\nset out \"%s%d.png\" \n",subdirf2(optionfilefiname,"e"),k1);
-    fprintf(ficgp,"set ylabel \"Years\" \nset ter png small\nset size 0.65,0.65\nplot [%.f:%.f] ",ageminpar,fage);
+    fprintf(ficgp,"set ylabel \"Years\" \nset ter png small size 320, 240\nplot [%.f:%.f] ",ageminpar,fage);
     
     for (i=1; i<= nlstate+1 ; i ++) {
       k=2*i;
@@ -3878,14 +3994,14 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"\%%lf",ageminpar,fage,subdirf2(fil
        if (j==i) fprintf(ficgp," \%%lf (\%%lf)");
        else fprintf(ficgp," \%%*lf (\%%*lf)");
       }   
-      fprintf(ficgp,"\" t\"\" w l lt 1,");
+      fprintf(ficgp,"\" t\"\" w l lt 0,");
       fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2+$3*2) \"\%%lf",subdirf2(fileres,"t"),k1-1,k1-1);
       for (j=1; j<= nlstate+1 ; j ++) {
        if (j==i) fprintf(ficgp," \%%lf (\%%lf)");
        else fprintf(ficgp," \%%*lf (\%%*lf)");
       }   
-      if (i== (nlstate+1)) fprintf(ficgp,"\" t\"\" w l lt 1");
-      else fprintf(ficgp,"\" t\"\" w l lt 1,");
+      if (i== (nlstate+1)) fprintf(ficgp,"\" t\"\" w l lt 0");
+      else fprintf(ficgp,"\" t\"\" w l lt 0,");
     }
   }
   
@@ -3896,8 +4012,7 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"\%%lf",ageminpar,fage,subdirf2(fil
       /*       k=2+nlstate*(2*cpt-2); */
       k=2+(nlstate+1)*(cpt-1);
       fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"exp"),cpt,k1);
-      fprintf(ficgp,"set ter png small\n\
-set size 0.65,0.65\n\
+      fprintf(ficgp,"set ter png small size 320, 240\n\
 plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subdirf2(fileres,"e"),k1-1,k1-1,k,cpt);
       /*fprintf(ficgp,",\"e%s\" every :::%d::%d u 1:($%d-2*$%d) \"\%%lf ",fileres,k1-1,k1-1,k,k+1);
        for (i=1; i<= nlstate*2 ; i ++) fprintf(ficgp,"\%%lf (\%%lf) ");
@@ -3920,9 +4035,9 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subd
   for (k1=1; k1<= m ; k1 ++) { 
     for (cpt=1; cpt<=nlstate ; cpt ++) {
       k=3;
-      fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"p"),cpt,k1);
+      fprintf(ficgp,"\nset out \"%s%d_%d.png\" \n",subdirf2(optionfilefiname,"p"),cpt,k1);
       fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\
-set ter png small\nset size 0.65,0.65\n\
+set ter png small size 320, 240\n\
 unset log y\n\
 plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdirf2(fileres,"pij"),k1,k+cpt+1,k+1);
       
@@ -3952,15 +4067,15 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdi
       }
     }
    }
-
+  /*goto avoid;*/
    for(ng=1; ng<=2;ng++){ /* Number of graphics: first is probabilities second is incidence per year*/
      for(jk=1; jk <=m; jk++) {
-       fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"pe"),jk,ng); 
+       fprintf(ficgp,"\nset out \"%s%d_%d.png\" \n",subdirf2(optionfilefiname,"pe"),jk,ng); 
        if (ng==2)
         fprintf(ficgp,"\nset ylabel \"Quasi-incidence per year\"\n");
        else
         fprintf(ficgp,"\nset title \"Probability\"\n");
-       fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65\nset log y\nplot  [%.f:%.f] ",ageminpar,agemaxpar);
+       fprintf(ficgp,"\nset ter png small size 320, 240\nset log y\nplot  [%.f:%.f] ",ageminpar,agemaxpar);
        i=1;
        for(k2=1; k2<=nlstate; k2++) {
         k3=i;
@@ -3972,11 +4087,11 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdi
               fprintf(ficgp," exp(p%d+p%d*x",i,i+1);
             ij=1;/* To be checked else nbcode[0][0] wrong */
             for(j=3; j <=ncovmodel; j++) {
-              if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) { /* Bug valgrind */
-                fprintf(ficgp,"+p%d*%d*x",i+j-1,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);
-                ij++;
-              }
-              else
+              /* if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) { /\* Bug valgrind *\/ */
+              /*        /\*fprintf(ficgp,"+p%d*%d*x",i+j-1,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);*\/ */
+              /*        ij++; */
+              /* } */
+              /* else */
                 fprintf(ficgp,"+p%d*%d",i+j-1,nbcode[Tvar[j-2]][codtab[jk][j-2]]);
             }
             fprintf(ficgp,")/(1");
@@ -3985,11 +4100,11 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdi
               fprintf(ficgp,"+exp(p%d+p%d*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1);
               ij=1;
               for(j=3; j <=ncovmodel; j++){
-                if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) {
-                  fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);
-                  ij++;
-                }
-                else
+                /* if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) { */
+                /*   fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]); */
+                /*   ij++; */
+                /* } */
+                /* else */
                   fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][j-2]]);
               }
               fprintf(ficgp,")");
@@ -4002,6 +4117,7 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdi
        } /* end k2 */
      } /* end jk */
    } /* end ng */
+ avoid:
    fflush(ficgp); 
 }  /* end gnuplot */
 
@@ -4585,8 +4701,8 @@ void printinggnuplotmort(char fileres[], char optionfilefiname[], double ageminp
   strcpy(optfileres,"vpl");
   fprintf(ficgp,"set out \"graphmort.png\"\n "); 
   fprintf(ficgp,"set xlabel \"Age\"\n set ylabel \"Force of mortality (per year)\" \n "); 
-  fprintf(ficgp, "set ter png small\n set log y\n"); 
-  fprintf(ficgp, "set size 0.65,0.65\n");
+  fprintf(ficgp, "set ter png small size 320, 240\n set log y\n"); 
+  /* fprintf(ficgp, "set size 0.65,0.65\n"); */
   fprintf(ficgp,"plot [%d:100] %lf*exp(%lf*(x-%d))",agegomp,p[1],p[2],agegomp);
 
 } 
@@ -4653,7 +4769,7 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
       cutv(stra, strb,line,' ');
       if(iout=sscanf(strb,"%d/%d",&month, &year) != 0){
       }
-      else  if(iout=sscanf(strb,"%s.") != 0){
+      else  if(iout=sscanf(strb,"%s.",dummy) != 0){
        month=99;
        year=9999;
       }else{
@@ -4684,7 +4800,7 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     cutv(stra, strb,line,' '); 
     if(iout=sscanf(strb,"%d/%d",&month, &year) != 0){
     }
-    else  if(iout=sscanf(strb,"%s.") != 0){
+    else  if(iout=sscanf(strb,"%s.", dummy) != 0){
       month=99;
       year=9999;
     }else{
@@ -4776,23 +4892,45 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
 
 
 
+}
+void removespace(char *str) {
+  char *p1 = str, *p2 = str;
+  do
+    while (*p2 == ' ')
+      p2++;
+  while (*p1++ = *p2++);
 }
 
-int decodemodel ( char model[], int lastobs)
+int decodemodel ( char model[], int lastobs) /**< This routine decode the model and returns:
+   * Model  V1+V2+V3+V8+V7*V8+V5*V6+V8*age+V3*age
+   * - cptcovt total number of covariates of the model nbocc(+)+1 = 8
+   * - cptcovn or number of covariates k of the models excluding age*products =6
+   * - cptcovage number of covariates with age*products =2
+   * - cptcovs number of simple covariates
+   * - Tvar[k] is the id of the kth covariate Tvar[1]@12 {1, 2, 3, 8, 10, 11, 8, 3, 7, 8, 5, 6}, thus Tvar[5=V7*V8]=10
+   *     which is a new column after the 9 (ncovcol) variables. 
+   * - if k is a product Vn*Vm covar[k][i] is filled with correct values for each individual
+   * - Tprod[l] gives the kth covariates of the product Vn*Vm l=1 to cptcovprod-cptcovage
+   *    Tprod[1]@2 {5, 6}: position of first product V7*V8 is 5, and second V5*V6 is 6.
+   * - Tvard[k]  p Tvard[1][1]@4 {7, 8, 5, 6} for V7*V8 and V5*V6 .
+ */
 {
-  int i, j, k;
+  int i, j, k, ks;
   int i1, j1, k1, k2;
   char modelsav[80];
-   char stra[80], strb[80], strc[80], strd[80],stre[80];
+  char stra[80], strb[80], strc[80], strd[80],stre[80];
 
+  /*removespace(model);*/
   if (strlen(model) >1){ /* If there is at least 1 covariate */
-    j=0, j1=0, k1=1, k2=1;
-    j=nbocc(model,'+'); /* j=Number of '+' */
-    j1=nbocc(model,'*'); /* j1=Number of '*' */
-    cptcovn=j+1; /* Number of covariates V1+V2*age+V3 =>(2 plus signs) + 1=3 
-                 but the covariates which are product must be computed and stored. */
-    cptcovprod=j1; /*Number of products  V1*V2 +v3*age = 2 */
-    
+    j=0, j1=0, k1=0, k2=-1, ks=0, cptcovn=0;
+    j=nbocc(model,'+'); /**< j=Number of '+' */
+    j1=nbocc(model,'*'); /**< j1=Number of '*' */
+    cptcovs=j+1-j1; /**<  Number of simple covariates V1+V2*age+V3 +V3*V4=> V1 + V3 =2  */
+    cptcovt= j+1; /* Number of total covariates in the model V1 + V2*age+ V3 + V3*V4=> 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  */
     strcpy(modelsav,model); 
     if (strstr(model,"AGE") !=0){
       printf("Error. AGE must be in lower case 'age' model=%s ",model);
@@ -4805,6 +4943,40 @@ int decodemodel ( char model[], int lastobs)
       return 1;
     }
     
+    /*   Design
+     *  V1   V2   V3   V4  V5  V6  V7  V8  V9 Weight
+     *  <          ncovcol=8                >
+     * Model V2 + V1 + V3*age + V3 + V5*V6 + V7*V8 + V8*age + V8
+     *   k=  1    2      3       4     5       6      7        8
+     *  cptcovn number of covariates (not including constant and age ) = # of + plus 1 = 7+1=8
+     *  covar[k,i], value of kth covariate if not including age for individual i:
+     *       covar[1][i]= (V2), covar[4][i]=(V3), covar[8][i]=(V8)
+     *  Tvar[k] # of the kth covariate:  Tvar[1]=2  Tvar[4]=3 Tvar[8]=8
+     *       if multiplied by age: V3*age Tvar[3=V3*age]=3 (V3) Tvar[7]=8 and 
+     *  Tage[++cptcovage]=k
+     *       if products, new covar are created after ncovcol with k1
+     *  Tvar[k]=ncovcol+k1; # of the kth covariate product:  Tvar[5]=ncovcol+1=10  Tvar[6]=ncovcol+1=11
+     *  Tprod[k1]=k; Tprod[1]=5 Tprod[2]= 6; gives the position of the k1th product
+     *  Tvard[k1][1]=m Tvard[k1][2]=m; Tvard[1][1]=5 (V5) Tvard[1][2]=6 Tvard[2][1]=7 (V7) Tvard[2][2]=8
+     *  Tvar[cptcovn+k2]=Tvard[k1][1];Tvar[cptcovn+k2+1]=Tvard[k1][2];
+     *  Tvar[8+1]=5;Tvar[8+2]=6;Tvar[8+3]=7;Tvar[8+4]=8 inverted
+     *  V1   V2   V3   V4  V5  V6  V7  V8  V9  V10  V11
+     *  <          ncovcol=8                >
+     *       Model V2 + V1 + V3*age + V3 + V5*V6 + V7*V8 + V8*age + V8    d1   d1   d2  d2
+     *          k=  1    2      3       4     5       6      7        8    9   10   11  12
+     *     Tvar[k]= 2    1      3       3    10      11      8        8    5    6    7   8
+     * p Tvar[1]@12={2,   1,     3,      3,   11,     10,     8,       8,   7,   8,   5,  6}
+     * p Tprod[1]@2={                         6, 5}
+     *p Tvard[1][1]@4= {7, 8, 5, 6}
+     * covar[k][i]= V2   V1      ?      V3    V5*V6?   V7*V8?  ?       V8   
+     *  cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2];
+     *How to reorganize?
+     * Model V1 + V2 + V3 + V8 + V5*V6 + V7*V8 + V3*age + V8*age
+     * Tvars {2,   1,     3,      3,   11,     10,     8,       8,   7,   8,   5,  6}
+     *       {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  */
@@ -4817,56 +4989,64 @@ int decodemodel ( char model[], int lastobs)
     /*         cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]]; */
     /*         } */
     /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
-    for(k=cptcovn; k>=1;k--){
-      cutv(stra,strb,modelsav,'+'); /* keeps in strb after the first '+' 
-                                    modelsav==V2+V1+V4+V3*age strb=V3*age stra=V2+V1+V4 
-                                   */ 
+    /*
+     * 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 */
+        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 */
-       cutv(strd,strc,strb,'*'); /* strd*strc  Vm*Vn: strb=V3*age strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */
-       if (strcmp(strc,"age")==0) { /* Vn*age */
+      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--;
-         cutv(strb,stre,strd,'V'); /* stre="V3" */
-         Tvar[k]=atoi(stre);  /* V2+V1+V4+V3*age Tvar[4]=2 ; V1+V2*age Tvar[2]=2 */
+         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 */
          cptcovage++; /* Sums the number of covariates which include age as a product */
          Tage[cptcovage]=k;  /* Tage[1] = 4 */
          /*printf("stre=%s ", stre);*/
        } else if (strcmp(strd,"age")==0) { /* or age*Vn */
          cptcovprod--;
-         cutv(strb,stre,strc,'V');
+         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 */
-         cutv(strb,stre,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
+         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 */
-         cutv(strb,strc,strd,'V'); /* strd was Vm, strc is m */
+         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*/
-         Tvar[cptcovn+k2]=Tvard[k1][1]; /* Tvar[(cptcovn=4+k2=1)=5]= 1 (V1) */
-         Tvar[cptcovn+k2+1]=Tvard[k1][2];  /* Tvar[(cptcovn=4+(k2=1)+1)=6]= 4 (V4) */
+         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 */
+              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];
          }
-         k1++;
-         k2=k2+2;
        } /* 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);*/
-       cutv(strd,strc,strb,'V');
-       Tvar[k]=atoi(strc);
+       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 */ 
       /*printf("a=%s b=%s sav=%s\n", stra,strb,modelsav);
@@ -5056,7 +5236,7 @@ int main(int argc, char *argv[])
   double kk1, kk2;
   double dateprev1, dateprev2,jproj1=1,mproj1=1,anproj1=2000,jproj2=1,mproj2=1,anproj2=2000;
   double **ximort;
-  char *alph[]={"a","a","b","c","d","e"}, str[4];
+  char *alph[]={"a","a","b","c","d","e"}, str[4]="1234";
   int *dcwave;
 
   char z[1]="c", occ;
@@ -5224,15 +5404,15 @@ int main(int argc, char *argv[])
   ungetc(c,ficpar);
 
    
-  covar=matrix(0,NCOVMAX,1,n); 
+  covar=matrix(0,NCOVMAX,1,n);  /**< used in readdata */
   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
   */
   if (strlen(model)>1) 
-    cptcovn=nbocc(model,'+')+1;
-  /* ncovprod */
-  ncovmodel=2+cptcovn; /*Number of variables including intercept and age = cptcovn + intercept + age : v1+v2+v3+v2*v4+v5*age makes 5+2=7*/
+    ncovmodel=2+nbocc(model,'+')+1; /*Number of variables including intercept and age = cptcovn + intercept + age : v1+v2+v3+v2*v4+v5*age makes 5+2=7*/
+  else
+    ncovmodel=2;
   nvar=ncovmodel-1; /* Suppressing age as a basic covariate */
   nforce= (nlstate+ndeath-1)*nlstate; /* Number of forces ij from state i to j */
   npar= nforce*ncovmodel; /* Number of parameters like aij*/
@@ -5264,7 +5444,7 @@ int main(int argc, char *argv[])
     matcov=matrix(1,npar,1,npar);
   }
   else{
-    /* Read guess parameters */
+    /* Read guessed parameters */
     /* Reads comments: lines beginning with '#' */
     while((c=getc(ficpar))=='#' && c!= EOF){
       ungetc(c,ficpar);
@@ -5313,6 +5493,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
     }  
     fflush(ficlog);
 
+    /* Reads scales values */
     p=param[1][1];
     
     /* Reads comments: lines beginning with '#' */
@@ -5351,6 +5532,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
     }
     fflush(ficlog);
 
+    /* Reads covariance matrix */
     delti=delti3[1][1];
 
 
@@ -5372,7 +5554,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
       for(j=1; j <=npar; j++) matcov[i][j]=0.;
       
     for(i=1; i <=npar; i++){
-      fscanf(ficpar,"%s",&str);
+      fscanf(ficpar,"%s",str);
       if(mle==1)
        printf("%s",str);
       fprintf(ficlog,"%s",str);
@@ -5452,15 +5634,15 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
     ncovcol + k1
     If already ncovcol=4 and model=V2+V1+V1*V4+age*V3
     Tvar[3=V1*V4]=4+1 etc */
-  Tprod=ivector(1,15); /* Gives the position of a product */
+  Tprod=ivector(1,NCOVMAX); /* Gives the position of a product */
   /* Tprod[k1=1]=3(=V1*V4) for V2+V1+V1*V4+age*V3
      if  V2+V1+V1*V4+age*V3+V3*V2   TProd[k1=2]=5 (V3*V2)
   */
-  Tvaraff=ivector(1,15); 
-  Tvard=imatrix(1,15,1,2); /* n=Tvard[k1][1]  and m=Tvard[k1][2] gives the couple n,m of the k1 th product Vn*Vm
+  Tvaraff=ivector(1,NCOVMAX); /* Unclear */
+  Tvard=imatrix(1,NCOVMAX,1,2); /* n=Tvard[k1][1]  and m=Tvard[k1][2] gives the couple n,m of the k1 th product Vn*Vm
                            * For V3*V2 (in V2+V1+V1*V4+age*V3+V3*V2), V3*V2 position is 2nd. 
                            * Tvard[k1=2][1]=3 (V3) Tvard[k1=2][2]=2(V2) */
-  Tage=ivector(1,15); /* Gives the covariate id of covariates associated with age: V2 + V1 + age*V4 + V3*age
+  Tage=ivector(1,NCOVMAX); /* Gives the covariate id of covariates associated with age: V2 + V1 + age*V4 + V3*age
                         4 covariates (3 plus signs)
                         Tage[1=V3*age]= 4; Tage[2=age*V4] = 3
                      */  
@@ -5492,8 +5674,8 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
      free_matrix(anint,1,maxwav,1,n);*/
   free_vector(moisdc,1,n);
   free_vector(andc,1,n);
-
-   
+  /* */
+  
   wav=ivector(1,imx);
   dh=imatrix(1,lastpass-firstpass+1,1,imx);
   bh=imatrix(1,lastpass-firstpass+1,1,imx);
@@ -5501,16 +5683,24 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
    
   /* Concatenates waves */
   concatwav(wav, dh, bh, mw, s, agedc, agev,  firstpass, lastpass, imx, nlstate, stepm);
-
+  /* */
   /* Routine tricode is to calculate cptcoveff (real number of unique covariates) and to associate covariable number and modality */
 
   nbcode=imatrix(0,NCOVMAX,0,NCOVMAX); 
   ncodemax[1]=1;
-  if (cptcovn > 0) tricode(Tvar,nbcode,imx);
-      
-  codtab=imatrix(1,100,1,10); /**< codtab[h,k]=( (h-1) - mod(k-1,2**(k-1) )/2**(k-1) 
-                              */
+  Ndum =ivector(-1,NCOVMAX);  
+  if (ncovmodel > 2)
+    tricode(Tvar,nbcode,imx, Ndum); /**< Fills nbcode[Tvar[j]][l]; */
+
+  codtab=imatrix(1,100,1,10); /* codtab[h,k]=( (h-1) - mod(k-1,2**(k-1) )/2**(k-1) */
+  /*printf(" codtab[1,1],codtab[100,10]=%d,%d\n", codtab[1][1],codtab[100][10]);*/
   h=0;
+
+
+  /*if (cptcovn > 0) */
+      
   m=pow(2,cptcoveff);
  
   for(k=1;k<=cptcoveff; k++){ /* scans any effective covariate */
@@ -5541,7 +5731,7 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
           *    16     2     2     2     1
           */
          codtab[h][k]=j;
-         codtab[h][Tvar[k]]=j;
+         /*codtab[h][Tvar[k]]=j;*/
          printf("h=%d k=%d j=%d codtab[h][k]=%d Tvar[k]=%d codtab[h][Tvar[k]]=%d \n",h, k,j,codtab[h][k],Tvar[k],codtab[h][Tvar[k]]);
        } 
       }
@@ -5556,6 +5746,10 @@ run imach with mle=-1 to get a correct template of the parameter file.\n",numlin
      printf("\n");
      }
      scanf("%d",i);*/
+
+ free_ivector(Ndum,-1,NCOVMAX);
+
+
     
   /*------------ gnuplot -------------*/
   strcpy(optionfilegnuplot,optionfilefiname);
@@ -5679,7 +5873,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        ximort[i][j]=(i == j ? 1.0 : 0.0);
     }
     
-    p[1]=0.0268; p[NDIM]=0.083;
+    /*p[1]=0.0268; p[NDIM]=0.083;*/
     /*printf("%lf %lf", p[1], p[2]);*/
     
     
@@ -6073,8 +6267,8 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     
     
     
-    /*  freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint);*/
-    /*,dateprev1,dateprev2,jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/
+     /* freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint); */
+    /* ,dateprev1,dateprev2,jprev1, mprev1,anprev1,jprev2, mprev2,anprev2); */
     
     replace_back_to_slash(pathc,pathcd); /* Even gnuplot wants a / */
     printinggnuplot(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p);
@@ -6099,117 +6293,21 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
 
 
     /*--------------- Prevalence limit  (period or stable prevalence) --------------*/
-  
-    strcpy(filerespl,"pl");
-    strcat(filerespl,fileres);
-    if((ficrespl=fopen(filerespl,"w"))==NULL) {
-      printf("Problem with period (stable) prevalence resultfile: %s\n", filerespl);goto end;
-      fprintf(ficlog,"Problem with period (stable) prevalence resultfile: %s\n", filerespl);goto end;
-    }
-    printf("Computing period (stable) prevalence: result on file '%s' \n", filerespl);
-    fprintf(ficlog,"Computing period (stable) prevalence: result on file '%s' \n", filerespl);
-    pstamp(ficrespl);
-    fprintf(ficrespl,"# Period (stable) prevalence \n");
-    fprintf(ficrespl,"#Age ");
-    for(i=1; i<=nlstate;i++) fprintf(ficrespl,"%d-%d ",i,i);
-    fprintf(ficrespl,"\n");
-  
-    prlim=matrix(1,nlstate,1,nlstate);
-
-    agebase=ageminpar;
-    agelim=agemaxpar;
-    ftolpl=1.e-10;
-    i1=pow(2,cptcoveff);
-    if (cptcovn < 1){i1=1;}
-
-    for(cptcov=1,k=0;cptcov<=i1;cptcov++){
-      //for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
-       k=k+1;
-       /* to clean */
-       //printf("cptcov=%d cptcod=%d codtab=%d\n",cptcov, cptcod,codtab[cptcod][cptcov]);
-       fprintf(ficrespl,"\n#******");
-       printf("\n#******");
-       fprintf(ficlog,"\n#******");
-       for(j=1;j<=cptcoveff;j++) {
-         fprintf(ficrespl," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
-         printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
-         fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
-       }
-       fprintf(ficrespl,"******\n");
-       printf("******\n");
-       fprintf(ficlog,"******\n");
-       
-       for (age=agebase; age<=agelim; age++){
-         prevalim(prlim, nlstate, p, age, oldm, savm,ftolpl,k);
-         fprintf(ficrespl,"%.0f ",age );
-         for(j=1;j<=cptcoveff;j++)
-           fprintf(ficrespl,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
-         for(i=1; i<=nlstate;i++)
-           fprintf(ficrespl," %.5f", prlim[i][i]);
-         fprintf(ficrespl,"\n");
-       } /* Age */
-       /* was end of cptcod */
-    } /* cptcov */
+#include "prevlim.h"  /* Use ficrespl, ficlog */
     fclose(ficrespl);
 
-    /*------------- h Pij x at various ages ------------*/
-  
-    strcpy(filerespij,"pij");  strcat(filerespij,fileres);
-    if((ficrespij=fopen(filerespij,"w"))==NULL) {
-      printf("Problem with Pij resultfile: %s\n", filerespij);goto end;
-      fprintf(ficlog,"Problem with Pij resultfile: %s\n", filerespij);goto end;
-    }
-    printf("Computing pij: result on file '%s' \n", filerespij);
-    fprintf(ficlog,"Computing pij: result on file '%s' \n", filerespij);
-  
-    stepsize=(int) (stepm+YEARM-1)/YEARM;
-    /*if (stepm<=24) stepsize=2;*/
-
-    agelim=AGESUP;
-    hstepm=stepsize*YEARM; /* Every year of age */
-    hstepm=hstepm/stepm; /* Typically 2 years, = 2/6 months = 4 */ 
-
-    /* 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 ");
-    for(cptcov=1,k=0;cptcov<=i1;cptcov++){
-      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
-       k=k+1;
-       fprintf(ficrespij,"\n#****** ");
-       for(j=1;j<=cptcoveff;j++) 
-         fprintf(ficrespij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
-       fprintf(ficrespij,"******\n");
-       
-       for (agedeb=fage; agedeb>=bage; agedeb--){ /* If stepm=6 months */
-         nhstepm=(int) rint((agelim-agedeb)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */ 
-         nhstepm = nhstepm/hstepm; /* Typically 40/4=10 */
-
-         /*      nhstepm=nhstepm*YEARM; aff par mois*/
+#ifdef FREEEXIT2
+#include "freeexit2.h"
+#endif
 
-         p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
-         oldm=oldms;savm=savms;
-         hpxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k);  
-         fprintf(ficrespij,"# Cov Agex agex+h hpijx with i,j=");
-         for(i=1; i<=nlstate;i++)
-           for(j=1; j<=nlstate+ndeath;j++)
-             fprintf(ficrespij," %1d-%1d",i,j);
-         fprintf(ficrespij,"\n");
-         for (h=0; h<=nhstepm; h++){
-           fprintf(ficrespij,"%d %3.f %3.f",k,agedeb, agedeb+ h*hstepm/YEARM*stepm );
-           for(i=1; i<=nlstate;i++)
-             for(j=1; j<=nlstate+ndeath;j++)
-               fprintf(ficrespij," %.5f", p3mat[i][j][h]);
-           fprintf(ficrespij,"\n");
-         }
-         free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
-         fprintf(ficrespij,"\n");
-       }
-      }
-    }
+    /*------------- h Pij x at various ages ------------*/
+#include "hpijx.h"
+    fclose(ficrespij);
 
+  /*-------------- Variance of one-step probabilities---*/
+    k=1;
     varprob(optionfilefiname, matcov, p, delti, nlstate, bage, fage,k,Tvar,nbcode, ncodemax,strstart);
 
-    fclose(ficrespij);
 
     probs= ma3x(1,AGESUP,1,NCOVMAX, 1,NCOVMAX);
     for(i=1;i<=AGESUP;i++)
@@ -6258,9 +6356,10 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     }
     printf("Computing Health Expectancies: result on file '%s' \n", filerese);
     fprintf(ficlog,"Computing Health Expectancies: result on file '%s' \n", filerese);
-    for(cptcov=1,k=0;cptcov<=i1;cptcov++){
-      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
-       k=k+1; 
+    /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
+      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
+          
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
        fprintf(ficreseij,"\n#****** ");
        for(j=1;j<=cptcoveff;j++) {
          fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
@@ -6272,7 +6371,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        evsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, strstart);  
       
        free_ma3x(eij,1,nlstate,1,nlstate,(int) bage, (int)fage);
-      }
+      /*}*/
     }
     fclose(ficreseij);
 
@@ -6317,10 +6416,11 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     printf("Computing Variance-covariance of DFLEs: file '%s' \n", fileresv);
     fprintf(ficlog,"Computing Variance-covariance of DFLEs: file '%s' \n", fileresv);
 
-    for(cptcov=1,k=0;cptcov<=i1;cptcov++){
-      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
-       k=k+1; 
-       fprintf(ficrest,"\n#****** ");
+    /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
+      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
+          
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+       fprintf(ficrest,"\n#****** ");
        for(j=1;j<=cptcoveff;j++) 
          fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
        fprintf(ficrest,"******\n");
@@ -6342,12 +6442,18 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        eij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage);
        oldm=oldms;savm=savms;
        cvevsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, delti, matcov, strstart);  
+       /*
+        */
+       /* goto endfree; */
  
        vareij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage);
        pstamp(ficrest);
+
+
        for(vpopbased=0; vpopbased <= popbased; vpopbased++){ /* Done for vpopbased=0 and vpopbased=1 if popbased==1*/
-         oldm=oldms;savm=savms;
-         varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,vpopbased,mobilav, strstart);   fprintf(ficrest,"# Total life expectancy with std error and decomposition into time to be expected in each health state\n#  (weighted average of eij where weights are ");
+         oldm=oldms;savm=savms; /* Segmentation fault */
+         varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,vpopbased,mobilav, strstart);
+         fprintf(ficrest,"# Total life expectancy with std error and decomposition into time to be expected in each health state\n#  (weighted average of eij where weights are ");
          if(vpopbased==1)
            fprintf(ficrest,"the age specific prevalence observed (cross-sectionally) in the population i.e cross-sectionally\n in each health state (popbased=1) (mobilav=%d)\n",mobilav);
          else
@@ -6391,10 +6497,10 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        free_ma3x(eij,1,nlstate,1,nlstate,(int) bage, (int)fage);
        free_ma3x(vareij,1,nlstate,1,nlstate,(int) bage, (int)fage);
        free_vector(epj,1,nlstate+1);
-      }
+      /*}*/
     }
     free_vector(weight,1,n);
-    free_imatrix(Tvard,1,15,1,2);
+    free_imatrix(Tvard,1,NCOVMAX,1,2);
     free_imatrix(s,1,maxwav+1,1,n);
     free_matrix(anint,1,maxwav,1,n); 
     free_matrix(mint,1,maxwav,1,n);
@@ -6416,10 +6522,11 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     }
     printf("Computing Variance-covariance of period (stable) prevalence: file '%s' \n", fileresvpl);
 
-    for(cptcov=1,k=0;cptcov<=i1;cptcov++){
-      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
-       k=k+1;
-       fprintf(ficresvpl,"\n#****** ");
+    /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
+      for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
+          
+    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+       fprintf(ficresvpl,"\n#****** ");
        for(j=1;j<=cptcoveff;j++) 
          fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]);
        fprintf(ficresvpl,"******\n");
@@ -6428,7 +6535,7 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        oldm=oldms;savm=savms;
        varprevlim(fileres, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k,strstart);
        free_matrix(varpl,1,nlstate,(int) bage, (int)fage);
-      }
+      /*}*/
     }
 
     fclose(ficresvpl);
@@ -6450,11 +6557,11 @@ Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
     free_matrix(agev,1,maxwav,1,imx);
     free_ma3x(param,1,nlstate,1, nlstate+ndeath-1,1,ncovmodel);
 
-    free_ivector(ncodemax,1,8);
-    free_ivector(Tvar,1,15);
-    free_ivector(Tprod,1,15);
-    free_ivector(Tvaraff,1,15);
-    free_ivector(Tage,1,15);
+    free_ivector(ncodemax,1,NCOVMAX);
+    free_ivector(Tvar,1,NCOVMAX);
+    free_ivector(Tprod,1,NCOVMAX);
+    free_ivector(Tvaraff,1,NCOVMAX);
+    free_ivector(Tage,1,NCOVMAX);
 
     free_imatrix(nbcode,0,NCOVMAX,0,NCOVMAX);
     free_imatrix(codtab,1,100,1,10);