]> henry.ined.fr Git - .git/commitdiff
Summary: last 0.99r31
authorN. Brouard <brouard@ined.fr>
Sat, 6 Aug 2022 07:18:25 +0000 (07:18 +0000)
committerN. Brouard <brouard@ined.fr>
Sat, 6 Aug 2022 07:18:25 +0000 (07:18 +0000)
*  imach.c (Module): Version of imach using partly decoderesult to rebuild xpxij function

src/imach.c

index 6710b39802ea88fb4cbd948e8d9fd39b9719b86c..9415d29df5d80e74dcf5cd273a3c0479cf1ebb35 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.329  2022/08/03 17:29:54  brouard
+  *  imach.c (Module): Many errors in graphs fixed with Vn*age covariates.
+
   Revision 1.328  2022/07/27 17:40:48  brouard
   Summary: valgrind bug fixed by initializing to zero DummyV as well as Tage
 
@@ -1237,14 +1240,15 @@ char strstart[80];
 char optionfilext[10], optionfilefiname[FILENAMELENGTH];
 int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings  */
 int nagesqr=0, nforce=0; /* nagesqr=1 if model is including age*age, number of forces */
-/* 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 in the model V2+V1 =2 */
+/* Number of covariates model (1)=V2+V1+ V3*age+V2*V4 */
+/* Model(2)  V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */
+int cptcovn=0; /**< cptcovn decodemodel: number of covariates k of the models excluding age*products =6 and age*age */
+int cptcovt=0; /**< cptcovt: total number of covariates of the model (2) nbocc(+)+1 = 8 excepting constant and age and age*age */
+int cptcovs=0; /**< cptcovs number of simple covariates in the model V2+V1 =2 (dummy or quantit or time varying) */
 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 cptcoveff=0; /* Total number of covariates to vary for printing results (2**cptcoveff combinations of dummies)(computed in tricode as cptcov) */
 int ncovf=0; /* Total number of effective fixed covariates (dummy or quantitative) in the model */
 int ncovv=0; /* Total number of effective (wave) varying covariates (dummy or quantitative) in the model */
 int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (dummy of quantitative) in the model */
@@ -1418,7 +1422,7 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
        *  V1   V2   V3   V4  V5  V6  V7  V8  Weight ddb ddth d1st s1 V9 V10 V11 V12 s2 V9 V10 V11 V12 
        *  <          ncovcol=6   >   nqv=2 (V7 V8)                   dv dv  dv  qtv    dv dv  dvv qtv
        *                                                             ntv=3     nqtv=1
-       *  cptcovn number of covariates (not including constant and age) = # of + plus 1 = 10+1=11
+       *  cptcovn number of covariates (not including constant and age or age*age) = number of plus sign + 1 = 10+1=11
        * For time varying covariate, quanti or dummies
        *       cotqvar[wav][iv(1 to nqtv)][i]= [1][12][i]=(V12) quanti
        *       cotvar[wav][ntv+iv][i]= [3+(1 to nqtv)][i]=(V12) quanti
@@ -1444,6 +1448,7 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
                                                          /* with age product, 3 quant with age product*/
 /*Tvar[k]=     5  4   3   6     5    2    7     1    1 */
 /*    nsd         1   2                              3 */ /* Counting single dummies covar fixed or tv */
+/*TnsdVar[Tvar]   1   2                              3 */ 
 /*TvarsD[nsd]     4   3                              1 */ /* ID of single dummy cova fixed or timevary*/
 /*TvarsDind[k]    2   3                              9 */ /* position K of single dummy cova */
 /*    nsq      1                     2                 */ /* Counting single quantit tv */
@@ -1453,6 +1458,7 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
 /* cptcovage                    1               2      */ /* Counting cov*age in the model equation */
 /* Tage[cptcovage]=k            5               8      */ /* Position in the model of ith cov*age */
 /* Tvard[1][1]@4={4,3,1,2}    V4*V3 V1*V2              */ /* Position in model of the ith prod without age */
+/* Tvardk[4][1]=4;Tvardk[4][2]=3;Tvardk[7][1]=1;Tvardk[7][2]=2 */ /* Variables of a prod at position in the model equation*/
 /* TvarF TvarF[1]=Tvar[6]=2,  TvarF[2]=Tvar[7]=7, TvarF[3]=Tvar[9]=1  ID of fixed covariates or product V2, V1*V2, V1 */
 /* TvarFind;  TvarFind[1]=6,  TvarFind[2]=7, TvarFind[3]=9 *//* Inverse V2(6) is first fixed (single or prod)  */
 /* Type                    */
@@ -1461,6 +1467,7 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
 /*           D  Q  D  D  Q */
 /*                         */
 int *TvarsD;
+int *TnsdVar;
 int *TvarsDind;
 int *TvarsQ;
 int *TvarsQind;
@@ -1469,8 +1476,10 @@ int *TvarsQind;
 int nresult=0;
 int parameterline=0; /* # of the parameter (type) line */
 int TKresult[MAXRESULTLINESPONE];
+int resultmodel[MAXRESULTLINESPONE][NCOVMAX];/* resultmodel[k1]=k3: k1th position in the model correspond to the k3 position in the resultline */
 int Tresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */
 int Tinvresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */
+int TinvDoQresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable or quanti value (output) */
 int Tvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For dummy variable , variable # (output) */
 double Tqresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */
 double Tqinvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */
@@ -1511,6 +1520,7 @@ int *TmodelInvQind; /** Tmodelqind[1]=1 for V5(quantitative varying) position,Tv
 int *Ndum; /** Freq of modality (tricode */
 /* int **codtab;*/ /**< codtab=imatrix(1,100,1,10); */
 int **Tvard;
+int **Tvardk;
 int *Tprod;/**< Gives the k position of the k1 product */
 /* Tprod[k1=1]=3(=V1*V4) for V2+V1+V1*V4+age*V3  */
 int *Tposprod; /**< Gives the k1 product from the k position */
@@ -2802,7 +2812,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
      }
     for (k=1; k<=nsd;k++) { /* For single dummy covariates only */
                        /* Here comes the value of the covariate 'ij' after renumbering k with single dummy covariates */
-      cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];
+      cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,TvarsD[k])];
       /* cov[++k1]=nbcode[TvarsD[k]][codtabm(ij,k)]; */
       /* printf("prevalim Dummy combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov=%lf codtabm(%d,Tvar[%d])=%d \n",ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,k)); */
     }
@@ -2814,7 +2824,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     }
     for (k=1; k<=cptcovage;k++){  /* For product with age */
       if(Dummy[Tage[k]]==2){ /* dummy with age */
-       cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+       cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,Tvar[Tage[k]])]*cov[2];
        /* cov[++k1]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
       } else if(Dummy[Tage[k]]==3){ /* quantitative with age */
        cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
@@ -2826,15 +2836,15 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       /* printf("prevalim Prod ij=%d k=%d  Tprod[%d]=%d Tvard[%d][1]=V%d, Tvard[%d][2]=V%d\n",ij,k,k,Tprod[k], k,Tvard[k][1], k,Tvard[k][2]); */
       if(Dummy[Tvard[k][1]]==0){
        if(Dummy[Tvard[k][2]]==0){
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])];
          /* cov[++k1]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
        }else{
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * Tqresult[nres][k];
          /* cov[++k1]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k]; */
        }
       }else{
        if(Dummy[Tvard[k][2]]==0){
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])] * Tqinvresult[nres][Tvard[k][1]];
          /* cov[++k1]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]]; */
        }else{
          cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]];
