Annotation of OpenXM/src/hgm/mh/src/mh.c, Revision 1.15
1.15 ! takayama 1: /* $OpenXM: OpenXM/src/hgm/mh/src/mh.c,v 1.14 2015/03/24 05:59:43 takayama Exp $ */
1.1 takayama 2: #include <stdio.h>
1.15 ! takayama 3: #include <string.h>
1.1 takayama 4: #include "sfile.h"
5: #include "mh.h"
6: #define WSIZE 1024
1.4 takayama 7: extern int MH_DEBUG;
1.13 takayama 8: extern int M_show_autosteps;
1.10 takayama 9: static int imypower(int x,int n) {
1.1 takayama 10: int a,i;
11: a = 1;
12: for (i=0; i<n; i++) a = a*x;
13: return(a);
14: }
15:
16: struct cWishart *new_cWishart(int rank) {
17: struct cWishart *cwp;
18: cwp = (struct cWishart *)mh_malloc(sizeof(struct cWishart));
19: cwp->x=0;
20: cwp->rank=rank;
21: cwp->f = (double *)mh_malloc(sizeof(double)*rank);
22: cwp->aux = cwp->aux2 = NULL;
23: return(cwp);
24: }
25:
1.3 takayama 26: struct cWishart *mh_cwishart_gen(int m,int n,double beta[],double x0,
1.13 takayama 27: int approxDeg,double h, int dp, double x,int modep[],
28: int automatic,double assigned_series_error,
29: int verbose)
30: {
1.6 takayama 31: /*
32: modep[0]. Do Koev-Edelman (ignored for now).
33: modep[1]. Do the HGM
34: modep[2]. Return modep[2] intermediate data.
35: */
1.1 takayama 36: struct SFILE *fp;
37: char swork[WSIZE];
38: char *argv[WSIZE];
1.13 takayama 39: int argc;
1.1 takayama 40: int i,rank;
41: char *comm;
42: struct MH_RESULT *rp;
43: struct SFILE *sfp;
44: struct cWishart *cw;
45: argv[0]="dummy";
46: argv[1] = "--bystring";
47: argv[2] = "--idata";
48: fp = mh_fopen("","w",0);
49: mh_fputs("%%Mg=\n",fp);
50: sprintf(swork,"%d\n",m); mh_fputs(swork,fp);
51: rank = imypower(2,m);
52: mh_fputs("%%Beta\n",fp);
53: for (i=0; i<m; i++) {
54: sprintf(swork,"%lf\n",beta[i]); mh_fputs(swork,fp);
55: }
56: mh_fputs("%%Ng=\n",fp); /* freedom param */
57: sprintf(swork,"%d\n",n); mh_fputs(swork,fp);
58: mh_fputs("%%X0g=\n",fp); /* initial point */
59: sprintf(swork,"%lf\n",x0); mh_fputs(swork,fp);
60: mh_fputs("%%Iv\n",fp); /* initial values, dummy */
61: for (i=0; i<rank; i++) mh_fputs("0.0\n",fp);
62: mh_fputs("%%Ef=\n1.0\n",fp); /* Below are dummy values */
1.14 takayama 63: if (h <= 0.0) {oxprintfe("h<=0.0, set to 0.1\n"); h=0.1;}
1.1 takayama 64: mh_fputs("%%Hg=\n",fp);
65: sprintf(swork,"%lf\n",h); mh_fputs(swork,fp);
1.14 takayama 66: if (dp < 1) {oxprintfe("dp<1, set to 1\n"); dp=1;}
1.1 takayama 67: mh_fputs("%%Dp=\n",fp);
68: sprintf(swork,"%d\n",dp); mh_fputs(swork,fp);
1.14 takayama 69: if (x <= x0) {oxprintfe("x <= x0, set to x=x0+10\n"); x=x0+10;}
1.1 takayama 70: mh_fputs("%%Xng=\n",fp);
71: sprintf(swork,"%lf\n",x); mh_fputs(swork,fp);
72:
1.13 takayama 73: sprintf(swork,"%%automatic=%d\n",automatic); mh_fputs(swork,fp);
74: sprintf(swork,"%%assigned_series_error=%lg\n",assigned_series_error); mh_fputs(swork,fp);
75: sprintf(swork,"%%show_autosteps=%d\n",verbose); mh_fputs(swork,fp);
76:
1.1 takayama 77: comm = (char *)mh_malloc(fp->len +1);
78: mh_outstr(comm,fp->len+1,fp);
79: mh_fclose(fp);
80: argv[3] = comm;
81:
82: argv[4] = "--degree";
83: argv[5] = (char *)mh_malloc(128);
84: sprintf(argv[5],"%d",approxDeg);
85:
1.4 takayama 86: rp=jk_main(6,argv);
1.1 takayama 87: if (rp == NULL) {
1.14 takayama 88: oxprintfe("rp is NULL.\n"); return(NULL);
1.1 takayama 89: }
90: cw = new_cWishart(rank);
91: cw->x = rp->x;
92: cw->rank = rp->rank;
1.5 takayama 93: if (rank != cw->rank) {
1.14 takayama 94: oxprintfe("Rank error.\n"); return(NULL);
1.5 takayama 95: }
1.4 takayama 96: for (i=0; i<cw->rank; i++) (cw->f)[i] = (rp->y)[i];
97: sfp = (rp->sfpp)[0];
1.5 takayama 98: cw->aux = (char *) mh_malloc((sfp->len)+1);
99: mh_outstr((char *)(cw->aux),(sfp->len)+1,sfp);
100: /* todo, the following line seems to cause seg fault. */
1.1 takayama 101: /* deallocate the memory */
102: for (i=0; i<rp->size; i++) mh_fclose((rp->sfpp)[i]);
103: /* todo, mh_free_??(rp); free Iv's */
1.6 takayama 104: if (!modep[1]) return(cw);
1.1 takayama 105:
1.14 takayama 106: if (MH_DEBUG) oxprintf("\n\n%s\n",(char *)cw->aux);
1.5 takayama 107: /* This output is strange. */
1.1 takayama 108: /* Starting HGM */
109: argv[3] = (char *)cw->aux;
110: argv[4] = "--dataf";
111: argv[5] = "dummy-dataf";
1.13 takayama 112: argc=6;
113: if (verbose) {
114: argv[6] = "--verbose"; ++argc;
115: }
116: rp = mh_main(argc,argv);
1.1 takayama 117: if (rp == NULL) {
1.14 takayama 118: oxprintfe("rp is NULL in the second step.\n"); return(NULL);
1.1 takayama 119: }
120: cw = new_cWishart(rank);
121: cw->x = rp->x;
122: cw->rank = rp->rank;
123: for (i=0; i<cw->rank; i++) (cw->f)[i] = (rp->y)[i];
124: sfp = (rp->sfpp)[0];
125: if (sfp) {
126: cw->aux = (char *) mh_malloc(sfp->len+1);
127: mh_outstr((char *)cw->aux,sfp->len+1,sfp);
128: }
129: sfp = (rp->sfpp)[1];
130: if (sfp) {
131: cw->aux2 = (char *) mh_malloc(sfp->len+1);
132: mh_outstr((char *)cw->aux2,sfp->len+1,sfp);
133: }
134: /* deallocate the memory */
135: for (i=0; i<rp->size; i++) mh_fclose((rp->sfpp)[i]);
136: mh_freeWorkArea();
137: return(cw);
138: }
139: /* Cumulative probability distribution function of the first eigenvalue of
140: Wishart matrix by Series */
141: struct cWishart *mh_cwishart_s(int m,int n,double beta[],double x0,
1.13 takayama 142: int approxDeg,double h, int dp, double x,
143: int automatic,double assigned_series_error,
144: int verbose)
145: {
1.6 takayama 146: int modep[]={1,0,0};
1.13 takayama 147: return(mh_cwishart_gen(m,n,beta,x0,approxDeg,h,dp,x,modep,automatic,assigned_series_error,verbose));
1.1 takayama 148: }
149:
150: /* Cumulative probability distribution function of the first eigenvalue of
151: Wishart matrix by HGM */
152: struct cWishart *mh_cwishart_hgm(int m,int n,double beta[],double x0,
1.13 takayama 153: int approxDeg, double h, int dp , double x,
154: int automatic,double assigned_series_error,
155: int verbose)
1.1 takayama 156: {
1.6 takayama 157: int modep[]={1,1,0};
1.13 takayama 158: return(mh_cwishart_gen(m,n,beta,x0,approxDeg,h,dp,x,modep,automatic,assigned_series_error,verbose));
1.1 takayama 159: }
160:
161: #ifdef STANDALONE
1.15 ! takayama 162: int main(int argc,char *argv[]) {
1.1 takayama 163: double beta[5]={1.0,2.0,3.0,4.0,5.0};
164: struct cWishart *cw;
1.7 takayama 165: struct SFILE *sfp;
166: char *s;
167: char str[1024];
168: double x;
1.12 takayama 169: int i,show;
1.13 takayama 170: int strategy=1;
1.12 takayama 171: double err[2]={-1.0,-1.0};
1.13 takayama 172: int verbose=0;
1.12 takayama 173: show=1;
174: for (i=1; i<argc; i++) {
175: if (strcmp(argv[i],"--strategy")==0) {
176: i++; sscanf(argv[i],"%d",&strategy);
177: }else if (strcmp(argv[i],"--abserr")==0) {
178: i++; sscanf(argv[i],"%lg",&(err[0]));
179: }else if (strcmp(argv[i],"--relerr")==0) {
180: i++; sscanf(argv[i],"%lg",&(err[1]));
181: }else if (strcmp(argv[i],"--quiet")==0) {
182: show=0;
1.13 takayama 183: }else if (strcmp(argv[i],"--verbose")==0) {
184: verbose=1;
1.12 takayama 185: }else{
1.14 takayama 186: oxprintfe("Unknown option.\n");
1.12 takayama 187: }
188: }
189: mh_set_strategy(strategy,err);
1.13 takayama 190: cw=mh_cwishart_hgm(3,5,beta,0.3,7, 0.01,1,10, 1,1e-7,verbose);
1.1 takayama 191: if (cw != NULL) {
1.14 takayama 192: oxprintf("x=%lf, y=%lf\n",cw->x,(cw->f)[0]);
193: /* oxprintf("%s",(char *)cw->aux); */
1.11 takayama 194: }
1.13 takayama 195: cw=mh_cwishart_hgm(4,5,beta,0.3,7, 0.01,1,10, 1,1e-7,verbose);
1.1 takayama 196: if (cw != NULL) {
1.14 takayama 197: oxprintf("x=%lf, y=%lf\n",cw->x,(cw->f)[0]);
1.7 takayama 198: s = (char *)cw->aux;
1.14 takayama 199: /* oxprintf("%s",(char *)cw->aux); */
1.12 takayama 200: if (show) {
201: sfp = mh_fopen(s,"r",0);
202: while (mh_fgets(str,1024,sfp)) {
1.14 takayama 203: sscanf(str,"%lg",&x); oxprintf("%lg\n",x);
1.12 takayama 204: }
205: mh_fclose(sfp);
1.7 takayama 206: }
1.1 takayama 207: }
1.15 ! takayama 208: return(0);
1.1 takayama 209: }
1.15 ! takayama 210: int main1() {
1.1 takayama 211: double beta[5]={1.0,2.0,3.0,4.0,5.0};
212: struct cWishart *cw;
1.13 takayama 213: int verbose=1;
214: cw=mh_cwishart_s(3,5,beta,0.3,7, 0,0,0, 1,1e-7,verbose);
1.1 takayama 215: if (cw != NULL) {
1.14 takayama 216: oxprintf("%s",(char *)cw->aux);
1.1 takayama 217: }
1.13 takayama 218: cw=mh_cwishart_s(4,5,beta,0.3,7, 0,0,0, 1,1e-7,verbose);
1.1 takayama 219: if (cw != NULL) {
1.14 takayama 220: oxprintf("%s",(char *)cw->aux);
1.1 takayama 221: }
1.13 takayama 222: cw=mh_cwishart_s(5,5,beta,0.3,7, 0,0,0, 1,1e-7,verbose);
1.1 takayama 223: if (cw != NULL) {
1.14 takayama 224: oxprintf("%s",(char *)cw->aux);
1.1 takayama 225: }
1.15 ! takayama 226: return(0);
1.1 takayama 227: }
228: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>