]> henry.ined.fr Git - .git/commitdiff
Summary: Improvements in models with age*Vn*Vm
authorN. Brouard <brouard@ined.fr>
Tue, 31 Jan 2023 09:19:37 +0000 (09:19 +0000)
committerN. Brouard <brouard@ined.fr>
Tue, 31 Jan 2023 09:19:37 +0000 (09:19 +0000)
src/imach.c

index b11af2b12654de4c14771ddd34965e9e80d755ab..91c768c7739ee63c813a0ef55eda1c26f038867d 100644 (file)
@@ -1314,7 +1314,7 @@ typedef struct {
 /* #include <libintl.h> */
 /* #define _(String) gettext (String) */
 
-#define MAXLINE 2048 /* Was 256 and 1024. Overflow with 312 with 2 states and 4 covariates. Should be ok */
+#define MAXLINE 16384 /* Was 256 and 1024 and 2048. Overflow with 312 with 2 states and 4 covariates. Should be ok */
 
 #define GNUPLOTPROGRAM "gnuplot"
 #define GNUPLOTVERSION 5.1
@@ -1325,7 +1325,7 @@ double gnuplotversion=GNUPLOTVERSION;
 #define        GLOCK_ERROR_NOPATH              -1      /* empty path */
 #define        GLOCK_ERROR_GETCWD              -2      /* cannot get cwd */
 
-#define MAXPARM 128 /**< Maximum number of parameters for the optimization */
+#define MAXPARM 216 /**< Maximum number of parameters for the optimization was 128 */
 #define NPARMAX 64 /**< (nlstate+ndeath-1)*nlstate*ncovmodel */
 
 #define NINTERVMAX 8
@@ -1359,7 +1359,7 @@ double gnuplotversion=GNUPLOTVERSION;
 /* $State$ */
 #include "version.h"
 char version[]=__IMACH_VERSION__;
-char copyright[]="September 2022,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2020, Nihon University 2021-202, INED 2000-2022";
+char copyright[]="January 2023,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2020, Nihon University 2021-202, INED 2000-2022";
 char fullversion[]="$Revision$ $Date$"; 
 char strstart[80];
 char optionfilext[10], optionfilefiname[FILENAMELENGTH];
@@ -1373,12 +1373,18 @@ int cptcovt=0; /**< cptcovt: total number of covariates of the model (2) nbocc(+
 int cptcovs=0; /**< cptcovs number of SIMPLE covariates in the model V2+V1 =2 (dummy or quantit or time varying) */
 int cptcovsnq=0; /**< cptcovsnq number of SIMPLE covariates in the model but non quantitative V2+V1 =2 */
 int cptcovage=0; /**< Number of covariates with age: V3*age only =1 */
+int cptcovprodage=0; /**< Number of fixed covariates with age: V3*age or V2*V3*age 1 */
+int cptcovprodvage=0; /**< Number of varying covariates with age: V7*age or V7*V6*age */
+int cptcovdageprod=0; /**< Number of doubleproducts with age, since 0.99r44 only: age*Vn*Vm for gnuplot printing*/
 int cptcovprodnoage=0; /**< Number of covariate products without age */   
 int cptcoveff=0; /* Total number of single dummy covariates (fixed or time varying) to vary for printing results (2**cptcoveff combinations of dummies)(computed in tricode as cptcov) */
 int ncovf=0; /* Total number of effective fixed covariates (dummy or quantitative) in the model */
 int ncovv=0; /* Total number of effective (wave) varying covariates (dummy or quantitative) in the model */
 int ncovvt=0; /* Total number of effective (wave) varying covariates (dummy or quantitative or products [without age]) in the model */
-int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (dummy of quantitative) in the model */
+int ncovvta=0; /*  +age*V6 + age*V7+ age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of expandend products [with age]) in the model */
+int ncovta=0; /*age*V3*V2 +age*V2+agev3+ageV4  +age*V6 + age*V7+ age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of expandend products [with age]) in the model */
+int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (single or product, dummy or quantitative) in the model */
+int ncovva=0; /* +age*V6 + age*V7+ge*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of effective (wave and stepm) varying with age covariates (single or product, dummy or quantitative) in the model */
 int nsd=0; /**< Total number of single dummy variables (output) */
 int nsq=0; /**< Total number of single quantitative variables (output) */
 int ncoveff=0; /* Total number of effective fixed dummy covariates in the model */
@@ -1465,6 +1471,7 @@ extern time_t time();
 
 struct tm start_time, end_time, curr_time, last_time, forecast_time;
 time_t  rstart_time, rend_time, rcurr_time, rlast_time, rforecast_time; /* raw time */
+time_t   rlast_btime; /* raw time */
 struct tm tm;
 
 char strcurr[80], strfor[80];
@@ -1568,27 +1575,27 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */
   # States 1=Coresidence, 2 Living alone, 3 Institution
   # V1=sex, V2=raedyrs Quant Fixed, State=livarnb4..livarnb11, V3=iadl4..iald11, V4=adlw4..adlw11, V5=r4bmi..r11bmi
 */
-/*           V5+V4+ V3+V4*V3 +V5*age+V2 +V1*V2+V1*age+V1 */
-/*    kmodel  1  2   3   4     5    6    7     8    9 */
-/*Typevar[k]=  0  0   0   2     1    0    2     1    0 *//*0 for simple covariate (dummy, quantitative,*/
-                                                         /* fixed or varying), 1 for age product, 2 for*/
-                                                         /* product */
-/*Dummy[k]=    1  0   0   1     3    1    1     2    0 *//*Dummy[k] 0=dummy (0 1), 1 quantitative */
-                                                         /*(single or product without age), 2 dummy*/
-                                                         /* with age product, 3 quant with age product*/
-/*Tvar[k]=     5  4   3   6     5    2    7     1    1 */
-/*    nsd         1   2                              3 */ /* Counting single dummies covar fixed or tv */
-/*TnsdVar[Tvar]   1   2                              3 */ 
-/*Tvaraff[nsd]     4   3                              1 */ /* ID of single dummy cova fixed or timevary*/
-/*TvarsD[nsd]     4   3                              1 */ /* ID of single dummy cova fixed or timevary*/
-/*TvarsDind[nsd]  2   3                              9 */ /* position K of single dummy cova */
-/*    nsq      1                     2                 */ /* Counting single quantit tv */
-/* TvarsQ[k]   5                     2                 */ /* Number of single quantitative cova */
-/* TvarsQind   1                     6                 */ /* position K of single quantitative cova */
-/* Tprod[i]=k             1               2            */ /* Position in model of the ith prod without age */
-/* cptcovage                    1               2      */ /* Counting cov*age in the model equation */
-/* Tage[cptcovage]=k            5               8      */ /* Position in the model of ith cov*age */
-/* Tvard[1][1]@4={4,3,1,2}    V4*V3 V1*V2              */ /* Position in model of the ith prod without age */
+/*           V5+V4+ V3+V4*V3 +V5*age+V2 +V1*V2+V1*age+V1+V4*V3*age */
+/*    kmodel  1  2   3    4     5     6    7     8     9    10 */
+/*Typevar[k]=  0  0   0   2     1    0    2     1     0    3 *//*0 for simple covariate (dummy, quantitative,*/
+                                                               /* fixed or varying), 1 for age product, 2 for*/
+                                                               /* product without age, 3 for age and double product   */
+/*Dummy[k]=    1  0   0   1     3    1    1     2     0     3  *//*Dummy[k] 0=dummy (0 1), 1 quantitative */
+                                                                /*(single or product without age), 2 dummy*/
+                                                               /* with age product, 3 quant with age product*/
+/*Tvar[k]=     5  4   3   6     5    2    7     1     1     6 */
+/*    nsd         1   2                               3 */ /* Counting single dummies covar fixed or tv */
+/*TnsdVar[Tvar]   1   2                               3 */ 
+/*Tvaraff[nsd]    4   3                               1 */ /* ID of single dummy cova fixed or timevary*/
+/*TvarsD[nsd]     4   3                               1 */ /* ID of single dummy cova fixed or timevary*/
+/*TvarsDind[nsd]  2   3                               9 */ /* position K of single dummy cova */
+/*    nsq      1                     2                  */ /* Counting single quantit tv */
+/* TvarsQ[k]   5                     2                  */ /* Number of single quantitative cova */
+/* TvarsQind   1                     6                  */ /* position K of single quantitative cova */
+/* Tprod[i]=k             1               2             */ /* Position in model of the ith prod without age */
+/* cptcovage                    1               2         3 */ /* Counting cov*age in the model equation */
+/* Tage[cptcovage]=k            5               8         10 */ /* Position in the model of ith cov*age */
+/* Tvard[1][1]@4={4,3,1,2}    V4*V3 V1*V2               */ /* Position in model of the ith prod without age */
 /* Tvardk[4][1]=4;Tvardk[4][2]=3;Tvardk[7][1]=1;Tvardk[7][2]=2 */ /* Variables of a prod at position in the model equation*/
 /* TvarF TvarF[1]=Tvar[6]=2,  TvarF[2]=Tvar[7]=7, TvarF[3]=Tvar[9]=1  ID of fixed covariates or product V2, V1*V2, V1 */
 /* TvarFind;  TvarFind[1]=6,  TvarFind[2]=7, TvarFind[3]=9 *//* Inverse V2(6) is first fixed (single or prod)  */
@@ -1638,14 +1645,18 @@ int *TvarVQ; /* TvarVQ[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* O
 int *TvarVQind; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
 int *TvarVV; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */
 int *TvarVVind; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */
+int *TvarVVA; /* We count ncovvt time varying covariates (single or products with age) and put their name into TvarVVA */
+int *TvarVVAind; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */
+int *TvarAVVA; /* We count ALL ncovta time varying covariates (single or products with age) and put their name into TvarVVA */
+int *TvarAVVAind; /* We count ALL ncovta time varying covariates (single or products without age) and put their name into TvarVV */
       /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
-      /* model V1+V3+age*V1+age*V3+V1*V3 */
-      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
-      /* TvarVV={3,1,3}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */            
-      /* TvarVVind={2,5,5}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */         
+      /* model V1+V3+age*V1+age*V3+V1*V3 + V1*V3*age */
+      /*  Tvar={1, 3, 1, 3, 6, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      /* TvarVV={3,1,3,1,3}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */        
+      /* TvarVVind={2,5,5,6,6}, for V3 and then the product V1*V3 is decomposed into V1 and V3 and V1*V3*age into 6,6 */              
 int *Tvarsel; /**< Selected covariates for output */
 double *Tvalsel; /**< Selected modality value of covariate for output */
-int *Typevar; /**< 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product */
+int *Typevar; /**< 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product, 3 age*Vn*Vm */
 int *Fixed; /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */ 
 int *Dummy; /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ 
 int *DummyV; /** Dummy[v] 0=dummy (0 1), 1 quantitative */
@@ -1808,19 +1819,19 @@ char *trimbb(char *out, char *in)
 char *substrchaine(char *out, char *in, char *chain)
 {
   /* Substract chain 'chain' from 'in', return and output 'out' */
-  /* in="V1+V1*age+age*age+V2", chain="age*age" */
+  /* in="V1+V1*age+age*age+V2", chain="+age*age" out="V1+V1*age+V2" */
 
   char *strloc;
 
-  strcpy (out, in); 
-  strloc = strstr(out, chain); /* strloc points to out at age*age+V2 */
-  printf("Bef strloc=%s chain=%s out=%s \n", strloc, chain, out);
+  strcpy (out, in);                   /* out="V1+V1*age+age*age+V2" */
+  strloc = strstr(out, chain); /* strloc points to out at "+age*age+V2"  */
+  printf("Bef strloc=%s chain=%s out=%s \n", strloc, chain, out); /* strloc=+age*age+V2 chain="+age*age", out="V1+V1*age+age*age+V2" */
   if(strloc != NULL){ 
-    /* will affect out */ /* strloc+strlenc(chain)=+V2 */ /* Will also work in Unicode */
-    memmove(strloc,strloc+strlen(chain), strlen(strloc+strlen(chain))+1);
-    /* strcpy (strloc, strloc +strlen(chain));*/
+    /* will affect out */ /* strloc+strlen(chain)=|+V2 = "V1+V1*age+age*age|+V2" */ /* Will also work in Unicodek */
+    memmove(strloc,strloc+strlen(chain), strlen(strloc+strlen(chain))+1); /* move number of bytes corresponding to the length of "+V2" which is 3, plus one is 4 (including the null)*/
+    /* equivalent to strcpy (strloc, strloc +strlen(chain)) if no overlap; Copies from "+V2" to V1+V1*age+ */
   }
-  printf("Aft strloc=%s chain=%s in=%s out=%s \n", strloc, chain, in, out);
+  printf("Aft strloc=%s chain=%s in=%s out=%s \n", strloc, chain, in, out);  /* strloc=+V2 chain="+age*age", in="V1+V1*age+age*age+V2", out="V1+V1*age+V2" */
   return out;
 }
 
@@ -1828,7 +1839,7 @@ char *substrchaine(char *out, char *in, char *chain)
 char *cutl(char *blocc, char *alocc, char *in, char occ)
 {
   /* cuts string in into blocc and alocc where blocc ends before FIRST occurence of char 'occ' 
-     and alocc starts after first occurence of char 'occ' : ex cutv(blocc,alocc,"abcdef2ghi2j",'2')
+     and alocc starts after first occurence of char 'occ' : ex cutl(blocc,alocc,"abcdef2ghi2j",'2')
      gives alocc="abcdef" and blocc="ghi2j".
      If occ is not found blocc is null and alocc is equal to in. Returns blocc
   */
@@ -1894,6 +1905,28 @@ int nbocc(char *s, char occ)
   return j;
 }
 
+int nboccstr(char *textin, char *chain)
+{
+  /* Counts the number of occurence of "chain"  in string textin */
+  /*  in="+V7*V4+age*V2+age*V3+age*V4"  chain="age" */
+  char *strloc;
+  
+  int i,j=0;
+
+  i=0;
+
+  strloc=textin; /* strloc points to "^+V7*V4+age+..." in textin */
+  for(;;) {
+    strloc= strstr(strloc,chain); /* strloc points to first character of chain in textin if found. Example strloc points^ to "+V7*V4+^age" in textin  */
+    if(strloc != NULL){
+      strloc = strloc+strlen(chain); /* strloc points to "+V7*V4+age^" in textin */
+      j++;
+    }else
+      break;
+  }
+  return j;
+  
+}
 /* void cutv(char *u,char *v, char*t, char occ) */
 /* { */
 /*   /\* cuts string t into u and v where u ends before last occurence of char 'occ'  */
@@ -2573,7 +2606,8 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
   double fp,fptt;
   double *xits;
   int niterf, itmp;
-
+  int Bigter=0, nBigterf=1;
+  
   pt=vector(1,n); 
   ptt=vector(1,n); 
   xit=vector(1,n); 
@@ -2586,14 +2620,16 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
     ibig=0; 
     del=0.0; 
     rlast_time=rcurr_time;
+    rlast_btime=rcurr_time;
     /* (void) gettimeofday(&curr_time,&tzp); */
     rcurr_time = time(NULL);  
     curr_time = *localtime(&rcurr_time);
     /* printf("\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout); */
     /* fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog); */
-    printf("\nPowell iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout);
-    fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog);
-/*     fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tm_sec-start_time.tm_sec); */
+    Bigter=(*iter - *iter % ncovmodel)/ncovmodel +1; /* Big iteration, i.e on ncovmodel cycle */
+    printf("\nPowell iter=%d Big Iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,Bigter,*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout);
+    fprintf(ficlog,"\nPowell iter=%d Big Iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,Bigter,*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog);
+    fprintf(ficrespow,"%d %d %.12f %d",*iter,Bigter, *fret,curr_time.tm_sec-start_time.tm_sec);
     fp=(*fret); /* From former iteration or initial value */
     for (i=1;i<=n;i++) {
       fprintf(ficrespow," %.12lf", p[i]);
@@ -2615,6 +2651,9 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       }else if(Typevar[j]==2) {
        printf("  +    V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
        fprintf(ficlog,"  +    V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+      }else if(Typevar[j]==3) {
+       printf("  +    V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+       fprintf(ficlog,"  +    V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
       }
     }
     printf("\n");
@@ -2645,15 +2684,17 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
        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){
+      for(nBigterf=1;nBigterf<=31;nBigterf+=10){
+       niterf=nBigterf*ncovmodel;
+       /* rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time); */
        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);
+       printf("   - if your program needs %d BIG iterations (%d iterations) to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",nBigterf, niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
+       fprintf(ficlog,"   - if your program needs %d BIG iterations  (%d iterations) to converge, convergence will be \n   reached in %s i.e.\n   on %s (current time is %s);\n",nBigterf, niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
       }
     }
     for (i=1;i<=n;i++) { /* For each direction i */
@@ -2954,7 +2995,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
      /* Model(2)  V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */
      /* total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age */
      for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
-       if(Typevar[k1]==1){ /* A product with age */
+       if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */
         cov[2+nagesqr+k1]=precov[nres][k1]*cov[2];
        }else{
         cov[2+nagesqr+k1]=precov[nres][k1];
@@ -3164,7 +3205,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret
       cov[3]= agefin*agefin;;
     }
     for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
-      if(Typevar[k1]==1){ /* A product with age */
+      if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */
        cov[2+nagesqr+k1]=precov[nres][k1]*cov[2];
       }else{
        cov[2+nagesqr+k1]=precov[nres][k1];
@@ -3631,7 +3672,7 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in
       /* Model(2)  V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */
       /* total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age */
       for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
-       if(Typevar[k1]==1){ /* A product with age */
+       if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */
          cov[2+nagesqr+k1]=precov[nres][k1]*cov[2];
        }else{
          cov[2+nagesqr+k1]=precov[nres][k1];
@@ -3817,7 +3858,7 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do
       }
       /** New code */
       for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
-       if(Typevar[k1]==1){ /* A product with age */
+       if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */
          cov[2+nagesqr+k1]=precov[nres][k1]*cov[2];
        }else{
          cov[2+nagesqr+k1]=precov[nres][k1];
@@ -4002,18 +4043,6 @@ double func( double *x)
          iposold=ipos;
          cov[ioffset+ipos]=cotvarv;
        }
-       /* for(itv=1; itv <= ntveff; itv++){ /\* Varying dummy covariates (single??)*\/ */
-       /*   iv= Tvar[Tmodelind[ioffset-2-nagesqr-cptcovage+itv]]-ncovcol-nqv; /\* Counting the # varying covariate from 1 to ntveff *\/ */
-       /*   cov[ioffset+iv]=cotvar[mw[mi][i]][iv][i]; */
-       /*   k=ioffset-2-nagesqr-cptcovage+itv; /\* position in simple model *\/ */
-       /*   cov[ioffset+itv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; */
-       /*   printf(" i=%d,mi=%d,itv=%d,TmodelInvind[itv]=%d,cotvar[mw[mi][i]][TmodelInvind[itv]][i]=%f\n", i, mi, itv, TmodelInvind[itv],cotvar[mw[mi][i]][TmodelInvind[itv]][i]); */
-       /* } */
-       /* for(iqtv=1; iqtv <= nqtveff; iqtv++){ /\* Varying quantitatives covariates *\/ */
-       /*   iv=TmodelInvQind[iqtv]; /\* Counting the # varying covariate from 1 to ntveff *\/ */
-       /*   /\* printf(" i=%d,mi=%d,iqtv=%d,TmodelInvQind[iqtv]=%d,cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]=%f\n", i, mi, iqtv, TmodelInvQind[iqtv],cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]); *\/ */
-       /*   cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]; */
-       /* } */
        /* for products of time varying to be done */
        for (ii=1;ii<=nlstate+ndeath;ii++)
          for (j=1;j<=nlstate+ndeath;j++){
@@ -4029,12 +4058,30 @@ double func( double *x)
          cov[2]=agexact;
          if(nagesqr==1)
            cov[3]= agexact*agexact;  /* Should be changed here */
-         for (kk=1; kk<=cptcovage;kk++) {
-           if(!FixedV[Tvar[Tage[kk]]])
-             cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /* Tage[kk] gives the data-covariate associated with age */
-           else
-             cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]*agexact; /* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ 
+         /* for (kk=1; kk<=cptcovage;kk++) { */
+         /*   if(!FixedV[Tvar[Tage[kk]]]) */
+         /*     cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /\* Tage[kk] gives the data-covariate associated with age *\/ */
+         /*   else */
+         /*     cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]*agexact; /\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/  */
+         /* } */
+         for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying  covariates with age including individual from products, product is computed dynamically */
+           itv=TvarAVVA[ncovva]; /*  TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm  */
+           ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/
+           if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */
+             cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i];  /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ 
+           }else{ /* fixed covariate */
+             cotvarv=covar[itv][i];  /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */
+           }
+           if(ipos!=iposold){ /* Not a product or first of a product */
+             cotvarvold=cotvarv;
+           }else{ /* A second product */
+             cotvarv=cotvarv*cotvarvold;
+           }
+           iposold=ipos;
+           cov[ioffset+ipos]=cotvarv*agexact;
+           /* For products */
          }
+         
          out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
                       1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
          savm=oldm;
@@ -4303,7 +4350,7 @@ double func( double *x)
 double funcone( double *x)
 {
   /* Same as func but slower because of a lot of printf and if */
-  int i, ii, j, k, mi, d, kk, kf=0;
+  int i, ii, j, k, mi, d, kk, kv=0, kf=0;
   int ioffset=0;
   int ipos=0,iposold=0,ncovv=0;
 
@@ -4339,7 +4386,7 @@ double funcone( double *x)
     /* Fixed */
     /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */
     /* for (k=1; k<=ncoveff;k++){ /\* Simple and product fixed Dummy covariates without age* products *\/ */
-    for (kf=1; kf<=ncovf;kf++){ /* Simple and product fixed covariates without age* products *//* Missing values are set to -1 but should be dropped */
+    for (kf=1; kf<=ncovf;kf++){ /*  V2  +  V3  +  V4  Simple and product fixed covariates without age* products *//* Missing values are set to -1 but should be dropped */
       /* printf("Debug3 TvarFind[%d]=%d",kf, TvarFind[kf]); */
       /* printf(" Tvar[TvarFind[kf]]=%d", Tvar[TvarFind[kf]]); */
       /* printf(" i=%d covar[Tvar[TvarFind[kf]]][i]=%f\n",i,covar[Tvar[TvarFind[kf]]][i]); */
@@ -4396,35 +4443,112 @@ double funcone( double *x)
       * TvarFind[k]     1   0     0     0         0        0        0       0        0
       */
       /* Other model ncovcol=5 nqv=0 ntv=3 nqtv=0 nlstate=3
-       * V2 V3 V4 are fixed V6 V7 are timevarying so V8 and V5 are not in the model and product column will start at 9 Tvar[4]=6
+       * V2 V3 V4 are fixed V6 V7 are timevarying so V8 and V5 are not in the model and product column will start at 9 Tvar[(v6*V2)6]=9
        * FixedV[ncovcol+qv+ntv+nqtv]       V5
-       *             V1  V2     V3    V4   V5 V6     V7  V8
-       *             0   0      0      0    0  1      1   1 
-       * model=          V2  +  V3  +  V4  +  V6  +  V7  +  V6*V2  +  V7*V2  +  V6*V3  +  V7*V3  +  V6*V4  +  V7*V4
-       * kmodel           1     2      3      4      5        6         7         8         9        10        11
+       * 3           V1  V2     V3    V4   V5 V6     V7  V8 V3*V2 V7*V2  V6*V3 V7*V3 V6*V4 V7*V4
+       *             0   0      0      0    0  1      1   1  0, 0, 1,1,   1, 0, 1, 0, 1, 0, 1, 0}
+       * 3           0   0      0      0    0  1      1   1  0,     1      1    1      1    1}
+       * model=          V2  +  V3  +  V4  +  V6  +  V7  +  V6*V2  +  V7*V2  +  V6*V3  +  V7*V3  +  V6*V4  +  V7*V4  
+        *                +age*V2 +age*V3 +age*V4 +age*V6 + age*V7
+        *                +age*V6*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4
+       * model2=          V2  +  V3  +  V4  +  V6  +  V7  +  V3*V2  +  V7*V2  +  V6*V3  +  V7*V3  +  V6*V4  +  V7*V4  
+        *                +age*V2 +age*V3 +age*V4 +age*V6 + age*V7
+        *                +age*V3*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4
+       * model3=          V2  +  V3  +  V4  +  V6  +  V7  + age*V3*V2  +  V7*V2  +  V6*V3  +  V7*V3  +  V6*V4  +  V7*V4  
+        *                +age*V2 +age*V3 +age*V4 +age*V6 + age*V7
+        *                +V3*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4
+       * kmodel           1     2      3      4      5        6         7         8         9        10        11    
+       *                  12       13      14      15       16
+       *                    17        18         19        20         21
+       * Tvar[kmodel]     2     3      4      6      7        9        10        11        12        13        14
+       *                   2       3        4       6        7
+       *                     9         11          12        13         14            
+       * cptcovage=5+5 total of covariates with age 
+       * Tage[cptcovage] age*V2=12      13      14      15       16
+       *1                   17            18         19        20         21 gives the position in model of covariates associated with age
+       *3 Tage[cptcovage] age*V3*V2=6  
+       *3                age*V2=12         13      14      15       16
+       *3                age*V6*V3=18      19    20   21
+       * Tvar[Tage[cptcovage]]    Tvar[12]=2      3      4       6         Tvar[16]=7(age*V7)
+       *     Tvar[17]age*V6*V2=9      Tvar[18]age*V6*V3=11  age*V7*V3=12         age*V6*V4=13        Tvar[21]age*V7*V4=14
+       * 2   Tvar[17]age*V3*V2=9      Tvar[18]age*V6*V3=11  age*V7*V3=12         age*V6*V4=13        Tvar[21]age*V7*V4=14
+       * 3 Tvar[Tage[cptcovage]]    Tvar[6]=9      Tvar[12]=2      3     4       6         Tvar[16]=7(age*V7)
+       * 3     Tvar[18]age*V6*V3=11  age*V7*V3=12         age*V6*V4=13        Tvar[21]age*V7*V4=14
+       * 3 Tage[cptcovage] age*V3*V2=6   age*V2=12 age*V3 13    14      15       16
+       *                    age*V6*V3=18         19        20         21 gives the position in model of covariates associated with age
+       * 3   Tvar[17]age*V3*V2=9      Tvar[18]age*V6*V3=11  age*V7*V3=12         age*V6*V4=13        Tvar[21]age*V7*V4=14
+       * Tvar=                {2, 3, 4, 6, 7,
+       *                       9, 10, 11, 12, 13, 14,
+       *              Tvar[12]=2, 3, 4, 6, 7,
+       *              Tvar[17]=9, 11, 12, 13, 14}
+       * Typevar[1]@21 = {0, 0, 0, 0, 0,
+       *                  2, 2, 2, 2, 2, 2,
+       * 3                3, 2, 2, 2, 2, 2,
+       *                  1, 1, 1, 1, 1, 
+       *                  3, 3, 3, 3, 3}
+       * 3                 2, 3, 3, 3, 3}
+       * p Tposprod[1]@21 {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 1, 3, 4, 5, 6} Id of the prod at position k in the model
+       * p Tprod[1]@21 {6, 7, 8, 9, 10, 11, 0 <repeats 15 times>}
+       * 3 Tposprod[1]@21 {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 1, 3, 4, 5, 6}
+       * 3 Tprod[1]@21 {17, 7, 8, 9, 10, 11, 0 <repeats 15 times>}
+       * cptcovprod=11 (6+5)
+       * FixedV[Tvar[Tage[cptcovage]]]]  FixedV[2]=0      FixedV[3]=0      0      1          (age*V7)Tvar[16]=1 FixedV[absolute] not [kmodel]
+       *   FixedV[Tvar[17]=FixedV[age*V6*V2]=FixedV[9]=1        1         1          1         1  
+       * 3 FixedV[Tvar[17]=FixedV[age*V3*V2]=FixedV[9]=0        [11]=1         1          1         1  
+       * FixedV[]          V1=0     V2=0   V3=0  v4=0    V5=0  V6=1    V7=1 v8=1  OK then model dependent
+       *                   9=1  [V7*V2]=[10]=1 11=1  12=1  13=1  14=1
+       * 3                 9=0  [V7*V2]=[10]=1 11=1  12=1  13=1  14=1
+       * cptcovdageprod=5  for gnuplot printing
+       * cptcovprodvage=6 
+       * ncova=15           1        2       3       4       5
+       *                      6 7        8 9      10 11        12 13     14 15
+       * TvarA              2        3       4       6       7
+       *                      6 2        6 7       7 3          6 4       7 4
+       * TvaAind             12 12      13 13     14 14      15 15       16 16        
        * ncovf            1     2      3
-       * ncovvt=14                            1      2       3 4       5 6       7 8       9 10     11 12     13 14
-       * TvarVV[1]@14 = itv                   {6,     7,     6, 2,     7, 2,     6, 3,     7, 3,     6, 4,     7, 4}
-       * TvarVVind[1]@14=                    {4,     5,      6, 6,     7, 7,     8, 8,      9, 9,   10, 10,   11, 11}
+       *                                    V6       V7      V6*V2     V7*V2     V6*V3     V7*V3     V6*V4     V7*V4
+       * ncovvt=14                            1      2        3 4       5 6       7 8       9 10     11 12     13 14     
+       * TvarVV[1]@14 = itv               {V6=6,     7, V6*V2=6, 2,     7, 2,     6, 3,     7, 3,     6, 4,     7, 4}
+       * TvarVVind[1]@14=                    {4,     5,       6, 6,     7, 7,     8, 8,      9, 9,   10, 10,   11, 11}
+       * 3 ncovvt=12                        V6       V7      V7*V2     V6*V3     V7*V3     V6*V4     V7*V4
+       * 3 TvarVV[1]@12 = itv                {6,     7, V7*V2=7, 2,     6, 3,     7, 3,     6, 4,     7, 4}
+       * 3                                    1      2        3  4      5  6      7  8      9 10     11 12
+       * TvarVVind[1]@12=         {V6 is in k=4,     5,  7,(4isV2)=7,   8, 8,      9, 9,   10,10,    11,11}TvarVVind[12]=k=11
+       * TvarV              6, 7, 9, 10, 11, 12, 13, 14
+       * 3 cptcovprodvage=6
+       * 3 ncovta=15    +age*V3*V2+age*V2+agev3+ageV4 +age*V6 + age*V7 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4
+       * 3 TvarAVVA[1]@15= itva 3 2    2      3    4        6       7        6 3         7 3         6 4         7 4 
+       * 3 ncovta             1 2      3      4    5        6       7        8 9       10 11       12 13        14 15
+       * TvarAVVAind[1]@15= V3 is in k=2 1 1  2    3        4       5        4,2         5,2,      4,3           5 3}TvarVVAind[]
+       * TvarAVVAind[1]@15= V3 is in k=6 6 12  13   14      15      16       18 18       19,19,     20,20        21,21}TvarVVAind[]
+       * 3 ncovvta=10     +age*V6 + age*V7 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4
+       * 3 we want to compute =cotvar[mw[mi][i]][TvarVVA[ncovva]][i] at position TvarVVAind[ncovva]
+       * 3 TvarVVA[1]@10= itva   6       7        6 3         7 3         6 4         7 4 
+       * 3 ncovva                1       2        3 4         5 6         7 8         9 10
+       * TvarVVAind[1]@10= V6 is in k=4  5        8,8         9, 9,      10,10        11 11}TvarVVAind[]
+       * TvarVVAind[1]@10=       15       16     18,18        19,19,      20,20        21 21}TvarVVAind[]
+       * TvarVA              V3*V2=6 6 , 1, 2, 11, 12, 13, 14
        * TvarFind[1]@14= {1,    2,     3,     0 <repeats 12 times>}
-       * Tvar[1]@20=     {2,    3,     4,    6,      7,      9,      10,        11,       12,      13,       14}
+       * Tvar[1]@21=     {2,    3,     4,    6,      7,      9,      10,        11,       12,      13,       14,
+       *                   2, 3, 4, 6, 7,
+       *                     6, 8, 9, 10, 11}
        * TvarFind[itv]                        0      0       0
        * FixedV[itv]                          1      1       1  0      1 0       1 0       1 0       0
        * Tvar[TvarFind[ncovf]]=[1]=2 [2]=3 [4]=4
        * Tvar[TvarFind[itv]]                [0]=?      ?ncovv 1 Ã  ncovvt]
        *   Not a fixed cotvar[mw][itv][i]     6       7      6  2      7, 2,     6, 3,     7, 3,     6, 4,     7, 4}
-       *   fixed covar[itv]                  [6]     [7]    [6][2]                            
+       *   fixed covar[itv]                  [6]     [7]    [6][2] 
        */
 
-      for(ncovv=1, iposold=0; ncovv <= ncovvt ; ncovv++){ /* Varying  covariates (single and product but no age) including individual from products */
-       itv=TvarVV[ncovv]; /*  TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product  */
+      for(ncovv=1, iposold=0; ncovv <= ncovvt ; ncovv++){ /*  V6       V7      V7*V2     V6*V3     V7*V3     V6*V4     V7*V4 Time varying  covariates (single and extended product but no age) including individual from products, product is computed dynamically */
+       itv=TvarVV[ncovv]; /*  TvarVV={3, 1, 3} gives the name of each varying covariate, or fixed covariate of a varying product after exploding product Vn*Vm into Vn and then Vm  */
        ipos=TvarVVind[ncovv]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/
        /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */
        if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */
          cotvarv=cotvar[mw[mi][i]][TvarVV[ncovv]][i];  /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ 
        }else{ /* fixed covariate */
          /* cotvarv=covar[Tvar[TvarFind[itv]]][i];  /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */
-         cotvarv=covar[itv][i];  /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */
+         cotvarv=covar[itv][i];  /* Good: In V6*V3, 3 is fixed at position of the data */
        }
        if(ipos!=iposold){ /* Not a product or first of a product */
          cotvarvold=cotvarv;
@@ -4471,12 +4595,30 @@ double funcone( double *x)
        cov[2]=agexact;
        if(nagesqr==1)
          cov[3]= agexact*agexact;
-       for (kk=1; kk<=cptcovage;kk++) {
-         if(!FixedV[Tvar[Tage[kk]]])
-           cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
-         else
-           cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]*agexact; /* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ 
+       for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying  covariates with age including individual from products, product is computed dynamically */
+         itv=TvarAVVA[ncovva]; /*  TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm  */
+         ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/
+         /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */
+         if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */
+           /* printf("DEBUG  ncovva=%d, Varying TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */
+           cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i];  /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ 
+         }else{ /* fixed covariate */
+           /* cotvarv=covar[Tvar[TvarFind[itv]]][i];  /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */
+           /* printf("DEBUG ncovva=%d, Fixed TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */
+           cotvarv=covar[itv][i];  /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */
+         }
+         if(ipos!=iposold){ /* Not a product or first of a product */
+           cotvarvold=cotvarv;
+         }else{ /* A second product */
+           /* printf("DEBUG * \n"); */
+           cotvarv=cotvarv*cotvarvold;
+         }
+         iposold=ipos;
+         /* printf("DEBUG Product cov[ioffset+ipos=%d] \n",ioffset+ipos); */
+         cov[ioffset+ipos]=cotvarv*agexact;
+         /* For products */
        }
+
        /* printf("i=%d,mi=%d,d=%d,mw[mi][i]=%d\n",i, mi,d,mw[mi][i]); */
        /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
        out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
@@ -4564,14 +4706,39 @@ double funcone( double *x)
          }
          iposold=ipos;
        }
-       for (kk=1; kk<=cptcovage;kk++) {
-         if(!FixedV[Tvar[Tage[kk]]]){
-           fprintf(ficresilk," %g*age",covar[Tvar[Tage[kk]]][i]);
-           /* printf(" %g*age",covar[Tvar[Tage[kk]]][i]); */
-         }else{
-           fprintf(ficresilk," %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ 
-           /* printf(" %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/  */
+       /* for (kk=1; kk<=cptcovage;kk++) { */
+       /*   if(!FixedV[Tvar[Tage[kk]]]){ */
+       /*     fprintf(ficresilk," %g*age",covar[Tvar[Tage[kk]]][i]); */
+       /*     /\* printf(" %g*age",covar[Tvar[Tage[kk]]][i]); *\/ */
+       /*   }else{ */
+       /*     fprintf(ficresilk," %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/  */
+       /*     /\* printf(" %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\\/  *\/ */
+       /*   } */
+       /* } */
+       for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying  covariates with age including individual from products, product is computed dynamically */
+         itv=TvarAVVA[ncovva]; /*  TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm  */
+         ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/
+         /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */
+         if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */
+           /* printf("DEBUG  ncovva=%d, Varying TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */
+           cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i];  /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ 
+         }else{ /* fixed covariate */
+           /* cotvarv=covar[Tvar[TvarFind[itv]]][i];  /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */
+           /* printf("DEBUG ncovva=%d, Fixed TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */
+           cotvarv=covar[itv][i];  /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */
+         }
+         if(ipos!=iposold){ /* Not a product or first of a product */
+           cotvarvold=cotvarv;
+         }else{ /* A second product */
+           /* printf("DEBUG * \n"); */
+           cotvarv=cotvarv*cotvarvold;
          }
+         cotvarv=cotvarv*agexact;
+         fprintf(ficresilk," %g*age",cotvarv);
+         iposold=ipos;
+         /* printf("DEBUG Product cov[ioffset+ipos=%d] \n",ioffset+ipos); */
+         cov[ioffset+ipos]=cotvarv;
+         /* For products */
        }
        /* printf("\n"); */
        /* } /\*  End debugILK *\/ */
@@ -6287,7 +6454,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
    for (k=1; k<=cptcovt; k++) { /* cptcovt: total number of covariates of the model (2) nbocc(+)+1 = 8 excepting constant and age and age*age */
      for (j=-1; (j < maxncov); j++) Ndum[j]=0;
      /* printf("Testing k=%d, cptcovt=%d\n",k, cptcovt); */
-     if(Dummy[k]==0 && Typevar[k] !=1 && Typevar[k] != 2){ /* Dummy covariate and not age product nor fixed product */ 
+     if(Dummy[k]==0 && Typevar[k] !=1 && Typevar[k] != 3  && Typevar[k] != 2){ /* Dummy covariate and not age product nor fixed product */ 
        switch(Fixed[k]) {
        case 0: /* Testing on fixed dummy covariate, simple or product of fixed */
         modmaxcovj=0;
@@ -6384,7 +6551,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
         break;
        } /* end switch */
      } /* end dummy test */
-     if(Dummy[k]==1 && Typevar[k] !=1 && Fixed ==0){ /* Fixed Quantitative covariate and not age product */ 
+     if(Dummy[k]==1 && Typevar[k] !=1 && Typevar[k] !=3 && Fixed ==0){ /* Fixed Quantitative covariate and not age product */ 
        for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the  modality of this covariate Vj*/
         if(Tvar[k]<=0 || Tvar[k]>=NCOVMAX){
           printf("Error k=%d \n",k);
@@ -7567,7 +7734,7 @@ To be simple, these graphs help to understand the significativity of each parame
         cov[3]= age*age;
        /* New code end of combination but for each resultline */
        for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ 
-        if(Typevar[k1]==1){ /* A product with age */
+        if(Typevar[k1]==1 || Typevar[k1] ==3){ /* A product with age */
           cov[2+nagesqr+k1]=precov[nres][k1]*cov[2];
         }else{
           cov[2+nagesqr+k1]=precov[nres][k1];
@@ -9247,6 +9414,31 @@ set ter svg size 640, 480\nunset log y\nplot [%.f:%.f]  ", ageminpar, agemaxpar)
                  } /* end Tprod */
                }
                break;
+             case 3:
+               if(cptcovdageprod >0){
+                 /* if(j==Tprod[ijp]) { */ /* not necessary */ 
+                   /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */
+                   if(ijp <=cptcovprod) { /* Product */
+                     if(DummyV[Tvard[ijp][1]]==0){/* Vn is dummy */
+                       if(DummyV[Tvard[ijp][2]]==0){/* Vn and Vm are dummy */
+                         /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],nbcode[Tvard[ijp][2]][codtabm(k1,j)]); */
+                         fprintf(ficgp,"+p%d*%d*%d*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]);
+                       }else{ /* Vn is dummy and Vm is quanti */
+                         /* fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],Tqinvresult[nres][Tvard[ijp][2]]); */
+                         fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]);
+                       }
+                     }else{ /* Vn*Vm Vn is quanti */
+                       if(DummyV[Tvard[ijp][2]]==0){
+                         fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]);
+                       }else{ /* Both quanti */
+                         fprintf(ficgp,"+p%d*%f*%f*x",i+j+2+nagesqr-1,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]);
+                       }
+                     }
+                     ijp++;
+                   }
+                   /* } */ /* end Tprod */
+               }
+               break;
              case 0:
                /* simple covariate */
                /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(k1,j)]); /\* Valgrind bug nbcode *\/ */
@@ -9333,6 +9525,35 @@ set ter svg size 640, 480\nunset log y\nplot [%.f:%.f]  ", ageminpar, agemaxpar)
                    } /* end Tprod */
                  } /* end if */
                  break;