@@ -2975,7 +2985,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     }
     for (k=1; k<=nsd;k++) { /* For single dummy covariates only */
                        /* Here comes the value of the covariate 'ij' after renumbering k with single dummy covariates */
-      cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];
+      cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,TvarsD[k])];
       /* printf("bprevalim Dummy agefin=%.0f combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov[%d]=%lf codtabm(%d,Tvar[%d])=%d \n",agefin,ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],2+nagesqr+TvarsDind[k],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,k)); */
     }
     /* for (k=1; k<=cptcovn;k++) { */
@@ -2995,7 +3005,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     for (k=1; k<=cptcovage;k++){  /* For product with age */
       /* if(Dummy[Tvar[Tage[k]]]== 2){ /\* dummy with age *\/ ERROR ???*/
       if(Dummy[Tage[k]]== 2){ /* dummy with age */
-       cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+       cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,Tvar[Tage[k]])]*cov[2];
       } else if(Dummy[Tage[k]]== 3){ /* quantitative with age */
        cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
       }
@@ -3005,13 +3015,13 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       /* printf("prevalim Prod ij=%d k=%d  Tprod[%d]=%d Tvard[%d][1]=V%d, Tvard[%d][2]=V%d\n",ij,k,k,Tprod[k], k,Tvard[k][1], k,Tvard[k][2]); */
       if(Dummy[Tvard[k][1]]==0){
        if(Dummy[Tvard[k][2]]==0){
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])];
        }else{
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * Tqresult[nres][k];
        }
       }else{
        if(Dummy[Tvard[k][2]]==0){
-         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]];
+         cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])] * Tqinvresult[nres][Tvard[k][1]];
        }else{
          cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]];
        }
@@ -3127,7 +3137,7 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
        /*       printf("Int j<i s1=%.17e, lnpijopii=%.17e\n",s1,lnpijopii); */
       }
       ps[i][j]=lnpijopii; /* In fact ln(pij/pii) */
-      /*       printf("s1=%.17e, lnpijopii=%.17e\n",s1,lnpijopii); */
+      /* printf("Debug pmij() i=%d j=%d nc=%d s1=%.17f, lnpijopii=%.17f\n",i,j,nc, s1,lnpijopii); */
     }
     for(j=i+1; j<=nlstate+ndeath;j++){
       for (nc=1, lnpijopii=0.;nc <=ncovmodel; nc++){
@@ -3136,6 +3146,7 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
        /*        printf("Int j>i s1=%.17e, lnpijopii=%.17e %lx %lx\n",s1,lnpijopii,s1,lnpijopii); */
       }
       ps[i][j]=lnpijopii; /* In fact ln(pij/pii) */
+      /* printf("Debug pmij() i=%d j=%d nc=%d s1=%.17f, lnpijopii=%.17f\n",i,j,nc, s1,lnpijopii); */
     }
   }
   
