]> henry.ined.fr Git - .git/commitdiff
Summary: Fixes
authorN. Brouard <brouard@ined.fr>
Fri, 1 Jul 2016 13:16:01 +0000 (13:16 +0000)
committerN. Brouard <brouard@ined.fr>
Fri, 1 Jul 2016 13:16:01 +0000 (13:16 +0000)
src/imach.c

index 701bc06e314db9ee5448a275517f6b8026a6c021..1ebc38a6ab27d1181a58fa9513772e28d9f9af70 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.223  2016/02/19 09:23:35  brouard
+  Summary: temporary
+
   Revision 1.222  2016/02/17 08:14:50  brouard
   Summary: Probably last 0.98 stable version 0.98r6
 
@@ -742,9 +745,9 @@ Back prevalence and projections:
 /* #define DEBUGLINMIN */
 /* #define DEBUGHESS */
 #define DEBUGHESSIJ
-/* #define LINMINORIGINAL  /\* Don't use loop on scale in linmin (accepting nan)*\/ */
+/* #define LINMINORIGINAL  /\* Don't use loop on scale in linmin (accepting nan) *\/ */
 #define POWELL /* Instead of NLOPT */
-#define POWELLF1F3 /* Skip test */
+#define POWELLNOF3INFF1TEST /* Skip test */
 /* #define POWELLORIGINAL /\* Don't use Directest to decide new direction but original Powell test *\/ */
 /* #define MNBRAKORIGINAL /\* Don't use mnbrak fix *\/ */
 