+               case 3:
+                 if(cptcovdageprod >0){
+                   /* if(j==Tprod[ijp]) { /\* *\/  */
+                     /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */
+                     if(ijp <=cptcovprod) { /* Product */
+                       if(DummyV[Tvard[ijp][1]]==0){/* Vn is dummy */
+                         if(DummyV[Tvard[ijp][2]]==0){/* Vn and Vm are dummy */
+                           /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],nbcode[Tvard[ijp][2]][codtabm(k1,j)]); */
+                           fprintf(ficgp,"+p%d*%d*%d*x",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]);
+                           /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]); */
+                         }else{ /* Vn is dummy and Vm is quanti */
+                           /* fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],Tqinvresult[nres][Tvard[ijp][2]]); */
+                           fprintf(ficgp,"+p%d*%d*%f*x",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]);
+                           /* fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); */
+                         }
+                       }else{ /* Vn*Vm Vn is quanti */
+                         if(DummyV[Tvard[ijp][2]]==0){
+                           fprintf(ficgp,"+p%d*%d*%f",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]);
+                           /* fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]); */
+                         }else{ /* Both quanti */
+                           fprintf(ficgp,"+p%d*%f*%f",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]);
+                           /* fprintf(ficgp,"+p%d*%f*%f*x",i+j+2+nagesqr-1,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); */
+                         } 
+                       }
+                       ijp++;
+                     }
+                   /* } /\* end Tprod *\/ */
+                 } /* end if */
+                 break;
                case 0: 
                  /* simple covariate */
                  /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(k1,j)]); /\* Valgrind bug nbcode *\/ */