@@ -3143,11 +3154,11 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
     s1=0;
     for(j=1; j<i; j++){
       s1+=exp(ps[i][j]); /* In fact sums pij/pii */
-      /*printf("debug1 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
+      /* printf("debug1 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
     }
     for(j=i+1; j<=nlstate+ndeath; j++){
       s1+=exp(ps[i][j]); /* In fact sums pij/pii */
-      /*printf("debug2 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
+      /* printf("debug2 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
     }
     /* s1= sum_{j<>i} pij/pii=(1-pii)/pii and thus pii is known from s1 */
     ps[i][i]=1./(s1+1.);
@@ -3403,7 +3414,7 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in
 
      */
 
-  int i, j, d, h, k;
+  int i, j, d, h, k, k1;
   double **out, cov[NCOVMAX+1];
   double **newm;
   double agexact;
@@ -3426,8 +3437,13 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in
       if(nagesqr==1){
        cov[3]= agexact*agexact;
       }
-      for (k=1; k<=nsd;k++) { /* For single dummy covariates only */
-/* Here comes the value of the covariate 'ij' after renumbering k with single dummy covariates */
+      /* Model(2)  V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */
+      /* total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age */
+      for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
+       if( Dummy[k1]==0 && Typevar[k1]==0 ){ /* Single dummy  */
+/*        V(Tvarsel)=Tvalsel=Tresult[nres][pos](value); V(Tvresult[nres][pos] (variable): V(variable)=value) */
+/*       for (k=1; k<=nsd;k++) { /\* For single dummy covariates only *\/ */
+/* /\* Here comes the value of the covariate 'ij' after renumbering k with single dummy covariates *\/ */
        /* codtabm(ij,k)  (1 & (ij-1) >> (k-1))+1 */
 /*             V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
 /*    k        1  2   3   4     5    6    7     8    9 */
@@ -3435,42 +3451,78 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in
 /*    nsd         1   2                              3 */ /* Counting single dummies covar fixed or tv */
 /*TvarsD[nsd]     4   3                              1 */ /* ID of single dummy cova fixed or timevary*/
 /*TvarsDind[k]    2   3                              9 */ /* position K of single dummy cova */
-       cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];
-       /* printf("hpxij Dummy combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov=%lf codtabm(%d,Tvar[%d])=%d \n",ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,k)); */
-      }
-      for (k=1; k<=nsq;k++) { /* For single varying covariates only */
-       /* Here comes the value of quantitative after renumbering k with single quantitative covariates */
-       cov[2+nagesqr+TvarsQind[k]]=Tqresult[nres][k];
-       /* printf("hPxij Quantitative k=%d  TvarsQind[%d]=%d, TvarsQ[%d]=V%d,Tqresult[%d][%d]=%f\n",k,k,TvarsQind[k],k,TvarsQ[k],nres,k,Tqresult[nres][k]); */
-      }
-      for (k=1; k<=cptcovage;k++){ /* For product with age V1+V1*age +V4 +age*V3 */
-       /* 1+2 Tage[1]=2 TVar[2]=1 Dummy[2]=2, Tage[2]=4 TVar[4]=3 Dummy[4]=3 quant*/
-       /* */
-       if(Dummy[Tage[k]]== 2){ /* dummy with age */
-       /* if(Dummy[Tvar[Tage[k]]]== 2){ /\* dummy with age *\/ */
-         cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
-       } else if(Dummy[Tage[k]]== 3){ /* quantitative with age */
-         cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
-       }
-       /* printf("hPxij Age combi=%d k=%d  Tage[%d]=V%d Tqresult[%d][%d]=%f\n",ij,k,k,Tage[k],nres,k,Tqresult[nres][k]); */
-      }
-      for (k=1; k<=cptcovprod;k++){ /*  For product without age */
-       /* printf("hPxij Prod ij=%d k=%d  Tprod[%d]=%d Tvard[%d][1]=V%d, Tvard[%d][2]=V%d\n",ij,k,k,Tprod[k], k,Tvard[k][1], k,Tvard[k][2]); */
-       /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
-       if(Dummy[Tvard[k][1]]==0){
-         if(Dummy[Tvard[k][2]]==0){
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)];
-         }else{
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k];
-         }
-       }else{
-         if(Dummy[Tvard[k][2]]==0){
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]];
-         }else{
-           cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]];
-         }
-       }
-      }
+         /* cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];or [codtabm(ij,TnsdVar[TvarsD[k]] */
+         cov[2+nagesqr+k1]=Tresult[nres][resultmodel[nres][k1]];
+         /* printf("hpxij Dummy combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov=%lf codtabm(%d,TnsdVar[TvarsD[%d])=%d \n",ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,TnsdVar[TvarsD[k]])],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,TnsdVar[TvarsD[k]])); */
+         printf("hpxij Dummy combi=%d k1=%d Tvar[%d]=V%d cov[2+%d+%d]=%lf resultmodel[nres][%d]=%d nres/nresult=%d/%d \n",ij,k1,k1, Tvar[k1],nagesqr,k1,cov[2+nagesqr+k1],k1,resultmodel[nres][k1],nres,nresult);
+       }else if( Dummy[k1]==1 && Typevar[k1]==0 ){ /* Single quantitative variables  */
+         /* resultmodel[nres][k1]=k3: k1th position in the model correspond to the k3 position in the resultline */
+         cov[2+nagesqr+k1]=Tqresult[nres][resultmodel[nres][k1]]; 
+         /* for (k=1; k<=nsq;k++) { /\* For single varying covariates only *\/ */
+         /*    /\* Here comes the value of quantitative after renumbering k with single quantitative covariates *\/ */
+         /*    cov[2+nagesqr+TvarsQind[k]]=Tqresult[nres][k]; */
+         printf("hPxij Quantitative k1=%d resultmodel[nres][%d]=%d,Tqresult[%d][%d]=%f\n",k1,k1,resultmodel[nres][k1],nres,resultmodel[nres][k1],Tqresult[nres][resultmodel[nres][k1]]);
+       }else if( Dummy[k1]==2 ){ /* For dummy with age product */
+         /* Tvar[k1] Variable in the age product age*V1 is 1 */
+         /* [Tinvresult[nres][V1] is its value in the resultline nres */
+         cov[2+nagesqr+k1]=Tinvresult[nres][Tvar[k1]];
+         printf("DhPxij Dummy with age k1=%d Tvar[%d]=%d Tinvresult[nres][%d]=%d,cov[2+%d+%d]=%.3f\n",k1,k1,Tvar[k1],Tinvresult[nres][Tvar[k1]],nagesqr,k1,cov[2+nagesqr+k1]);
+         /* cov[2+nagesqr+k1]=Tresult[nres][resultmodel[nres][k1]];     */
+         /* for (k=1; k<=cptcovage;k++){ /\* For product with age V1+V1*age +V4 +age*V3 *\/ */
+         /* 1+2 Tage[1]=2 TVar[2]=1 Dummy[2]=2, Tage[2]=4 TVar[4]=3 Dummy[4]=3 quant*/
+         /* */
+/*             V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
+/*    k        1  2   3   4     5    6    7     8    9 */
+/*Tvar[k]=     5  4   3   6     5    2    7     1    1 */
+/*cptcovage=2                   1               2      */
+/*Tage[k]=                      5               8      */      
+       }else if( Dummy[k1]==2 ){ /* For quant with age product */
+         cov[2+nagesqr+k1]=Tresult[nres][resultmodel[nres][k1]];       
+         printf("QhPxij Quant with age k1=%d resultmodel[nres][%d]=%d,Tqresult[%d][%d]=%f\n",k1,k1,resultmodel[nres][k1],nres,resultmodel[nres][k1],Tqresult[nres][resultmodel[nres][k1]]);
+         /* if(Dummy[Tage[k]]== 2){ /\* dummy with age *\/ */
+         /* /\* if(Dummy[Tvar[Tage[k]]]== 2){ /\\* dummy with age *\\/ *\/ */
+         /*   /\* cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; *\/ */
+         /*   /\* cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,TnsdVar[TvarsD[Tvar[Tage[k]]]])]*cov[2]; *\/ */
+         /*   cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,TnsdVar[TvarsD[Tvar[Tage[k]]]])]*cov[2]; */
+         /*   printf("hPxij Age combi=%d k=%d cptcovage=%d Tage[%d]=%d Tvar[Tage[%d]]=V%d nbcode[Tvar[Tage[k]]][codtabm(ij,TnsdVar[Tvar[Tage[k]]]])]=%d nres=%d\n",ij,k,cptcovage,k,Tage[k],k,Tvar[Tage[k]], nbcode[Tvar[Tage[k]]][codtabm(ij,TnsdVar[Tvar[Tage[k]]])],nres); */
+         /* } else if(Dummy[Tage[k]]== 3){ /\* quantitative with age *\/ */
+         /*   cov[2+nagesqr+Tage[k]]=Tqresult[nres][k]; */
+         /* } */
+         /* printf("hPxij Age combi=%d k=%d  Tage[%d]=V%d Tqresult[%d][%d]=%f\n",ij,k,k,Tage[k],nres,k,Tqresult[nres][k]); */
+       }else if(Typevar[k1]==2 ){ /* For product (not with age) */
+/*       for (k=1; k<=cptcovprod;k++){ /\*  For product without age *\/ */
+/* /\*             V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 *\/ */
+/* /\*    k        1  2   3   4     5    6    7     8    9 *\/ */
+/* /\*Tvar[k]=     5  4   3   6     5    2    7     1    1 *\/ */
+/* /\*cptcovprod=1            1               2            *\/ */
+/* /\*Tprod[]=                4               7            *\/ */
+/* /\*Tvard[][1]             4               1             *\/ */
+/* /\*Tvard[][2]               3               2           *\/ */
+         
+         /* printf("hPxij Prod ij=%d k=%d  Tprod[%d]=%d Tvard[%d][1]=V%d, Tvard[%d][2]=V%d nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])]=%d nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][1])]=%d\n",ij,k,k,Tprod[k], k,Tvard[k][1], k,Tvard[k][2],nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])],nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])]); */
+         /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+         cov[2+nagesqr+k1]=TinvDoQresult[nres][Tvardk[k1][1]] * TinvDoQresult[nres][Tvardk[k1][2]];    
+         printf("hPxij Prod ij=%d k1=%d  cov[2+%d+%d]=%.5f Tvard[%d][1]=V%d * Tvard[%d][2]=V%d ; TinvDoQresult[nres][Tvardk[k1][1]]=%.4f * TinvDoQresult[nres][Tvardk[k1][1]]=%.4f\n",ij,k1,nagesqr,k1,cov[2+nagesqr+k1],k1,Tvard[k1][1], k1,Tvard[k1][2], TinvDoQresult[nres][Tvardk[k1][1]], TinvDoQresult[nres][Tvardk[k1][2]]);
+         /* if(Dummy[Tvardk[k1][1]]==0){ */
+         /*   if(Dummy[Tvardk[k1][2]]==0){ /\* Product of dummies *\/ */
+             /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+             /* cov[2+nagesqr+k1]=Tinvresult[nres][Tvardk[k1][1]] * Tinvresult[nres][Tvardk[k1][2]];    */
+             /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,TnsdVar[Tvard[k][1]])] * nbcode[Tvard[k][2]][codtabm(ij,TnsdVar[Tvard[k][2]])]; */
+           /* }else{ /\* Product of dummy by quantitative *\/ */
+             /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,TnsdVar[Tvard[k][1]])] * Tqresult[nres][k]; */
+             /* cov[2+nagesqr+k1]=Tresult[nres][Tinvresult[nres][Tvardk[k1][1]]] * Tqresult[nres][Tinvresult[nres][Tvardk[k1][2]]]; */
+         /*   } */
+         /* }else{ /\* Product of quantitative by...*\/ */
+         /*   if(Dummy[Tvard[k][2]]==0){  /\* quant by dummy *\/ */
+         /*     /\* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,TnsdVar[Tvard[k][2]])] * Tqinvresult[nres][Tvard[k][1]]; *\/ */
+         /*     cov[2+nagesqr+k1]=Tqresult[nres][Tinvresult[nres][Tvardk[k1][1]]] * Tresult[nres][Tinvresult[nres][Tvardk[k1][2]]]  ; */
+         /*   }else{ /\* Product of two quant *\/ */
+         /*     /\* cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]]; *\/ */
+         /*     cov[2+nagesqr+k1]=Tqresult[nres][Tinvresult[nres][Tvardk[k1][1]]] * Tqresult[nres][Tinvresult[nres][Tvardk[k1][2]]]  ; */
+         /*   } */
+         /* }/\*end of products quantitative *\/ */
+       }/*end of products */
+      } /* End of loop on model equation */
       /* for (k=1; k<=cptcovn;k++)  */
       /*       cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; */
       /* for (k=1; k<=cptcovage;k++) /\* Should start at cptcovn+1 *\/ */
