=================================================================== RCS file: /home/cvs/OpenXM/src/hgm/mh/src/wmain.c,v retrieving revision 1.1 retrieving revision 1.24 diff -u -p -r1.1 -r1.24 --- OpenXM/src/hgm/mh/src/wmain.c 2013/02/19 03:06:19 1.1 +++ OpenXM/src/hgm/mh/src/wmain.c 2015/04/02 01:11:13 1.24 @@ -1,256 +1,412 @@ /* -License: LGPL -$Id: wmain.c,v 1.1 2013/02/19 03:06:19 takayama Exp $ - */ + $OpenXM: OpenXM/src/hgm/mh/src/wmain.c,v 1.23 2015/03/24 07:49:06 takayama Exp $ + License: LGPL +*/ #include #include #include #include +#include "sfile.h" +#include "mh.h" #define SMAX 4096 -#define inci(i) { i++; if (i >= argc) { fprintf(stderr,"Option argument is not given.\n"); return(-1); }} +#define inci(i) { i++; if (i >= argc) { oxprintfe("Option argument is not given.\n"); return(NULL); }} +int MH_deallocate=0; + +/* + changelog + 2014.03.15 --strategy 1 is default. A new parser in setParam() + */ extern char *MH_Gfname; extern char *MH_Dfname; /* global variables. They are set in setParam() */ +int MH_byFile=1; int MH_RANK; int MH_M; int MH_Mg; /* m */ double *MH_Beta; /* beta[0], ..., beta[m-1] */ -double *Ng; /* freedom n. c=(m+1)/2+n/2; Note that it is a pointer */ -double X0g; /* initial point */ -double *Iv; /* Initial values of mhg sorted by mhbase() in rd.rr at beta*x0 */ -double Ef; /* exponential factor at beta*x0 */ -extern double Hg; /* step size of rk defined in rk.c */ -int Dp; /* Data sampling period */ -double Xng=0.0; /* the last point */ -int RawName = 0; -int Testrank=0; -extern int Verbose; +double *MH_Ng; /* freedom n. c=(m+1)/2+n/2; Note that it is a pointer */ +double MH_X0g; /* initial point */ +static double *Iv; /* Initial values of mhg sorted by mhbase() in rd.rr at beta*x0 */ +static double Ef; /* exponential factor at beta*x0 */ +extern double MH_Hg; /* step size of rk defined in rk.c */ +int MH_Dp; /* Data sampling period */ +static double Xng=0.0; /* the last point */ +int MH_RawName = 0; +static int Testrank=0; +/* If MH_success is set to 1, then strategy, MH_abserr, MH_relerr seem to + be properly set. +*/ +int MH_success=0; +/* + Estimation of the maximal coeff of A in y'=Ay. + This might be too rough estimate. + */ +double MH_coeff_max; +/* + Estimation of h by MH_coeff_max; + */ +double MH_estimated_start_step; +extern int MH_Verbose; +extern int MH_strategy; +extern double MH_abserr; +extern double MH_relerr; -extern int P95; /* 95 % points */ -int gopen_file(void); -double rkmain(double x0,double y0[],double xn); -int setParam(char *fname); -int showParam(void); +extern int MH_P95; /* 95 % points */ +int mh_gopen_file(void); +static int setParamTest(void); +static int setParamDefault(void); +static int setParam(char *fname); +static int showParam(void); +static int next(struct SFILE *fp,char *s, char *msg); +static double estimateHg(int m, double beta[],double x0); /* #define DEBUG */ #ifdef DEBUG -char *MH_Dfname; char *MH_Gfname; double Hg; -int gopen_file(void) { } -double rkmain(double x0,double y0[],double xn) { } +char *MH_Dfname; char *MH_Gfname; double MH_Hg; +int mh_gopen_file(void) { } +struct MH_RESULT mh_rkmain(double x0,double y0[],double xn) { } #endif -void *mymalloc(int s) { - void *p; - p = (void*)malloc(s); - if (p == NULL) { - fprintf(stderr,"No memory.\n"); exit(-1); - } - return(p); +void mh_freeWorkArea(void) { + extern int MH_deallocate; + MH_deallocate=1; /* switch to deallocation mode. */ + mh_main(0,NULL); + setParam(NULL); + mh_rkmain(0.0, NULL, 0.0); + mh_rf(0.0, NULL, 0, NULL, 0); + MH_deallocate=0; /* switch to the normal mode. */ } -static mypower(int x,int n) { +static int mypower(int x,int n) { int a,i; a = 1; for (i=0; i SIGDIGIT_DEFAULT*myabs(y0[0])) { + MH_success = 0; + oxprintfe("%%%%Warning, abserr seems not to be small enough, abserr=%lg, y[0]=%lg\n",MH_abserr,y0[0]); + }else{ + MH_success = 1; + } + }else{ + MH_success = 0; + } + MH_estimated_start_step = estimateHg(MH_Mg,MH_Beta,MH_X0g); + if (MH_Verbose) showParam(); + if (MH_Verbose) {for (i=0; it.txt\n"); + oxprintfe(" ./hgm_w-n --idata t.txt --gnuplotf test-g --verbose\n"); + oxprintfe(" gnuplot -persist 1) dmin = myabs(beta[1]-beta[0]); + else dmin=myabs(beta[0]); + for (i=0; i