--- imach/src/imach.c 2009/07/06 10:21:25 1.133 +++ imach/src/imach.c 2009/10/29 15:33:14 1.135 @@ -1,6 +1,12 @@ -/* $Id: imach.c,v 1.133 2009/07/06 10:21:25 brouard Exp $ +/* $Id: imach.c,v 1.135 2009/10/29 15:33:14 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.135 2009/10/29 15:33:14 brouard + (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code. + + Revision 1.134 2009/10/29 13:18:53 brouard + (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code. + Revision 1.133 2009/07/06 10:21:25 brouard just nforces @@ -403,11 +409,11 @@ extern int errno; #define ODIRSEPARATOR '/' #endif -/* $Id: imach.c,v 1.133 2009/07/06 10:21:25 brouard Exp $ */ +/* $Id: imach.c,v 1.135 2009/10/29 15:33:14 brouard Exp $ */ /* $State: Exp $ */ -char version[]="Imach version 0.98k, June 2009, INED-EUROREVES-Institut de longevite "; -char fullversion[]="$Revision: 1.133 $ $Date: 2009/07/06 10:21:25 $"; +char version[]="Imach version 0.98l, October 2009, INED-EUROREVES-Institut de longevite "; +char fullversion[]="$Revision: 1.135 $ $Date: 2009/10/29 15:33:14 $"; char strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ @@ -3482,6 +3488,13 @@ To be simple, these graphs help to under /* Computing eigen value of matrix of covariance */ lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.; lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.; + if ((lc2 <0) || (lc1 <0) ){ + printf("Error: One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Continuing by making them positive: WRONG RESULTS.\n", lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor); + fprintf(ficlog,"Error: One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e\n", lc1, lc2, v1, v2, cv12);fflush(ficlog); + lc1=fabs(lc1); + lc2=fabs(lc2); + } + /* Eigen vectors */ v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12)); /*v21=sqrt(1.-v11*v11); *//* error */ @@ -4945,10 +4958,16 @@ run imach with mle=-1 to get a correct t month=99; year=9999; }else{ - printf("Error reading data around '%s' at line number %ld %s for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line,j); - fprintf(ficlog,"Error reading data around '%s' at line number %ld %s for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line,j);fflush(ficlog); + printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line); + fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line);fflush(ficlog); goto end; } + if (year==9999) { + printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line); + fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);fflush(ficlog); + goto end; + + } annais[i]=(double)(year); moisnais[i]=(double)(month); strcpy(line,stra); @@ -5172,7 +5191,7 @@ run imach with mle=-1 to get a correct t agev[m][i]=1; else if(agev[m][i] agemax){ agemax=agev[m][i];