@@ -3559,7 +3611,7 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do
       for (k=1; k<=nsd;k++){ /* For single dummy covariates only *//* cptcovn error */
       /*       cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; */
       /* /\* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,Tvar[k])]; *\/ */
-       cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];/* Bug valgrind */
+       cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,TvarsD[k])];/* Bug valgrind */
         /* printf("hbxij Dummy agexact=%.0f combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov[%d]=%lf codtabm(%d,Tvar[%d])=%d \n",agexact,ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],2+nagesqr+TvarsDind[k],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,k)); */
       }
       for (k=1; k<=nsq;k++) { /* For single varying covariates only */
@@ -3570,23 +3622,23 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do
       for (k=1; k<=cptcovage;k++){ /* Should start at cptcovn+1 *//* For product with age */
        /* if(Dummy[Tvar[Tage[k]]]== 2){ /\* dummy with age error!!!*\/ */
        if(Dummy[Tage[k]]== 2){ /* dummy with age */
-         cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+         cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,Tvar[Tage[k]])]*cov[2];
        } else if(Dummy[Tage[k]]== 3){ /* quantitative with age */
          cov[2+nagesqr+Tage[k]]=Tqresult[nres][k]; 
        }
        /* printf("hBxij Age combi=%d k=%d  Tage[%d]=V%d Tqresult[%d][%d]=%f\n",ij,k,k,Tage[k],nres,k,Tqresult[nres][k]); */
       }
       for (k=1; k<=cptcovprod;k++){ /* Useless because included in cptcovn */
-       cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)];
+       cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])]*nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])];
        if(Dummy[Tvard[k][1]]==0){
          if(Dummy[Tvard[k][2]]==0){
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)];
+           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][1])];
          }else{
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k];
+           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * Tqresult[nres][k];
          }
        }else{
          if(Dummy[Tvard[k][2]]==0){
-           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]];
+           cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])] * Tqinvresult[nres][Tvard[k][1]];
          }else{
            cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]];
          }
@@ -4799,6 +4851,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
   
   /* j=ncoveff;  /\* Only fixed dummy covariates *\/ */
   j=cptcoveff;  /* Only dummy covariates of the model */
+  /* j=cptcovn;  /\* Only dummy covariates of the model *\/ */
   if (cptcovn<1) {j=1;ncodemax[1]=1;}
   
   
@@ -4806,7 +4859,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
      reference=low_education V1=0,V2=0
      med_educ                V1=1 V2=0, 
      high_educ               V1=0 V2=1
-     Then V1=1 and V2=1 is a noisy combination that we want to exclude for the list 2**cptcoveff 
+     Then V1=1 and V2=1 is a noisy combination that we want to exclude for the list 2**cptcovn 
   */
   dateintsum=0;
   k2cpt=0;