@@ -10483,33 +10704,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
   char stra[MAXLINE], strb[MAXLINE];
   char *stratrunc;
 
-  DummyV=ivector(1,NCOVMAX); /* 1 to 3 */
-  FixedV=ivector(1,NCOVMAX); /* 1 to 3 */
-  for(v=1;v<NCOVMAX;v++){
-    DummyV[v]=0;
-    FixedV[v]=0;
-  }
-
-  for(v=1; v <=ncovcol;v++){
-    DummyV[v]=0;
-    FixedV[v]=0;
-  }
-  for(v=ncovcol+1; v <=ncovcol+nqv;v++){
-    DummyV[v]=1;
-    FixedV[v]=0;
-  }
-  for(v=ncovcol+nqv+1; v <=ncovcol+nqv+ntv;v++){
-    DummyV[v]=0;
-    FixedV[v]=1;
-  }
-  for(v=ncovcol+nqv+ntv+1; v <=ncovcol+nqv+ntv+nqtv;v++){
-    DummyV[v]=1;
-    FixedV[v]=1;
-  }
-  for(v=1; v <=ncovcol+nqv+ntv+nqtv;v++){
-    printf("Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",v,v,DummyV[v],v,FixedV[v]);
-    fprintf(ficlog,"Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",v,v,DummyV[v],v,FixedV[v]);
-  }
+  /* DummyV=ivector(-1,NCOVMAX); /\* 1 to 3 *\/ */
+  /* FixedV=ivector(-1,NCOVMAX); /\* 1 to 3 *\/ */
   
   ncovcolt=ncovcol+nqv+ntv+nqtv; /* total of covariates in the data, not in the model equation */
   
