/* $OpenXM: OpenXM/src/hgm/mh/src/code-n-2f1.c,v 1.5 2016/02/13 02:18:59 takayama Exp $ License: LGPL Ref: code-n.c, 2016.01.30, 31. */ #include #include #include #include "sfile.h" #include "mh.h" static void error_code(char *s); #ifdef STANDALONE static void showf(char *s,double *v,int m); static void showf(char *s,double *v,int m); static void showf2(char *s,double *v,int m,int n); #endif extern int MH_M; extern int MH_RANK; extern int MH_Ef_type; extern double *MH_A_pFq; extern double *MH_B_pFq; static int bitcount(int n) {int c; c=0; while (n) { ++c; n &= (n-1); } return(c);} #define join(k,jj) ( (1 << k) | jj) #define delete(k,jj) ( (~(1 << k)) & jj) #define member(k,ii) ( (1 << k) & ii) #define NaN 9.999e100 #define idxM(i,j) ((i)*MH_M+j) #define idxRank(i,j) ((i)*MH_RANK+j) void mh_rf_ef_type_2(double x, double *f, int rank_not_used, double *val, int n_not_used) { extern double *MH_Beta; /* beta = (1/2)*\simga^(-1) */ extern double *MH_Ng; /* freedom */ extern int MH_Mg; /* number of variables, MH_Mg=MH_M */ static int initialized = 0; extern int MH_deallocate; /* static double b[MH_M]; */ static double *b; static double bsum = 0; static int m; /* static int bitSize[MH_RANK]; static int invbitSize[MH_RANK]; */ static int *bitSize; static int *invbitSize; int i,j,k,p; int ii,jj; /* stands for I and J */ double rijj; double dd; static double *pp=NULL; /* p(x_i) */ static double *qq=NULL; /* q(x_i,x_k) */ static double *qq2=NULL; /* q_2(x_i,x_k) */ static double *rr=NULL; /* r(x_i) */ static double *qq_pd=NULL; /* dx_k q */ static double *qq2_pd=NULL; /* dx_k q_2 */ /* double f2[MH_M][MH_RANK];*/ static double *f2=NULL; static double *y=NULL; static double aaa=NaN; static double bbb,ccc; static double *b2=NULL; /* b_i/(x+b_i)^2 */ mh_check_intr(100); if (MH_deallocate && initialized) { if (b) mh_free(b); if (bitSize) mh_free(bitSize); if (invbitSize) mh_free(invbitSize); if (f2) mh_free(f2); if (pp) mh_free(pp); if (qq) mh_free(qq); if (qq2) mh_free(qq2); if (rr) mh_free(rr); if (qq_pd) mh_free(qq_pd); if (qq2_pd) mh_free(qq2_pd); if (b2) mh_free(b2); if (y) mh_free(y); b = f2 = y = NULL; pp = qq = qq2 = rr = qq_pd = qq2_pd = NULL; bitSize = invbitSize = NULL; initialized = 0; return; } if (!initialized) { b = (double *)mh_malloc(sizeof(double)*MH_M); bitSize = (int *)mh_malloc(sizeof(int)*MH_RANK); invbitSize = (int *)mh_malloc(sizeof(int)*MH_RANK); y = (double *)mh_malloc(sizeof(double)*MH_RANK); f2 = (double *)mh_malloc(sizeof(double)*MH_M*MH_RANK); pp = (double *)mh_malloc(sizeof(double)*MH_M); qq = (double *)mh_malloc(sizeof(double)*MH_M*MH_M); qq2 = (double *)mh_malloc(sizeof(double)*MH_M*MH_M); rr = (double *)mh_malloc(sizeof(double)*MH_M); qq_pd = (double *)mh_malloc(sizeof(double)*MH_M*MH_M); qq2_pd = (double *)mh_malloc(sizeof(double)*MH_M*MH_M); b2 = (double *)mh_malloc(sizeof(double)*MH_M); m = MH_Mg; if (m != MH_M) error_code("MH_M != m. MH_M is given by -DMH_M..."); aaa = MH_A_pFq[0]; bbb = MH_A_pFq[1]; ccc = MH_B_pFq[0]; if(MH_Beta != NULL) for (i=0;i