@@ -4818,7 +4871,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
 
   /* if a constant only model, one pass to compute frequency tables and to write it on ficresp */
   /* Loop on nj=1 or 2 if dummy covariates j!=0
-   *   Loop on j1(1 to 2**cptcoveff) covariate combination
+   *   Loop on j1(1 to 2**cptcovn) covariate combination
    *     freq[s1][s2][iage] =0.
    *     Loop on iind
    *       ++freq[s1][s2][iage] weighted
@@ -4843,12 +4896,12 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
     if(nj==1)
       j=0;  /* First pass for the constant */
     else{
-      j=cptcoveff; /* Other passes for the covariate values */
+      j=cptcovs; /* Other passes for the covariate values */
     }
     first=1;
     for (j1 = 1; j1 <= (int) pow(2,j); j1++){ /* Loop on all covariates combination of the model, excluding quantitatives, V4=0, V3=0 for example, fixed or varying covariates */
       posproptt=0.;
-      /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
+      /*printf("cptcovn=%d Tvaraff=%d", cptcovn,Tvaraff[1]);
        scanf("%d", i);*/
       for (i=-5; i<=nlstate+ndeath; i++)  
        for (s2=-5; s2<=nlstate+ndeath; s2++)  
@@ -4879,14 +4932,14 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
        bool=1;
        if(j !=0){
          if(anyvaryingduminmodel==0){ /* If All fixed covariates */
-           if (cptcoveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
-             for (z1=1; z1<=cptcoveff; z1++) { /* loops on covariates in the model */
+           if (cptcovn >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
+             for (z1=1; z1<=cptcovn; z1++) { /* loops on covariates in the model */
                /* if(Tvaraff[z1] ==-20){ */
                /*       /\* sumnew+=cotvar[mw[mi][iind]][z1][iind]; *\/ */
                /* }else  if(Tvaraff[z1] ==-10){ */
                /*       /\* sumnew+=coqvar[z1][iind]; *\/ */
-               /* }else  */
-               if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]){ /* for combination j1 of covariates */
+               /* }else  */ /* TODO TODO codtabm(j1,z1) or codtabm(j1,Tvaraff[z1]]z1)*/
+               if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]){ /* for combination j1 of covariates */
                  /* Tests if the value of the covariate z1 for this individual iind responded to combination j1 (V4=1 V3=0) */
                  bool=0; /* bool should be equal to 1 to be selected, one covariate value failed */
                  /* printf("bool=%d i=%d, z1=%d, Tvaraff[%d]=%d, covar[Tvarff][%d]=%2f, codtabm(%d,%d)=%d, nbcode[Tvaraff][codtabm(%d,%d)=%d, j1=%d\n", 
@@ -4904,15 +4957,15 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
            m=mw[mi][iind];
            if(j!=0){
              if(anyvaryingduminmodel==1){ /* Some are varying covariates */
-               for (z1=1; z1<=cptcoveff; z1++) {
+               for (z1=1; z1<=cptcovn; z1++) {
                  if( Fixed[Tmodelind[z1]]==1){
                    iv= Tvar[Tmodelind[z1]]-ncovcol-nqv;
-                   if (cotvar[m][iv][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) /* iv=1 to ntv, right modality. If covariate's 
+                   if (cotvar[m][iv][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]) /* iv=1 to ntv, right modality. If covariate's 
                                                                                      value is -1, we don't select. It differs from the 
                                                                                      constant and age model which counts them. */
                      bool=0; /* not selected */
                  }else if( Fixed[Tmodelind[z1]]== 0) { /* fixed */
-                   if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) {
+                   if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]) {
                      bool=0;
                    }
                  }
@@ -4973,28 +5026,28 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
       
       
       /*      fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/
-      if(cptcoveff==0 && nj==1) /* no covariate and first pass */
+      if(cptcovn==0 && nj==1) /* no covariate and first pass */
         pstamp(ficresp);
-      if  (cptcoveff>0 && j!=0){
+      if  (cptcovn>0 && j!=0){
         pstamp(ficresp);
        printf( "\n#********** Variable "); 
        fprintf(ficresp, "\n#********** Variable "); 
        fprintf(ficresphtm, "\n<br/><br/><h3>********** Variable "); 
        fprintf(ficresphtmfr, "\n<br/><br/><h3>********** Variable "); 
        fprintf(ficlog, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; z1++){
+       for (z1=1; z1<=cptcovs; z1++){
          if(!FixedV[Tvaraff[z1]]){
-           printf( "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresp, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresphtm, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresphtmfr, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficlog, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+           printf( "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresp, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresphtm, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresphtmfr, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficlog, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
          }else{
-           printf( "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresp, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresphtm, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficresphtmfr, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
-           fprintf(ficlog, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+           printf( "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresp, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresphtm, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficresphtmfr, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
+           fprintf(ficlog, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,TnsdVar[Tvaraff[z1]])]);
          }
        }
        printf( "**********\n#");
@@ -5028,14 +5081,14 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
       /* } */
 
       fprintf(ficresphtm,"<table style=\"text-align:center; border: 1px solid\">");
-      if((cptcoveff==0 && nj==1)|| nj==2 ) /* no covariate and first pass */
+      if((cptcovn==0 && nj==1)|| nj==2 ) /* no covariate and first pass */
         fprintf(ficresp, " Age");
-      if(nj==2) for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresp, " V%d=%d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+      if(nj==2) for (z1=1; z1<=cptcovn; z1++) fprintf(ficresp, " V%d=%d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]);
       for(i=1; i<=nlstate;i++) {
-       if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp," Prev(%d)  N(%d)  N  ",i,i);
+       if((cptcovn==0 && nj==1)|| nj==2 ) fprintf(ficresp," Prev(%d)  N(%d)  N  ",i,i);
        fprintf(ficresphtm, "<th>Age</th><th>Prev(%d)</th><th>N(%d)</th><th>N</th>",i,i);
       }
-      if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp, "\n");
+      if((cptcovn==0 && nj==1)|| nj==2 ) fprintf(ficresp, "\n");
       fprintf(ficresphtm, "\n");
       
       /* Header of frequency table by age */
@@ -5103,14 +5156,14 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
        }
        
        /* Writing ficresp */
-       if(cptcoveff==0 && nj==1){ /* no covariate and first pass */
+       if(cptcovn==0 && nj==1){ /* no covariate and first pass */
           if( iage <= iagemax){
            fprintf(ficresp," %d",iage);
           }
         }else if( nj==2){
           if( iage <= iagemax){
            fprintf(ficresp," %d",iage);
-            for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresp, " %d %d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+            for (z1=1; z1<=cptcovn; z1++) fprintf(ficresp, " %d %d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]);
           }
        }
        for(s1=1; s1 <=nlstate ; s1++){
@@ -5125,7 +5178,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
          }
          if( iage <= iagemax){
            if(pos>=1.e-5){
-             if(cptcoveff==0 && nj==1){ /* no covariate and first pass */
+             if(cptcovn==0 && nj==1){ /* no covariate and first pass */
                fprintf(ficresp," %.5f %.0f %.0f",prop[s1][iage]/pospropta, prop[s1][iage],pospropta);
               }else if( nj==2){
                fprintf(ficresp," %.5f %.0f %.0f",prop[s1][iage]/pospropta, prop[s1][iage],pospropta);
@@ -5134,7 +5187,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
              /*probs[iage][s1][j1]= pp[s1]/pos;*/
              /*printf("\niage=%d s1=%d j1=%d %.5f %.0f %.0f %f",iage,s1,j1,pp[s1]/pos, pp[s1],pos,probs[iage][s1][j1]);*/
            } else{
-             if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp," NaNq %.0f %.0f",prop[s1][iage],pospropta);
+             if((cptcovn==0 && nj==1)|| nj==2 ) fprintf(ficresp," NaNq %.0f %.0f",prop[s1][iage],pospropta);
              fprintf(ficresphtm,"<th>%d</th><td>NaNq</td><td>%.0f</td><td>%.0f</td>",iage, prop[s1][iage],pospropta);
            }
          }
@@ -5160,7 +5213,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
        }
        fprintf(ficresphtmfr,"</tr>\n ");
        fprintf(ficresphtm,"</tr>\n");
-       if((cptcoveff==0 && nj==1)|| nj==2 ) {
+       if((cptcovn==0 && nj==1)|| nj==2 ) {
          if(iage <= iagemax)
            fprintf(ficresp,"\n");
        }
@@ -5436,10 +5489,10 @@ void prevalence(double ***probs, double agemin, double agemax, int **s, double *
        for (z1=1; z1<=cptcoveff; z1++){
          if( Fixed[Tmodelind[z1]]==1){
            iv= Tvar[Tmodelind[z1]]-ncovcol-nqv;
-           if (cotvar[m][iv][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) /* iv=1 to ntv, right modality */
+           if (cotvar[m][iv][i]!= nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]) /* iv=1 to ntv, right modality */
              bool=0;
          }else if( Fixed[Tmodelind[z1]]== 0)  /* fixed */
-           if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) {
+           if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]) {
              bool=0;
            }
        }
@@ -5885,7 +5938,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
    } /* 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
+   *cptcov=ij; /* cptcov= Number of total real effective covariates: effective (used as cptcoveff in other functions)
                * because they can be excluded from the model and real
                * if in the model but excluded because missing values, but how to get k from ij?*/
    for(j=ij+1; j<= cptcovt; j++){
@@ -5976,7 +6029,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
     /* If stepm=6 months */
     /* Computed by stepm unit matrices, product of hstepma matrices, stored
        in an array of nhstepma length: nhstepma=10, hstepm=4, stepm=6 months */
-    
+    /* printf("HELLO evsij Entering hpxij age=%d cij=%d hstepm=%d x[1]=%f nres=%d\n",(int) age, cij, hstepm, x[1], nres); */
     hpxij(p3mat,nhstepma,age,hstepm,x,nlstate,stepm,oldm, savm, cij, nres);  
     
     hf=hstepm*stepm/YEARM;  /* Duration of hstepm expressed in year unit. */
@@ -6290,7 +6343,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
      fprintf(ficresprobmorprev," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
    }
    for(j=1;j<=cptcoveff;j++) 
-     fprintf(ficresprobmorprev,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(ij,j)]);
+     fprintf(ficresprobmorprev,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(ij,Tvaraff[j])]);
    fprintf(ficresprobmorprev,"\n");
 
    fprintf(ficresprobmorprev,"# Age cov=%-d",ij);
@@ -6923,24 +6976,24 @@ To be simple, these graphs help to understand the significativity of each parame
      /* for(nres=1;nres <=nresult; nres++){ /\* For each resultline *\/ */
      if  (cptcovn>0) {
        fprintf(ficresprob, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; 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,Tvaraff[z1])]);
        fprintf(ficresprob, "**********\n#\n");
        fprintf(ficresprobcov, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; 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,Tvaraff[z1])]);
        fprintf(ficresprobcov, "**********\n#\n");
                        
        fprintf(ficgp, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; 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,Tvaraff[z1])]);
        fprintf(ficgp, "**********\n#\n");
                        
                        
        fprintf(fichtmcov, "\n<hr  size=\"2\" color=\"#EC5E5E\">********** Variable "); 
        /* for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); */
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtmcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtmcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,Tvaraff[z1])]);
        fprintf(fichtmcov, "**********\n<hr size=\"2\" color=\"#EC5E5E\">");
                        
        fprintf(ficresprobcor, "\n#********** Variable ");    