@@ -10937,7 +11133,7 @@ int decoderesult( char resultline[], int nres)
        fprintf(ficlog,"Error in result line (Product with age): V%d is missing in result: %s according to model=1+age+%s (Tvarsel[k2=%d]=%d)\n",Tvar[k1], resultline, model, k2, Tvarsel[k2]);
       return 1;
       }
-    }else if(Typevar[k1]==2){ /* Product No age We want to get the position in the resultline of the product in the model line*/
+    }else if(Typevar[k1]==2 || Typevar[k1]==3){ /* Product with or without age. We want to get the position in the resultline of the product in the model line*/
       /* resultmodel[nres][of such a Vn * Vm product k1] is not unique, so can't exist, we feed Tvard[k1][1] and [2] */ 
       match=0;
       /* printf("Decoderesult very first Product Tvardk[k1=%d][1]=%d Tvardk[k1=%d][2]=%d V%d * V%d\n",k1,Tvardk[k1][1],k1,Tvardk[k1][2],Tvardk[k1][1],Tvardk[k1][2]); */
@@ -10949,8 +11145,8 @@ int decoderesult( char resultline[], int nres)
        }
       }
       if(match == 0){
-       printf("Error in result line (Product without age first variable): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][1], resultline, model);
-       fprintf(ficlog,"Error in result line (Product without age first variable): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][1], resultline, model);
+       printf("Error in result line (Product without age first variable or double product with age): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][1], resultline, model);
+       fprintf(ficlog,"Error in result line (Product without age first variable or double product with age): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][1], resultline, model);
        return 1;
       }
       match=0;
@@ -10963,8 +11159,8 @@ int decoderesult( char resultline[], int nres)
        }
       }
       if(match == 0){
-       printf("Error in result line (Product without age second variable): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][2], resultline, model);
-       fprintf(ficlog,"Error in result line (Product without age second variable): V%d is missing in result : %s according to model=1+age+%s\n",Tvardk[k1][2], resultline, model);
+       printf("Error in result line (Product without age second variable or double product with age): V%d is missing in result: %s according to model=1+age+%s\n",Tvardk[k1][2], resultline, model);
+       fprintf(ficlog,"Error in result line (Product without age second variable or double product with age): V%d is missing in result : %s according to model=1+age+%s\n",Tvardk[k1][2], resultline, model);
        return 1;
       }
     }/* End of testing */
@@ -10976,7 +11172,7 @@ int decoderesult( char resultline[], int nres)
     match=0;
     for(k1=1; k1<= cptcovt ;k1++){ /* loop on model: model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
       if(Typevar[k1]==0){ /* Single only */
-       if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4   */
+       if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4  What if a product?  */
          resultmodel[nres][k1]=k2;  /* k1th position in the model equation corresponds to k2th position in the result line. resultmodel[2]=1 resultmodel[1]=2  resultmodel[3]=3  resultmodel[6]=4 resultmodel[9]=5 */
          modelresult[nres][k2]=k1; /* k1th position in the model equation corresponds to k2th position in the result line. modelresult[1]=2 modelresult[2]=1  modelresult[3]=3  remodelresult[4]=6 modelresult[5]=9 */
          ++match;
@@ -11076,7 +11272,7 @@ int decoderesult( char resultline[], int nres)
       TinvDoQresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* TinvDoQresult[nres][5]=25.1 */
       precov[nres][k1]=Tvalsel[k3q];
       /* printf("Decoderesult Quantitative with age nres=%d, k1=%d, precov[nres=%d][k1=%d]=%f Tvar[%d]=V%d V(k2q=%d)= Tvarsel[%d]=%d, Tvalsel[%d]=%f\n",nres, k1, nres, k1,precov[nres][k1], k1,  Tvar[k1], k2q, k3q, Tvarsel[k3q], k3q, Tvalsel[k3q]); */
-    }else if(Typevar[k1]==2 ){ /* For product quant or dummy (not with age) */
+    }else if(Typevar[k1]==2 || Typevar[k1]==3 ){ /* For product quant or dummy (with or without age) */
       precov[nres][k1]=TinvDoQresult[nres][Tvardk[k1][1]] * TinvDoQresult[nres][Tvardk[k1][2]];      
       /* printf("Decoderesult Quantitative or Dummy (not with age) nres=%d k1=%d precov[nres=%d][k1=%d]=%.f V%d(=%.f) * V%d(=%.f) \n",nres, k1, nres, k1,precov[nres][k1], Tvardk[k1][1], TinvDoQresult[nres][Tvardk[k1][1]], Tvardk[k1][2], TinvDoQresult[nres][Tvardk[k1][2]]); */
     }else{
@@ -11108,14 +11304,21 @@ int decodemodel( char model[], int lastobs)
 /* V2+V1+V4+V3*age Tvar[4]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1, Tage[1]=2 */
 {
   int i, j, k, ks, v;
-  int  j1, k1, k2, k3, k4;
-  char modelsav[80];
-  char stra[80], strb[80], strc[80], strd[80],stre[80];
+  int n,m;
+  int  j1, k1, k11, k12, k2, k3, k4;
+  char modelsav[300];
+  char stra[300], strb[300], strc[300], strd[300],stre[300],strf[300];
   char *strpt;
-
+  int  **existcomb;
+  
+  existcomb=imatrix(1,NCOVMAX,1,NCOVMAX);
+  for(i=1;i<=NCOVMAX;i++)
+    for(j=1;j<=NCOVMAX;j++)
+      existcomb[i][j]=0;
+    
   /*removespace(model);*/
   if (strlen(model) >1){ /* If there is at least 1 covariate */
-    j=0, j1=0, k1=0, k2=-1, ks=0, cptcovn=0;
+    j=0, j1=0, k1=0, k12=0, k2=-1, ks=0, cptcovn=0;
     if (strstr(model,"AGE") !=0){
       printf("Error. AGE must be in lower case 'age' model=1+age+%s. ",model);
       fprintf(ficlog,"Error. AGE must be in lower case model=1+age+%s. ",model);fflush(ficlog);
@@ -11147,19 +11350,21 @@ int decodemodel( char model[], int lastobs)
        substrchaine(modelsav, model, "age*age");
     }else
       nagesqr=0;
-    if (strlen(modelsav) >1){
+    if (strlen(modelsav) >1){ /* V2 +V3 +V4 +V6 +V7 +V6*V2 +V7*V2 +V6*V3 +V7*V3 +V6*V4 +V7*V4 +age*V2 +age*V3 +age*V4 +age*V6 +age*V7 +age*V6*V2 +V7*V2 +age*V6*V3 +age*V7*V3 +age*V6*V4 +age*V7*V4 */
       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 =5-3=2  */
+      cptcovs=j+1-j1; /**<  Number of simple covariates V1 +V1*age +V3 +V3*V4 +age*age => V1 + V3 =4+1-3=2  */
       cptcovt= j+1; /* Number of total covariates in the model, not including
                     * cst, age and age*age 
                     * V1+V1*age+ V3 + V3*V4+age*age=> 3+1=4*/
       /* including age products which are counted in cptcovage.
        * but the covariates which are products must be treated 
        * separately: ncovn=4- 2=2 (V1+V3). */
-      cptcovprod=j1; /**< Number of products  V1*V2 +v3*age = 2 */
+      cptcovprod=0; /**< Number of products  V1*V2 +v3*age = 2 */
+      cptcovdageprod=0; /* Number of doouble products with age age*Vn*VM or Vn*age*Vm or Vn*Vm*age */
       cptcovprodnoage=0; /**< Number of covariate products without age: V3*V4 =1  */
-      
+      cptcovprodage=0;
+      /* cptcovprodage=nboccstr(modelsav,"age");*/
       
       /*   Design
        *  V1   V2   V3   V4  V5  V6  V7  V8  V9 Weight
@@ -11220,66 +11425,196 @@ int decodemodel( char model[], int lastobs)
          strcpy(strb,modelsav); /* and analyzes it */
        /*      printf("i=%d a=%s b=%s sav=%s\n",i, stra,strb,modelsav);*/
        /*scanf("%d",i);*/
-       if (strchr(strb,'*')) {  /**< Model includes a product V2+V1+V5*age+ V4+V3*age strb=V3*age */
-         cutl(strc,strd,strb,'*'); /**< k=1 strd*strc  Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */
-         if (strcmp(strc,"age")==0) { /**< Model includes age: Vn*age */
-           /* covar is not filled and then is empty */
-           cptcovprod--;
-           cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */
-           Tvar[k]=atoi(stre);  /* V2+V1+V5*age+V4+V3*age Tvar[5]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */
-           Typevar[k]=1;  /* 1 for age product */
-           cptcovage++; /* Counts the number of covariates which include age as a product */
-           Tage[cptcovage]=k;  /*  V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */
-           /*printf("stre=%s ", stre);*/
-         } else if (strcmp(strd,"age")==0) { /* or age*Vn */
-           cptcovprod--;
-           cutl(stre,strb,strc,'V');
-           Tvar[k]=atoi(stre);
-           Typevar[k]=1;  /* 1 for age product */
-           cptcovage++;
-           Tage[cptcovage]=k;
-         } else {  /* Age is not in the model product V2+V1+V1*V4+V3*age+V3*V2  strb=V3*V2*/
-           /* loops on k1=1 (V3*V2) and k1=2 V4*V3 */
-           cptcovn++;
-           cptcovprodnoage++;k1++;
+       if (strchr(strb,'*')) {  /**< Model includes a product V2+V1+V5*age+ V4+V3*age strb=V3*age OR double product with age strb=age*V6*V2 or V6*V2*age or V6*age*V2 */
+         cutl(strc,strd,strb,'*'); /**< k=1 strd*strc  Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 OR strb=age*V6*V2 strc=V6*V2 strd=age OR c=V2*age OR c=age*V2  */
+         if(strchr(strc,'*')) { /**< Model with age and DOUBLE product: allowed since 0.99r44, strc=V6*V2 or V2*age or age*V2, strd=age or V6 or V6   */
+           Typevar[k]=3;  /* 3 for age and double product age*Vn*Vm varying of fixed */
+            if(strstr(strc,"age")!=0) { /* It means that strc=V2*age or age*V2 and thus that strd=Vn */
+              cutl(stre,strf,strc,'*') ; /* strf=age or Vm, stre=Vm or age. If strc=V6*V2 then strf=V6 and stre=V2 */
+             strcpy(strc,strb); /* save strb(=age*Vn*Vm) into strc */
+             /* We want strb=Vn*Vm */
+              if(strcmp(strf,"age")==0){ /* strf is "age" so that stre=Vm =V2 . */
+                strcpy(strb,strd);
+                strcat(strb,"*");
+                strcat(strb,stre);
+              }else{  /* strf=Vm  If strf=V6 then stre=V2 */
+                strcpy(strb,strf);
+                strcat(strb,"*");
+                strcat(strb,stre);
+                strcpy(strd,strb); /* in order for strd to not be "age"  for next test (will be Vn*Vm */
+              }
+             printf("DEBUG FIXED k=%d, Tage[k]=%d, Tvar[Tage[k]=%d,FixedV[Tvar[Tage[k]]]=%d\n",k,Tage[k],Tvar[Tage[k]],FixedV[Tvar[Tage[k]]]);
+             FixedV[Tvar[Tage[k]]]=0; /* HERY not sure */
+            }else{  /* strc=Vn*Vm (and strd=age) and should be strb=Vn*Vm but want to keep original strb double product  */
+             strcpy(stre,strb); /* save full b in stre */
+             strcpy(strb,strc); /* save short c in new short b for next block strb=Vn*Vm*/
+             strcpy(strf,strc); /* save short c in new short f */
+              cutl(strc,strd,strf,'*'); /* We get strd=Vn and strc=Vm for next block (strb=Vn*Vm)*/
+             /* strcpy(strc,stre);*/ /* save full e in c for future */
+            }
+            cptcovdageprod++; /* double product with age  Which product is it? */
+            /* strcpy(strb,strc);  /\* strb was age*V6*V2 or V6*V2*age or V6*age*V2 IS now V6*V2 or V2*age or age*V2 *\/ */
+            /* cutl(strc,strd,strb,'*'); /\* strd=  V6    or   V2     or    age and  strc=  V2 or    age or    V2 *\/ */
            cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
-           Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* ncovcolt+k1; For model-covariate k tells which data-covariate to use but
-                                               because this model-covariate is a construction we invent a new column
-                                               which is after existing variables ncovcol+nqv+ntv+nqtv + k1
-                                               If already ncovcol=4 and model= V2 + V1 + V1*V4 + age*V3 + V3*V2
-                                               thus after V4 we invent V5 and V6 because age*V3 will be computed in 4
-                                               Tvar[3=V1*V4]=4+1=5 Tvar[5=V3*V2]=4 + 2= 6, Tvar[4=age*V3]=3 etc */
-           /* Please remark that the new variables are model dependent */
-           /* If we have 4 variable but the model uses only 3, like in
-            * model= V1 + age*V1 + V2 + V3 + age*V2 + age*V3 + V1*V2 + V1*V3
-            *  k=     1     2       3   4     5        6        7       8
-            * Tvar[k]=1     1       2   3     2        3       (5       6) (and not 4 5 because of V4 missing)
-            * Tage[kk]    [1]= 2           [2]=5      [3]=6                  kk=1 to cptcovage=3
-            * Tvar[Tage[kk]][1]=2          [2]=2      [3]=3
-            */
-           Typevar[k]=2;  /* 2 for product */
+           n=atoi(stre);
            cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
-           Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2  */
-           Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 */
-           Tvard[k1][1] =atoi(strc); /* m 1 for V1*/
-           Tvardk[k][1] =atoi(strc); /* m 1 for V1*/
-           Tvard[k1][2] =atoi(stre); /* n 4 for V4*/
-           Tvardk[k][2] =atoi(stre); /* n 4 for V4*/
-           k2=k2+2;  /* k2 is initialize to -1, We want to store the n and m in Vn*Vm at the end of Tvar */
-           /* Tvar[cptcovt+k2]=Tvard[k1][1]; /\* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) *\/ */
-           /* Tvar[cptcovt+k2+1]=Tvard[k1][2];  /\* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) *\/ */
-            /*ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2, Tvar[3]=5, Tvar[4]=6, cptcovt=5 */
-           /*                     1  2   3      4     5 | Tvar[5+1)=1, Tvar[7]=2   */
-           if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* If the product is a fixed covariate then we feed the new column with Vn*Vm */
-             for (i=1; i<=lastobs;i++){/* For fixed product */
-             /* Computes the new covariate which is a product of
-                covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
-             covar[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+           m=atoi(strc);
+           cptcovage++; /* Counts the number of covariates which include age as a product */
+           Tage[cptcovage]=k; /* For age*V3*V2 gives the position in model of covariates associated with age Tage[1]=6 HERY too*/
+           if(existcomb[n][m] == 0){
+             /*  r /home/brouard/Documents/Recherches/REVES/Zachary/Zach-2022/Feinuo_Sun/Feinuo-threeway/femV12V15_3wayintNBe.imach */
+             printf("Warning in model combination V%d*V%d should exist in the model before adding V%d*V%d*age !\n",n,m,n,m);
+             fprintf(ficlog,"Warning in model combination V%d*V%d should exist in the model before adding V%d*V%d*age !\n",n,m,n,m);
+             fflush(ficlog);
+             k1++;  /* The combination Vn*Vm will be in the model so we create it at k1 */
+             k12++;
+             existcomb[n][m]=k1;
+             existcomb[m][n]=k1;
+             Tvar[k]=ncovcol+nqv+ntv+nqtv+k1;
+             Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2+ age*V6*V3 Gives the k position of the k1 double product Vn*Vm or age*Vn*Vm*/
+             Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 Gives the k1 double product  Vn*Vm or age*Vn*Vm at the k position */
+             Tvard[k1][1] =m; /* m 1 for V1*/
+             Tvardk[k][1] =m; /* m 1 for V1*/
+             Tvard[k1][2] =n; /* n 4 for V4*/
+             Tvardk[k][2] =n; /* n 4 for V4*/
+/*           Tvar[Tage[cptcovage]]=k1;*/ /* Tvar[6=age*V3*V2]=9 (new fixed covariate) */
+             if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* If the product is a fixed covariate then we feed the new column with Vn*Vm */
+               for (i=1; i<=lastobs;i++){/* For fixed product */
+                 /* Computes the new covariate which is a product of
+                    covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
+                 covar[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+               }
+               cptcovprodage++; /* Counting the number of fixed covariate with age */
+               FixedV[ncovcolt+k12]=0; /* We expand Vn*Vm */
+               k12++;
+               FixedV[ncovcolt+k12]=0;
+             }else{ /*End of FixedV */
+               cptcovprodvage++; /* Counting the number of varying covariate with age */
+               FixedV[ncovcolt+k12]=1; /* We expand Vn*Vm */
+               k12++;
+               FixedV[ncovcolt+k12]=1;
+             }
+           }else{  /* k1 Vn*Vm already exists */
+             k11=existcomb[n][m];
+             Tposprod[k]=k11; /* OK */
+             Tvar[k]=Tvar[Tprod[k11]]; /* HERY */
+             Tvardk[k][1]=m;
+             Tvardk[k][2]=n;
+             if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* If the product is a fixed covariate then we feed the new column with Vn*Vm */
+               /*cptcovage++;*/ /* Counts the number of covariates which include age as a product */
+               cptcovprodage++; /* Counting the number of fixed covariate with age */
+               /*Tage[cptcovage]=k;*/ /* For age*V3*V2 Tage[1]=V3*V3=9 HERY too*/
+               Tvar[Tage[cptcovage]]=k1;
+               FixedV[ncovcolt+k12]=0; /* We expand Vn*Vm */
+               k12++;
+               FixedV[ncovcolt+k12]=0;
+             }else{ /* Already exists but time varying (and age) */
+               /*cptcovage++;*/ /* Counts the number of covariates which include age as a product */
+               /*Tage[cptcovage]=k;*/ /* For age*V3*V2 Tage[1]=V3*V3=9 HERY too*/
+               /* Tvar[Tage[cptcovage]]=k1; */
+               cptcovprodvage++;
+               FixedV[ncovcolt+k12]=1; /* We expand Vn*Vm */
+               k12++;
+               FixedV[ncovcolt+k12]=1;
+             }
+           }
+           /* Tage[cptcovage]=k;  /\*  V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 *\/ */
+           /* Tvar[k]=k11; /\* HERY *\/ */
+         } else {/* simple product strb=age*Vn so that c=Vn and d=age, or strb=Vn*age so that c=age and d=Vn, or b=Vn*Vm so that c=Vm and d=Vn */
+            cptcovprod++;
+            if (strcmp(strc,"age")==0) { /**< Model includes age: strb= Vn*age c=age d=Vn*/
+              /* covar is not filled and then is empty */
+              cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */
+              Tvar[k]=atoi(stre);  /* V2+V1+V5*age+V4+V3*age Tvar[5]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */
+              Typevar[k]=1;  /* 1 for age product */
+              cptcovage++; /* Counts the number of covariates which include age as a product */
+              Tage[cptcovage]=k;  /*  V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */
+             if( FixedV[Tvar[k]] == 0){
+               cptcovprodage++; /* Counting the number of fixed covariate with age */
+             }else{
+               cptcovprodvage++; /* Counting the number of fixedvarying covariate with age */
              }
-           } /*End of FixedV */
-         } /* End age is not in the model */
-       } /* End if model includes a product */
-       else { /* not a product */
+              /*printf("stre=%s ", stre);*/
+            } else if (strcmp(strd,"age")==0) { /* strb= age*Vn c=Vn */
+              cutl(stre,strb,strc,'V');
+              Tvar[k]=atoi(stre);
+              Typevar[k]=1;  /* 1 for age product */
+              cptcovage++;
+              Tage[cptcovage]=k;
+             if( FixedV[Tvar[k]] == 0){
+               cptcovprodage++; /* Counting the number of fixed covariate with age */
+             }else{
+               cptcovprodvage++; /* Counting the number of fixedvarying covariate with age */
+             }
+            }else{ /*  for product Vn*Vm */
+             Typevar[k]=2;  /* 2 for product Vn*Vm */
+             cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
+             n=atoi(stre);
+             cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
+             m=atoi(strc);
+             k1++;
+             cptcovprodnoage++;
+             if(existcomb[n][m] != 0 || existcomb[m][n] != 0){
+               printf("Warning in model combination V%d*V%d already exists in the model in position k1=%d!\n",n,m,existcomb[n][m]);
+               fprintf(ficlog,"Warning in model combination V%d*V%d already exists in the model in position k1=%d!\n",n,m,existcomb[n][m]);
+               fflush(ficlog);
+               k11=existcomb[n][m];
+               Tvar[k]=ncovcol+nqv+ntv+nqtv+k11;
+               Tposprod[k]=k11;
+               Tprod[k11]=k;
+               Tvardk[k][1] =m; /* m 1 for V1*/
+               /* Tvard[k11][1] =m; /\* n 4 for V4*\/ */
+               Tvardk[k][2] =n; /* n 4 for V4*/                
+               /* Tvard[k11][2] =n; /\* n 4 for V4*\/ */
+             }else{ /* combination Vn*Vm doesn't exist we create it (no age)*/
+               existcomb[n][m]=k1;
+               existcomb[m][n]=k1;
+               Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* ncovcolt+k1; For model-covariate k tells which data-covariate to use but
+                                                   because this model-covariate is a construction we invent a new column
+                                                   which is after existing variables ncovcol+nqv+ntv+nqtv + k1
+                                                   If already ncovcol=4 and model= V2 + V1 + V1*V4 + age*V3 + V3*V2
+                                                   thus after V4 we invent V5 and V6 because age*V3 will be computed in 4
+                                                   Tvar[3=V1*V4]=4+1=5 Tvar[5=V3*V2]=4 + 2= 6, Tvar[4=age*V3]=3 etc */
+               /* Please remark that the new variables are model dependent */
+               /* If we have 4 variable but the model uses only 3, like in
+                * model= V1 + age*V1 + V2 + V3 + age*V2 + age*V3 + V1*V2 + V1*V3
+                *  k=     1     2      3   4     5        6        7       8
+                * Tvar[k]=1     1       2   3     2        3       (5       6) (and not 4 5 because of V4 missing)
+                * Tage[kk]    [1]= 2           [2]=5      [3]=6                  kk=1 to cptcovage=3
+                * Tvar[Tage[kk]][1]=2          [2]=2      [3]=3
+                */
+               /* We need to feed some variables like TvarVV, but later on next loop because of ncovv (k2) is not correct */
+               Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2 +V6*V2*age  */
+               Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 */
+               Tvard[k1][1] =m; /* m 1 for V1*/
+               Tvardk[k][1] =m; /* m 1 for V1*/
+               Tvard[k1][2] =n; /* n 4 for V4*/
+               Tvardk[k][2] =n; /* n 4 for V4*/
+               k2=k2+2;  /* k2 is initialize to -1, We want to store the n and m in Vn*Vm at the end of Tvar */
+               /* Tvar[cptcovt+k2]=Tvard[k1][1]; /\* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) *\/ */
+               /* Tvar[cptcovt+k2+1]=Tvard[k1][2];  /\* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) *\/ */
+               /*ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2, Tvar[3]=5, Tvar[4]=6, cptcovt=5 */
+               /*                     1  2   3      4     5 | Tvar[5+1)=1, Tvar[7]=2   */
+               if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* If the product is a fixed covariate then we feed the new column with Vn*Vm */
+                 for (i=1; i<=lastobs;i++){/* For fixed product */
+                   /* Computes the new covariate which is a product of
+                      covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
+                   covar[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+                 }
+                 /* TvarVV[k2]=n; */
+                 /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+                 /* TvarVV[k2+1]=m; */
+                 /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+               }else{ /* not FixedV */
+                 /* TvarVV[k2]=n; */
+                 /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+                 /* TvarVV[k2+1]=m; */
+                 /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+               }                 
+             }  /* End of creation of Vn*Vm if not created by age*Vn*Vm earlier  */
+           } /*  End of product Vn*Vm */
+          } /* End of age*double product or simple product */
+       }else { /* not a product */
          /*printf("d=%s c=%s b=%s\n", strd,strc,strb);*/
          /*  scanf("%d",i);*/
          cutl(strd,strc,strb,'V');
@@ -11294,7 +11629,8 @@ int decodemodel( char model[], int lastobs)
       } /* end of loop + on total covariates */
     } /* end if strlen(modelsave == 0) age*age might exist */
   } /* end if strlen(model == 0) */
-  
+  cptcovs=cptcovt - cptcovdageprod - cptcovprod;/**<  Number of simple covariates V1 +V1*age +V3 +V3*V4 +age*age + age*v4*V3=> V1 + V3 =4+1-3=2  */
+
   /*The number n of Vn is stored in Tvar. cptcovage =number of age covariate. Tage gives the position of age. cptcovprod= number of products.
     If model=V1+V1*age then Tvar[1]=1 Tvar[2]=1 cptcovage=1 Tage[1]=2 cptcovprod=0*/
   
@@ -11320,16 +11656,16 @@ int decodemodel( char model[], int lastobs)
   /* Tvar[k] is the value n of Vn with n varying for 1 to nvcol, or p  Vp=Vn*Vm for product */
        /* Computing effective variables, ie used by the model, that is from the cptcovt variables */
   printf("Model=1+age+%s\n\
-Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product \n\
+Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product, 3 for double product with age \n\
 Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\
 Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model);
   fprintf(ficlog,"Model=1+age+%s\n\
-Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product \n\
+Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product, 3 for double product with age  \n\
 Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\
 Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model);
   for(k=-1;k<=NCOVMAX; k++){ Fixed[k]=0; Dummy[k]=0;}
   for(k=1;k<=NCOVMAX; k++){TvarFind[k]=0; TvarVind[k]=0;}
-  for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0, ncovvt=0;k<=cptcovt; k++){ /* or cptocvt loop on k from model */
+  for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0,ncovva=0,ncovvta=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0, ncovvt=0;k<=cptcovt; k++){ /* or cptocvt loop on k from model */
     if (Tvar[k] <=ncovcol && Typevar[k]==0 ){ /* Simple fixed dummy (<=ncovcol) covariates */
       Fixed[k]= 0;
       Dummy[k]= 0;
@@ -11345,17 +11681,6 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
       TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
     /* }else if( Tvar[k] <=ncovcol &&  Typevar[k]==2){ /\* Product of fixed dummy (<=ncovcol) covariates For a fixed product k is higher than ncovcol *\/ */
-    }else if( Tposprod[k]>0  &&  Typevar[k]==2 && FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* Needs a fixed product Product of fixed dummy (<=ncovcol) covariates For a fixed product k is higher than ncovcol */
-      Fixed[k]= 0;
-      Dummy[k]= 0;
-      ncoveff++;
-      ncovf++;
-      modell[k].maintype= FTYPE;
-      TvarF[ncovf]=Tvar[k];
-      /* TnsdVar[Tvar[k]]=nsd; */ /* To be done */
-      TvarFind[ncovf]=k;
-      TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
-      TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
     }else if( Tvar[k] <=ncovcol+nqv && Typevar[k]==0){/* Remind that product Vn*Vm are added in k Only simple fixed quantitative variable */
       Fixed[k]= 0;
       Dummy[k]= 1;
@@ -11417,186 +11742,396 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       TvarVQind[nqtveff]=k; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
       TmodelInvQind[nqtveff]=Tvar[k]- ncovcol-nqv-ntv;/* Only simple time varying quantitative variable */
       /* Tmodeliqind[k]=nqtveff;/\* Only simple time varying quantitative variable *\/ */
-      /* printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%d,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); */
+      /* printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%Ad,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); */
       /* printf("Quasi TmodelInvQind[%d]=%d\n",k,Tvar[k]- ncovcol-nqv-ntv); */
     }else if (Typevar[k] == 1) {  /* product with age */
       ncova++;
       TvarA[ncova]=Tvar[k];
       TvarAind[ncova]=k;
+      /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */
+      /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ 
       if (Tvar[k] <=ncovcol ){ /* Product age with fixed dummy covariatee */
        Fixed[k]= 2;
        Dummy[k]= 2;
        modell[k].maintype= ATYPE;
        modell[k].subtype= APFD;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvar[k]; /*  (2)age*V3 */
+       TvarAVVAind[ncovta]=k;
        /* ncoveff++; */
       }else if( Tvar[k] <=ncovcol+nqv) { /* Remind that product Vn*Vm are added in k*/
        Fixed[k]= 2;
        Dummy[k]= 3;
        modell[k].maintype= ATYPE;
        modell[k].subtype= APFQ;                /*      Product age * fixed quantitative */
+       ncovta++;
+       TvarAVVA[ncovta]=Tvar[k]; /*   */
+       TvarAVVAind[ncovta]=k;
        /* nqfveff++;  /\* Only simple fixed quantitative variable *\/ */
       }else if( Tvar[k] <=ncovcol+nqv+ntv ){
        Fixed[k]= 3;
        Dummy[k]= 2;
        modell[k].maintype= ATYPE;
        modell[k].subtype= APVD;                /*      Product age * varying dummy */
+       ncovva++;
+       TvarVVA[ncovva]=Tvar[k]; /*  (1)+age*V6 + (2)age*V7 */
+       TvarVVAind[ncovva]=k;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvar[k]; /*   */
+       TvarAVVAind[ncovta]=k;
        /* ntveff++; /\* Only simple time varying dummy variable *\/ */
       }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv){
        Fixed[k]= 3;
        Dummy[k]= 3;
        modell[k].maintype= ATYPE;
        modell[k].subtype= APVQ;                /*      Product age * varying quantitative */
+       ncovva++;
+       TvarVVA[ncovva]=Tvar[k]; /*   */
+       TvarVVAind[ncovva]=k;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvar[k]; /*  (1)+age*V6 + (2)age*V7 */
+       TvarAVVAind[ncovta]=k;
        /* nqtveff++;/\* Only simple time varying quantitative variable *\/ */
       }
-    }else if (Typevar[k] == 2) {  /* product Vn * Vm without age, V1+V3+age*V1+age*V3+V1*V3 looking at V1*V3, Typevar={0, 0, 1, 1, 2}, k=5, V1 is fixed, V3 is timevary, V5 is a product  */
+    }else if( Tposprod[k]>0  &&  Typevar[k]==2){  /* Detects if fixed product no age Vm*Vn */
+      printf("MEMORY ERRORR k=%d  Tposprod[k]=%d, Typevar[k]=%d\n ",k, Tposprod[k], Typevar[k]);
+      if(FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* Needs a fixed product Product of fixed dummy (<=ncovcol) covariates For a fixed product k is higher than ncovcol V3*V2 */
+      printf("MEMORY ERRORR k=%d Tvardk[k][1]=%d, Tvardk[k][2]=%d, FixedV[Tvardk[k][1]]=%d,FixedV[Tvardk[k][2]]=%d\n ",k,Tvardk[k][1],Tvardk[k][2],FixedV[Tvardk[k][1]],FixedV[Tvardk[k][2]]);
+       Fixed[k]= 0;
+       Dummy[k]= 0;
+       ncoveff++;
+       ncovf++;
+       /* ncovv++; */
+       /* TvarVV[ncovv]=Tvardk[k][1]; */
+       /* FixedV[ncovcolt+ncovv]=0; /\* or FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+       /* ncovv++; */
+       /* TvarVV[ncovv]=Tvardk[k][2]; */
+       /* FixedV[ncovcolt+ncovv]=0; /\* or FixedV[TvarVV[ncovv]]=0 HERE *\/ */
+       modell[k].maintype= FTYPE;
+       TvarF[ncovf]=Tvar[k];
+       /* TnsdVar[Tvar[k]]=nsd; */ /* To be done */
+       TvarFind[ncovf]=k;
+       TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
+       TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
+      }else{/* product varying Vn * Vm without age, V1+V3+age*V1+age*V3+V1*V3 looking at V1*V3, Typevar={0, 0, 1, 1, 2}, k=5, V1 is fixed, V3 is timevary, V5 is a product  */
+       /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+       /* model V1+V3+age*V1+age*V3+V1*V3 + V1*V3*age*/
+       /*  Tvar={1, 3, 1, 3, 6, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+       k1=Tposprod[k];  /* Position in the products of product k, Tposprod={0, 0, 0, 0, 1, 1} k1=1 first product but second time varying because of V3 */
+       ncovvt++;
+       TvarVV[ncovvt]=Tvard[k1][1];  /*  TvarVV[2]=V1 (because TvarVV[1] was V3, first time varying covariates */
+       TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+       ncovvt++;
+       TvarVV[ncovvt]=Tvard[k1][2];  /*  TvarVV[3]=V3 */
+       TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+       
+       /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */
+       /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ 
+       
+       if(Tvard[k1][1] <=ncovcol){ /* Vn is dummy fixed, (Tvard[1][1]=V1), (Tvard[1][1]=V3 time varying) */
+         if(Tvard[k1][2] <=ncovcol){ /* Vm is dummy fixed */
+           Fixed[k]= 1;
+           Dummy[k]= 0;
+           modell[k].maintype= FTYPE;
+           modell[k].subtype= FPDD;            /*      Product fixed dummy * fixed dummy */
+           ncovf++; /* Fixed variables without age */
+           TvarF[ncovf]=Tvar[k];
+           TvarFind[ncovf]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv){ /* Vm is quanti fixed */
+           Fixed[k]= 0;  /* Fixed product */
+           Dummy[k]= 1;
+           modell[k].maintype= FTYPE;
+           modell[k].subtype= FPDQ;            /*      Product fixed dummy * fixed quantitative */
+           ncovf++; /* Varying variables without age */
+           TvarF[ncovf]=Tvar[k];
+           TvarFind[ncovf]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is a time varying dummy covariate */
+           Fixed[k]= 1;
+           Dummy[k]= 0;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDD;            /*      Product fixed dummy * varying dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];  /* TvarV[1]=Tvar[5]=5 because there is a V4 */
+           TvarVind[ncovv]=k;/* TvarVind[1]=5 */ 
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is a time varying quantitative covariate */
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product fixed dummy * varying quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }
+       }else if(Tvard[k1][1] <=ncovcol+nqv){ /* Vn is fixed quanti  */
+         if(Tvard[k1][2] <=ncovcol){ /* Vm is fixed dummy */
+           Fixed[k]= 0;  /*  Fixed product */
+           Dummy[k]= 1;
+           modell[k].maintype= FTYPE;
+           modell[k].subtype= FPDQ;            /*      Product fixed quantitative * fixed dummy */
+           ncovf++; /* Fixed variables without age */
+           TvarF[ncovf]=Tvar[k];
+           TvarFind[ncovf]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is time varying */
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product fixed quantitative * varying dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is time varying quanti */
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPQQ;            /*      Product fixed quantitative * varying quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }
+       }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ /* Vn is time varying dummy */
+         if(Tvard[k1][2] <=ncovcol){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDD;            /*      Product time varying dummy * fixed dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product time varying dummy * fixed quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
+           Fixed[k]= 1;
+           Dummy[k]= 0;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDD;            /*      Product time varying dummy * time varying dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product time varying dummy * time varying quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }
+       }else if(Tvard[k1][1] <=ncovcol+nqv+ntv+nqtv){ /* Vn is time varying quanti */
+         if(Tvard[k1][2] <=ncovcol){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product time varying quantitative * fixed dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPQQ;            /*      Product time varying quantitative * fixed quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPDQ;            /*      Product time varying quantitative * time varying dummy */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
+           Fixed[k]= 1;
+           Dummy[k]= 1;
+           modell[k].maintype= VTYPE;
+           modell[k].subtype= VPQQ;            /*      Product time varying quantitative * time varying quantitative */
+           ncovv++; /* Varying variables without age */
+           TvarV[ncovv]=Tvar[k];
+           TvarVind[ncovv]=k;
+         }
+       }else{
+         printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]);
+         fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]);
+       } /*end k1*/
+      }
+    }else if(Typevar[k] == 3){  /* product Vn * Vm with age, V1+V3+age*V1+age*V3+V1*V3 looking at V1*V3, Typevar={0, 0, 1, 1, 2}, k=5, V1 is fixed, V3 is timevary, V5 is a product  */
       /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
-      /* model V1+V3+age*V1+age*V3+V1*V3 */
-      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
-      k1=Tposprod[k];  /* Position in the products of product k, Tposprod={0, 0, 0, 0, 1} k1=1 first product but second time varying because of V3 */
-      ncovvt++;
-      TvarVV[ncovvt]=Tvard[k1][1];  /*  TvarVV[2]=V1 (because TvarVV[1] was V3, first time varying covariates */
-      TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
-      ncovvt++;
-      TvarVV[ncovvt]=Tvard[k1][2];  /*  TvarVV[3]=V3 */
-      TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
-
-
+      /* model V1+V3+age*V1+age*V3+V1*V3 + V1*V3*age*/
+      /*  Tvar={1, 3, 1, 3, 6, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      k1=Tposprod[k];  /* Position in the products of product k, Tposprod={0, 0, 0, 0, 1, 1} k1=1 first product but second time varying because of V3 */
+      ncova++;
+      TvarA[ncova]=Tvard[k1][1];  /*  TvarVV[2]=V1 (because TvarVV[1] was V3, first time varying covariates */
+      TvarAind[ncova]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+      ncova++;
+      TvarA[ncova]=Tvard[k1][2];  /*  TvarVV[3]=V3 */
+      TvarAind[ncova]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+
+      /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */
+      /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ 
+      if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){
+       ncovta++;
+       TvarAVVA[ncovta]=Tvard[k1][1]; /*   age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */
+       TvarAVVAind[ncovta]=k;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvard[k1][2]; /*   age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */
+       TvarAVVAind[ncovta]=k;
+      }else{
+       ncovva++;  /* HERY  reached */
+       TvarVVA[ncovva]=Tvard[k1][1]; /*  age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4  */
+       TvarVVAind[ncovva]=k;
+       ncovva++;
+       TvarVVA[ncovva]=Tvard[k1][2]; /*   */
+       TvarVVAind[ncovva]=k;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvard[k1][1]; /*   age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */
+       TvarAVVAind[ncovta]=k;
+       ncovta++;
+       TvarAVVA[ncovta]=Tvard[k1][2]; /*   age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */
+       TvarAVVAind[ncovta]=k;
+      }
       if(Tvard[k1][1] <=ncovcol){ /* Vn is dummy fixed, (Tvard[1][1]=V1), (Tvard[1][1]=V3 time varying) */
        if(Tvard[k1][2] <=ncovcol){ /* Vm is dummy fixed */
-         Fixed[k]= 1;
-         Dummy[k]= 0;
+         Fixed[k]= 2;
+         Dummy[k]= 2;
          modell[k].maintype= FTYPE;
          modell[k].subtype= FPDD;              /*      Product fixed dummy * fixed dummy */
-         ncovf++; /* Fixed variables without age */
-         TvarF[ncovf]=Tvar[k];
-         TvarFind[ncovf]=k;
+         /* TvarF[ncova]=Tvar[k];   /\* Problem to solve *\/ */
+         /* TvarFind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv){ /* Vm is quanti fixed */
-         Fixed[k]= 0;  /* Fixed product */
-         Dummy[k]= 1;
+         Fixed[k]= 2;  /* Fixed product */
+         Dummy[k]= 3;
          modell[k].maintype= FTYPE;
          modell[k].subtype= FPDQ;              /*      Product fixed dummy * fixed quantitative */
-         ncovf++; /* Varying variables without age */
-         TvarF[ncovf]=Tvar[k];
-         TvarFind[ncovf]=k;
+         /* TvarF[ncova]=Tvar[k]; */
+         /* TvarFind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is a time varying dummy covariate */
-         Fixed[k]= 1;
-         Dummy[k]= 0;
+         Fixed[k]= 3;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDD;              /*      Product fixed dummy * varying dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];  /* TvarV[1]=Tvar[5]=5 because there is a V4 */
-         TvarVind[ncovv]=k;/* TvarVind[1]=5 */ 
+         TvarV[ncova]=Tvar[k];  /* TvarV[1]=Tvar[5]=5 because there is a V4 */
+         TvarVind[ncova]=k;/* TvarVind[1]=5 */ 
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is a time varying quantitative covariate */
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 3;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product fixed dummy * varying quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncovv++; /\* Varying variables without age *\/ */
+         /* TvarV[ncovv]=Tvar[k]; */
+         /* TvarVind[ncovv]=k; */
        }
       }else if(Tvard[k1][1] <=ncovcol+nqv){ /* Vn is fixed quanti  */
        if(Tvard[k1][2] <=ncovcol){ /* Vm is fixed dummy */
-         Fixed[k]= 0;  /*  Fixed product */
-         Dummy[k]= 1;
+         Fixed[k]= 2;  /*  Fixed product */
+         Dummy[k]= 2;
          modell[k].maintype= FTYPE;
          modell[k].subtype= FPDQ;              /*      Product fixed quantitative * fixed dummy */
-         ncovf++; /* Fixed variables without age */
-         TvarF[ncovf]=Tvar[k];
-         TvarFind[ncovf]=k;
+         /* ncova++; /\* Fixed variables with age *\/ */
+         /* TvarF[ncovf]=Tvar[k]; */
+         /* TvarFind[ncovf]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is time varying */
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 2;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product fixed quantitative * varying dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is time varying quanti */
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 3;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPQQ;              /*      Product fixed quantitative * varying quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         ncova++; /* Varying variables without age */
+         TvarV[ncova]=Tvar[k];
+         TvarVind[ncova]=k;
+         /* ncova++; /\* Varying variables without age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }
       }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ /* Vn is time varying dummy */
        if(Tvard[k1][2] <=ncovcol){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 2;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDD;              /*      Product time varying dummy * fixed dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 2;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product time varying dummy * fixed quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
-         Fixed[k]= 1;
-         Dummy[k]= 0;
+         Fixed[k]= 3;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDD;              /*      Product time varying dummy * time varying dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 3;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product time varying dummy * time varying quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }
       }else if(Tvard[k1][1] <=ncovcol+nqv+ntv+nqtv){ /* Vn is time varying quanti */
        if(Tvard[k1][2] <=ncovcol){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 2;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product time varying quantitative * fixed dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 2;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPQQ;              /*      Product time varying quantitative * fixed quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 3;
+         Dummy[k]= 2;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDQ;              /*      Product time varying quantitative * time varying dummy */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
-         Fixed[k]= 1;
-         Dummy[k]= 1;
+         Fixed[k]= 3;
+         Dummy[k]= 3;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPQQ;              /*      Product time varying quantitative * time varying quantitative */
-         ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
+         /* ncova++; /\* Varying variables with age *\/ */
+         /* TvarV[ncova]=Tvar[k]; */
+         /* TvarVind[ncova]=k; */
        }
       }else{
        printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]);
        fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]);
       } /*end k1*/
-    }else{
+    } else{
       printf("Error, current version can't treat for performance reasons, Tvar[%d]=%d, Typevar[%d]=%d\n", k, Tvar[k], k, Typevar[k]);
       fprintf(ficlog,"Error, current version can't treat for performance reasons, Tvar[%d]=%d, Typevar[%d]=%d\n", k, Tvar[k], k, Typevar[k]);
     }
@@ -11604,6 +12139,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
     /* printf("           modell[%d].maintype=%d, modell[%d].subtype=%d\n",k,modell[k].maintype,k,modell[k].subtype); */
     fprintf(ficlog,"Decodemodel, k=%d, Tvar[%d]=V%d,Typevar=%d, Fixed=%d, Dummy=%d\n",k, k,Tvar[k],Typevar[k],Fixed[k],Dummy[k]);
   }
