--- imach/src/imach.c 2023/05/23 12:08:43 1.356 +++ imach/src/imach.c 2023/06/14 14:55:52 1.357 @@ -1,6 +1,9 @@ -/* $Id: imach.c,v 1.356 2023/05/23 12:08:43 brouard Exp $ +/* $Id: imach.c,v 1.357 2023/06/14 14:55:52 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.357 2023/06/14 14:55:52 brouard + * imach.c (Module): Testing if conjugate gradient could be quicker when lot of variables POWELLORIGINCONJUGATE + Revision 1.356 2023/05/23 12:08:43 brouard Summary: 0.99r46 @@ -1292,6 +1295,7 @@ Important routines /* #define POWELLORIGINAL /\* Don't use Directest to decide new direction but original Powell test *\/ */ /* #define MNBRAKORIGINAL /\* Don't use mnbrak fix *\/ */ /* #define FLATSUP *//* Suppresses directions where likelihood is flat */ +#define POWELLORIGINCONJUGATE /* Don't use conjugate but biggest decrease if valuable */ #include #include @@ -1384,12 +1388,12 @@ double gnuplotversion=GNUPLOTVERSION; #define ODIRSEPARATOR '\\' #endif -/* $Id: imach.c,v 1.356 2023/05/23 12:08:43 brouard Exp $ */ +/* $Id: imach.c,v 1.357 2023/06/14 14:55:52 brouard Exp $ */ /* $State: Exp $ */ #include "version.h" char version[]=__IMACH_VERSION__; char copyright[]="April 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: 1.356 $ $Date: 2023/05/23 12:08:43 $"; +char fullversion[]="$Revision: 1.357 $ $Date: 2023/06/14 14:55:52 $"; char strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ @@ -2755,7 +2759,9 @@ void powell(double p[], double **xi, int printf("%d",i);fflush(stdout); /* print direction (parameter) i */ fprintf(ficlog,"%d",i);fflush(ficlog); #ifdef LINMINORIGINAL - linmin(p,xit,n,fret,func); /* Point p[n]. xit[n] has been loaded for direction i as input.*/ + linmin(p,xit,n,fret,func); /* New point i minimizing in direction i has coordinates p[j].*/ + /* xit[j] gives the n coordinates of direction i as input.*/ + /* *fret gives the maximum value on direction xit */ #else linmin(p,xit,n,fret,func,&flat); /* Point p[n]. xit[n] has been loaded for direction i as input.*/ flatdir[i]=flat; /* Function is vanishing in that direction i */ @@ -2785,9 +2791,8 @@ void powell(double p[], double **xi, int fprintf(ficlog,"\n"); #endif } /* end loop on each direction i */ - /* Convergence test will use last linmin estimation (fret) and compare former iteration (fp) */ + /* Convergence test will use last linmin estimation (fret) and compare to former iteration (fp) */ /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit */ - /* New value of last point Pn is not computed, P(n-1) */ for(j=1;j<=n;j++) { if(flatdir[j] >0){ printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]); @@ -2925,10 +2930,17 @@ void powell(double p[], double **xi, int } } #endif +#ifdef POWELLORIGINCONJUGATE for (j=1;j<=n;j++) { xi[j][ibig]=xi[j][n]; /* Replace direction with biggest decrease by last direction n */ xi[j][n]=xit[j]; /* and this nth direction by the by the average p_0 p_n */ } +#else + for (j=1;j<=n-1;j++) { + xi[j][1]=xi[j][j+1]; /* Standard method of conjugate directions */ + xi[j][n]=xit[j]; /* and this nth direction by the by the average p_0 p_n */ + } +#endif #ifdef LINMINORIGINAL #else for (j=1, flatd=0;j<=n;j++) { @@ -2957,6 +2969,15 @@ void powell(double p[], double **xi, int #endif printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); + /* The minimization in direction $\xi_1$ gives $P_1$. From $P_1$ minimization in direction $\xi_2$ gives */ + /* $P_2$. Minimization of line $P_2-P_1$ gives new starting point $P^{(1)}_0$ and direction $\xi_1$ is dropped and replaced by second */ + /* direction $\xi_1^{(1)}=\xi_2$. Also second direction is replaced by new direction $\xi^{(1)}_2=P_2-P_0$. */ + + /* At the second iteration, starting from $P_0^{(1)}$, minimization amongst $\xi^{(1)}_1$ gives point $P^{(1)}_1$. */ + /* Minimization amongst $\xi^{(1)}_2=(P_2-P_0)$ gives point $P^{(1)}_2$. As $P^{(2)}_1$ and */ + /* $P^{(1)}_0$ are minimizing in the same direction $P^{(1)}_2 - P^{(1)}_1= P_2-P_0$, directions $P^{(1)}_2-P^{(1)}_0$ */ + /* and $P_2-P_0$ (parallel to $\xi$ and $\xi^c$) are conjugate. } */ + #ifdef DEBUG printf("Direction changed last moved %d in place of ibig=%d, new last is the average:\n",n,ibig); @@ -4967,7 +4988,7 @@ void mlikeli(FILE *ficres,double p[], in xi=matrix(1,npar,1,npar); - for (i=1;i<=npar;i++) + for (i=1;i<=npar;i++) /* Starting with canonical directions j=1,n xi[i=1,n][j] */ for (j=1;j<=npar;j++) xi[i][j]=(i==j ? 1.0 : 0.0); printf("Powell\n"); fprintf(ficlog,"Powell\n");