-       for (z1=1; z1<=cptcoveff; 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,Tvaraff[z1])]);
        fprintf(ficresprobcor, "**********\n#");    
        if(invalidvarcomb[j1]){
         fprintf(ficgp,"\n#Combination (%d) ignored because no cases \n",j1); 
@@ -6960,7 +7013,7 @@ To be simple, these graphs help to understand the significativity of each parame
        /*       cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(j1,k)]; */
        for (k=1; k<=nsd;k++) { /* For single dummy covariates only */
         /* Here comes the value of the covariate 'j1' after renumbering k with single dummy covariates */
-        cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(j1,k)];
+        cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(j1,TvarsD[k])];
         /*cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(j1,Tvar[k])];*//* j1 1 2 3 4
                                                                    * 1  1 1 1 1
                                                                    * 2  2 1 1 1
@@ -6973,7 +7026,7 @@ To be simple, these graphs help to understand the significativity of each parame
        /*for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
        for (k=1; k<=cptcovage;k++){  /* For product with age */
         if(Dummy[Tage[k]]==2){ /* dummy with age */
-          cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(j1,k)]*cov[2];
+          cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(j1,Tvar[Tage[k]])]*cov[2];
           /* cov[++k1]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
         } else if(Dummy[Tage[k]]==3){ /* quantitative with age */
           printf("Internal IMaCh error, don't know which value for quantitative covariate with age, Tage[k]%d, k=%d, Tvar[Tage[k]]=V%d, age=%d\n",Tage[k],k ,Tvar[Tage[k]], (int)cov[2]);
@@ -6986,15 +7039,15 @@ To be simple, these graphs help to understand the significativity of each parame
        for (k=1; k<=cptcovprod;k++){/* For product without age */
         if(Dummy[Tvard[k][1]]==0){
           if(Dummy[Tvard[k][2]]==0){
-            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,k)] * nbcode[Tvard[k][2]][codtabm(j1,k)];
+            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(j1,Tvard[k][2])];
             /* cov[++k1]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
           }else{ /* Should we use the mean of the quantitative variables? */
-            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,k)] * Tqresult[nres][k];
+            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,Tvard[k][1])] * Tqresult[nres][k];
             /* cov[++k1]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k]; */
           }
         }else{
           if(Dummy[Tvard[k][2]]==0){
-            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(j1,k)] * Tqinvresult[nres][Tvard[k][1]];
+            cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(j1,Tvard[k][2])] * Tqinvresult[nres][Tvard[k][1]];
             /* cov[++k1]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]]; */
           }else{
             cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]*  Tqinvresult[nres][Tvard[k][2]];
@@ -8914,7 +8967,7 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
     }
     fprintf(ficresf,"\n#****** hpijx=probability over h years, hp.jx is weighted by observed prev \n#");
     for(j=1;j<=cptcoveff;j++) {
-      fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+      fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
     }
     for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
       fprintf(ficresf," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
@@ -8944,7 +8997,7 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
        }
        fprintf(ficresf,"\n");
        for(j=1;j<=cptcoveff;j++) 
