Annotation of OpenXM/src/hgm/mh/src/code-n.c, Revision 1.1
1.1 ! takayama 1: /*
! 2: License: LGPL
! 3: cf. @s/2011/12/01-my-note-code-n.pdf
! 4: */
! 5: #include <stdio.h>
! 6: #include <stdlib.h>
! 7: #include <math.h>
! 8:
! 9: extern int MH_M;
! 10: extern int MH_RANK;
! 11:
! 12: int bitcount(int n) {int c; c=0; while (n) { ++c; n &= (n-1); } return(c);}
! 13: #define join(k,jj) ( (1 << k) | jj)
! 14: #define delete(k,jj) ( (~(1 << k)) & jj)
! 15: #define member(k,ii) ( (1 << k) & ii)
! 16: #define NaN 9.999e100
! 17:
! 18: #define idxM(i,j) ((i)*MH_M+j)
! 19: #define idxRank(i,j) ((i)*MH_RANK+j)
! 20:
! 21: /*
! 22: p(x) = exp(-bsum*x)*x^(MH_M*(c-a))
! 23: f is p(x)*pd{J}F
! 24: */
! 25: void rf(double x, double *f, int rank_not_used, double *val, int n_not_used)
! 26: { extern double *MH_Beta; /* beta = (1/2)*\simga^(-1) */
! 27: extern double *Ng; /* freedom */
! 28: extern int MH_Mg; /* number of variables, MH_Mg=MH_M */
! 29: static int initialized = 0;
! 30: /* static double b[MH_M]; */
! 31: static double *b;
! 32: static double bsum = 0;
! 33: static double a;
! 34: static double c;
! 35: static int m;
! 36: /*
! 37: static int bitSize[MH_RANK];
! 38: static int invbitSize[MH_RANK];
! 39: */
! 40: static int *bitSize;
! 41: static int *invbitSize;
! 42: int i,j,k,p;
! 43: int ii,jj; /* stands for I and J */
! 44: double rijj;
! 45: /*
! 46: double yik[MH_M][MH_M];
! 47: double yik2[MH_M][MH_M];
! 48: double y[MH_M];
! 49: */
! 50: static double *yik=NULL;
! 51: static double *yik2=NULL;
! 52: static double *y=NULL;
! 53: /* double f2[MH_M][MH_RANK];*/
! 54: static double *f2=NULL;
! 55:
! 56: if (!initialized) {
! 57: b = (double *)mymalloc(sizeof(double)*MH_M);
! 58: bitSize = (int *)mymalloc(sizeof(int)*MH_RANK);
! 59: invbitSize = (int *)mymalloc(sizeof(int)*MH_RANK);
! 60:
! 61: f2 = (double *)mymalloc(sizeof(double)*MH_M*MH_RANK);
! 62: yik = (double *)mymalloc(sizeof(double)*MH_M*MH_M);
! 63: yik2 = (double *)mymalloc(sizeof(double)*MH_M*MH_M);
! 64: y = (double *)mymalloc(sizeof(double)*MH_M);
! 65:
! 66: m = MH_Mg;
! 67: if (m != MH_M) error_code("MH_M != m. MH_M is given by -DMH_M...");
! 68: a = ((double)m+1.0)/2.0;
! 69:
! 70: if(MH_Beta != NULL) for (i=0;i<MH_M;i++) b[i]=MH_Beta[i];
! 71: else error_code("MH_Beta is null.");
! 72: if (Ng != NULL) c=a+*(Ng)/2; /* set c, a+n/2, n is given by the option n */
! 73: else error_code("Ng is null.");
! 74:
! 75: bsum = 0; for (i=0; i<m; i++) bsum += b[i];
! 76:
! 77: for (i=0; i<MH_RANK; i++) bitSize[i] = bitcount(i);
! 78: for (i=0, k=0; i<=MH_M; i++) {
! 79: for (j=0; j<MH_RANK; j++) {
! 80: if (bitSize[j] == i) {invbitSize[k] = j; k++; }
! 81: }
! 82: }
! 83: initialized = 1;
! 84: }
! 85: for (i=0; i<MH_M; i++) {
! 86: y[i] = b[i]*x;
! 87: }
! 88: for (i=0; i<MH_M; i++) {
! 89: for (k=0; k<MH_M; k++) {
! 90: if (i != k) {
! 91: yik[idxM(i,k)] = y[k]/(y[i]-y[k]);
! 92: yik2[idxM(i,k)] = y[i]/((y[i]-y[k])*(y[i]-y[k]));
! 93: }
! 94: }
! 95: }
! 96:
! 97: /*
! 98: generation of f2[i][jj] = p(x) pd{i}^2 \pd{J} F
! 99: Do not forget to devide by y[i]
! 100: */
! 101: for (i=0; i<MH_M; i++) for (j=0; j<MH_RANK; j++) f2[idxRank(i,j)] = NaN;
! 102: for (i=0; i<MH_M; i++) {
! 103: f2[idxRank(i,0)] = -((c-y[i])*f[join(i,0)]-a*f[0]);
! 104: for (k=0; k<MH_M; k++) {
! 105: if (i!=k) {
! 106: f2[idxRank(i,0)] += -0.5*yik[idxM(i,k)]*(f[join(i,0)]-f[join(k,0)]);
! 107: }
! 108: }
! 109: f2[idxRank(i,0)] = f2[idxRank(i,0)]/y[i];
! 110: }
! 111: for (p=1; p<MH_RANK; p++) {
! 112: jj = invbitSize[p];
! 113: for (i=0; i<MH_M; i++) {
! 114: if (member(i,jj)) continue;
! 115: ii = join(i,jj);
! 116: rijj = -( (c-y[i])*f[ii]-a*f[jj] );
! 117: for (k=0; k<MH_M; k++) {
! 118: if (!member(k,ii)) rijj += -(0.5)*yik[idxM(i,k)]*(f[ii]-f[join(k,jj)]);
! 119: if (member(k,jj)) {
! 120: rijj += -(0.5)*yik[idxM(i,k)]*f[ii];
! 121: rijj += -(0.5)*yik2[idxM(i,k)]*(f[join(i,delete(k,jj))]-f[jj]);
! 122: }
! 123: }
! 124: f2[idxRank(i,jj)] = rijj;
! 125: for (k = 0; k<MH_M; k++) {
! 126: if (member(k,jj)) {
! 127: f2[idxRank(i,jj)] += (0.5)*yik[idxM(i,k)]*f2[idxRank(k,delete(k,jj))];
! 128: }
! 129: }
! 130: f2[idxRank(i,jj)] = f2[idxRank(i,jj)]/y[i];
! 131: }
! 132: }
! 133: /** showf2("f2",f2,MH_M,MH_RANK); exit(0); */
! 134:
! 135: for (jj=0; jj<MH_RANK; jj++) {
! 136: val[jj] = 0;
! 137: for (i=0; i<MH_M; i++) {
! 138: if (member(i,jj)) {
! 139: val[jj] += b[i]*f2[idxRank(i,delete(i,jj))];
! 140: }else{
! 141: val[jj] += b[i]*f[join(i,jj)];
! 142: }
! 143: }
! 144: }
! 145:
! 146: /* diagonal shift. check MH_M.*/
! 147: for (i=0; i<MH_RANK; i++) {
! 148: val[i] += (-bsum+MH_M*(c-a)/x)*f[i];
! 149: }
! 150: }
! 151:
! 152: error_code(char *s) {
! 153: fprintf(stderr,"%s",s);
! 154: exit(10);
! 155: }
! 156:
! 157: /* for debug */
! 158: showf(char *s,double *v,int m) {
! 159: int i;
! 160: printf("%s=\n",s);
! 161: for (i=0; i<m; i++) {
! 162: printf("%e, ",v[i]);
! 163: }
! 164: printf("\n");
! 165: }
! 166:
! 167: showd(char *s,int *v,int m) {
! 168: int i;
! 169: printf("%s=\n",s);
! 170: for (i=0; i<m; i++) {
! 171: printf("%5d, ",v[i]);
! 172: }
! 173: printf("\n");
! 174: }
! 175:
! 176: showf2(char *s,double *v,int m,int n) {
! 177: int i,j;
! 178: printf("%s=\n",s);
! 179: for (i=0; i<m; i++) {
! 180: for (j=0; j<n; j++) {
! 181: printf("%e, ",v[i*n+j]);
! 182: }
! 183: printf("\n");
! 184: }
! 185: printf("\n");
! 186: printf("member(0,0)=%d, member(0,1)=%d, member(0,2)=%d,member(0,3)=%d\n",
! 187: member(0,0),member(0,1),member(0,2),member(0,3));
! 188: }
! 189:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>