@@ -838,7 +841,7 @@ typedef struct {
 /* $State$ */
 #include "version.h"
 char version[]=__IMACH_VERSION__;
-char copyright[]="October 2015,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015";
+char copyright[]="February 2016,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2018";
 char fullversion[]="$Revision$ $Date$"; 
 char strstart[80];
 char optionfilext[10], optionfilefiname[FILENAMELENGTH];
@@ -851,6 +854,10 @@ 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 ncoveff=0; /* Total number of effective covariates in the model */
+int nqveff=0; /**< nqveff number of effective quantitative variables */
+int ntveff=0; /**< ntveff number of effective time varying variables */
+int nqtveff=0; /**< ntqveff number of effective time varying quantitative variables */
 int cptcov=0; /* Working variable */
 int ncovcombmax=NCOVMAX; /* Maximum calculated number of covariate combination = pow(2, cptcoveff) */
 int npar=NPARMAX;
@@ -996,9 +1003,9 @@ double *agedc;
 double  **covar; /**< covar[j,i], value of jth covariate for individual i,
                  * covar=matrix(0,NCOVMAX,1,n); 
                  * cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*age; */
+double **coqvar; /* Fixed quantitative covariate */
 double ***cotvar; /* Time varying covariate */
 double ***cotqvar; /* Time varying quantitative covariate */
-double **coqvar; /* Fixed quantitative covariate */
 double  idx; 
 int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
 int *Tage;
@@ -1546,12 +1553,12 @@ double brent(double ax, double bx, double cx, double (*f)(double), double tol,
       etemp=e; 
       e=d; 
       if (fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) 
-       d=CGOLD*(e=(x >= xm ? a-x : b-x)); 
+                               d=CGOLD*(e=(x >= xm ? a-x : b-x)); 
       else { 
-       d=p/q; 
-       u=x+d; 
-       if (u-a < tol2 || b-u < tol2) 
-         d=SIGN(tol1,xm-x); 
+                               d=p/q; 
+                               u=x+d; 
+                               if (u-a < tol2 || b-u < tol2) 
+                                       d=SIGN(tol1,xm-x); 
       } 
     } else { 
       d=CGOLD*(e=(x >= xm ? a-x : b-x)); 
@@ -1565,13 +1572,13 @@ double brent(double ax, double bx, double cx, double (*f)(double), double tol,
     } else { 
       if (u < x) a=u; else b=u; 
       if (fu <= fw || w == x) { 
-       v=w; 
-       w=u; 
-       fv=fw; 
-       fw=fu; 
+                               v=w; 
+                               w=u; 
+                               fv=fw; 
+                               fw=fu; 
       } else if (fu <= fv || v == x || v == w) { 
-       v=u; 
-       fv=fu; 
+                               v=u; 
+                               fv=fu; 
       } 
     } 
   } 
@@ -1612,12 +1619,12 @@ values at the three points, fa, fb , and fc such that fa > fb and fb < fc.
   *cx=(*bx)+GOLD*(*bx-*ax); 
   *fc=(*func)(*cx); 
 #ifdef DEBUG
-  printf("mnbrak0 *fb=%.12e *fc=%.12e\n",*fb,*fc);
-  fprintf(ficlog,"mnbrak0 *fb=%.12e *fc=%.12e\n",*fb,*fc);
+  printf("mnbrak0 a=%lf *fa=%lf, b=%lf *fb=%lf, c=%lf *fc=%lf\n",*ax,*fa,*bx,*fb,*cx, *fc);
+  fprintf(ficlog,"mnbrak0 a=%lf *fa=%lf, b=%lf *fb=%lf, c=%lf *fc=%lf\n",*ax,*fa,*bx,*fb,*cx, *fc);
 #endif
-  while (*fb > *fc) { /* Declining a,b,c with fa> fb > fc */
+  while (*fb > *fc) { /* Declining a,b,c with fa> fb > fc. If fc=inf it exits and if flat fb=fc it exits too.*/
     r=(*bx-*ax)*(*fb-*fc); 
-    q=(*bx-*cx)*(*fb-*fa); 
+    q=(*bx-*cx)*(*fb-*fa); /* What if fa=inf */
     u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ 
       (2.0*SIGN(FMAX(fabs(q-r),TINY),q-r)); /* Minimum abscissa of a parabolic estimated from (a,fa), (b,fb) and (c,fc). */
     ulim=(*bx)+GLIMIT*(*cx-*bx); /* Maximum abscissa where function should be evaluated */
@@ -1628,8 +1635,8 @@ values at the three points, fa, fb , and fc such that fa > fb and fb < fc.
       double A, fparabu; 
       A= (*fb - *fa)/(*bx-*ax)/(*bx+*ax-2*u);
       fparabu= *fa - A*(*ax-u)*(*ax-u);
-      printf("mnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf, fparabu=%.12f)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu);
-      fprintf(ficlog, "mnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf, fparabu=%.12f)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu);
+      printf("\nmnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf, fparabu=%.12f, q=%lf < %lf=r)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu,q,r);
+      fprintf(ficlog,"\nmnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf, fparabu=%.12f, q=%lf < %lf=r)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu,q,r);
       /* And thus,it can be that fu > *fc even if fparabu < *fc */
       /* mnbrak (*ax=7.666299858533, *fa=299039.693133272231), (*bx=8.595447774979, *fb=298976.598289369489),
         (*cx=10.098840694817, *fc=298946.631474258087),  (*u=9.852501168332, fu=298948.773013752128, fparabu=298945.434711494134) */
@@ -1662,9 +1669,12 @@ values at the three points, fa, fb , and fc such that fa > fb and fb < fc.
 /*     fu = *fc; */
 /*     *fc =dum; */
 /*       } */
-#ifdef DEBUG
-      printf("mnbrak34  fu < or >= fc \n");
-      fprintf(ficlog, "mnbrak34 fu < fc\n");
+#ifdef DEBUGMNBRAK
+                double A, fparabu; 
+     A= (*fb - *fa)/(*bx-*ax)/(*bx+*ax-2*u);
+     fparabu= *fa - A*(*ax-u)*(*ax-u);
+     printf("\nmnbrak35 ax=%lf fa=%lf bx=%lf fb=%lf, u=%lf fp=%lf fu=%lf < or >= fc=%lf cx=%lf, q=%lf < %lf=r \n",*ax, *fa, *bx,*fb,u,fparabu,fu,*fc,*cx,q,r);
+     fprintf(ficlog,"\nmnbrak35 ax=%lf fa=%lf bx=%lf fb=%lf, u=%lf fp=%lf fu=%lf < or >= fc=%lf cx=%lf, q=%lf < %lf=r \n",*ax, *fa, *bx,*fb,u,fparabu,fu,*fc,*cx,q,r);
 #endif
       dum=u; /* Shifting c and u */
       u = *cx;
@@ -1675,38 +1685,45 @@ values at the three points, fa, fb , and fc such that fa > fb and fb < fc.
 #endif
     } else if ((*cx-u)*(u-ulim) > 0.0) { /* u is after c but before ulim */
 #ifdef DEBUG
-      printf("mnbrak2  u after c but before ulim\n");
-      fprintf(ficlog, "mnbrak2 u after c but before ulim\n");
+      printf("\nmnbrak2  u=%lf after c=%lf but before ulim\n",u,*cx);
+      fprintf(ficlog,"\nmnbrak2  u=%lf after c=%lf but before ulim\n",u,*cx);
 #endif
       fu=(*func)(u); 
       if (fu < *fc) { 
 #ifdef DEBUG
-      printf("mnbrak2  u after c but before ulim AND fu < fc\n");
-      fprintf(ficlog, "mnbrak2 u after c but before ulim AND fu <fc \n");
+                               printf("\nmnbrak2  u=%lf after c=%lf but before ulim=%lf AND fu=%lf < %lf=fc\n",u,*cx,ulim,fu, *fc);
+                         fprintf(ficlog,"\nmnbrak2  u=%lf after c=%lf but before ulim=%lf AND fu=%lf < %lf=fc\n",u,*cx,ulim,fu, *fc);
+#endif
+                         SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx)) 
+                               SHFT(*fb,*fc,fu,(*func)(u)) 
+#ifdef DEBUG
+                                       printf("\nmnbrak2 shift GOLD c=%lf",*cx+GOLD*(*cx-*bx));
 #endif
-       SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx)) 
-       SHFT(*fb,*fc,fu,(*func)(u)) 
       } 
     } else if ((u-ulim)*(ulim-*cx) >= 0.0) { /* u outside ulim (verifying that ulim is beyond c) */
 #ifdef DEBUG
-      printf("mnbrak2  u outside ulim (verifying that ulim is beyond c)\n");
-      fprintf(ficlog, "mnbrak2 u outside ulim (verifying that ulim is beyond c)\n");
+      printf("\nmnbrak2  u=%lf outside ulim=%lf (verifying that ulim is beyond c=%lf)\n",u,ulim,*cx);
+      fprintf(ficlog,"\nmnbrak2  u=%lf outside ulim=%lf (verifying that ulim is beyond c=%lf)\n",u,ulim,*cx);
 #endif
       u=ulim; 
       fu=(*func)(u); 
     } else { /* u could be left to b (if r > q parabola has a maximum) */
 #ifdef DEBUG
-      printf("mnbrak2  u could be left to b (if r > q parabola has a maximum)\n");
-      fprintf(ficlog, "mnbrak2  u could be left to b (if r > q parabola has a maximum)\n");
+      printf("\nmnbrak2  u=%lf could be left to b=%lf (if r=%lf > q=%lf parabola has a maximum)\n",u,*bx,r,q);
+      fprintf(ficlog,"\nmnbrak2  u=%lf could be left to b=%lf (if r=%lf > q=%lf parabola has a maximum)\n",u,*bx,r,q);
 #endif
       u=(*cx)+GOLD*(*cx-*bx); 
       fu=(*func)(u); 
+#ifdef DEBUG
+      printf("\nmnbrak2 new u=%lf fu=%lf shifted gold left from c=%lf and b=%lf \n",u,fu,*cx,*bx);
+      fprintf(ficlog,"\nmnbrak2 new u=%lf fu=%lf shifted gold left from c=%lf and b=%lf \n",u,fu,*cx,*bx);
+#endif
     } /* end tests */
     SHFT(*ax,*bx,*cx,u) 
     SHFT(*fa,*fb,*fc,fu) 
 #ifdef DEBUG
-      printf("mnbrak2 (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu);
-      fprintf(ficlog, "mnbrak2 (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf),  (*u=%.12f, fu=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu);
+      printf("\nmnbrak2 shift (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc);
+      fprintf(ficlog, "\nmnbrak2 shift (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc);
 #endif
   } /* end while; ie return (a, b, c, fa, fb, fc) such that a < b < c with f(a) > f(b) and fb < f(c) */
 } 
@@ -1721,7 +1738,11 @@ int ncom;
 double *pcom,*xicom;
 double (*nrfunc)(double []); 
  
+#ifdef LINMINORIGINAL
 void linmin(double p[], double xi[], int n, double *fret,double (*func)(double [])) 
+#else
+void linmin(double p[], double xi[], int n, double *fret,double (*func)(double []), int *flat) 
+#endif
 { 
   double brent(double ax, double bx, double cx, 
               double (*f)(double), double tol, double *xmin); 
@@ -1765,28 +1786,41 @@ void linmin(double p[], double xi[], int n, double *fret,double (*func)(double [
 #ifdef LINMINORIGINAL
 #else
     if (fx != fx){
-       xxs=xxs/scale; /* Trying a smaller xx, closer to initial ax=0 */
-       printf("|");
-       fprintf(ficlog,"|");
+                       xxs=xxs/scale; /* Trying a smaller xx, closer to initial ax=0 */
+                       printf("|");
+                       fprintf(ficlog,"|");
 #ifdef DEBUGLINMIN
-       printf("\nLinmin NAN : input [axs=%lf:xxs=%lf], mnbrak outputs fx=%lf <(fb=%lf and fa=%lf) with xx=%lf in [ax=%lf:bx=%lf] \n",  axs, xxs, fx,fb, fa, xx, ax, bx);
+                       printf("\nLinmin NAN : input [axs=%lf:xxs=%lf], mnbrak outputs fx=%lf <(fb=%lf and fa=%lf) with xx=%lf in [ax=%lf:bx=%lf] \n",  axs, xxs, fx,fb, fa, xx, ax, bx);
 #endif
     }
-  }while(fx != fx);
+  }while(fx != fx && xxs > 1.e-5);
 #endif
   
 #ifdef DEBUGLINMIN
   printf("\nLinmin after mnbrak: ax=%12.7f xx=%12.7f bx=%12.7f fa=%12.2f fx=%12.2f fb=%12.2f\n",  ax,xx,bx,fa,fx,fb);
   fprintf(ficlog,"\nLinmin after mnbrak: ax=%12.7f xx=%12.7f bx=%12.7f fa=%12.2f fx=%12.2f fb=%12.2f\n",  ax,xx,bx,fa,fx,fb);
 #endif
+#ifdef LINMINORIGINAL
+#else
+       if(fb == fx){ /* Flat function in the direction */
+               xmin=xx;
+    *flat=1;
+       }else{
+    *flat=0;
+#endif
+               /*Flat mnbrak2 shift (*ax=0.000000000000, *fa=51626.272983130431), (*bx=-1.618034000000, *fb=51590.149499362531), (*cx=-4.236068025156, *fc=51590.149499362531) */
   *fret=brent(ax,xx,bx,f1dim,TOL,&xmin); /* Giving a bracketting triplet (ax, xx, bx), find a minimum, xmin, according to f1dim, *fret(xmin),*/
   /* fa = f(p[j] + ax * xi[j]), fx = f(p[j] + xx * xi[j]), fb = f(p[j] + bx * xi[j]) */
   /* fmin = f(p[j] + xmin * xi[j]) */
   /* P+lambda n in that direction (lambdamin), with TOL between abscisses */
   /* f1dim(xmin): for (j=1;j<=ncom;j++) xt[j]=pcom[j]+xmin*xicom[j]; */
 #ifdef DEBUG
-  printf("retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
-  fprintf(ficlog,"retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
+  printf("retour brent from bracket (a=%lf fa=%lf, xx=%lf fx=%lf, b=%lf fb=%lf): fret=%lf xmin=%lf\n",ax,fa,xx,fx,bx,fb,*fret,xmin);
+  fprintf(ficlog,"retour brent from bracket (a=%lf fa=%lf, xx=%lf fx=%lf, b=%lf fb=%lf): fret=%lf xmin=%lf\n",ax,fa,xx,fx,bx,fb,*fret,xmin);
+#endif
+#ifdef LINMINORIGINAL
+#else
+                       }
 #endif
 #ifdef DEBUGLINMIN
   printf("linmin end ");
@@ -1836,17 +1870,33 @@ such that failure to decrease by more than this amount on one iteration signals
 output, p is set to the best point found, xi is the then-current direction set, fret is the returned
 function value at p , and iter is the number of iterations taken. The routine linmin is used.
  */
+#ifdef LINMINORIGINAL
+#else
+       int *flatdir; /* Function is vanishing in that direction */
+       int flat=0; /* Function is vanishing in that direction */
+#endif
 void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret, 
            double (*func)(double [])) 
 { 
-  void linmin(double p[], double xi[], int n, double *fret, 
+#ifdef LINMINORIGINAL
+ void linmin(double p[], double xi[], int n, double *fret, 
              double (*func)(double [])); 
+#else 
+ void linmin(double p[], double xi[], int n, double *fret, 
+                                                double (*func)(double []),int *flat); 
+#endif
   int i,ibig,j; 
   double del,t,*pt,*ptt,*xit;
   double directest;
   double fp,fptt;
   double *xits;
   int niterf, itmp;
+#ifdef LINMINORIGINAL
+#else
+
+  flatdir=ivector(1,n); 
+  for (j=1;j<=n;j++) flatdir[j]=0; 
+#endif
 
   pt=vector(1,n); 
   ptt=vector(1,n); 
@@ -1880,18 +1930,18 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       rforecast_time=rcurr_time; 
       itmp = strlen(strcurr);
       if(strcurr[itmp-1]=='\n')  /* Windows outputs with a new line */
-       strcurr[itmp-1]='\0';
+                               strcurr[itmp-1]='\0';
       printf("\nConsidering the time needed for the last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time);
       fprintf(ficlog,"\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time);
       for(niterf=10;niterf<=30;niterf+=10){
-       rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time);
-       forecast_time = *localtime(&rforecast_time);
-       strcpy(strfor,asctime(&forecast_time));
-       itmp = strlen(strfor);
-       if(strfor[itmp-1]=='\n')
-       strfor[itmp-1]='\0';
-       printf("   - if your program needs %d iterations to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
-       fprintf(ficlog,"   - if your program needs %d iterations to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
+                               rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time);
+                               forecast_time = *localtime(&rforecast_time);
+                               strcpy(strfor,asctime(&forecast_time));
+                               itmp = strlen(strfor);
+                               if(strfor[itmp-1]=='\n')
+                                       strfor[itmp-1]='\0';
+                               printf("   - if your program needs %d iterations to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
+                               fprintf(ficlog,"   - if your program needs %d iterations to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
       }
     }
     for (i=1;i<=n;i++) { /* For each direction i */
@@ -1903,27 +1953,32 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
 #endif
       printf("%d",i);fflush(stdout); /* print direction (parameter) i */
       fprintf(ficlog,"%d",i);fflush(ficlog);
+#ifdef LINMINORIGINAL
       linmin(p,xit,n,fret,func); /* Point p[n]. xit[n] has been loaded for direction i as input.*/
-                                   /* Outputs are fret(new point p) p is updated and xit rescaled */
+#else
+      linmin(p,xit,n,fret,func,&flat); /* Point p[n]. xit[n] has been loaded for direction i as input.*/
+                       flatdir[i]=flat; /* Function is vanishing in that direction i */
+#endif
+                       /* Outputs are fret(new point p) p is updated and xit rescaled */
       if (fabs(fptt-(*fret)) > del) { /* We are keeping the max gain on each of the n directions */
-       /* because that direction will be replaced unless the gain del is small */
-       /* in comparison with the 'probable' gain, mu^2, with the last average direction. */
-       /* Unless the n directions are conjugate some gain in the determinant may be obtained */
-       /* with the new direction. */
-       del=fabs(fptt-(*fret)); 
-       ibig=i; 
+                               /* because that direction will be replaced unless the gain del is small */
+                               /* in comparison with the 'probable' gain, mu^2, with the last average direction. */
+                               /* Unless the n directions are conjugate some gain in the determinant may be obtained */
+                               /* with the new direction. */
+                               del=fabs(fptt-(*fret)); 
+                               ibig=i; 
       } 
 #ifdef DEBUG
       printf("%d %.12e",i,(*fret));
       fprintf(ficlog,"%d %.12e",i,(*fret));
       for (j=1;j<=n;j++) {
-       xits[j]=FMAX(fabs(p[j]-pt[j]),1.e-5);
-       printf(" x(%d)=%.12e",j,xit[j]);
-       fprintf(ficlog," x(%d)=%.12e",j,xit[j]);
+                               xits[j]=FMAX(fabs(p[j]-pt[j]),1.e-5);
+                               printf(" x(%d)=%.12e",j,xit[j]);
+                               fprintf(ficlog," x(%d)=%.12e",j,xit[j]);
       }
       for(j=1;j<=n;j++) {
-       printf(" p(%d)=%.12e",j,p[j]);
-       fprintf(ficlog," p(%d)=%.12e",j,p[j]);
+                       printf(" p(%d)=%lf ",j,p[j]);
+                       fprintf(ficlog," p(%d)=%lf ",j,p[j]);
       }
       printf("\n");
       fprintf(ficlog,"\n");
@@ -1932,6 +1987,13 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     /* Convergence test will use last linmin estimation (fret) and compare former iteration (fp) */ 
     /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit  */
     /* New value of last point Pn is not computed, P(n-1) */
+      for(j=1;j<=n;j++) {
+                         printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+                         fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+      }
+      printf("\n");
+      fprintf(ficlog,"\n");
+
     if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) { /* Did we reach enough precision? */
       /* We could compare with a chi^2. chisquare(0.95,ddl=1)=3.84 */
       /* By adding age*age in a model, the new -2LL should be lower and the difference follows a */
@@ -1940,7 +2002,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       /* By adding age*age and V1*age the gain (-2LL) should be more than 5.99 (ddl=2) */
       /* By using V1+V2+V3, the gain should be  7.82, compared with basic 1+age. */
       /* By adding 10 parameters more the gain should be 18.31 */
-
+                       
       /* Starting the program with initial values given by a former maximization will simply change */
       /* the scales of the directions and the directions, because the are reset to canonical directions */
       /* Thus the first calls to linmin will give new points and better maximizations until fp-(*fret) is */
@@ -1968,7 +2030,10 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       }
 #endif
 
-
+#ifdef LINMINORIGINAL
+#else
+      free_ivector(flatdir,1,n); 
+#endif
       free_vector(xit,1,n); 
       free_vector(xits,1,n); 
       free_vector(ptt,1,n); 
@@ -1982,7 +2047,10 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       pt[j]=p[j]; 
     } 
     fptt=(*func)(ptt); /* f_3 */
-#ifdef POWELLF1F3
+#ifdef NODIRECTIONCHANGEDUNTILNITER  /* No change in drections until some iterations are done */
+               if (*iter <=4) {
+#else                  
+#ifdef POWELLNOF3INFF1TEST    /* skips test F3 <F1 */
 #else
     if (fptt < fp) { /* If extrapolated point is better, decide if we keep that new direction or not */
 #endif
@@ -1991,8 +2059,16 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       /* Let f"(x2) be the 2nd derivative equal everywhere.  */
       /* Then the parabolic through (x1,f1), (x2,f2) and (x3,f3) */
       /* will reach at f3 = fm + h^2/2 f"m  ; f" = (f1 -2f2 +f3 ) / h**2 */
-      /* Conditional for using this new direction is that mu^2 = (f1-2f2+f3)^2 /2 < del */
+      /* Conditional for using this new direction is that mu^2 = (f1-2f2+f3)^2 /2 < del or directest <0 */
+      /* also  lamda^2=(f1-f2)^2/mu² is a parasite solution of powell */
+      /* For powell, inclusion of this average direction is only if t(del)<0 or del inbetween mu^2 and lambda^2 */
       /* t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)-del*SQR(fp-fptt); */
+      /*  Even if f3 <f1, directest can be negative and t >0 */
+      /* mu² and del² are equal when f3=f1 */
+                       /* f3 < f1 : mu² < del <= lambda^2 both test are equivalent */
+                       /* f3 < f1 : mu² < lambda^2 < del then directtest is negative and powell t is positive */
+                       /* f3 > f1 : lambda² < mu^2 < del then t is negative and directest >0  */
+                       /* f3 > f1 : lambda² < del < mu^2 then t is positive and directest >0  */
 #ifdef NRCORIGINAL
       t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)- del*SQR(fp-fptt); /* Original Numerical Recipes in C*/
 #else
@@ -2014,56 +2090,75 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       if (t < 0.0) { /* Then we use it for new direction */
 #else
       if (directest*t < 0.0) { /* Contradiction between both tests */
-       printf("directest= %.12lf (if <0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt,del);
+                               printf("directest= %.12lf (if <0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt,del);
         printf("f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
-        fprintf(ficlog,"directest= %.12lf (if <0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt, del);
+        fprintf(ficlog,"directest= %.12lf (if directest<0 or t<0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt, del);
         fprintf(ficlog,"f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
       } 
       if (directest < 0.0) { /* Then we use it for new direction */
 #endif
 #ifdef DEBUGLINMIN
-       printf("Before linmin in direction P%d-P0\n",n);
-       for (j=1;j<=n;j++) { 
-         printf(" Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
-         fprintf(ficlog," Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
-         if(j % ncovmodel == 0){
-           printf("\n");
-           fprintf(ficlog,"\n");
-         }
-       }
+                               printf("Before linmin in direction P%d-P0\n",n);
+                               for (j=1;j<=n;j++) {
+                                       printf(" Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+                                       fprintf(ficlog," Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+                                       if(j % ncovmodel == 0){
+                                               printf("\n");
+                                               fprintf(ficlog,"\n");
+                                       }
+                               }
 #endif
-       linmin(p,xit,n,fret,func); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/
-#ifdef DEBUGLINMIN
-       for (j=1;j<=n;j++) { 
-         printf("After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
-         fprintf(ficlog,"After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
-         if(j % ncovmodel == 0){
-           printf("\n");
-           fprintf(ficlog,"\n");
-         }
-       }
+#ifdef LINMINORIGINAL
+                               linmin(p,xit,n,fret,func); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/
+#else
+                               linmin(p,xit,n,fret,func,&flat); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/
+                               flatdir[i]=flat; /* Function is vanishing in that direction i */
 #endif
-       for (j=1;j<=n;j++) { 
-         xi[j][ibig]=xi[j][n]; /* Replace direction with biggest decrease by last direction n */
-         xi[j][n]=xit[j];      /* and this nth direction by the by the average p_0 p_n */
-       }
-       printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
-       fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
 
+#ifdef DEBUGLINMIN
+                               for (j=1;j<=n;j++) { 
+                                       printf("After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+                                       fprintf(ficlog,"After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+                                       if(j % ncovmodel == 0){
+                                               printf("\n");
+                                               fprintf(ficlog,"\n");
+                                       }
+                               }
+#endif
+                               for (j=1;j<=n;j++) { 
+                                       xi[j][ibig]=xi[j][n]; /* Replace direction with biggest decrease by last direction n */
+                                       xi[j][n]=xit[j];      /* and this nth direction by the by the average p_0 p_n */
+                               }
+#ifdef LINMINORIGINAL
+#else
+                               printf("Flat directions\n");
+                               fprintf(ficlog,"Flat directions\n");
+                               for (j=1;j<=n;j++) { 
+                                       printf("flatdir[%d]=%d ",j,flatdir[j]);
+                                       fprintf(ficlog,"flatdir[%d]=%d ",j,flatdir[j]);
+        }
+                               printf("\n");
+                               fprintf(ficlog,"\n");
+#endif
+                               printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
+                               fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig);
+                               
 #ifdef DEBUG
-       printf("Direction changed  last moved %d in place of ibig=%d, new last is the average:\n",n,ibig);
-       fprintf(ficlog,"Direction changed  last moved %d in place of ibig=%d, new last is the average:\n",n,ibig);
-       for(j=1;j<=n;j++){
-         printf(" %.12e",xit[j]);
-         fprintf(ficlog," %.12e",xit[j]);
-       }
-       printf("\n");
-       fprintf(ficlog,"\n");
+                               printf("Direction changed  last moved %d in place of ibig=%d, new last is the average:\n",n,ibig);
+                               fprintf(ficlog,"Direction changed  last moved %d in place of ibig=%d, new last is the average:\n",n,ibig);
+                               for(j=1;j<=n;j++){
+                                       printf(" %lf",xit[j]);
+                                       fprintf(ficlog," %lf",xit[j]);
+                               }
+                               printf("\n");
+                               fprintf(ficlog,"\n");
 #endif
       } /* end of t or directest negative */
-#ifdef POWELLF1F3
+#ifdef POWELLNOF3INFF1TEST
 #else
     } /* end if (fptt < fp)  */
+#endif
+               } /*NODIRECTIONCHANGEDUNTILNITER  No change in drections until some iterations are done */
 #endif
   } /* loop iteration */ 
 } 
@@ -2775,141 +2870,142 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do
 /*************** log-likelihood *************/
 double func( double *x)
 {
-  int i, ii, j, k, mi, d, kk;
-       int ioffset;
-  double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
-  double **out;
-  double sw; /* Sum of weights */
-  double lli; /* Individual log likelihood */
-  int s1, s2;
-  int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate */
-  double bbh, survp;
-  long ipmx;
-  double agexact;
-  /*extern weight */
-  /* We are differentiating ll according to initial status */
-  /*  for (i=1;i<=npar;i++) printf("%f ", x[i]);*/
-  /*for(i=1;i<imx;i++) 
-    printf(" %d\n",s[4][i]);
-  */
-
-  ++countcallfunc;
-
-  cov[1]=1.;
-
-  for(k=1; k<=nlstate; k++) ll[k]=0.;
+       int i, ii, j, k, mi, d, kk;
+       int ioffset=0;
+       double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
+       double **out;
+       double sw; /* Sum of weights */
+       double lli; /* Individual log likelihood */
+       int s1, s2;
+       int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate */
+       double bbh, survp;
+       long ipmx;
+       double agexact;
+       /*extern weight */
+       /* We are differentiating ll according to initial status */
+       /*  for (i=1;i<=npar;i++) printf("%f ", x[i]);*/
+       /*for(i=1;i<imx;i++) 
+               printf(" %d\n",s[4][i]);
+       */
 
-  if(mle==1){
-    for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-      /* Computes the values of the ncovmodel covariates of the model
-        depending if the covariates are fixed or varying (age dependent) and stores them in cov[]
-        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.
-       */
-      ioffset=2+nagesqr;
-      for (k=1; k<=cptcovn;k++){ /* Simple and product covariates without age* products */
-        cov[++ioffset]=covar[Tvar[k]][i];
-      }
-      for(iqv=1; iqv <= nqv; iqv++){ /* Varying quantitatives covariates */
-       /* cov[2+nagesqr+cptcovn+iqv]=varq[mw[mi+1][i]][iqv][i]; */
-      }
+       ++countcallfunc;
+
+       cov[1]=1.;
+
+       for(k=1; k<=nlstate; k++) ll[k]=0.;
+  ioffset=0;
+       if(mle==1){
+               for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+                       /* Computes the values of the ncovmodel covariates of the model
+                                depending if the covariates are fixed or varying (age dependent) and stores them in cov[]
+                                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.
+                       */
+                       ioffset=2+nagesqr+cptcovage;
+                       /* for (k=1; k<=cptcovn;k++){ /\* Simple and product covariates without age* products *\/ */
+                       for (k=1; k<=ncoveff;k++){ /* Simple and product covariates without age* products */
+                               cov[++ioffset]=covar[Tvar[k]][i];
+                       }
+                       for(iqv=1; iqv <= nqveff; iqv++){ /* Quantitatives covariates */
+                               cov[++ioffset]=coqvar[iqv][i];
+                       }
 
-      /* 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 */
-      /* For an individual i, wav[i] gives the number of effective waves */
-      /* We compute the contribution to Likelihood of each effective transition
-        mw[mi][i] is real wave of the mi th effectve wave */
-      /* Then statuses are computed at each begin and end of an effective wave s1=s[ mw[mi][i] ][i];
-       s2=s[mw[mi+1][i]][i];
-       And the iv th varying covariate is the cotvar[mw[mi+1][i]][iv][i]
-       But if the variable is not in the model TTvar[iv] is the real variable effective in the model:
-       meaning that decodemodel should be used cotvar[mw[mi+1][i]][TTvar[iv]][i]
-      */
-      for(mi=1; mi<= wav[i]-1; mi++){
-       for(itv=1; itv <= ntv; itv++){ /* Varying dummy covariates */
-         cov[++ioffset]=cotvar[mw[mi+1][i]][itv][i];
-       }
-       for(iqtv=1; iqtv <= nqtv; iqtv++){ /* Varying quantitatives covariates */
-         /* cov[2+nagesqr+cptcovn+nqv+ntv+iqtv]=varq[mw[mi+1][i]][iqtv][i]; */
-       }
-       ioffset=2+nagesqr+cptcovn+nqv+ntv+nqtv;
-       for (ii=1;ii<=nlstate+ndeath;ii++)
-         for (j=1;j<=nlstate+ndeath;j++){
-           oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-           savm[ii][j]=(ii==j ? 1.0 : 0.0);
-         }
-       for(d=0; d<dh[mi][i]; d++){
-         newm=savm;
-         agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-         cov[2]=agexact;
-         if(nagesqr==1)
-           cov[3]= agexact*agexact;  /* Should be changed here */
-         for (kk=1; kk<=cptcovage;kk++) {
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /* Tage[kk] gives the data-covariate associated with age */
-         }
-         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 */
-      
-       /*lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]);*/ /* Original formula */
-       /* But now since version 0.9 we anticipate for bias at large stepm.
-        * If stepm is larger than one month (smallest stepm) and if the exact delay 
-        * (in months) between two waves is not a multiple of stepm, we rounded to 
-        * the nearest (and in case of equal distance, to the lowest) interval but now
-        * we keep into memory the bias bh[mi][i] and also the previous matrix product
-        * (i.e to dh[mi][i]-1) saved in 'savm'. Then we inter(extra)polate the
-        * probability in order to take into account the bias as a fraction of the way
-        * from savm to out if bh is negative or even beyond if bh is positive. bh varies
-        * -stepm/2 to stepm/2 .
-        * For stepm=1 the results are the same as for previous versions of Imach.
-        * For stepm > 1 the results are less biased than in previous versions. 
-        */
-       s1=s[mw[mi][i]][i];
-       s2=s[mw[mi+1][i]][i];
-       bbh=(double)bh[mi][i]/(double)stepm; 
-       /* bias bh is positive if real duration
-        * is higher than the multiple of stepm and negative otherwise.
-        */
-       /* lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2]));*/
-       if( s2 > nlstate){ 
-         /* i.e. if s2 is a death state and if the date of death is known 
-            then the contribution to the likelihood is the probability to 
-            die between last step unit time and current  step unit time, 
-            which is also equal to probability to die before dh 
-            minus probability to die before dh-stepm . 
-            In version up to 0.92 likelihood was computed
-       as if date of death was unknown. Death was treated as any other
-       health state: the date of the interview describes the actual state
-       and not the date of a change in health state. The former idea was
-       to consider that at each interview the state was recorded
-       (healthy, disable or death) and IMaCh was corrected; but when we
-       introduced the exact date of death then we should have modified
-       the contribution of an exact death to the likelihood. This new
-       contribution is smaller and very dependent of the step unit
-       stepm. It is no more the probability to die between last interview
-       and month of death but the probability to survive from last
-       interview up to one month before death multiplied by the
-       probability to die within a month. Thanks to Chris
-       Jackson for correcting this bug.  Former versions increased
-       mortality artificially. The bad side is that we add another loop
-       which slows down the processing. The difference can be up to 10%
-       lower mortality.
-         */
-       /* If, at the beginning of the maximization mostly, the
-          cumulative probability or probability to be dead is
-          constant (ie = 1) over time d, the difference is equal to
-          0.  out[s1][3] = savm[s1][3]: probability, being at state
-          s1 at precedent wave, to be dead a month before current
-          wave is equal to probability, being at state s1 at
-          precedent wave, to be dead at mont of the current
-          wave. Then the observed probability (that this person died)
-          is null according to current estimated parameter. In fact,
-          it should be very low but not zero otherwise the log go to
-          infinity.
-       */
+                       /* 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 */
+                       /* For an individual i, wav[i] gives the number of effective waves */
+                       /* We compute the contribution to Likelihood of each effective transition
+                                mw[mi][i] is real wave of the mi th effectve wave */
+                       /* Then statuses are computed at each begin and end of an effective wave s1=s[ mw[mi][i] ][i];
+                                s2=s[mw[mi+1][i]][i];
+                                And the iv th varying covariate is the cotvar[mw[mi+1][i]][iv][i]
+                                But if the variable is not in the model TTvar[iv] is the real variable effective in the model:
+                                meaning that decodemodel should be used cotvar[mw[mi+1][i]][TTvar[iv]][i]
+                       */
+                       for(mi=1; mi<= wav[i]-1; mi++){
+                               for(itv=1; itv <= ntveff; itv++){ /* Varying dummy covariates */
+                                       cov[ioffset+itv]=cotvar[mw[mi][i]][itv][i];
+                               }
+                               for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */
+                                       cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][iqtv][i];
+                               }
+                               /* ioffset=2+nagesqr+cptcovn+nqv+ntv+nqtv; */
+                               for (ii=1;ii<=nlstate+ndeath;ii++)
+                                       for (j=1;j<=nlstate+ndeath;j++){
+                                               oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                               savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       }
+                               for(d=0; d<dh[mi][i]; d++){
+                                       newm=savm;
+                                       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                                       cov[2]=agexact;
+                                       if(nagesqr==1)
+                                               cov[3]= agexact*agexact;  /* Should be changed here */
+                                       for (kk=1; kk<=cptcovage;kk++) {
+                                               cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /* Tage[kk] gives the data-covariate associated with age */
+                                       }
+                                       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 */
+                               
+                                       /*lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]);*/ /* Original formula */
+                               /* But now since version 0.9 we anticipate for bias at large stepm.
+                                * If stepm is larger than one month (smallest stepm) and if the exact delay 
+                                * (in months) between two waves is not a multiple of stepm, we rounded to 
+                                * the nearest (and in case of equal distance, to the lowest) interval but now
+                                * we keep into memory the bias bh[mi][i] and also the previous matrix product
+                                * (i.e to dh[mi][i]-1) saved in 'savm'. Then we inter(extra)polate the
+                                * probability in order to take into account the bias as a fraction of the way
+                                * from savm to out if bh is negative or even beyond if bh is positive. bh varies
+                                * -stepm/2 to stepm/2 .
+                                * For stepm=1 the results are the same as for previous versions of Imach.
+                                * For stepm > 1 the results are less biased than in previous versions. 
+                                */
+                               s1=s[mw[mi][i]][i];
+                               s2=s[mw[mi+1][i]][i];
+                               bbh=(double)bh[mi][i]/(double)stepm; 
+                               /* bias bh is positive if real duration
+                                * is higher than the multiple of stepm and negative otherwise.
+                                */
+                               /* lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2]));*/
+                               if( s2 > nlstate){ 
+                                       /* i.e. if s2 is a death state and if the date of death is known 
+                                                then the contribution to the likelihood is the probability to 
+                                                die between last step unit time and current  step unit time, 
+                                                which is also equal to probability to die before dh 
+                                                minus probability to die before dh-stepm . 
+                                                In version up to 0.92 likelihood was computed
+                                                as if date of death was unknown. Death was treated as any other
+                                                health state: the date of the interview describes the actual state
+                                                and not the date of a change in health state. The former idea was
+                                                to consider that at each interview the state was recorded
+                                                (healthy, disable or death) and IMaCh was corrected; but when we
+                                                introduced the exact date of death then we should have modified
+                                                the contribution of an exact death to the likelihood. This new
+                                                contribution is smaller and very dependent of the step unit
+                                                stepm. It is no more the probability to die between last interview
+                                                and month of death but the probability to survive from last
+                                                interview up to one month before death multiplied by the
+                                                probability to die within a month. Thanks to Chris
+                                                Jackson for correcting this bug.  Former versions increased
+                                                mortality artificially. The bad side is that we add another loop
+                                                which slows down the processing. The difference can be up to 10%
+                                                lower mortality.
+                                       */
+                                       /* If, at the beginning of the maximization mostly, the
+                                                cumulative probability or probability to be dead is
+                                                constant (ie = 1) over time d, the difference is equal to
+                                                0.  out[s1][3] = savm[s1][3]: probability, being at state
+                                                s1 at precedent wave, to be dead a month before current
+                                                wave is equal to probability, being at state s1 at
+                                                precedent wave, to be dead at mont of the current
+                                                wave. Then the observed probability (that this person died)
+                                                is null according to current estimated parameter. In fact,
+                                                it should be very low but not zero otherwise the log go to
+                                                infinity.
+                                       */
 /* #ifdef INFINITYORIGINAL */
 /*         lli=log(out[s1][s2] - savm[s1][s2]); */
 /* #else */
@@ -2918,187 +3014,187 @@ double func( double *x)
 /*       else */
 /*         lli=log(out[s1][s2] - savm[s1][s2]); */
 /* #endif */
-         lli=log(out[s1][s2] - savm[s1][s2]);
+                                       lli=log(out[s1][s2] - savm[s1][s2]);
          
-       } else if  ( s2==-1 ) { /* alive */
-         for (j=1,survp=0. ; j<=nlstate; j++) 
-           survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-         /*survp += out[s1][j]; */
-         lli= log(survp);
-       }
-       else if  (s2==-4) { 
-         for (j=3,survp=0. ; j<=nlstate; j++)  
-           survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-         lli= log(survp); 
-       } 
-       else if  (s2==-5) { 
-         for (j=1,survp=0. ; j<=2; j++)  
-           survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-         lli= log(survp); 
-       } 
-       else{
-         lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
-         /*  lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */
-       } 
-       /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/
-       /*if(lli ==000.0)*/
-       /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */
-       ipmx +=1;
-       sw += weight[i];
-       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
-       /* if (lli < log(mytinydouble)){ */
-       /*   printf("Close to inf lli = %.10lf <  %.10lf i= %d mi= %d, s[%d][i]=%d s1=%d s2=%d\n", lli,log(mytinydouble), i, mi,mw[mi][i], s[mw[mi][i]][i], s1,s2); */
-       /*   fprintf(ficlog,"Close to inf lli = %.10lf i= %d mi= %d, s[mw[mi][i]][i]=%d\n", lli, i, mi,s[mw[mi][i]][i]); */
-       /* } */
-      } /* end of wave */
-    } /* end of individual */
-  }  else if(mle==2){
-    for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-      for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
-      for(mi=1; mi<= wav[i]-1; mi++){
-       for (ii=1;ii<=nlstate+ndeath;ii++)
-         for (j=1;j<=nlstate+ndeath;j++){
-           oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-           savm[ii][j]=(ii==j ? 1.0 : 0.0);
-         }
-       for(d=0; d<=dh[mi][i]; d++){
-         newm=savm;
-         agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-         cov[2]=agexact;
-         if(nagesqr==1)
-           cov[3]= agexact*agexact;
-         for (kk=1; kk<=cptcovage;kk++) {
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-         }
-         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 */
+                               } else if  ( s2==-1 ) { /* alive */
+                                       for (j=1,survp=0. ; j<=nlstate; j++) 
+                                               survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+                                       /*survp += out[s1][j]; */
+                                       lli= log(survp);
+                               }
+                               else if  (s2==-4) { 
+                                       for (j=3,survp=0. ; j<=nlstate; j++)  
+                                               survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+                                       lli= log(survp); 
+                               
+                               else if  (s2==-5) { 
+                                       for (j=1,survp=0. ; j<=2; j++)  
+                                               survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+                                       lli= log(survp); 
+                               
+                               else{
+                                       lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+                                       /*  lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */
+                               
+                               /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/
+                               /*if(lli ==000.0)*/
+                               /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */
+                               ipmx +=1;
+                               sw += weight[i];
+                               ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+                               /* if (lli < log(mytinydouble)){ */
+                               /*   printf("Close to inf lli = %.10lf <  %.10lf i= %d mi= %d, s[%d][i]=%d s1=%d s2=%d\n", lli,log(mytinydouble), i, mi,mw[mi][i], s[mw[mi][i]][i], s1,s2); */
+                               /*   fprintf(ficlog,"Close to inf lli = %.10lf i= %d mi= %d, s[mw[mi][i]][i]=%d\n", lli, i, mi,s[mw[mi][i]][i]); */
+                               /* } */
+                       } /* end of wave */
+               } /* end of individual */
+       }  else if(mle==2){
+               for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+                       for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+                       for(mi=1; mi<= wav[i]-1; mi++){
+                               for (ii=1;ii<=nlstate+ndeath;ii++)
+                                       for (j=1;j<=nlstate+ndeath;j++){
+                                               oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                               savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       }
+                               for(d=0; d<=dh[mi][i]; d++){
+                                       newm=savm;
+                                       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                                       cov[2]=agexact;
+                                       if(nagesqr==1)
+                                               cov[3]= agexact*agexact;
+                                       for (kk=1; kk<=cptcovage;kk++) {
+                                               cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+                                       }
+                                       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                                                                                        1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+                                       savm=oldm;
+                                       oldm=newm;
+                               } /* end mult */
       
-       s1=s[mw[mi][i]][i];
-       s2=s[mw[mi+1][i]][i];
-       bbh=(double)bh[mi][i]/(double)stepm; 
-       lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
-       ipmx +=1;
-       sw += weight[i];
-       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
-      } /* end of wave */
-    } /* end of individual */
-  }  else if(mle==3){  /* exponential inter-extrapolation */
-    for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-      for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
-      for(mi=1; mi<= wav[i]-1; mi++){
-       for (ii=1;ii<=nlstate+ndeath;ii++)
-         for (j=1;j<=nlstate+ndeath;j++){
-           oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-           savm[ii][j]=(ii==j ? 1.0 : 0.0);
-         }
-       for(d=0; d<dh[mi][i]; d++){
-         newm=savm;
-         agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-         cov[2]=agexact;
-         if(nagesqr==1)
-           cov[3]= agexact*agexact;
-         for (kk=1; kk<=cptcovage;kk++) {
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-         }
-         out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
-                      1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
-         savm=oldm;
-         oldm=newm;
-       } /* end mult */
+                               s1=s[mw[mi][i]][i];
+                               s2=s[mw[mi+1][i]][i];
+                               bbh=(double)bh[mi][i]/(double)stepm; 
+                               lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
+                               ipmx +=1;
+                               sw += weight[i];
+                               ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+                       } /* end of wave */
+               } /* end of individual */
+       }  else if(mle==3){  /* exponential inter-extrapolation */
+               for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+                       for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+                       for(mi=1; mi<= wav[i]-1; mi++){
+                               for (ii=1;ii<=nlstate+ndeath;ii++)
+                                       for (j=1;j<=nlstate+ndeath;j++){
+                                               oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                               savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       }
+                               for(d=0; d<dh[mi][i]; d++){
+                                       newm=savm;
+                                       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                                       cov[2]=agexact;
+                                       if(nagesqr==1)
+                                               cov[3]= agexact*agexact;
+                                       for (kk=1; kk<=cptcovage;kk++) {
+                                               cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+                                       }
+                                       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                                                                                        1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+                                       savm=oldm;
+                                       oldm=newm;
+                               } /* end mult */
       
-       s1=s[mw[mi][i]][i];
-       s2=s[mw[mi+1][i]][i];
-       bbh=(double)bh[mi][i]/(double)stepm; 
-       lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
-       ipmx +=1;
-       sw += weight[i];
-       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
-      } /* end of wave */
-    } /* end of individual */
-  }else if (mle==4){  /* ml=4 no inter-extrapolation */
-    for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-      for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
-      for(mi=1; mi<= wav[i]-1; mi++){
-       for (ii=1;ii<=nlstate+ndeath;ii++)
-         for (j=1;j<=nlstate+ndeath;j++){
-           oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-           savm[ii][j]=(ii==j ? 1.0 : 0.0);
-         }
-       for(d=0; d<dh[mi][i]; d++){
-         newm=savm;
-         agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-         cov[2]=agexact;
-         if(nagesqr==1)
-           cov[3]= agexact*agexact;
-         for (kk=1; kk<=cptcovage;kk++) {
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-         }
+                               s1=s[mw[mi][i]][i];
+                               s2=s[mw[mi+1][i]][i];
+                               bbh=(double)bh[mi][i]/(double)stepm; 
+                               lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
+                               ipmx +=1;
+                               sw += weight[i];
+                               ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+                       } /* end of wave */
+               } /* end of individual */
+       }else if (mle==4){  /* ml=4 no inter-extrapolation */
+               for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+                       for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+                       for(mi=1; mi<= wav[i]-1; mi++){
+                               for (ii=1;ii<=nlstate+ndeath;ii++)
+                                       for (j=1;j<=nlstate+ndeath;j++){
+                                               oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                               savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       }
+                               for(d=0; d<dh[mi][i]; d++){
+                                       newm=savm;
+                                       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                                       cov[2]=agexact;
+                                       if(nagesqr==1)
+                                               cov[3]= agexact*agexact;
+                                       for (kk=1; kk<=cptcovage;kk++) {
+                                               cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+                                       }
        
-         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 */
+                                       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                                                                                        1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+                                       savm=oldm;
+                                       oldm=newm;
+                               } /* end mult */
       
-       s1=s[mw[mi][i]][i];
-       s2=s[mw[mi+1][i]][i];
-       if( s2 > nlstate){ 
-         lli=log(out[s1][s2] - savm[s1][s2]);
-       } else if  ( s2==-1 ) { /* alive */
-         for (j=1,survp=0. ; j<=nlstate; j++) 
-           survp += out[s1][j];
-         lli= log(survp);
-       }else{
-         lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */
-       }
-       ipmx +=1;
-       sw += weight[i];
-       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+                               s1=s[mw[mi][i]][i];
+                               s2=s[mw[mi+1][i]][i];
+                               if( s2 > nlstate){ 
+                                       lli=log(out[s1][s2] - savm[s1][s2]);
+                               } else if  ( s2==-1 ) { /* alive */
+                                       for (j=1,survp=0. ; j<=nlstate; j++) 
+                                               survp += out[s1][j];
+                                       lli= log(survp);
+                               }else{
+                                       lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */
+                               }
+                               ipmx +=1;
+                               sw += weight[i];
+                               ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
 /*     printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */
-      } /* end of wave */
-    } /* end of individual */
-  }else{  /* ml=5 no inter-extrapolation no jackson =0.8a */
-    for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-      for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
-      for(mi=1; mi<= wav[i]-1; mi++){
-       for (ii=1;ii<=nlstate+ndeath;ii++)
-         for (j=1;j<=nlstate+ndeath;j++){
-           oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-           savm[ii][j]=(ii==j ? 1.0 : 0.0);
-         }
-       for(d=0; d<dh[mi][i]; d++){
-         newm=savm;
-         agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-         cov[2]=agexact;
-         if(nagesqr==1)
-           cov[3]= agexact*agexact;
-         for (kk=1; kk<=cptcovage;kk++) {
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-         }
+                       } /* end of wave */
+               } /* end of individual */
+       }else{  /* ml=5 no inter-extrapolation no jackson =0.8a */
+               for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+                       for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+                       for(mi=1; mi<= wav[i]-1; mi++){
+                               for (ii=1;ii<=nlstate+ndeath;ii++)
+                                       for (j=1;j<=nlstate+ndeath;j++){
+                                               oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                               savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       }
+                               for(d=0; d<dh[mi][i]; d++){
+                                       newm=savm;
+                                       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                                       cov[2]=agexact;
+                                       if(nagesqr==1)
+                                               cov[3]= agexact*agexact;
+                                       for (kk=1; kk<=cptcovage;kk++) {
+                                               cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+                                       }
        
-         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 */
+                                       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                                                                                        1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+                                       savm=oldm;
+                                       oldm=newm;
+                               } /* end mult */
       
-       s1=s[mw[mi][i]][i];
-       s2=s[mw[mi+1][i]][i];
-       lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */
-       ipmx +=1;
-       sw += weight[i];
-       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
-       /*printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]);*/
-      } /* end of wave */
-    } /* end of individual */
-  } /* End of if */
-  for(k=1,l=0.; k<=nlstate; k++) l += ll[k];
-  /* printf("l1=%f l2=%f ",ll[1],ll[2]); */
-  l= l*ipmx/sw; /* To get the same order of magnitude as if weight=1 for every body */
-  return -l;
+                               s1=s[mw[mi][i]][i];
+                               s2=s[mw[mi+1][i]][i];
+                               lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */
+                               ipmx +=1;
+                               sw += weight[i];
+                               ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+                               /*printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]);*/
+                       } /* end of wave */
+               } /* end of individual */
+       } /* End of if */
+       for(k=1,l=0.; k<=nlstate; k++) l += ll[k];
+       /* printf("l1=%f l2=%f ",ll[1],ll[2]); */
+       l= l*ipmx/sw; /* To get the same order of magnitude as if weight=1 for every body */
+       return -l;
 }
 
 /*************** log-likelihood *************/
@@ -3106,11 +3202,13 @@ double funcone( double *x)
 {
   /* Same as likeli but slower because of a lot of printf and if */
   int i, ii, j, k, mi, d, kk;
+       int ioffset=0;
   double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
   double **out;
   double lli; /* Individual log likelihood */
   double llt;
   int s1, s2;
+       int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate */
   double bbh, survp;
   double agexact;
   double agebegin, ageend;
@@ -3123,37 +3221,51 @@ double funcone( double *x)
   cov[1]=1.;
 
   for(k=1; k<=nlstate; k++) ll[k]=0.;
-
+  ioffset=0;
   for (i=1,ipmx=0, sw=0.; i<=imx; i++){
-    for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+               ioffset=2+nagesqr+cptcovage;
+    /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */
+               for (k=1; k<=ncoveff;k++){ /* Simple and product covariates without age* products */
+                       cov[++ioffset]=covar[Tvar[k]][i];
+               }
+               for(iqv=1; iqv <= nqveff; iqv++){ /* Quantitatives covariates */
+                       cov[++ioffset]=coqvar[iqv][i];
+               }
+
     for(mi=1; mi<= wav[i]-1; mi++){
+                       for(itv=1; itv <= ntveff; itv++){ /* Varying dummy covariates */
+                               cov[ioffset+itv]=cotvar[mw[mi][i]][itv][i];
+                       }
+                       for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */
+                               cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][iqtv][i];
+                       }
       for (ii=1;ii<=nlstate+ndeath;ii++)
-       for (j=1;j<=nlstate+ndeath;j++){
-         oldm[ii][j]=(ii==j ? 1.0 : 0.0);
-         savm[ii][j]=(ii==j ? 1.0 : 0.0);
-       }
+                               for (j=1;j<=nlstate+ndeath;j++){
+                                       oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+                                       savm[ii][j]=(ii==j ? 1.0 : 0.0);
+                               }
       
       agebegin=agev[mw[mi][i]][i]; /* Age at beginning of effective wave */
       ageend=agev[mw[mi][i]][i] + (dh[mi][i])*stepm/YEARM; /* Age at end of effective wave and at the end of transition */
       for(d=0; d<dh[mi][i]; d++){  /* Delay between two effective waves */
-       /*dh[m][i] or dh[mw[mi][i]][i] is the delay between two effective waves m=mw[mi][i]
-         and mw[mi+1][i]. dh depends on stepm.*/
-       newm=savm;
-       agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
-       cov[2]=agexact;
-       if(nagesqr==1)
-         cov[3]= agexact*agexact;
-       for (kk=1; kk<=cptcovage;kk++) {
-         cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-       }
-
-       /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
-       out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
-                    1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
-       /* out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, */
-       /*           1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); */
-       savm=oldm;
-       oldm=newm;
+                               /*dh[m][i] or dh[mw[mi][i]][i] is the delay between two effective waves m=mw[mi][i]
+                                       and mw[mi+1][i]. dh depends on stepm.*/
+                               newm=savm;
+                               agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+                               cov[2]=agexact;
+                               if(nagesqr==1)
+                                       cov[3]= agexact*agexact;
+                               for (kk=1; kk<=cptcovage;kk++) {
+                                       cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+                               }
+                               
+                               /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
+                               out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+                                                                                1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+                               /* out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, */
+                               /*           1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); */
+                               savm=oldm;
+                               oldm=newm;
       } /* end mult */
       
       s1=s[mw[mi][i]][i];
@@ -3167,37 +3279,37 @@ double funcone( double *x)
        * is higher than the multiple of stepm and negative otherwise.
        */
       if( s2 > nlstate && (mle <5) ){  /* Jackson */
-       lli=log(out[s1][s2] - savm[s1][s2]);
+                               lli=log(out[s1][s2] - savm[s1][s2]);
       } else if  ( s2==-1 ) { /* alive */
-       for (j=1,survp=0. ; j<=nlstate; j++) 
-         survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-       lli= log(survp);
+                               for (j=1,survp=0. ; j<=nlstate; j++) 
+                                       survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+                               lli= log(survp);
       }else if (mle==1){
-       lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+                               lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
       } else if(mle==2){
-       lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
+                               lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
       } else if(mle==3){  /* exponential inter-extrapolation */
-       lli= (savm[s1][s2]>(double)1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
+                               lli= (savm[s1][s2]>(double)1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
       } else if (mle==4){  /* mle=4 no inter-extrapolation */
-       lli=log(out[s1][s2]); /* Original formula */
+                               lli=log(out[s1][s2]); /* Original formula */
       } else{  /* mle=0 back to 1 */
-       lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
-       /*lli=log(out[s1][s2]); */ /* Original formula */
+                               lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+                               /*lli=log(out[s1][s2]); */ /* Original formula */
       } /* End of if */
       ipmx +=1;
       sw += weight[i];
       ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
       /*printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */
       if(globpr){
-       fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %11.6f %8.4f %8.3f\
+                               fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %15.6f %8.4f %8.3f\
  %11.6f %11.6f %11.6f ", \
-               num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw,
-               2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
-       for(k=1,llt=0.,l=0.; k<=nlstate; k++){
-         llt +=ll[k]*gipmx/gsw;
-         fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw);
-       }
-       fprintf(ficresilk," %10.6f\n", -llt);
+                                                               num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw,
+                                                               2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
+                               for(k=1,llt=0.,l=0.; k<=nlstate; k++){
+                                       llt +=ll[k]*gipmx/gsw;
+                                       fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw);
+                               }
+                               fprintf(ficresilk," %10.6f\n", -llt);
       }
     } /* end of wave */
   } /* end of individual */
@@ -3714,6 +3826,8 @@ void pstamp(FILE *fichier)
         int mi; /* Effective wave */
         int first;
         double ***freq; /* Frequencies */
+        double *meanq;
+        double **meanqt;
         double *pp, **prop, *posprop, *pospropt;
         double pos=0., posproptt=0., pospropta=0., k2, dateintsum=0,k2cpt=0;
         char fileresp[FILENAMELENGTH], fileresphtm[FILENAMELENGTH], fileresphtmfr[FILENAMELENGTH];
@@ -3724,6 +3838,8 @@ void pstamp(FILE *fichier)
         posprop=vector(1,nlstate); /* Counting the number of transition starting from a live state per age */ 
         pospropt=vector(1,nlstate); /* Counting the number of transition starting from a live state */ 
         /* prop=matrix(1,nlstate,iagemin,iagemax+3); */
+        meanq=vector(1,nqveff);
+        meanqt=matrix(1,lastpass,1,nqtveff);
         strcpy(fileresp,"P_");
         strcat(fileresp,fileresu);
         /*strcat(fileresphtm,fileresu);*/
@@ -3766,7 +3882,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
         freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin-AGEMARGE,iagemax+3+AGEMARGE);
         j1=0;
   
-        j=cptcoveff;
+        j=ncoveff;
         if (cptcovn<1) {j=1;ncodemax[1]=1;}
 
         first=1;
@@ -3778,7 +3894,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
                        Then V1=1 and V2=1 is a noisy combination that we want to exclude for the list 2**cptcoveff 
         */
 
-        for (j1 = 1; j1 <= (int) pow(2,cptcoveff); j1++){ /* Loop on covariates combination */
+        for (j1 = 1; j1 <= (int) pow(2,j); j1++){ /* Loop on covariates combination excluding varying and quantitatives */
                 posproptt=0.;
                 /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
                         scanf("%d", i);*/
@@ -3793,16 +3909,30 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
                         posprop[i]=0;
                         pospropt[i]=0;
                 }
+                for (z1=1; z1<= nqveff; z1++) {  
+                        meanq[z1]+=0.;
+                        for(m=1;m<=lastpass;m++){
+                                meanqt[m][z1]=0.;
+                        }
+                }
       
                 dateintsum=0;
                 k2cpt=0;
-
+     /* For that comination of covariate j1, we count and print the frequencies */
                 for (iind=1; iind<=imx; iind++) { /* For each individual iind */
                         bool=1;
-                        if (cptcovn>0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
-                                for (z1=1; z1<=cptcoveff; z1++) {      
+                        if (nqveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
+                                for (z1=1; z1<= nqveff; z1++) {  
+                                        meanq[z1]+=coqvar[Tvar[z1]][iind];
+                                }
+                                for (z1=1; z1<=ncoveff; z1++) {  
+                                        /* 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)]){
-                                                /* Tests if the value of each of the covariates of i is equal to filter j1 */
+                                                /* Tests if this individual i responded to j1 (V4=1 V3=0) */
                                                 bool=0;
                                                 /* 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", 
                 bool,i,z1, z1, Tvaraff[z1],i,covar[Tvaraff[z1]][i],j1,z1,codtabm(j1,z1),
@@ -3812,7 +3942,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
                                 } /* end z1 */
                         } /* cptcovn > 0 */
 
-                        if (bool==1){
+                        if (bool==1){ /* We selected an individual iin satisfying combination j1 */
                                 /* for(m=firstpass; m<=lastpass; m++){ */
                                 for(mi=1; mi<wav[iind];mi++){
                                         m=mw[mi][iind];
@@ -3852,11 +3982,11 @@ 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);*/
                 pstamp(ficresp);
-                if  (cptcovn>0) {
+                if  (ncoveff>0) {
                         fprintf(ficresp, "\n#********** Variable "); 
                         fprintf(ficresphtm, "\n<br/><br/><h3>********** Variable "); 
                         fprintf(ficresphtmfr, "\n<br/><br/><h3>********** Variable "); 
-                        for (z1=1; z1<=cptcoveff; z1++){
+                        for (z1=1; z1<=ncoveff; z1++){
                                 fprintf(ficresp, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
                                 fprintf(ficresphtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
                                 fprintf(ficresphtmfr, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
@@ -3865,7 +3995,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
                         fprintf(ficresphtm, "**********</h3>\n");
                         fprintf(ficresphtmfr, "**********</h3>\n");
                         fprintf(ficlog, "\n#********** Variable "); 
-                        for (z1=1; z1<=cptcoveff; z1++) fprintf(ficlog, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+                        for (z1=1; z1<=ncoveff; z1++) fprintf(ficlog, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
                         fprintf(ficlog, "**********\n");
                 }
                 fprintf(ficresphtm,"<table style=\"text-align:center; border: 1px solid\">");
@@ -4016,12 +4146,14 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
         fclose(ficresp);
         fclose(ficresphtm);
         fclose(ficresphtmfr);
+        free_vector(meanq,1,nqveff);
+        free_matrix(meanqt,1,lastpass,1,nqtveff);
         free_ma3x(freq,-5,nlstate+ndeath,-5,nlstate+ndeath, iagemin-AGEMARGE, iagemax+3+AGEMARGE);
         free_vector(pospropt,1,nlstate);
         free_vector(posprop,1,nlstate);
         free_matrix(prop,1,nlstate,iagemin-AGEMARGE, iagemax+3+AGEMARGE);
         free_vector(pp,1,nlstate);
-        /* End of Freq */
+        /* End of freqsummary */
  }
 
 /************ Prevalence ********************/
@@ -4054,7 +4186,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
    if (cptcovn<1) {j=1;ncodemax[1]=1;}
   
    first=1;
-   for(j1=1; j1<= (int) pow(2,cptcoveff);j1++){ /* For each combination of covariate */
+   for(j1=1; j1<= (int) pow(2,nqveff);j1++){ /* For each combination of covariate */
      for (i=1; i<=nlstate; i++)  
        for(iage=iagemin-AGEMARGE; iage <= iagemax+3+AGEMARGE; iage++)
         prop[i][iage]=0.0;
@@ -4062,7 +4194,7 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age
      for (i=1; i<=imx; i++) { /* Each individual */
        bool=1;
        if  (cptcovn>0) {  /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
-        for (z1=1; z1<=cptcoveff; z1++) /* For each covariate, look at the value for individual i and checks if it is equal to the corresponding value of this covariate according to current combination j1*/
+        for (z1=1; z1<=nqveff; z1++) /* For each covariate, look at the value for individual i and checks if it is equal to the corresponding value of this covariate according to current combination j1*/
           if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) 
             bool=0;
        } 
@@ -4128,10 +4260,10 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
      and mw[mi+1][i]. dh depends on stepm.
      */
 
-  int i, mi, m;
+  int i=0, mi=0, m=0, mli=0;
   /* int j, k=0,jk, ju, jl,jmin=1e+5, jmax=-1;
      double sum=0., jmean=0.;*/
-  int first, firstwo, firsthree, firstfour;
+  int first=0, firstwo=0, firsthree=0, firstfour=0, firstfiv=0;
   int j, k=0,jk, ju, jl;
   double sum=0.;
   first=0;
@@ -4141,54 +4273,82 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
   jmin=100000;
   jmax=-1;
   jmean=0.;
+
+/* Treating live states */
   for(i=1; i<=imx; i++){  /* For simple cases and if state is death */
-    mi=0;
+    mi=0;  /* First valid wave */
+               mli=0; /* Last valid wave */
     m=firstpass;
     while(s[m][i] <= nlstate){  /* a live state */
-      if(s[m][i]>=1 || s[m][i]==-4 || s[m][i]==-5){ /* Since 0.98r4 if status=-2 vital status is really unknown, wave should be skipped */
+                       if(m >firstpass && s[m][i]==s[m-1][i] && mint[m][i]==mint[m-1][i] && anint[m][i]==anint[m-1][i]){/* Two succesive identical information on wave m */
+                               mli=m-1;/* mw[++mi][i]=m-1; */
+                       }else if(s[m][i]>=1 || s[m][i]==-4 || s[m][i]==-5){ /* Since 0.98r4 if status=-2 vital status is really unknown, wave should be skipped */
                                mw[++mi][i]=m;
+                               mli=m;
+      } /* else might be a useless wave  -1 and mi is not incremented and mw[mi] not updated */
+      if(m < lastpass){ /* m < lastpass, standard case */
+                               m++; /* mi gives the "effective" current wave, m the current wave, go to next wave by incrementing m */
       }
-      if(m >=lastpass){
+                       else{ /* m >= lastpass, eventual special issue with warning */
+#ifdef UNKNOWNSTATUSNOTCONTRIBUTING
+                               break;
+#else
                                if(s[m][i]==-1 && (int) andc[i] == 9999 && (int)anint[m][i] != 9999){
                                        if(firsthree == 0){
-                                               printf("Information! Unknown health status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m);
+                                               printf("Information! Unknown status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood as pi. .\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m);
                                                firsthree=1;
                                        }
-                                       fprintf(ficlog,"Information! Unknown status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood.\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m);
+                                       fprintf(ficlog,"Information! Unknown status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood as pi. .\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m);
                                        mw[++mi][i]=m;
+                                       mli=m;
                                }
                                if(s[m][i]==-2){ /* Vital status is really unknown */
                                        nbwarn++;
                                        if((int)anint[m][i] == 9999){  /*  Has the vital status really been verified? */
                                                printf("Warning! Vital status for individual %ld (line=%d) at last wave %d interviewed at date %d/%d is unknown %d. Please, check if the vital status and the date of death %d/%d are really unknown. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], (int) moisdc[i], (int) andc[i], i, m);
-                                               fprintf(ficlog,"Warning! Vital status for individual %ld (line=%d) at last wave %d interviewed at date %d/%d is unknown %d. Please, check if the vital status and the date of death %d/%d are really unknown. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], (int) moisdc[i], (int) andc[i], i, m);
+                                               fprintf(ficlog,"Warning! Vital status for individual %ld (line=%d) at last wave %d interviewed at date %d/%d is unknown %d. Please, check if the vital status and the date of death %d/%d are really unknown. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], (int) moisdc[i], (int) andc[i], i, m);
                                        }
                                        break;
                                }
                                break;
-      }
-      else
-                               m++;
+#endif
+                       }/* End m >= lastpass */
     }/* end while */
-    
+
+       /* mi is the last effective wave, m is lastpass, mw[j][i] gives the # of j-th effective wave for individual i */
     /* After last pass */
+/* Treating death states */
     if (s[m][i] > nlstate){  /* In a death state */
+                       /* if( mint[m][i]==mdc[m][i] && anint[m][i]==andc[m][i]){ /\* same date of death and date of interview *\/ */
+                       /* } */
       mi++;    /* Death is another wave */
       /* if(mi==0)  never been interviewed correctly before death */
                        /* Only death is a correct wave */
       mw[mi][i]=m;
-    }else if ((int) andc[i] != 9999) { /* Status is either death or negative. A death occured after lastpass, we can't take it into account because of potential bias */
+    }
+#ifndef DISPATCHINGKNOWNDEATHAFTERLASTWAVE
+               else if ((int) andc[i] != 9999) { /* Status is negative. A death occured after lastpass, we can't take it into account because of potential bias */
       /* m++; */
       /* mi++; */
       /* s[m][i]=nlstate+1;  /\* We are setting the status to the last of non live state *\/ */
       /* mw[mi][i]=m; */
-      nberr++;
       if ((int)anint[m][i]!= 9999) { /* date of last interview is known */
-                               if(firstwo==0){
-                                       printf("Error! Death for individual %ld line=%d  occurred %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m );
-                                       firstwo=1;
+                               if((andc[i]+moisdc[i]/12.) <=(anint[m][i]+mint[m][i]/12.)){ /* death occured before last wave and status should have been death instead of -1 */
+                                       nbwarn++;
+                                       if(firstfiv==0){
+                                               printf("Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d interviewed at %d/%d and should have been coded as death instead of '%d'. This case (%d)/wave (%d) is contributing to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+                                               firstfiv=1;
+                                       }else{
+                                               fprintf(ficlog,"Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d interviewed at %d/%d and should have been coded as death instead of '%d'. This case (%d)/wave (%d) is contributing to likelihood.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+                                       }
+                               }else{ /* Death occured afer last wave potential bias */
+                                       nberr++;
+                                       if(firstwo==0){
+                                               printf("Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m );
+                                               firstwo=1;
+                                       }
+                                       fprintf(ficlog,"Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m );
                                }
-                               fprintf(ficlog,"Error! Death for individual %ld line=%d  occurred %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m );
       }else{ /* end date of interview is known */
                                /* death is known but not confirmed by death status at any wave */
                                if(firstfour==0){
@@ -4197,8 +4357,10 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
                                }
                                fprintf(ficlog,"Error! Death for individual %ld line=%d  occurred %d/%d but not confirmed by any death status for any wave, including last wave %d at unknown date %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m );
       }
-    }
-    wav[i]=mi;
+    } /* end if date of death is known */
+#endif
+    wav[i]=mi; /* mi should be the last effective wave (or mli) */
+    /* wav[i]=mw[mi][i]; */
     if(mi==0){
       nbwarn++;
       if(first==0){
@@ -4309,8 +4471,8 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
   /**< 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]
-   * Tvar[5] in V2+V1+V3*age+V2*V4 is 2 (V2)
-   * nbcode[Tvar[5]][1]= nbcode[2][1]=0, nbcode[2][2]=1 (usually);
+   * Tvar[5] in V2+V1+V3*age+V2*V4 is 4 (V4) even it is a time varying or quantitative variable
+   * nbcode[Tvar[5]][1]= nbcode[4][1]=0, nbcode[4][2]=1 (usually);
   */
 
   int ij=1, k=0, j=0, i=0, maxncov=NCOVMAX;
@@ -4320,41 +4482,44 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
 
 
   /* cptcoveff=0;  */
-       *cptcov=0;
+       /* *cptcov=0; */
  
   for (k=1; k <= maxncov; k++) ncodemax[k]=0; /* Horrible constant again replaced by NCOVMAX */
 
-  /* Loop on covariates without age and products */
-  for (j=1; j<=(cptcovs); j++) { /* From model V1 + V2*age+ V3 + V3*V4 keeps V1 + V3 = 2 only */
+  /* Loop on covariates without age and products and no quantitative variable */
+  /* for (j=1; j<=(cptcovs); j++) { /\* From model V1 + V2*age+ V3 + V3*V4 keeps V1 + V3 = 2 only *\/ */
+  for (j=1; j<=(*cptcov); j++) { /* From model V1 + V2*age + V3 + V3*V4 keeps V1 + V3 = 2 only */
     for (k=-1; k < maxncov; k++) Ndum[k]=0;
     for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the 
-                                                                                                                               modality of this covariate Vj*/ 
-      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*/
+                                                                                                                               modality of this covariate Vj*/
+                       if(Tvar[j]  >=1 && Tvar[j]  <= *cptcov){ /* A real fixed covariate */
+                               ij=(int)(covar[Tvar[j]][i]); /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i
+                                                                                                                                                       * If product of Vn*Vm, still boolean *:
+                                                                                                                                                       * If it was coded 1, 2, 3, 4 should be splitted into 3 boolean variables
+                                                                                                                                                       * 1 => 0 0 0, 2 => 0 0 1, 3 => 0 1 1, 4=1 0 0   */
+                               /* Finds for covariate j, n=Tvar[j] of Vn . ij is the
+                                        modality of the nth covariate of individual i. */
+                               if (ij > modmaxcovj)
+                                       modmaxcovj=ij; 
+                               else if (ij < modmincovj) 
+                                       modmincovj=ij; 
+                               if ((ij < -1) && (ij > NCOVMAX)){
+                                       printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX );
+                                       exit(1);
+                               }else
+                                       Ndum[ij]++; /*counts and stores the occurence of this modality 0, 1, -1*/
       /*  If coded 1, 2, 3 , counts the number of 1 Ndum[1], number of 2, Ndum[2], etc */
       /*printf("i=%d ij=%d Ndum[ij]=%d imx=%d",i,ij,Ndum[ij],imx);*/
       /* getting the maximum value of the modality of the covariate
-        (should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
-        female is 1, then modmaxcovj=1.*/
-    } /* end for loop on individuals i */
+                                (should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
+                                female ies 1, then modmaxcovj=1.*/
+                       }
+               } /* end for loop on individuals i */
     printf(" Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
     fprintf(ficlog," Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
     cptcode=modmaxcovj;
     /* Ndum[0] = frequency of 0 for model-covariate j, Ndum[1] frequency of 1 etc. */
-   /*for (i=0; i<=cptcode; i++) {*/
+               /*for (i=0; i<=cptcode; i++) {*/
     for (k=modmincovj;  k<=modmaxcovj; k++) { /* k=-1 ? 0 and 1*//* For each value k of the modality of model-cov j */
       printf("Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
       fprintf(ficlog, "Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
@@ -4369,7 +4534,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
                                                                                                                                undefined. Usually 3: -1, 0 and 1. */
       }
       /* In fact  ncodemax[j]=2 (dichotom. variables only) but it could be more for
-                                historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
+                        * historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
     } /* Ndum[-1] number of undefined modalities */
                
     /* j is a covariate, n=Tvar[j] of Vn; Fills nbcode */
@@ -4390,11 +4555,11 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
        if (Ndum[i] == 0) { /* If nobody responded to this modality k */
                                break;
                        }
-       ij++;
-       nbcode[Tvar[j]][ij]=i;  /* stores the original value of modality i in an array nbcode, ij modality from 1 to last non-nul modality.*/
-       cptcode = ij; /* New max modality for covar j */
+                       ij++;
+                       nbcode[Tvar[j]][ij]=i;  /* stores the original value of modality i in an array nbcode, ij modality from 1 to last non-nul modality.*/
+                       cptcode = ij; /* New max modality for covar j */
     } /* end of loop on modality i=-1 to 1 or more */
-      
+               
     /*   for (k=0; k<= cptcode; k++) { /\* k=-1 ? k=0 to 1 *\//\* Could be 1 to 4 *\//\* cptcode=modmaxcovj *\/ */
     /*         /\*recode from 0 *\/ */
     /*                                      k is a modality. If we have model=V1+V1*sex  */
@@ -4416,23 +4581,27 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
                /* Listing of all covariables in statement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/ 
                ij=Tvar[i]; /* Tvar might be -1 if status was unknown */ 
                Ndum[ij]++; /* Might be supersed V1 + V1*age */
-       } 
+       } /* V4+V3+V5, Ndum[1]@5={0, 0, 1, 1, 1} */
        
        ij=0;
        for (i=0; i<=  maxncov-1; i++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
                /*printf("Ndum[%d]=%d\n",i, Ndum[i]);*/
                if((Ndum[i]!=0) && (i<=ncovcol)){
-                       ij++;
                        /*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
-                       Tvaraff[ij]=i; /*For printing (unclear) */
-               }else{
-                       /* Tvaraff[ij]=0; */
+                       Tvaraff[++ij]=i; /*For printing (unclear) */
+               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv)){
+                       Tvaraff[++ij]=-10; /* Dont'n know how to treat quantitative variables yet */
+               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv)){
+                       Tvaraff[++ij]=i; /*For printing (unclear) */
+               }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv+nqtv)){
+                Tvaraff[++ij]=-20; /* Dont'n know how to treat quantitative variables yet */
                }
-       }
+       } /* Tvaraff[1]@5 {3, 4, -20, 0, 0} Very strange */
        /* ij--; */
        /* cptcoveff=ij; /\*Number of total covariates*\/ */
-       *cptcov=ij; /*Number of total covariates*/
-       
+       *cptcov=ij; /*Number of total real effective covariates: effective
+                                                        * because they can be excluded from the model and real
+                                                        * if in the model but excluded because missing values*/
 }
 
 
@@ -5280,29 +5449,29 @@ To be simple, these graphs help to understand the significativity of each parame
 
    cov[1]=1;
    /* tj=cptcoveff; */
-   tj = (int) pow(2,cptcoveff);
+   tj = (int) pow(2,nqveff);
    if (cptcovn<1) {tj=1;ncodemax[1]=1;}
    j1=0;
-   for(j1=1; j1<=tj;j1++){  /* For each valid combination of covariates */
+   for(j1=1; j1<=tj;j1++){  /* For each valid combination of covariates or only once*/
      if  (cptcovn>0) {
        fprintf(ficresprob, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprob, "**********\n#\n");
        fprintf(ficresprobcov, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprobcov, "**********\n#\n");
                        
        fprintf(ficgp, "\n#********** Variable "); 
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=nqveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficgp, "**********\n#\n");
                        
                        
        fprintf(fichtmcov, "\n<hr  size=\"2\" color=\"#EC5E5E\">********** Variable "); 
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=nqveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(fichtmcov, "**********\n<hr size=\"2\" color=\"#EC5E5E\">");
                        
        fprintf(ficresprobcor, "\n#********** Variable ");    
-       for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+       for (z1=1; z1<=nqveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
        fprintf(ficresprobcor, "**********\n#");    
        if(invalidvarcomb[j1]){
         fprintf(ficgp,"\n#Combination (%d) ignored because no cases \n",j1); 
@@ -5568,7 +5737,7 @@ void printinghtml(char fileresu[], char title[], char datafile[], int firstpass,
 
    fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>");
 
-   m=pow(2,cptcoveff);
+   m=pow(2,nqveff);
    if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
    jj1=0;
@@ -5578,7 +5747,7 @@ void printinghtml(char fileresu[], char title[], char datafile[], int firstpass,
      jj1++;
      if (cptcovn > 0) {
        fprintf(fichtm,"<hr  size=\"2\" color=\"#EC5E5E\">************ Results for covariates");
-       for (cpt=1; cpt<=cptcoveff;cpt++){ 
+       for (cpt=1; cpt<=nqveff;cpt++){ 
         fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);
         printf(" V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);fflush(stdout);
        }
@@ -5688,7 +5857,7 @@ See page 'Matrix of variance-covariance of one-step probabilities' below. \n", r
    fflush(fichtm);
    fprintf(fichtm," <ul><li><b>Graphs</b></li><p>");
 
-   m=pow(2,cptcoveff);
+   m=pow(2,nqveff);
    if (cptcovn < 1) {m=1;ncodemax[1]=1;}
 
    jj1=0;
@@ -5697,7 +5866,7 @@ See page 'Matrix of variance-covariance of one-step probabilities' below. \n", r
      jj1++;
      if (cptcovn > 0) {
        fprintf(fichtm,"<hr  size=\"2\" color=\"#EC5E5E\">************ Results for covariates");
-       for (cpt=1; cpt<=cptcoveff;cpt++) 
+       for (cpt=1; cpt<=nqveff;cpt++) 
         fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);
        fprintf(fichtm," ************\n<hr size=\"2\" color=\"#EC5E5E\">");
 
@@ -5742,7 +5911,7 @@ void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar,
   /*#ifdef windows */
   fprintf(ficgp,"cd \"%s\" \n",pathc);
   /*#endif */
-  m=pow(2,cptcoveff);
+  m=pow(2,nqveff);
 
   /* Contribution to likelihood */
   /* Plot the probability implied in the likelihood */
@@ -5780,8 +5949,8 @@ void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar,
     for (k1=1; k1<= m ; k1 ++) { /* For each valid combination of covariate */
       /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */
       fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' files ");
-      for (k=1; k<=cptcoveff; k++){    /* For each covariate k get corresponding value lv for combination k1 */
-       lv= decodtabm(k1,k,cptcoveff); /* Should be the value of the covariate corresponding to k1 combination */
+      for (k=1; k<=nqveff; k++){    /* For each covariate k get corresponding value lv for combination k1 */
+       lv= decodtabm(k1,k,nqveff); /* Should be the value of the covariate corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5820,12 +5989,12 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
       if(backcast==1){ /* We need to get the corresponding values of the covariates involved in this combination k1 */
        /* fprintf(ficgp,",\"%s\" every :::%d::%d u 1:($%d) t\"Backward stable prevalence\" w l lt 3",subdirf2(fileresu,"PLB_"),k1-1,k1-1,1+cpt); */
        fprintf(ficgp,",\"%s\" u 1:((",subdirf2(fileresu,"PLB_")); /* Age is in 1 */
-       if(cptcoveff ==0){
+       if(nqveff ==0){
          fprintf(ficgp,"$%d)) t 'Backward prevalence in state %d' with line ",  2+(cpt-1),  cpt );
        }else{
          kl=0;
-         for (k=1; k<=cptcoveff; k++){    /* For each combination of covariate  */
-           lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
+         for (k=1; k<=nqveff; k++){    /* For each combination of covariate  */
+           lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
            /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
            /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
            /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5835,7 +6004,7 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
            /*6+(cpt-1)*(nlstate+1)+1+(i-1)+(nlstate+1)*nlstate; 6+(1-1)*(2+1)+1+(1-1) +(2+1)*2=13 */ 
            /*6+1+(i-1)+(nlstate+1)*nlstate; 6+1+(1-1) +(2+1)*2=13 */ 
            /* ''  u 6:(($1==1 && $2==0 && $3==2 && $4==0)? $9/(1.-$15) : 1/0):($5==2000? 3:2) t 'p.1' with line lc variable*/
-           if(k==cptcoveff){
+           if(k==nqveff){
              fprintf(ficgp,"$%d==%d && $%d==%d)? $%d : 1/0) t 'Backward prevalence in state %d' with line ",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv], \
                      6+(cpt-1),  cpt );
            }else{
@@ -5852,8 +6021,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
   for (k1=1; k1<= m ; k1 ++) { 
 
     fprintf(ficgp,"\n# 2nd: Total life expectancy with CI: 't' files ");
-    for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-      lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+    for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+      lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
       /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
       /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
       /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5905,8 +6074,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(file
 
     for (cpt=1; cpt<= nlstate ; cpt ++) {
       fprintf(ficgp,"\n# 3d: Life expectancy with EXP_ files:  cov=%d state=%d",k1, cpt);
-      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5947,8 +6116,8 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subd
 
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
       fprintf(ficgp,"\n#\n#\n# Survival functions in state j : 'LIJ_' files, cov=%d state=%d",k1, cpt);
-      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -5989,8 +6158,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each inital state  */
                        
       fprintf(ficgp,"\n#\n#\n# Survival functions in state j and all livestates from state i by final state j: 'lij' files, cov=%d state=%d",k1, cpt);
-      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-                               lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+                               lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
                                /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6039,8 +6208,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                        
       fprintf(ficgp,"\n#\n#\n#CV preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt);
-      for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-                               lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+      for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+                               lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
                                /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6081,8 +6250,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */
       for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                                fprintf(ficgp,"\n#\n#\n#CV Back preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt);
-                               for (k=1; k<=cptcoveff; k++){    /* For each covariate and each value */
-                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */
+                               for (k=1; k<=nqveff; k++){    /* For each covariate and each value */
+                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate number corresponding to k1 combination */
                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
          /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6128,8 +6297,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
     for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */
       for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
                                fprintf(ficgp,"\n#\n#\n#Projection of prevalence to stable (period): 'PROJ_' files, covariatecombination#=%d state=%d",k1, cpt);
-                               for (k=1; k<=cptcoveff; k++){    /* For each correspondig covariate value  */
-                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
+                               for (k=1; k<=nqveff; k++){    /* For each correspondig covariate value  */
+                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */
                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6158,7 +6327,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                        }else{
                                                fprintf(ficgp,",\\\n '' ");
                                        }
-                                       if(cptcoveff ==0){ /* No covariate */
+                                       if(nqveff ==0){ /* No covariate */
                                                ioffset=2; /* Age is in 2 */
                                                /*# yearproj age p11 p21 p31 p.1 p12 p22 p32 p.2 p13 p23 p33 p.3 p14 p24 p34 p.4*/
                                                /*#   1       2   3   4   5  6    7  8   9   10  11  12  13  14  15  16  17  18 */
@@ -6172,7 +6341,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                        fprintf(ficgp," $%d/(1.-$%d)) t 'p%d%d' with line ",                    \
                                                                                        ioffset+(cpt-1)*(nlstate+1)+1+(i-1),  ioffset+1+(i-1)+(nlstate+1)*nlstate,i,cpt );
                                        }else{ /* more than 2 covariates */
-                                               if(cptcoveff ==1){
+                                               if(nqveff ==1){
                                                        ioffset=4; /* Age is in 4 */
                                                }else{
                                                        ioffset=6; /* Age is in 6 */
@@ -6182,8 +6351,8 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                fprintf(ficgp," u %d:(",ioffset); 
                                                kl=0;
                                                strcpy(gplotcondition,"(");
-                                               for (k=1; k<=cptcoveff; k++){    /* For each covariate writing the chain of conditions */
-                                                       lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
+                                               for (k=1; k<=nqveff; k++){    /* For each covariate writing the chain of conditions */
+                                                       lv= decodtabm(k1,k,nqveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
                                                        /* decodtabm(1,1,4) = 1 because h=1  k= (1) 1  1  1 */
                                                        /* decodtabm(1,2,4) = 1 because h=1  k=  1 (1) 1  1 */
                                                        /* decodtabm(13,3,4)= 2 because h=13 k=  1  1 (2) 2 */
@@ -6191,7 +6360,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
                                                        kl++;
                                                        sprintf(gplotcondition+strlen(gplotcondition),"$%d==%d && $%d==%d " ,kl,Tvaraff[k], kl+1, nbcode[Tvaraff[k]][lv]);
                                                        kl++;
-                                                       if(k <cptcoveff && cptcoveff>1)
+                                                       if(k <nqveff && nqveff>1)
                                                                sprintf(gplotcondition+strlen(gplotcondition)," && ");
                                                }
                                                strcpy(gplotcondition+strlen(gplotcondition),")");
@@ -6248,7 +6417,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
   fprintf(ficgp,"#\n");
   for(ng=1; ng<=3;ng++){ /* Number of graphics: first is logit, 2nd is probabilities, third is incidences per year*/
     fprintf(ficgp,"# ng=%d\n",ng);
-    fprintf(ficgp,"#   jk=1 to 2^%d=%d\n",cptcoveff,m);
+    fprintf(ficgp,"#   jk=1 to 2^%d=%d\n",nqveff,m);
     for(jk=1; jk <=m; jk++) {
       fprintf(ficgp,"#    jk=%d\n",jk);
       fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" ",subdirf2(optionfilefiname,"PE_"),jk,ng);
@@ -6371,7 +6540,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
    double *agemingood, *agemaxgood; /* Currently identical for all covariates */
   
   
-   /* modcovmax=2*cptcoveff;/\* Max number of modalities. We suppose  */
+   /* modcovmax=2*nqveff;/\* Max number of modalities. We suppose  */
    /*             a covariate has 2 modalities, should be equal to ncovcombmax  *\/ */
 
    sumnewp = vector(1,ncovcombmax);
@@ -6512,7 +6681,7 @@ plot [%.f:%.f]  ", ageminpar, agemaxpar);
  
 
 /************** Forecasting ******************/
-void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int cptcoveff){
+void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int nqveff){
   /* proj1, year, month, day of starting projection 
      agemin, agemax range of age
      dateprev1 dateprev2 range of dates during which prevalence is computed
@@ -6543,7 +6712,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
   printf("Computing forecasting: result on file '%s', please wait... \n", fileresf);
   fprintf(ficlog,"Computing forecasting: result on file '%s', please wait... \n", fileresf);
 
-  if (cptcoveff==0) ncodemax[cptcoveff]=1;
+  if (nqveff==0) ncodemax[nqveff]=1;
 
 
   stepsize=(int) (stepm+YEARM-1)/YEARM;
@@ -6564,7 +6733,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
   if(jprojmean==0) jprojmean=1;
   if(mprojmean==0) jprojmean=1;
 
-  i1=cptcoveff;
+  i1=nqveff;
   if (cptcovn < 1){i1=1;}
   
   fprintf(ficresf,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jprojmean,mprojmean,anprojmean,dateintmean,dateprev1,dateprev2); 
@@ -6573,10 +6742,10 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 
 /*           if (h==(int)(YEARM*yearp)){ */
   for(cptcov=1, k=0;cptcov<=i1;cptcov++){
-    for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){
+    for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){
       k=k+1;
       fprintf(ficresf,"\n#****** hpijx=probability over h years, hp.jx is weighted by observed prev \n#");
-      for(j=1;j<=cptcoveff;j++) {
+      for(j=1;j<=nqveff;j++) {
                                fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficresf," yearproj age");
@@ -6598,7 +6767,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
                                        for (h=0; h<=nhstepm; h++){
                                                if (h*hstepm/YEARM*stepm ==yearp) {
               fprintf(ficresf,"\n");
-              for(j=1;j<=cptcoveff;j++) 
+              for(j=1;j<=nqveff;j++) 
                 fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
                                                        fprintf(ficresf,"%.f %.f ",anproj1+yearp,agec+h*hstepm/YEARM*stepm);
                                                } 
@@ -6632,7 +6801,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 }
 
 /* /\************** Back Forecasting ******************\/ */
-/* void prevbackforecast(char fileres[], double anback1, double mback1, double jback1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anback2, double p[], int cptcoveff){ */
+/* void prevbackforecast(char fileres[], double anback1, double mback1, double jback1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anback2, double p[], int nqveff){ */
 /*   /\* back1, year, month, day of starting backection  */
 /*      agemin, agemax range of age */
 /*      dateprev1 dateprev2 range of dates during which prevalence is computed */
@@ -6664,7 +6833,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*   printf("Computing back forecasting: result on file '%s', please wait... \n", fileresfb); */
 /*   fprintf(ficlog,"Computing back forecasting: result on file '%s', please wait... \n", fileresfb); */
        
-/*   if (cptcoveff==0) ncodemax[cptcoveff]=1; */
+/*   if (nqveff==0) ncodemax[nqveff]=1; */
        
 /*   /\* if (mobilav!=0) { *\/ */
 /*   /\*   mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); *\/ */
@@ -6692,7 +6861,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*   if(jprojmean==0) jprojmean=1; */
 /*   if(mprojmean==0) jprojmean=1; */
        
-/*   i1=cptcoveff; */
+/*   i1=nqveff; */
 /*   if (cptcovn < 1){i1=1;} */
   
 /*   fprintf(ficresfb,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jprojmean,mprojmean,anprojmean,dateintmean,dateprev1,dateprev2);  */
@@ -6701,10 +6870,10 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
        
 /*     /\*           if (h==(int)(YEARM*yearp)){ *\/ */
 /*   for(cptcov=1, k=0;cptcov<=i1;cptcov++){ */
-/*     for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){ */
+/*     for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){ */
 /*       k=k+1; */
 /*       fprintf(ficresfb,"\n#****** hbijx=probability over h years, hp.jx is weighted by observed prev \n#"); */
-/*       for(j=1;j<=cptcoveff;j++) { */
+/*       for(j=1;j<=nqveff;j++) { */
 /*                             fprintf(ficresfb," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); */
 /*       } */
 /*       fprintf(ficresfb," yearbproj age"); */
@@ -6726,7 +6895,7 @@ void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1,
 /*                                     for (h=0; h<=nhstepm; h++){ */
 /*                                             if (h*hstepm/YEARM*stepm ==yearp) { */
 /*               fprintf(ficresfb,"\n"); */
-/*               for(j=1;j<=cptcoveff;j++)  */
+/*               for(j=1;j<=nqveff;j++)  */
 /*                 fprintf(ficresfb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); */
 /*                                                     fprintf(ficresfb,"%.f %.f ",anback1+yearp,agec+h*hstepm/YEARM*stepm); */
 /*                                             }  */
@@ -6789,7 +6958,7 @@ void populforecast(char fileres[], double anpyram,double mpyram,double jpyram,do
   printf("Computing forecasting: result on file '%s' \n", filerespop);
   fprintf(ficlog,"Computing forecasting: result on file '%s' \n", filerespop);
 
-  if (cptcoveff==0) ncodemax[cptcoveff]=1;
+  if (nqveff==0) ncodemax[nqveff]=1;
 
   /* if (mobilav!=0) { */
   /*   mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
@@ -6824,10 +6993,10 @@ void populforecast(char fileres[], double anpyram,double mpyram,double jpyram,do
   }
   
   for(cptcov=1,k=0;cptcov<=i2;cptcov++){
-    for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){
+    for(cptcod=1;cptcod<=ncodemax[nqveff];cptcod++){
       k=k+1;
       fprintf(ficrespop,"\n#******");
-      for(j=1;j<=cptcoveff;j++) {
+      for(j=1;j<=nqveff;j++) {
        fprintf(ficrespop," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficrespop,"******\n");
@@ -7461,20 +7630,21 @@ void removespace(char *str) {
   while (*p1++ == *p2++);
 }
 
-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+age*age
-   * - nagesqr = 1 if age*age in the model, otherwise 0.
-   * - cptcovt total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age
-   * - cptcovn or number of covariates k of the models excluding age*products =6 and age*age
-   * - 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 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+age*age
+       * - nagesqr = 1 if age*age in the model, otherwise 0.
+       * - cptcovt total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age
+       * - cptcovn or number of covariates k of the models excluding age*products =6 and age*age
+       * - 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, ks;
   int  j1, k1, k2;
@@ -7499,34 +7669,34 @@ int decodemodel ( char model[], int lastobs) /**< This routine decode the model
     if ((strpt=strstr(model,"age*age")) !=0){
       printf(" strpt=%s, model=%s\n",strpt, model);
       if(strpt != model){
-      printf("Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
+                               printf("Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
  'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
  corresponding column of parameters.\n",model);
-      fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
+                               fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
  'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
  corresponding column of parameters.\n",model); fflush(ficlog);
-      return 1;
-    }
+                               return 1;
+                       }
 
       nagesqr=1;
       if (strstr(model,"+age*age") !=0)
-       substrchaine(modelsav, model, "+age*age");
+                               substrchaine(modelsav, model, "+age*age");
       else if (strstr(model,"age*age+") !=0)
-       substrchaine(modelsav, model, "age*age+");
+                               substrchaine(modelsav, model, "age*age+");
       else 
-       substrchaine(modelsav, model, "age*age");
+                               substrchaine(modelsav, model, "age*age");
     }else
       nagesqr=0;
     if (strlen(modelsav) >1){
       j=nbocc(modelsav,'+'); /**< j=Number of '+' */
       j1=nbocc(modelsav,'*'); /**< j1=Number of '*' */
-      cptcovs=j+1-j1; /**<  Number of simple covariates V1+V1*age+V3 +V3*V4+age*age=> V1 + V3 =2  */
+      cptcovs=j+1-j1; /**<  Number of simple covariates V1+V1*age+V3 +V3*V4+age*age=> V1 + V3 =5-3=2  */
       cptcovt= j+1; /* Number of total covariates in the model, not including
-                  * cst, age and age*age 
-                  * V1+V1*age+ V3 + V3*V4+age*age=> 4*/
-                  /* including age products which are counted in cptcovage.
-                 * but the covariates which are products must be treated 
-                 * separately: ncovn=4- 2=2 (V1+V3). */
+                                                                                * cst, age and age*age 
+                                                                                * V1+V1*age+ V3 + V3*V4+age*age=> 3+1=4*/
+                       /* including age products which are counted in cptcovage.
+                        * but the covariates which are products must be treated 
+                        * separately: ncovn=4- 2=2 (V1+V3). */
       cptcovprod=j1; /**< Number of products  V1*V2 +v3*age = 2 */
       cptcovprodnoage=0; /**< Number of covariate products without age: V3*V4 =1  */
 
@@ -7538,8 +7708,8 @@ int decodemodel ( char model[], int lastobs) /**< This routine decode the model
        *   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
+       *       covar[1][i]= (V1), covar[4][i]=(V4), covar[8][i]=(V8)
+       *  Tvar[k] # of the kth covariate:  Tvar[1]=2  Tvar[2]=1 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
@@ -7647,16 +7817,29 @@ int decodemodel ( char model[], int lastobs) /**< This routine decode the model
     If model=V1+V1*age then Tvar[1]=1 Tvar[2]=1 cptcovage=1 Tage[1]=2 cptcovprod=0*/
 
   /* printf("tvar1=%d tvar2=%d tvar3=%d cptcovage=%d Tage=%d",Tvar[1],Tvar[2],Tvar[3],cptcovage,Tage[1]);
-  printf("cptcovprod=%d ", cptcovprod);
-  fprintf(ficlog,"cptcovprod=%d ", cptcovprod);
-
-  scanf("%d ",i);*/
-
+                printf("cptcovprod=%d ", cptcovprod);
+                fprintf(ficlog,"cptcovprod=%d ", cptcovprod);
+
+                scanf("%d ",i);*/
+/* Dispatching in quantitative and time varying covariates */
+
+       for(k=1, ncoveff=0, nqveff=0, ntveff=0, nqtveff=0;k<=cptcovn; k++){ /* or cptocvt */
+               if (Tvar[k] <=ncovcol){
+                       ncoveff++;
+               }else if( Tvar[k] <=ncovcol+nqv){
+                       nqveff++;
+               }else if( Tvar[k] <=ncovcol+nqv+ntv){
+                       ntveff++;
+               }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv){
+                       nqtveff++;
+               }else
+                       printf("Error in effective covariates \n");
+       }
 
   return (0); /* with covar[new additional covariate if product] and Tage if age */ 
   /*endread:*/
-    printf("Exiting decodemodel: ");
-    return (1);
+       printf("Exiting decodemodel: ");
+       return (1);
 }
 
 int calandcheckages(int imx, int maxwav, double *agemin, double *agemax, int *nberr, int *nbwarn )
@@ -7991,7 +8174,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
   agebase=ageminpar;
   agelim=agemaxpar;
 
-  i1=pow(2,cptcoveff);
+  i1=pow(2,ncoveff);
   if (cptcovn < 1){i1=1;}
 
   for(k=1; k<=i1;k++){
@@ -8004,7 +8187,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
     fprintf(ficrespl,"#******");
     printf("#******");
     fprintf(ficlog,"#******");
-    for(j=1;j<=cptcoveff;j++) {
+    for(j=1;j<=nqveff;j++) {
       fprintf(ficrespl," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
@@ -8020,7 +8203,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
                }
 
     fprintf(ficrespl,"#Age ");
-    for(j=1;j<=cptcoveff;j++) {
+    for(j=1;j<=nqveff;j++) {
       fprintf(ficrespl,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     }
     for(i=1; i<=nlstate;i++) fprintf(ficrespl,"  %d-%d   ",i,i);
@@ -8030,7 +8213,7 @@ int prevalence_limit(double *p, double **prlim, double ageminpar, double agemaxp
       /* for (age=agebase; age<=agebase; age++){ */
       prevalim(prlim, nlstate, p, age, oldm, savm, ftolpl, ncvyearp, k);
       fprintf(ficrespl,"%.0f ",age );
-      for(j=1;j<=cptcoveff;j++)
+      for(j=1;j<=nqveff;j++)
                                                        fprintf(ficrespl,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       tot=0.;
       for(i=1; i<=nlstate;i++){
@@ -8078,7 +8261,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
   agelim=agemaxpar;
   
   
-  i1=pow(2,cptcoveff);
+  i1=pow(2,nqveff);
   if (cptcovn < 1){i1=1;}
 
        for(k=1; k<=i1;k++){ 
@@ -8091,7 +8274,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
     fprintf(ficresplb,"#******");
     printf("#******");
     fprintf(ficlog,"#******");
-    for(j=1;j<=cptcoveff;j++) {
+    for(j=1;j<=nqveff;j++) {
       fprintf(ficresplb," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
@@ -8107,7 +8290,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
                }
     
     fprintf(ficresplb,"#Age ");
-    for(j=1;j<=cptcoveff;j++) {
+    for(j=1;j<=nqveff;j++) {
       fprintf(ficresplb,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     }
     for(i=1; i<=nlstate;i++) fprintf(ficresplb,"  %d-%d   ",i,i);
@@ -8129,7 +8312,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
                                bprevalim(bprlim, probs, nlstate, p, age, ftolpl, ncvyearp, k);
       }
       fprintf(ficresplb,"%.0f ",age );
-      for(j=1;j<=cptcoveff;j++)
+      for(j=1;j<=nqveff;j++)
                                fprintf(ficresplb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       tot=0.;
       for(i=1; i<=nlstate;i++){
@@ -8177,13 +8360,13 @@ int hPijx(double *p, int bage, int fage){
     /* hstepm=1;   aff par mois*/
     pstamp(ficrespij);
     fprintf(ficrespij,"#****** h Pij x Probability to be in state j at age x+h being in i at x ");
-    i1= pow(2,cptcoveff);
+    i1= pow(2,nqveff);
                /* for(cptcov=1,k=0;cptcov<=i1;cptcov++){ */
                /*    /\*for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*\/ */
                /*      k=k+1;  */
-    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+    for (k=1; k <= (int) pow(2,nqveff); k++){
       fprintf(ficrespij,"\n#****** ");
-      for(j=1;j<=cptcoveff;j++) 
+      for(j=1;j<=nqveff;j++) 
        fprintf(ficrespij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficrespij,"******\n");
       
@@ -8249,13 +8432,13 @@ int hPijx(double *p, int bage, int fage){
   /* hstepm=1;   aff par mois*/
   pstamp(ficrespijb);
   fprintf(ficrespijb,"#****** h Pij x Back Probability to be in state i at age x-h being in j at x ");
-  i1= pow(2,cptcoveff);
+  i1= pow(2,nqveff);
   /* for(cptcov=1,k=0;cptcov<=i1;cptcov++){ */
   /*    /\*for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*\/ */
   /*   k=k+1;  */
-  for (k=1; k <= (int) pow(2,cptcoveff); k++){
+  for (k=1; k <= (int) pow(2,nqveff); k++){
     fprintf(ficrespijb,"\n#****** ");
-    for(j=1;j<=cptcoveff;j++)
+    for(j=1;j<=nqveff;j++)
       fprintf(ficrespijb,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
     fprintf(ficrespijb,"******\n");
     if(invalidvarcomb[k]){
@@ -8652,7 +8835,7 @@ int main(int argc, char *argv[])
   covar=matrix(0,NCOVMAX,1,n);  /**< used in readdata */
   coqvar=matrix(1,nqv,1,n);  /**< used in readdata */
   cotvar=ma3x(1,maxwav,1,ntv,1,n);  /**< used in readdata */
-  cotqvar=ma3x(1,maxwav,1,ntqv,1,n);  /**< used in readdata */
+  cotqvar=ma3x(1,maxwav,1,nqtv,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
@@ -9422,7 +9605,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     printf("\n");
     
     /*--------- results files --------------*/
-    fprintf(ficres,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle= 0 weight=%d\nmodel=1+age+%s.\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate, ndeath, maxwav, weightopt,model);
+    fprintf(ficres,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nqv=%d ntv=%d nqtv=%d nlstate=%d ndeath=%d maxwav=%d mle= 0 weight=%d\nmodel=1+age+%s.\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nqv, ntv, nqtv, nlstate, ndeath, maxwav, weightopt,model);
     
     
     fprintf(ficres,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n");
@@ -9769,7 +9952,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*if((stepm == 1) && (strcmp(model,".")==0)){*/
     if(prevfcast==1){
       /*    if(stepm ==1){*/
-      prevforecast(fileresu, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, cptcoveff);
+      prevforecast(fileresu, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, nqveff);
     }
     if(backcast==1){
       ddnewms=matrix(1,nlstate+ndeath,1,nlstate+ndeath);       
@@ -9787,7 +9970,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       free_matrix(bprlim,1,nlstate,1,nlstate); /*here or after loop ? */
 
       /* prevbackforecast(fileresu, anback1, mback1, jback1, agemin, agemax, dateprev1, dateprev2, mobilavproj,
-        bage, fage, firstpass, lastpass, anback2, p, cptcoveff); */
+        bage, fage, firstpass, lastpass, anback2, p, nqveff); */
       free_matrix(ddnewms, 1, nlstate+ndeath, 1, nlstate+ndeath);
       free_matrix(ddsavms, 1, nlstate+ndeath, 1, nlstate+ndeath);
       free_matrix(ddoldms, 1, nlstate+ndeath, 1, nlstate+ndeath);
@@ -9813,9 +9996,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     printf("Computing Health Expectancies: result on file '%s' ...", filerese);fflush(stdout);
     fprintf(ficlog,"Computing Health Expectancies: result on file '%s' ...", filerese);fflush(ficlog);
                
-    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+    for (k=1; k <= (int) pow(2,nqveff); k++){
       fprintf(ficreseij,"\n#****** ");
-      for(j=1;j<=cptcoveff;j++) {
+      for(j=1;j<=nqveff;j++) {
                                fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       }
       fprintf(ficreseij,"******\n");
@@ -9873,15 +10056,15 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
       for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
           
-    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+    for (k=1; k <= (int) pow(2,nqveff); k++){
       fprintf(ficrest,"\n#****** ");
-      for(j=1;j<=cptcoveff;j++) 
+      for(j=1;j<=nqveff;j++) 
                                fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficrest,"******\n");
       
       fprintf(ficresstdeij,"\n#****** ");
       fprintf(ficrescveij,"\n#****** ");
-      for(j=1;j<=cptcoveff;j++) {
+      for(j=1;j<=nqveff;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)]);
       }
@@ -9889,7 +10072,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
       fprintf(ficrescveij,"******\n");
       
       fprintf(ficresvij,"\n#****** ");
-      for(j=1;j<=cptcoveff;j++) 
+      for(j=1;j<=nqveff;j++) 
                                fprintf(ficresvij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
       fprintf(ficresvij,"******\n");
       
@@ -9999,9 +10182,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
       for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
           
-    for (k=1; k <= (int) pow(2,cptcoveff); k++){
+    for (k=1; k <= (int) pow(2,nqveff); k++){
        fprintf(ficresvpl,"\n#****** ");
-                       for(j=1;j<=cptcoveff;j++) 
+                       for(j=1;j<=nqveff;j++) 
                                fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
                        fprintf(ficresvpl,"******\n");
       
@@ -10027,7 +10210,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     free_matrix(oldms, 1,nlstate+ndeath,1,nlstate+ndeath);
     free_matrix(newms, 1,nlstate+ndeath,1,nlstate+ndeath);
     free_matrix(savms, 1,nlstate+ndeath,1,nlstate+ndeath);
-    free_ma3x(cotqvar,1,maxwav,1,ntqv,1,n);
+    free_ma3x(cotqvar,1,maxwav,1,nqtv,1,n);
     free_ma3x(cotvar,1,maxwav,1,ntv,1,n);
     free_matrix(coqvar,1,maxwav,1,n);
     free_matrix(covar,0,NCOVMAX,1,n);