+  ncovvta=ncovva;
   /* Searching for doublons in the model */
   for(k1=1; k1<= cptcovt;k1++){
     for(k2=1; k2 <k1;k2++){
@@ -11631,6 +12167,8 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
   fprintf(ficlog,"ncoveff=%d, nqfveff=%d, ntveff=%d, nqtveff=%d, cptcovn=%d\n",ncoveff,nqfveff,ntveff,nqtveff,cptcovn);
   printf("ncovf=%d, ncovv=%d, ncova=%d, nsd=%d, nsq=%d\n",ncovf,ncovv,ncova,nsd,nsq);
   fprintf(ficlog,"ncovf=%d, ncovv=%d, ncova=%d, nsd=%d, nsq=%d\n",ncovf,ncovv,ncova,nsd, nsq);
+
+  free_imatrix(existcomb,1,NCOVMAX,1,NCOVMAX);
   return (0); /* with covar[new additional covariate if product] and Tage if age */ 
   /*endread:*/
   printf("Exiting decodemodel: ");
@@ -13054,12 +13592,19 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   TvarVQind=ivector(1,NCOVMAX); /*  */
   TvarVV=ivector(1,NCOVMAX); /*  */
   TvarVVind=ivector(1,NCOVMAX); /*  */
+  TvarVVA=ivector(1,NCOVMAX); /*  */
+  TvarVVAind=ivector(1,NCOVMAX); /*  */
+  TvarAVVA=ivector(1,NCOVMAX); /*  */
+  TvarAVVAind=ivector(1,NCOVMAX); /*  */
 
   Tvalsel=vector(1,NCOVMAX); /*  */
   Tvarsel=ivector(1,NCOVMAX); /*  */
   Typevar=ivector(-1,NCOVMAX); /* -1 to 2 */
   Fixed=ivector(-1,NCOVMAX); /* -1 to 3 */
   Dummy=ivector(-1,NCOVMAX); /* -1 to 3 */
+  DummyV=ivector(-1,NCOVMAX); /* 1 to 3 */
+  FixedV=ivector(-1,NCOVMAX); /* 1 to 3 */
+
   /*  V2+V1+V4+age*V3 is a model with 4 covariates (3 plus signs). 
       For each model-covariate stores the data-covariate id. Tvar[1]=2, Tvar[2]=1, Tvar[3]=4, 
       Tvar[4=age*V3] is 3 and 'age' is recorded in Tage.
@@ -13079,7 +13624,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   Tvard=imatrix(1,NCOVMAX,1,2); /* n=Tvard[k1][1]  and m=Tvard[k1][2] gives the couple n,m of the k1 th product Vn*Vm
                            * For V3*V2 (in V2+V1+V1*V4+age*V3+V3*V2), V3*V2 position is 2nd. 
                            * Tvard[k1=2][1]=3 (V3) Tvard[k1=2][2]=2(V2) */
-  Tvardk=imatrix(1,NCOVMAX,1,2);
+  Tvardk=imatrix(-1,NCOVMAX,1,2);
   Tage=ivector(1,NCOVMAX); /* Gives the covariate id of covariates associated with age: V2 + V1 + age*V4 + V3*age
                         4 covariates (3 plus signs)
                         Tage[1=V3*age]= 4; Tage[2=age*V4] = 3
@@ -13099,6 +13644,36 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
                                * Tmodelqind[1]=1,Tvaraff[1]@9={4,
                                * 3, 1, 0, 0, 0, 0, 0, 0},
                                * model=V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1*/
+
+/* Probably useless zeroes */
+  for(i=1;i<NCOVMAX;i++){
+    DummyV[i]=0;
+    FixedV[i]=0;
+  }
+
+  for(i=1; i <=ncovcol;i++){
+    DummyV[i]=0;
+    FixedV[i]=0;
+  }
+  for(i=ncovcol+1; i <=ncovcol+nqv;i++){
+    DummyV[i]=1;
+    FixedV[i]=0;
+  }
+  for(i=ncovcol+nqv+1; i <=ncovcol+nqv+ntv;i++){
+    DummyV[i]=0;
+    FixedV[i]=1;
+  }
+  for(i=ncovcol+nqv+ntv+1; i <=ncovcol+nqv+ntv+nqtv;i++){
+    DummyV[i]=1;
+    FixedV[i]=1;
+  }
+  for(i=1; i <=ncovcol+nqv+ntv+nqtv;i++){
+    printf("Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",i,i,DummyV[i],i,FixedV[i]);
+    fprintf(ficlog,"Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",i,i,DummyV[i],i,FixedV[i]);
+  }
+
+
+
 /* Main decodemodel */
 
 
@@ -13675,6 +14250,11 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
        fprintf(ficres,"  +    V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
        fprintf(ficlog,"  +    V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
        fprintf(fichtm, "<th>+  V%d*V%d</th>",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+      }else if(Typevar[j]==3) { /* TO VERIFY */
+       printf("  +    V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+       fprintf(ficres,"  +    V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+       fprintf(ficlog,"  +    V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+       fprintf(fichtm, "<th>+  V%d*V%d*age</th>",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
       }
     }
     printf("\n");
@@ -13734,6 +14314,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
          fprintf(fichtm, "<th>+  V%d*age</th>",Tvar[j]);
        }else if(Typevar[j]==2) {
          fprintf(fichtm, "<th>+  V%d*V%d</th>",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+       }else if(Typevar[j]==3) { /* TO VERIFY */
+         fprintf(fichtm, "<th>+  V%d*V%d*age</th>",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
        }
       }
       fprintf(fichtm, "</tr>\n");
@@ -13791,7 +14373,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
     }
     
     fprintf(ficres,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n#   ...\n# 232 Cov(b23,a12)  Cov(b23,b12) ... Var (b23)\n");
-    if(mle >= 1) /* To big for the screen */
+    if(mle >= 1) /* Too big for the screen */
       printf("# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n#   ...\n# 232 Cov(b23,a12)  Cov(b23,b12) ... Var (b23)\n");
     fprintf(ficlog,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n#   ...\n# 232 Cov(b23,a12)  Cov(b23,b12) ... Var (b23)\n");
     /* # 121 Var(a12)\n\ */
@@ -14552,7 +15134,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
 
     
     free_vector(weight,firstobs,lastobs);
-    free_imatrix(Tvardk,1,NCOVMAX,1,2);
+    free_imatrix(Tvardk,-1,NCOVMAX,1,2);
     free_imatrix(Tvard,1,NCOVMAX,1,2);
     free_imatrix(s,1,maxwav+1,firstobs,lastobs);
     free_matrix(anint,1,maxwav,firstobs,lastobs); 
@@ -14594,8 +15176,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
   free_ivector(ncodemaxwundef,1,NCOVMAX);
   free_ivector(Dummy,-1,NCOVMAX);
   free_ivector(Fixed,-1,NCOVMAX);
-  free_ivector(DummyV,1,NCOVMAX);
-  free_ivector(FixedV,1,NCOVMAX);
+  free_ivector(DummyV,-1,NCOVMAX);
+  free_ivector(FixedV,-1,NCOVMAX);
   free_ivector(Typevar,-1,NCOVMAX);
   free_ivector(Tvar,1,NCOVMAX);
   free_ivector(TvarsQ,1,NCOVMAX);
@@ -14617,6 +15199,10 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
   free_ivector(TvarVDind,1,NCOVMAX);
   free_ivector(TvarVQ,1,NCOVMAX);
   free_ivector(TvarVQind,1,NCOVMAX);
+  free_ivector(TvarAVVA,1,NCOVMAX);
+  free_ivector(TvarAVVAind,1,NCOVMAX);
+  free_ivector(TvarVVA,1,NCOVMAX);
+  free_ivector(TvarVVAind,1,NCOVMAX);
   free_ivector(TvarVV,1,NCOVMAX);
   free_ivector(TvarVVind,1,NCOVMAX);