-         fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+         fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
        fprintf(ficresf,"%.f %.f ",anprojd+yearp,agec+h*hstepm/YEARM*stepm);
        
        for(j=1; j<=nlstate+ndeath;j++) {
@@ -9054,7 +9107,7 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
     }
     fprintf(ficresfb,"\n#****** hbijx=probability over h years, hb.jx is weighted by observed prev \n#");
     for(j=1;j<=cptcoveff;j++) {
-      fprintf(ficresfb," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+      fprintf(ficresfb," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
     }
     for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
       fprintf(ficresf," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
@@ -9090,7 +9143,7 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
        }
        fprintf(ficresfb,"\n");
        for(j=1;j<=cptcoveff;j++)
-         fprintf(ficresfb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+         fprintf(ficresfb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
        fprintf(ficresfb,"%.f %.f ",anbackd+yearp,agec-h*hstepm/YEARM*stepm);
        for(i=1; i<=nlstate+ndeath;i++) {
          ppij=0.;ppi=0.;
@@ -9157,9 +9210,9 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
       printf("\n#****** ");
       fprintf(ficlog,"\n#****** ");
       for(j=1;j<=cptcoveff;j++) {
-       fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-       fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -9214,9 +9267,9 @@ void prevforecast(char fileres[], double dateintmean, double dateprojd, double d
        printf("\n#****** ");
        fprintf(ficlog,"\n#****** ");
        for(j=1;j<=cptcoveff;j++) {
-        fprintf(ficresvbl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-        fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-        printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+        fprintf(ficresvbl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+        fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+        printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
        }
        for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
         printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -10046,12 +10099,12 @@ void removefirstspace(char **stri){/*, char stro[]) {*/
   *stri=p2; 
 }
 
-int decoderesult ( char resultline[], int nres)
+int decoderesult( char resultline[], int nres)
 /**< This routine decode one result line and returns the combination # of dummy covariates only **/
 {
   int j=0, k=0, k1=0, k2=0, k3=0, k4=0, match=0, k2q=0, k3q=0, k4q=0;
   char resultsav[MAXLINE];
-  int resultmodel[MAXLINE];
+  /* int resultmodel[MAXLINE]; */
   int modelresult[MAXLINE];
   char stra[80], strb[80], strc[80], strd[80],stre[80];
 
@@ -10113,7 +10166,7 @@ int decoderesult ( char resultline[], int nres)
     for(k1=1; k1<= cptcovt ;k1++){ /* loop on model: model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
       if(Typevar[k1]==0){ /* Single */
        if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4   */
-         resultmodel[k1]=k2;  /* k2th variable of the model corresponds to k1 variable of the model. resultmodel[2]=1 resultmodel[1]=2  resultmodel[3]=3  resultmodel[6]=4 resultmodel[9]=5 */
+         resultmodel[nres][k1]=k2;  /* k1th position in the model equation corresponds to k2th position in the result line. resultmodel[2]=1 resultmodel[1]=2  resultmodel[3]=3  resultmodel[6]=4 resultmodel[9]=5 */
          ++match;
        }
       }
@@ -10131,40 +10184,59 @@ int decoderesult ( char resultline[], int nres)
       
   /* We need to deduce which combination number is chosen and save quantitative values */
   /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
-  /* result line V4=1 V5=25.1 V3=0  V2=8 V1=1 */
-  /* should give a combination of dummy V4=1, V3=0, V1=1 => V4*2**(0) + V3*2**(1) + V1*2**(2) = 5 + (1offset) = 6*/
-  /* result line V4=1 V5=24.1 V3=1  V2=8 V1=0 */
+  /* nres=1st result line: V4=1 V5=25.1 V3=0  V2=8 V1=1 */
+  /* should correspond to the combination 6 of dummy: V4=1, V3=0, V1=1 => V4*2**(0) + V3*2**(1) + V1*2**(2) = 1*1 + 0*2 + 1*4 = 5 + (1offset) = 6*/
+  /* nres=2nd result line: V4=1 V5=24.1 V3=1  V2=8 V1=0 */
   /* should give a combination of dummy V4=1, V3=1, V1=0 => V4*2**(0) + V3*2**(1) + V1*2**(2) = 3 + (1offset) = 4*/
   /*    1 0 0 0 */
   /*    2 1 0 0 */
   /*    3 0 1 0 */ 
-  /*    4 1 1 0 */ /* V4=1, V3=1, V1=0 */
+  /*    4 1 1 0 */ /* V4=1, V3=1, V1=0 (nres=2)*/
   /*    5 0 0 1 */
-  /*    6 1 0 1 */ /* V4=1, V3=0, V1=1 */
+  /*    6 1 0 1 */ /* V4=1, V3=0, V1=1 (nres=1)*/
   /*    7 0 1 1 */
   /*    8 1 1 1 */
   /* V(Tvresult)=Tresult V4=1 V3=0 V1=1 Tresult[nres=1][2]=0 */
   /* V(Tvqresult)=Tqresult V5=25.1 V2=8 Tqresult[nres=1][1]=25.1 */
   /* V5*age V5 known which value for nres?  */
   /* Tqinvresult[2]=8 Tqinvresult[1]=25.1  */
-  for(k1=1, k=0, k4=0, k4q=0; k1 <=cptcovt;k1++){ /* loop on model line */
+  for(k1=1, k=0, k4=0, k4q=0; k1 <=cptcovt;k1++){ /* loop k1 on position in the model line (excluding product) */
     if( Dummy[k1]==0 && Typevar[k1]==0 ){ /* Single dummy */
-      k3= resultmodel[k1]; /* resultmodel[2(V4)] = 1=k3 */
-      k2=(int)Tvarsel[k3]; /*  Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */
-      k+=Tvalsel[k3]*pow(2,k4);  /*  Tvalsel[1]=1  */
-      Tresult[nres][k4+1]=Tvalsel[k3];/* Tresult[nres][1]=1(V4=1)  Tresult[nres][2]=0(V3=0) */
+      /* k4+1= position in the resultline V(Tvarsel)=Tvalsel=Tresult[nres][pos](value); V(Tvresult[nres][pos] (variable): V(variable)=value) */
+      /* modelresult[k3]=k1: k3th position in the result line correspond to the k1 position in the model line */
+      /* Value in the (current nres) resultline of the variable at the k1th position in the model equation resultmodel[nres][k1]= k3 */
+      /* resultmodel[nres][k1]=k3: k1th position in the model correspond to the k3 position in the resultline */
+      /*      k3 is the position in the nres result line of the k1th variable of the model equation                                          */
+      /* Tvarsel: Name of the variable at the k3th position in the result line Tvarsel[k3].                                                  */
+      /* Tvalsel: Value of the variable at the k3th position in the result line Tvarsel[k3].                                                 */
+      /* Tresult[nres][result_position]= value of the dummy variable at the result_position in the nres resultline                                 */
+      /* Tvresult[nres][result_position]= id of the dummy variable at the result_position in the nres resultline                                   */
+      /* Tinvresult[nres][Name of a dummy variable]= value of the variable in the result line                                                      */
+      /* TinvDoQresult[nres][Name of a Dummy or Q variable]= value of the variable in the result line                                                      */
+      k3= resultmodel[nres][k1]; /* nres=1 k1=2 resultmodel[2(V4)] = 1=k3 ; k1=3 resultmodel[3(V3)] = 2=k3*/
+      k2=(int)Tvarsel[k3]; /* nres=1 k1=2=>k3=1 Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 (V4); k1=3=>k3=2 Tvarsel[2]=3 (V3)*/
+      k+=Tvalsel[k3]*pow(2,k4);  /* nres=1 k1=2 Tvalsel[1]=1 (V4=1); k1=3 k3=2 Tvalsel[2]=0 (V3=0) */
+      Tresult[nres][k4+1]=Tvalsel[k3];/* Tresult[nres=2][1]=1(V4=1)  Tresult[nres=2][2]=0(V3=0) */
       Tvresult[nres][k4+1]=(int)Tvarsel[k3];/* Tvresult[nres][1]=4 Tvresult[nres][3]=1 */
       Tinvresult[nres][(int)Tvarsel[k3]]=Tvalsel[k3]; /* Tinvresult[nres][4]=1 */
+      TinvDoQresult[nres][(int)Tvarsel[k3]]=Tvalsel[k3]; /* Tinvresult[nres][4]=1 */
       printf("Decoderesult Dummy k=%d, V(k2=V%d)= Tvalsel[%d]=%d, 2**(%d)\n",k, k2, k3, (int)Tvalsel[k3], k4);
       k4++;;
     }  else if( Dummy[k1]==1 && Typevar[k1]==0 ){ /* Single quantitative */
-      k3q= resultmodel[k1]; /* resultmodel[1(V5)] = 25.1=k3q */
+      /* Tqresult[nres][result_position]= value of the variable at the result_position in the nres resultline                                 */
+      /* Tqvresult[nres][result_position]= id of the variable at the result_position in the nres resultline                                 */
+      /* Tqinvresult[nres][Name of a quantitative variable]= value of the variable in the result line                                                      */
+      k3q= resultmodel[nres][k1]; /* resultmodel[1(V5)] = 25.1=k3q */
       k2q=(int)Tvarsel[k3q]; /*  Tvarsel[resultmodel[1]]= Tvarsel[1] = 4=k2 */
       Tqresult[nres][k4q+1]=Tvalsel[k3q]; /* Tqresult[nres][1]=25.1 */
       Tvqresult[nres][k4q+1]=(int)Tvarsel[k3q]; /* Tvqresult[nres][1]=5 */
       Tqinvresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* Tqinvresult[nres][5]=25.1 */
+      TinvDoQresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* Tqinvresult[nres][5]=25.1 */
       printf("Decoderesult Quantitative nres=%d, V(k2q=V%d)= Tvalsel[%d]=%d, Tvarsel[%d]=%f\n",nres, k2q, k3q, Tvarsel[k3q], k3q, Tvalsel[k3q]);
       k4q++;;
+    }else{
+      printf("Decodemodel probably a product  Dummy[%d]==%d && Typevar[%d]==%d\n", k1, Dummy[k1], k1, Typevar[k1]);
+      fprintf(ficlog,"Decodemodel probably a product  Dummy[%d]==%d && Typevar[%d]==%d\n", k1, Dummy[k1], k1, Typevar[k1]);
     }
   }
   
@@ -10336,7 +10408,9 @@ int decodemodel( char model[], int lastobs)
            Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2  */
            Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 */
            Tvard[k1][1] =atoi(strc); /* m 1 for V1*/
+           Tvardk[k][1] =atoi(strc); /* m 1 for V1*/
            Tvard[k1][2] =atoi(stre); /* n 4 for V4*/
+           Tvardk[k][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) *\/ */
@@ -10408,6 +10482,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       modell[k].maintype= FTYPE;
       TvarsD[nsd]=Tvar[k];
       TvarsDind[nsd]=k;
+      TnsdVar[Tvar[k]]=nsd;
       TvarF[ncovf]=Tvar[k];
       TvarFind[ncovf]=k;
       TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
@@ -10419,6 +10494,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       ncovf++;
       modell[k].maintype= FTYPE;
       TvarF[ncovf]=Tvar[k];
+      /* TnsdVar[Tvar[k]]=nsd; */ /* To be done */
       TvarFind[ncovf]=k;
       TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
       TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
@@ -10445,6 +10521,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       nsd++;
       TvarsD[nsd]=Tvar[k];
       TvarsDind[nsd]=k;
+      TnsdVar[Tvar[k]]=nsd; /* To be verified */
       ncovv++; /* Only simple time varying variables */
       TvarV[ncovv]=Tvar[k];
       TvarVind[ncovv]=k; /* TvarVind[2]=2  TvarVind[3]=3 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Any time varying singele */
@@ -11030,9 +11107,9 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
       printf("#******");
       fprintf(ficlog,"#******");
       for(j=1;j<=cptcoveff ;j++) {/* all covariates */
-       fprintf(ficrespl," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); /* Here problem for varying dummy*/
-       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)]);
+       fprintf(ficrespl," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]); /* Here problem for varying dummy*/
+       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
@@ -11051,7 +11128,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
 
       fprintf(ficrespl,"#Age ");
       for(j=1;j<=cptcoveff;j++) {
-       fprintf(ficrespl,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficrespl,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for(i=1; i<=nlstate;i++) fprintf(ficrespl,"  %d-%d   ",i,i);
       fprintf(ficrespl,"Total Years_to_converge\n");
@@ -11061,7 +11138,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
        prevalim(prlim, nlstate, p, age, oldm, savm, ftolpl, ncvyearp, k, nres);
        fprintf(ficrespl,"%.0f ",age );
        for(j=1;j<=cptcoveff;j++)
-         fprintf(ficrespl,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+         fprintf(ficrespl,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
        tot=0.;
        for(i=1; i<=nlstate;i++){
          tot +=  prlim[i][i];
@@ -11121,9 +11198,9 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
       printf("#******");
       fprintf(ficlog,"#******");
       for(j=1;j<=cptcoveff ;j++) {/* all covariates */
-       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)]);
+       fprintf(ficresplb," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -11142,7 +11219,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
     
       fprintf(ficresplb,"#Age ");
       for(j=1;j<=cptcoveff;j++) {
-       fprintf(ficresplb,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficresplb,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for(i=1; i<=nlstate;i++) fprintf(ficresplb,"  %d-%d   ",i,i);
       fprintf(ficresplb,"Total Years_to_converge\n");
@@ -11166,7 +11243,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
        }
        fprintf(ficresplb,"%.0f ",age );
        for(j=1;j<=cptcoveff;j++)
-         fprintf(ficresplb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+         fprintf(ficresplb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
        tot=0.;
        for(i=1; i<=nlstate;i++){
          tot +=  bprlim[i][i];
@@ -11224,7 +11301,7 @@ int hPijx(double *p, int bage, int fage){
        continue;
       fprintf(ficrespij,"\n#****** ");
       for(j=1;j<=cptcoveff;j++) 
-       fprintf(ficrespij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficrespij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
        fprintf(ficrespij," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
@@ -11303,7 +11380,7 @@ int hPijx(double *p, int bage, int fage){
        continue;
       fprintf(ficrespijb,"\n#****** ");
       for(j=1;j<=cptcoveff;j++)
-       fprintf(ficrespijb,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficrespijb,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        fprintf(ficrespijb," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
       }
@@ -12044,6 +12121,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   
   Tvar=ivector(1,NCOVMAX); /* Was 15 changed to NCOVMAX. */
   TvarsDind=ivector(1,NCOVMAX); /*  */
+  TnsdVar=ivector(1,NCOVMAX); /*  */
   TvarsD=ivector(1,NCOVMAX); /*  */
   TvarsQind=ivector(1,NCOVMAX); /*  */
   TvarsQ=ivector(1,NCOVMAX); /*  */
@@ -12086,6 +12164,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   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) */
+  Tvardk=imatrix(1,NCOVMAX,1,2);
   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
@@ -13289,8 +13368,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficreseij,"\n#****** ");
       printf("\n#****** ");
       for(j=1;j<=cptcoveff;j++) {
-       fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -13301,6 +13380,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       
       eij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage);
       oldm=oldms;savm=savms;
+      /* printf("HELLO Entering evsij bage=%d fage=%d k=%d estepm=%d nres=%d\n",(int) bage, (int)fage, k, estepm, nres); */
       evsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, strstart, nres);  
       
       free_ma3x(eij,1,nlstate,1,nlstate,(int) bage, (int)fage);
@@ -13358,9 +13438,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficrest,"\n# model %s \n#****** Result for:", model);
       fprintf(ficlog,"\n# model %s \n#****** Result for:", model);
       for(j=1;j<=cptcoveff;j++){ 
-       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-       fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
-       fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -13374,8 +13454,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficresstdeij,"\n#****** ");
       fprintf(ficrescveij,"\n#****** ");
       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)]);
+       fprintf(ficresstdeij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
+       fprintf(ficrescveij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       }
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        fprintf(ficresstdeij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
@@ -13387,7 +13467,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficresvij,"\n#****** ");
       /* pstamp(ficresvij); */
       for(j=1;j<=cptcoveff;j++) 
-       fprintf(ficresvij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+       fprintf(ficresvij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,Tvaraff[j])]);
       for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
        fprintf(ficresvij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
       }        
@@ -13477,6 +13557,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
 
     
     free_vector(weight,firstobs,lastobs);
+    free_imatrix(Tvardk,1,NCOVMAX,1,2);
     free_imatrix(Tvard,1,NCOVMAX,1,2);
     free_imatrix(s,1,maxwav+1,firstobs,lastobs);
     free_matrix(anint,1,maxwav,firstobs,lastobs); 
@@ -13524,6 +13605,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
   free_ivector(TvarsQ,1,NCOVMAX);
   free_ivector(TvarsQind,1,NCOVMAX);
   free_ivector(TvarsD,1,NCOVMAX);
+  free_ivector(TnsdVar,1,NCOVMAX);
   free_ivector(TvarsDind,1,NCOVMAX);
   free_ivector(TvarFD,1,NCOVMAX);
   free_ivector(TvarFDind,1,NCOVMAX);