[BACK]Return to jack-n.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / hgm / mh / src

Annotation of OpenXM/src/hgm/mh/src/jack-n.c, Revision 1.12

1.1       takayama    1: #include <stdio.h>
                      2: #include <stdlib.h>
                      3: #define _ISOC99_SOURCE
                      4: #include <math.h>
                      5: #include <string.h>
                      6: #include "sfile.h"
                      7: /*
1.12    ! takayama    8:   $OpenXM: OpenXM/src/hgm/mh/src/jack-n.c,v 1.11 2013/03/05 05:26:07 takayama Exp $
        !             9:   Ref: copied from this11/misc-2011/A1/wishart/Prog
        !            10:   jack-n.c, translated from mh.rr or tk_jack.rr in the asir-contrib. License: LGPL
        !            11:   Koev-Edelman for higher order derivatives.
        !            12:   cf. 20-my-note-mh-jack-n.pdf,  /Movies/oxvh/priv-j1/2011-12-14-ke-mh-jack.mov
        !            13:   Todo:
        !            14:   1. Cash the transposes of partitions.
        !            15:   2. Use the recurrence to obtain beta().
        !            16:   3. Easier input data file format for mh-n.c
        !            17:   Changelog:
        !            18:   2012.02.21, porting to OpenXM/src/hgm
        !            19:   2011.12.22, --table option, which is experimental.
        !            20:   2011.12.19, bug fix.  jjk() should return double. It can become more than max int.
        !            21:   2011.12.15, mh.r --> jack-n.c
1.1       takayama   22: */
                     23:
1.3       takayama   24: /****** from mh-n.c *****/
                     25: static int JK_byFile=1;
1.6       takayama   26: static int JK_deallocate=0;
1.3       takayama   27: #define M_n_default 3
1.4       takayama   28: #define Sample_default 1
1.3       takayama   29: static int M_n=0;
1.1       takayama   30: /* global variables. They are set in setParam() */
1.2       takayama   31: static int Mg;  /* n */
                     32: static int Mapprox; /* m, approximation degree */
                     33: static double *Beta; /* beta[0], ..., beta[m-1] */
                     34: static double *Ng;   /* freedom n.  c=(m+1)/2+n/2; Note that it is a pointer */
                     35: static double X0g;   /* initial point */
                     36: static double *Iv;   /* Initial values of mhg sorted by mhbase() in rd.rr at beta*x0 */
                     37: static double Ef;   /* exponential factor at beta*x0 */
                     38: static double Hg;   /* step size of rk defined in rk.c */
                     39: static int Dp;      /* Data sampling period */
                     40: static double Xng=0.0;   /* the last point */
1.4       takayama   41: static int Sample = Sample_default;
1.1       takayama   42:
                     43: /* for sample inputs */
1.2       takayama   44: static double *Iv2;
                     45: static double Ef2;
1.1       takayama   46:
                     47: #ifdef NAN
                     48: #else
1.2       takayama   49: #define NAN  3.40282e+38  /* for old 32 bit machines. Todo, configure */
1.1       takayama   50: #endif
                     51:
                     52: /* #define M_n  3  defined in the Makefile */ /* number of variables */
                     53: #define M_n0 3 /* used for tests. Must be equal to M_n */
                     54: #define M_m_MAX 200
1.3       takayama   55: #define M_nmx  M_m_MAX  /* maximal of M_n */
1.1       takayama   56: #define A_LEN  1 /* (a_1) , (a_1, ..., a_p)*/
                     57: #define B_LEN  1 /* (b_1) */
1.9       takayama   58: static int Debug = 0;
1.5       takayama   59: static int Alpha = 2;  /* 2 implies the zonal polynomial */
1.2       takayama   60: static int *Darray = NULL;
                     61: static int **Parray = NULL; /* array of partitions of size M_n */
                     62: static int *ParraySize = NULL; /* length of each partitions */
1.3       takayama   63: static int M_kap[M_nmx];
1.2       takayama   64: static int M_m=M_m_MAX-2;   /* | | <= M_m, bug do check of M_m <=M_m_MAX-2 */
1.1       takayama   65: void (*M_pExec)(void);
1.3       takayama   66: static int HS_mu[M_nmx];
                     67: static int HS_n=M_nmx;      /* It is initialized to M_n in jk_main */
1.1       takayama   68: void (*HS_hsExec)(void);
1.3       takayama   69: static double M_x[M_nmx];
1.1       takayama   70:
                     71: /* They are used in pmn */
1.2       takayama   72: static int *P_pki=NULL;
                     73: static int P_pmn=0;
1.1       takayama   74:
                     75: /* It is used genDarray2(), list partitions... */
1.2       takayama   76: static int DR_parray=0;
1.1       takayama   77:
                     78: /* Used in genBeta() and enumeration of horizontal strip. */
1.2       takayama   79: static double *M_beta_0=NULL;  /* M_beta[0][*] value of beta_{kappa,mu}, M_beta[1][*] N_mu */
                     80: static int *M_beta_1=NULL;
                     81: static int M_beta_pt=0;
1.3       takayama   82: static int M_beta_kap[M_nmx];
1.2       takayama   83: static int UseTable = 0;
                     84:
                     85: static double **M_jack;
                     86: static int M_df=1; /* Compute differentials? */
                     87: static int M_2n=0; /* 2^N */
1.1       takayama   88:
1.3       takayama   89: static double Xarray[M_nmx][M_m_MAX];
1.1       takayama   90: /* (x_1, ..., x_n) */
                     91: /* Xarray[i][0]  x_{i+1}^0, Xarray[i][1], x_{i+1}^1, ... */
                     92:
1.2       takayama   93: static double *M_qk=NULL;  /* saves pochhammerb */
                     94: static double M_rel_error=0.0; /* relative errors */
1.1       takayama   95:
1.2       takayama   96: /* prototypes */
                     97: static void *mymalloc(int size);
1.10      takayama   98: static int myfree(void *p);
                     99: static int myerror(char *s);
1.2       takayama  100: static double jack1(int K);
                    101: static double jack1diff(int k);
                    102: static double xval(int i,int p); /* x_i^p */
                    103: static int mysum(int L[]);
                    104: static int plength(int P[]);
                    105: static int plength_t(int P[]);
1.3       takayama  106: static void ptrans(int P[M_nmx],int Pt[]);
1.10      takayama  107: static int test_ptrans();
1.2       takayama  108: static int huk(int K[],int I,int J);
                    109: static int hdk(int K[],int I,int J);
                    110: static double jjk(int K[]);
                    111: static double ppoch(double A,int K[]);
                    112: static double ppoch2(double A,double B,int K[]);
                    113: static double mypower(double x,int n);
                    114: static double qk(int K[],double A[A_LEN],double B[B_LEN]);
                    115: static int bb(int N[],int K[],int M[],int I,int J);
                    116: static double beta(int K[],int M[]);
1.10      takayama  117: static int printp(int kappa[]);
                    118: static int printp2(int kappa[]);
                    119: static int test_beta();
1.2       takayama  120: static double q3_10(int K[],int M[],int SK);
                    121: static double q3_5(double A[],double B[],int K[],int I);
                    122: static void mtest4();
                    123: static void mtest4b();
                    124: static int nk(int KK[]);
                    125: static int plength2(int P1[],int P2[]);
                    126: static int myeq(int P1[],int P2[]);
                    127: static int pListPartition(int M,int N);
                    128: static int pListPartition2(int Less,int From,int To, int M);
                    129: static void pExec_0();
                    130: static int pListHS(int Kap[],int N);
                    131: static int pListHS2(int From,int To,int Kap[]);
                    132: static void hsExec_0();
                    133: static int pmn(int M,int N);
                    134: static int *cloneP(int a[]);
1.10      takayama  135: static int copyP(int p[],int a[]);
1.2       takayama  136: static void pExec_darray(void);
1.10      takayama  137: static int genDarray2(int M,int N);
                    138: static int isHStrip(int Kap[],int Nu[]);
1.2       takayama  139: static void hsExec_beta(void);
1.10      takayama  140: static int genBeta(int Kap[]);
                    141: static int checkBeta1();
1.2       takayama  142: static int psublen(int Kap[],int Mu[]);
1.10      takayama  143: static int genJack(int M,int N);
                    144: static int checkJack1(int M,int N);
                    145: static int checkJack2(int M,int N);
                    146: static int mtest1b();
1.2       takayama  147:
                    148: static int imypower(int x,int n);
1.10      takayama  149: static int usage();
                    150: static int setParamDefault();
                    151: static int next(struct SFILE *fp,char *s,char *msg);
1.2       takayama  152: static int gopen_file(void);
                    153: static int setParam(char *fname);
1.8       takayama  154: static int showParam(struct SFILE *fp,int fd);
1.2       takayama  155: static double iv_factor(void);
                    156: static double gammam(double a,int n);
                    157: static double mypower(double a,int n);
                    158:
                    159: double mh_t(double A[A_LEN],double B[B_LEN],int N,int M);
                    160: double mh_t2(int J);
1.3       takayama  161: struct MH_RESULT *jk_main(int argc,char *argv[]);
                    162: int jk_freeWorkArea();
                    163: int jk_initializeWorkArea();
                    164:
                    165: int jk_freeWorkArea() {
                    166:   /* bug, p in the cloneP will not be deallocated.
1.12    ! takayama  167:      Nk in genDarray2 will not be deallocated.
        !           168:   */
1.3       takayama  169:   int i;
1.6       takayama  170:   JK_deallocate=1;
1.3       takayama  171:   if (Darray) {myfree(Darray); Darray=NULL;}
                    172:   if (Parray) {myfree(Parray); Parray=NULL;}
                    173:   if (ParraySize) {myfree(ParraySize); ParraySize=NULL;}
                    174:   if (M_beta_0) {myfree(M_beta_0); M_beta_0=NULL;}
                    175:   if (M_beta_1) {myfree(M_beta_1); M_beta_1=NULL;}
                    176:   if (M_jack) {
1.12    ! takayama  177:     for (i=0; M_jack[i] != NULL; i++) {
        !           178:       if (Debug) printf("Free M_jack[%d]\n",i);
        !           179:       myfree(M_jack[i]); M_jack[i] = NULL;
        !           180:     }
        !           181:     myfree(M_jack); M_jack=NULL;
1.3       takayama  182:   }
                    183:   if (M_qk) {myfree(M_qk); M_qk=NULL;}
                    184:   if (P_pki) {myfree(P_pki); P_pki=NULL;}
1.6       takayama  185:   JK_deallocate=0;
1.3       takayama  186: }
                    187: int jk_initializeWorkArea() {
                    188:   int i,j;
1.6       takayama  189:   JK_deallocate=1;
                    190:   xval(0,0);
                    191:   JK_deallocate=0;
1.3       takayama  192:   Darray=NULL;
                    193:   Parray=NULL;
                    194:   ParraySize=NULL;
                    195:   M_beta_0=NULL;
                    196:   M_beta_1=NULL;
                    197:   M_jack=NULL;
                    198:   M_qk=NULL;
                    199:   for (i=0; i<M_nmx; i++) M_kap[i]=HS_mu[i]=0;
                    200:   for (i=0; i<M_nmx; i++) M_x[i]=0;
                    201:   for (i=0; i<M_nmx; i++) for (j=0; j<M_m_MAX; j++) Xarray[i][j]=0;
1.5       takayama  202:   for (i=0; i<M_nmx; i++) M_beta_kap[i]=0;
1.3       takayama  203:   M_m=M_m_MAX-2;
                    204:   Alpha = 2;
                    205:   HS_n=M_nmx;
                    206:   P_pki=NULL;
                    207:   P_pmn=0;
                    208:   DR_parray=0;
                    209:   M_beta_pt=0;
                    210:   M_df=1;
                    211:   M_2n=0;
                    212:   M_rel_error=0.0;
1.4       takayama  213:   Sample = Sample_default;
1.5       takayama  214:   Xng=0.0;
                    215:   M_n=0;
1.3       takayama  216: }
1.2       takayama  217:
                    218: static void *mymalloc(int size) {
1.1       takayama  219:   void *p;
                    220:   if (Debug) printf("mymalloc(%d)\n",size);
1.8       takayama  221:   p = (void *)mh_malloc(size);
1.1       takayama  222:   if (p == NULL) {
                    223:     fprintf(stderr,"No more memory.\n");
1.3       takayama  224:     mh_exit(-1);
1.1       takayama  225:   }
                    226:   return(p);
                    227: }
1.10      takayama  228: static int myfree(void *p) {
1.8       takayama  229:   if (Debug) printf("myFree at %p\n",p);
                    230:   mh_free(p);
1.7       takayama  231: }
1.10      takayama  232: static int myerror(char *s) { fprintf(stderr,"%s: type in control-C\n",s); getchar(); getchar();}
1.1       takayama  233:
1.2       takayama  234: static double jack1(int K) {
1.1       takayama  235:   double F;
                    236:   extern int Alpha;
                    237:   int I,J,L,II,JJ,N;
                    238:   N = 1;
                    239:   if (K == 0) return((double)1);
                    240:   F = xval(1,K);
                    241:   for (J=0; J<K; J++) {
                    242:     II = 1; JJ = J+1;
                    243:     F *= (N-(II-1)+Alpha*(JJ-1));
                    244:   }
                    245:   return(F);
                    246: }
1.2       takayama  247: static double jack1diff(int K) {
1.1       takayama  248:   double F;
                    249:   extern int Alpha;
                    250:   int I,J,S,L,II,JJ,N;
                    251:   N = 1;
                    252:   if (K == 0) return((double)1);
                    253:   F = K*xval(1,K-1);
                    254:   for (J=0; J<K; J++) {
                    255:     II = 1; JJ = J+1;
                    256:     F *= (N-(II-1)+Alpha*(JJ-1));
                    257:   }
                    258:   return(F);
                    259: }
                    260:
1.2       takayama  261: static double xval(int ii,int p) { /* x_i^p */
1.1       takayama  262:   extern double M_x[];
                    263:   double F;
                    264:   int i,j;
1.10      takayama  265:   static int init=0;
1.6       takayama  266:   if (JK_deallocate) { init=0; return(0.0);}
1.1       takayama  267:   if (!init) {
                    268:     for (i=1; i<=M_n; i++) {
                    269:       for (j=0; j<M_m_MAX; j++) {
1.12    ! takayama  270:         if (j != 0) {
        !           271:           Xarray[i-1][j] = M_x[i-1]*Xarray[i-1][j-1];
        !           272:         }else{
        !           273:           Xarray[i-1][0] = 1;
        !           274:         }
1.1       takayama  275:       }
                    276:     }
                    277:     init = 1;
                    278:   }
                    279:   if (ii < 1) myerror("xval, index out of bound.");
                    280:   if (p > M_m_MAX-2) myerror("xval, p is too large.");
                    281:   if (p < 0) {
                    282:     myerror("xval, p is negative.");
                    283:     printf("ii=%d, p=%d\n",ii,p);
1.3       takayama  284:     mh_exit(-1);
1.1       takayama  285:   }
                    286:   return(Xarray[ii-1][p]);
                    287: }
                    288:
1.2       takayama  289: static int mysum(int L[]) {
1.1       takayama  290:   int S,I,N;
                    291:   N=M_n;
                    292:   S=0;
                    293:   for (I=0; I<N; I++) S += L[I];
                    294:   return(S);
                    295: }
                    296:
                    297: /*
1.12    ! takayama  298:   (3,2,2,0,0) --> 3
1.1       takayama  299: */
1.2       takayama  300: static int plength(int P[]) {
1.1       takayama  301:   int I;
                    302:   for (I=0; I<M_n; I++) {
                    303:     if (P[I] == 0) return(I);
                    304:   }
                    305:   return(M_n);
                    306: }
                    307: /* plength for transpose */
1.2       takayama  308: static int plength_t(int P[]) {
1.1       takayama  309:   int I;
                    310:   for (I=0; I<M_m; I++) {
                    311:     if (P[I] == 0) return(I);
                    312:   }
                    313:   return(M_m);
                    314: }
                    315:
                    316: /*
1.12    ! takayama  317:     ptrans(P)  returns Pt
1.1       takayama  318: */
1.3       takayama  319: static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m] */
1.1       takayama  320:   extern int M_m;
                    321:   int i,j,len;
1.3       takayama  322:   int p[M_nmx];
1.1       takayama  323:   for (i=0; i<M_n; i++) p[i] = P[i];
                    324:   for (i=0; i<M_m+1; i++) Pt[i] = 0;
                    325:   for (i=0; i<M_m; i++) {
                    326:     len=plength(p); Pt[i] = len;
                    327:     if (len == 0) return;
                    328:     for (j=0; j<len; j++) p[j] -= 1;
                    329:   }
                    330: }
                    331:
1.10      takayama  332: static int test_ptrans() {
1.1       takayama  333:   extern int M_m;
                    334:   int p[M_n0]={5,3,2};
                    335:   int pt[10];
                    336:   int i;
                    337:   M_m = 10;
                    338:   ptrans(p,pt);
                    339:   if (Debug) {for (i=0; i<10; i++) printf("%d,",pt[i]);  printf("\n");}
                    340: }
                    341:
                    342:
                    343: /*
                    344:   upper hook length
                    345:   h_kappa^*(K)
                    346: */
1.2       takayama  347: static int huk(int K[],int I,int J) {
1.1       takayama  348:   extern int Alpha;
                    349:   int Kp[M_m_MAX];
                    350:   int A,H;
                    351:   A=Alpha;
                    352:   /*printf("h^k(%a,%a,%a,%a)\n",K,I,J,A);*/
                    353:   ptrans(K,Kp);
                    354:   H=Kp[J-1]-I+A*(K[I-1]-J+1);
                    355:   return(H);
                    356: }
                    357:
                    358: /*
                    359:   lower hook length
                    360:   h^kappa_*(K)
                    361: */
1.2       takayama  362: static int hdk(int K[],int I,int J) {
1.1       takayama  363:   extern int Alpha;
                    364:   int Kp[M_m_MAX];
                    365:   int A,H;
                    366:   A = Alpha;
                    367:   /*printf("h_k(%a,%a,%a,%a)\n",K,I,J,A);*/
                    368:   ptrans(K,Kp);
                    369:   H=Kp[J-1]-I+1+A*(K[I-1]-J);
                    370:   return(H);
                    371: }
                    372: /*
                    373:   j_kappa.  cf. Stanley.
                    374: */
1.2       takayama  375: static double jjk(int K[]) {
1.1       takayama  376:   extern int Alpha;
                    377:   int A,L,I,J;
                    378:   double V;
                    379:   A=Alpha;
                    380:   V=1;
                    381:   L=plength(K);
                    382:   for (I=0; I<L; I++) {
                    383:     for (J=0; J<K[I]; J++) {
                    384:       V *= huk(K,I+1,J+1)*hdk(K,I+1,J+1);
                    385:     }
                    386:   }
                    387:   if (Debug) {printp(K); printf("<--K, jjk=%lg\n",V);}
                    388:   return(V);
                    389: }
                    390: /*
                    391:   (a)_kappa^\alpha, Pochhammer symbol
                    392:   Note that  ppoch(a,[n]) = (a)_n, Alpha=2
                    393: */
1.2       takayama  394: static double ppoch(double A,int K[]) {
1.1       takayama  395:   extern int Alpha;
                    396:   double V;
                    397:   int L,I,J,II,JJ;
                    398:   V = 1;
                    399:   L=plength(K);
                    400:   for (I=0; I<L; I++) {
                    401:     for (J=0; J<K[I]; J++) {
                    402:       II = I+1; JJ = J+1;
                    403:       V *= (A-((double)(II-1))/((double)Alpha)+JJ-1);
                    404:     }
                    405:   }
                    406:   return(V);
                    407: }
1.2       takayama  408: static double ppoch2(double A,double B,int K[]) {
1.1       takayama  409:   extern int Alpha;
                    410:   double V;
                    411:   int L,I,J,II,JJ;
                    412:   V = 1;
                    413:   L=plength(K);
                    414:   for (I=0; I<L; I++) {
                    415:     for (J=0; J<K[I]; J++) {
                    416:       II = I+1; JJ = J+1;
                    417:       V *= (A-((double)(II-1))/((double)Alpha)+JJ-1);
                    418:       V /= (B-((double)(II-1))/((double)Alpha)+JJ-1);
                    419:     }
                    420:   }
                    421:   return(V);
                    422: }
1.2       takayama  423: static double mypower(double x,int n) {
1.1       takayama  424:   int i;
                    425:   double v;
                    426:   if (n < 0) return(1/mypower(x,-n));
                    427:   v = 1;
                    428:   for (i=0; i<n; i++) v *= x;
                    429:   return(v);
                    430: }
                    431: /* Q_kappa
1.12    ! takayama  432:  */
1.2       takayama  433: static double qk(int K[],double A[A_LEN],double B[B_LEN]) {
1.1       takayama  434:   extern int Alpha;
                    435:   int P,Q,I;
                    436:   double V;
                    437:   P = A_LEN;
                    438:   Q = B_LEN;
                    439:   V = mypower((double) Alpha,mysum(K))/jjk(K);
1.2       takayama  440:   /* to reduce numerical errors, temporary. */
1.1       takayama  441:   if (P == Q) {
                    442:     for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);
                    443:   }
                    444:   return(V);
                    445:
                    446:   for (I=0; I<P; I++) V = V*ppoch(A[I],K);
                    447:   for (I=0; I<Q; I++) V = V/ppoch(B[I],K);
                    448:   return(V);
                    449: }
                    450:
                    451: /*
1.12    ! takayama  452:   B^nu_{kappa,mu}(i,j)
        !           453:   bb(N,K,M,I,J)
1.1       takayama  454: */
1.2       takayama  455: static int bb(int N[],int K[],int M[],int I,int J) {
1.1       takayama  456:   int Kp[M_m_MAX]; int Mp[M_m_MAX];
                    457:   ptrans(K,Kp);
                    458:   ptrans(M,Mp);
                    459:
                    460:   /*
1.12    ! takayama  461:     printp(K); printf("K<--, "); printp2(Kp); printf("<--Kp\n");
        !           462:     printp(M); printf("M<--, "); printp2(Mp); printf("<--Mp\n");
1.1       takayama  463:   */
                    464:
                    465:   if ((plength_t(Kp) < J) || (plength_t(Mp) < J)) return(hdk(N,I,J));
                    466:   if (Kp[J-1] == Mp[J-1]) return(huk(N,I,J));
                    467:   else return(hdk(N,I,J));
                    468: }
                    469: /*
                    470:   beta_{kappa,mu}
                    471:   beta(K,M)
                    472: */
1.2       takayama  473: static double beta(int K[],int M[]) {
1.1       takayama  474:   double V;
                    475:   int L,I,J,II,JJ;
                    476:   V = 1;
                    477:
                    478:   L=plength(K);
                    479:   for (I=0; I<L; I++) {
                    480:     for (J=0; J<K[I]; J++) {
                    481:       II = I+1; JJ = J+1;
                    482:       V *= (double)bb(K,K,M,II,JJ);
                    483:       /* printf("[%d,%d,%lf]\n",I,J,V); */
                    484:     }
                    485:   }
                    486:
                    487:   L=plength(M);
                    488:   for (I=0; I<L; I++) {
                    489:     for (J=0; J<M[I]; J++) {
                    490:       II = I+1; JJ = J+1;
                    491:       V /= (double)bb(M,K,M,II,JJ);
                    492:       /* printf("[%d,%d,%lf]\n",I,J,V);*/
                    493:     }
                    494:   }
                    495:
                    496:   return(V);
                    497: }
1.10      takayama  498: static int printp(int kappa[]) {
1.1       takayama  499:   int i;
                    500:   printf("(");
                    501:   for (i=0; i<M_n; i++) {
                    502:     if (i <M_n-1) printf("%d,",kappa[i]);
                    503:     else printf("%d)",kappa[i]);
                    504:   }
                    505: }
1.10      takayama  506: static int printp2(int kappa[]) {
1.1       takayama  507:   int i,ell;
                    508:   printf("(");
                    509:   ell = plength_t(kappa);
                    510:   for (i=0; i<ell+1; i++) {
                    511:     if (i <ell+1-1) printf("%d,",kappa[i]);
                    512:     else printf("%d)",kappa[i]);
                    513:   }
                    514: }
                    515:
1.10      takayama  516: static int test_beta() {
1.1       takayama  517:   int kappa[M_n0]={2,1,0};
                    518:   int mu1[M_n0]={1,0,0};
                    519:   int mu2[M_n0]={1,1,0};
                    520:   int mu3[M_n0]={2,0,0};
                    521:   printp(kappa); printf(","); printp(mu3); printf(": beta = %lf\n",beta(kappa,mu3));
                    522:   printp(kappa); printf(","); printp(mu1); printf(": beta = %lf\n",beta(kappa,mu1));
                    523:   printp(kappa); printf(","); printp(mu2); printf(": beta = %lf\n",beta(kappa,mu2));
                    524: }
                    525:
                    526: /* main() { test_beta(); } */
                    527:
                    528:
                    529: /*
1.12    ! takayama  530:   cf. w1m.rr
1.1       takayama  531:   matrix hypergeometric by jack
                    532:   N variables, up to degree M.
                    533: */
                    534: /* todo
1.12    ! takayama  535:    def mhgj(A,B,N,M) {
        !           536:    F = 0;
        !           537:    P = partition_a(N,M);
        !           538:    for (I=0; I<length(P); I++) {
        !           539:    K = P[I];
        !           540:    F += qk(K,A,B)*jack(K,N);
        !           541:    }
        !           542:    return(F);
        !           543:    }
1.1       takayama  544: */
                    545:
                    546:
                    547: /* The quotient of (3.10) of Koev-Edelman K=kappa, M=mu, SK=k */
1.2       takayama  548: static double q3_10(int K[],int M[],int SK) {
1.1       takayama  549:   extern int Alpha;
                    550:   int Mp[M_m_MAX];
1.3       takayama  551:   int ML[M_nmx];
                    552:   int N[M_nmx];
1.1       takayama  553:   int i,R;
                    554:   double T,Q,V,Ur,Vr,Wr;
                    555:   ptrans(M,Mp);
                    556:   for (i=0; i<M_n; i++) {ML[i] = M[i]; N[i] = M[i];}
                    557:   N[SK-1] = N[SK-1]-1;
                    558:
                    559:   T = SK-Alpha*M[SK-1];
                    560:   Q = T+1;
                    561:   V = Alpha;
                    562:   for (R=1; R<=SK; R++) {
                    563:     Ur = Q-R+Alpha*K[R-1];
                    564:     V *= Ur/(Ur+Alpha-1);
                    565:   }
                    566:   for (R=1; R<=SK-1; R++) {
                    567:     Vr = T-R+Alpha*M[R-1];
                    568:     V *= (Vr+Alpha)/Vr;
                    569:   }
                    570:   for (R=1; R<=M[SK-1]-1; R++) {
                    571:     Wr = Mp[R-1]-T-Alpha*R;
                    572:     V *= (Wr+Alpha)/Wr;
                    573:   }
                    574:   return(V);
                    575: }
                    576:
1.2       takayama  577: static double q3_5(double A[],double B[],int K[],int I) {
1.1       takayama  578:   extern int Alpha;
                    579:   int Kp[M_m_MAX];
                    580:   double C,D,V,Ej,Fj,Gj,Hj,Lj;
                    581:   int J,P,Q;
                    582:   ptrans(K,Kp);
                    583:   P=A_LEN;; Q = B_LEN;
                    584:   C = -((double)(I-1))/Alpha+K[I-1]-1;
                    585:   D = K[I-1]*Alpha-I;
                    586:
                    587:   V=1;
                    588:
                    589:   for (J=1; J<=P; J++)  {
1.12    ! takayama  590:     V *= (A[J-1]+C);
1.1       takayama  591:   }
                    592:   for (J=1; J<=Q; J++) {
1.12    ! takayama  593:     V /= (B[J-1]+C);
1.1       takayama  594:   }
                    595:
                    596:   for (J=1; J<=K[I-1]-1; J++) {
1.12    ! takayama  597:     Ej = D-J*Alpha+Kp[J-1];
        !           598:     Gj = Ej+1;
        !           599:     V *= (Gj-Alpha)*Ej/(Gj*(Ej+Alpha));
1.1       takayama  600:   }
                    601:   for (J=1; J<=I-1; J++) {
1.12    ! takayama  602:     Fj=K[J-1]*Alpha-J-D;
        !           603:     Hj=Fj+Alpha;
        !           604:     Lj=Hj*Fj;
        !           605:     V *= (Lj-Fj)/(Lj+Hj);
1.1       takayama  606:   }
                    607:   return(V);
                    608: }
                    609:
1.2       takayama  610: static void mtest4() {
1.1       takayama  611:   double A[A_LEN] = {1.5};
                    612:   double B[B_LEN]={6.5};
                    613:   int K[M_n0] = {3,2,0};
                    614:   int I=2;
                    615:   int Ki[M_n0]={3,1,0};
                    616:   double V1,V2;
                    617:   V1=q3_5(A,B,K,I);
                    618:   V2=qk(K,A,B)/qk(Ki,A,B);
                    619:   printf("%lf== %lf?\n",V1,V2);
                    620: }
1.2       takayama  621: static void mtest4b() {
1.1       takayama  622:   int K[M_n0]={3,2,0};
                    623:   int M[M_n0]={2,1,0};
                    624:   int N[M_n0]={2,0};
                    625:   int SK=2;
                    626:   double V1,V2;
                    627:   V1=q3_10(K,M,SK);
                    628:   V2=beta(K,N)/beta(K,M);
                    629:   printf("%lf== %lf?\n",V1,V2);
                    630: }
                    631:
                    632: /* main() { mtest4(); mtest4b(); } */
                    633:
                    634: /* nk in (4.1),
1.12    ! takayama  635:  */
1.2       takayama  636: static int nk(int KK[]) {
1.1       takayama  637:   extern int *Darray;
                    638:   int N,I,Ki;
1.3       takayama  639:   int Kpp[M_nmx];
1.1       takayama  640:   int i;
                    641:   N = plength(KK);
                    642:   if (N == 0) return(0);
                    643:   if (N == 1) return(KK[0]);
                    644:   for (i=0; i<M_n; i++) Kpp[i] = 0;
                    645:   for (I=0; I<N-1; I++) Kpp[I] = KK[I];
                    646:   Ki = KK[N-1];
                    647:   /* K = (Kpp,Ki) */
                    648:   return(Darray[nk(Kpp)]+Ki-1);
                    649: }
1.2       takayama  650: static int plength2(int P1[],int P2[]) {
1.1       takayama  651:   int S1,S2;
                    652:   S1 = plength(P1); S2 = plength(P2);
                    653:   if (S1 > S2) return(1);
                    654:   else if (S1 == S2) {
                    655:     S1=mysum(P1); S2=mysum(P2);
                    656:     if(S1 > S2) return(1);
                    657:     else if (S1 == S2) return(0);
                    658:     else return(-1);
                    659:   }
                    660:   else return(-1);
                    661: }
1.2       takayama  662: static int myeq(int P1[],int P2[]) {
1.1       takayama  663:   int I,L1;
                    664:   if ((L1=plength(P1)) != plength(P2)) return(0);
                    665:   for (I=0; I<L1; I++) {
                    666:     if (P1[I] != P2[I]) return(0);
                    667:   }
                    668:   return(1);
                    669: }
                    670: /*
                    671:   M is a degree, N is a number of variables
                    672:   genDarray(3,3);
                    673:   N(0)=0;
                    674:   N(1)=1;
                    675:   N(2)=2;
                    676:   N(3)=3;
                    677:   N(1,1)=4;  D[1] = 4
                    678:   N(2,1)=5;  D[2] = 5;
                    679:   N(1,1,1)=6; D[4] = 6;
                    680:   still buggy.
                    681: */
                    682:
1.2       takayama  683: static int pListPartition(int M,int N) {
1.1       takayama  684:   extern int M_m;
                    685:   extern int M_kap[];
                    686:   int I;
                    687:   /* initialize */
                    688:   if (M_n != N) {
1.3       takayama  689:     fprintf(stderr,"M_n != N\n"); mh_exit(-1);
1.1       takayama  690:   }
                    691:   M_m = M;
                    692:   /* M_plist = []; */
                    693:   /* end of initialize */
                    694:   (*M_pExec)();  /* exec for 0 */
                    695:   for (I=1; I<=M_n; I++) {
                    696:     pListPartition2(M_m,1,I,M_m);
                    697:   }
                    698:   /* M_plist = reverse(M_plist); */
                    699:   return(1);
                    700: }
                    701:
                    702: /*
                    703:   Enumerate all such that
                    704:   Less >= M_kap[From], ..., M_kap[To],  |(M_kap[From],...,M_kap[To])|<=M,
                    705: */
1.2       takayama  706: static int pListPartition2(int Less,int From,int To, int M) {
1.1       takayama  707:   int I,R;
1.11      takayama  708:   mh_check_intr(100);
1.1       takayama  709:   if (To < From) {
1.12    ! takayama  710:     (*M_pExec)(); return(0);
1.1       takayama  711:   }
                    712:   for (I=1; (I<=Less) && (I<=M) ; I++) {
                    713:     M_kap[From-1] = I;
                    714:     R = pListPartition2(I,From+1,To,M-I);
                    715:   }
                    716:   return(1);
                    717: }
                    718:
                    719: /*
                    720:   partition に対してやる仕事をこちらへ書く.
                    721: */
1.2       takayama  722: static void pExec_0() {
1.1       takayama  723:   if (Debug) {
1.12    ! takayama  724:     printf("M_kap=");
        !           725:     printp(M_kap);
        !           726:     printf("\n");
1.1       takayama  727:   }
                    728: }
                    729:
                    730: /* Test.
1.12    ! takayama  731:    Compare pListPartition(4,3);  genDarray(4,3);
        !           732:    Compare pListPartition(5,3);  genDarray(5,3);
1.1       takayama  733:
                    734: */
                    735:
                    736: /*
1.12    ! takayama  737:   main() {
1.1       takayama  738:   M_pExec = pExec_0;
                    739:   pListPartition(5,3);
1.12    ! takayama  740:   }
1.1       takayama  741: */
                    742:
                    743:
                    744: /*
                    745:   List all horizontal strips.
                    746:   Kap[0] is not a dummy in C code. !(Start from Kap[1].)
                    747: */
1.2       takayama  748: static int pListHS(int Kap[],int N) {
1.1       takayama  749:   extern int HS_n;
                    750:   extern int HS_mu[];
                    751:   int i;
                    752:   HS_n = N;
                    753:   /* Clear HS_mu. Do not forget when N < M_n  */
                    754:   for (i=0; i<M_n; i++) HS_mu[i] = 0;
                    755:   pListHS2(1,N,Kap);
                    756: }
                    757:
1.2       takayama  758: static int pListHS2(int From,int To,int Kap[]) {
1.1       takayama  759:   int More,I;
                    760:   if (To <From) {(*HS_hsExec)(); return(0);}
                    761:   if (From == HS_n) More=0; else More=Kap[From];
                    762:   for (I=Kap[From-1]; I>= More; I--) {
                    763:     HS_mu[From-1] = I;
                    764:     pListHS2(From+1,To,Kap);
                    765:   }
                    766:   return(1);
                    767: }
                    768:
1.2       takayama  769: static void hsExec_0() {
1.1       takayama  770:   int i;
                    771:   if(Debug) {printf("hsExec: "); printp(HS_mu); printf("\n");}
                    772: }
                    773:
                    774: /*
                    775:   pListHS([0,4,2,1],3);
                    776: */
                    777: /*
1.12    ! takayama  778:   main() {
1.1       takayama  779:   int Kap[3]={4,2,1};
                    780:   HS_hsExec = hsExec_0;
                    781:   pListHS(Kap,3);
1.12    ! takayama  782:   }
1.1       takayama  783: */
                    784:
                    785: /* The number of partitions <= M, with N parts.
1.12    ! takayama  786:    (0,0,...,0) is excluded.
1.1       takayama  787: */
                    788: #define aP_pki(i,j) P_pki[(i)*(M+1)+(j)]
1.2       takayama  789: static int pmn(int M,int N) {
1.1       takayama  790:   int Min_m_n,I,K,S,T,i,j;
                    791:   extern int P_pmn;
                    792:   extern int *P_pki;
                    793:   Min_m_n = (M>N?N:M);
                    794:   /* P_pki=newmat(Min_m_n+1,M+1); */
                    795:   P_pki = (int *) mymalloc(sizeof(int)*(Min_m_n+1)*(M+1));
                    796:   for (i=0; i<Min_m_n+1; i++) for (j=0; j<M+1; j++) aP_pki(i,j) = 0;
                    797:   for (I=1; I<=M; I++) aP_pki(1,I) = 1;
                    798:   for (K=1; K<=Min_m_n; K++) aP_pki(K,0) = 0;
                    799:   S = M;
                    800:   for (K=2; K<=Min_m_n; K++) {
                    801:     for (I=1; I<=M; I++) {
                    802:       if (I-K < 0) T=0; else T=aP_pki(K,I-K);
                    803:       aP_pki(K,I) = aP_pki(K-1,I-1)+T;
                    804:       S += aP_pki(K,I);
                    805:     }
                    806:   }
                    807:   P_pmn=S;
                    808:   if (Debug) {
                    809:     printf("P_pmn=%d\n",P_pmn);
                    810:     for (i=0; i<=Min_m_n; i++) {
                    811:       for (j=0; j<=M; j++) printf("%d,",aP_pki(i,j));
                    812:       printf("\n");
                    813:     }
                    814:   }
                    815:   myfree(P_pki); P_pki=NULL;
                    816:   return(S);
                    817: }
                    818:
                    819: /*
1.12    ! takayama  820:   main() {pmn(4,3); printf("P_pmn=%d\n",P_pmn);}
1.1       takayama  821: */
                    822:
1.2       takayama  823: static int *cloneP(int a[]) {
1.1       takayama  824:   int *p;
                    825:   int i;
                    826:   p = (int *) mymalloc(sizeof(int)*M_n);
                    827:   for (i=0; i<M_n; i++) p[i] = a[i];
                    828:   return(p);
                    829: }
1.10      takayama  830: static int copyP(int p[],int a[]) {
1.1       takayama  831:   int i;
                    832:   for (i=0; i<M_n; i++) p[i] = a[i];
                    833: }
                    834:
1.2       takayama  835: static void pExec_darray(void) {
1.1       takayama  836:   extern int DR_parray;
                    837:   extern int M_kap[];
                    838:   extern int **Parray;
                    839:   extern int *ParraySize;
                    840:   int *K;
                    841:   pExec_0();
                    842:   K = cloneP(M_kap);
                    843:   Parray[DR_parray] = K;
                    844:   ParraySize[DR_parray] = mysum(K);
                    845:   DR_parray++;
                    846: }
1.10      takayama  847: static int genDarray2(int M,int N) {
1.1       takayama  848:   extern int *Darray;
                    849:   extern int **Parray;
                    850:   extern int DR_parray;
                    851:   extern int M_m;
                    852:   int Pmn,I,J,Ksize,i;
                    853:   int **L;
                    854:   int *Nk;
                    855:   int *K;
1.3       takayama  856:   int Kone[M_nmx];
1.1       takayama  857:
                    858:   M_m = M;
                    859:   Pmn = pmn(M,N)+1;
                    860:   if (Debug) printf("Degree M = %d, N of vars N = %d, Pmn+1=%d\n",M,N,Pmn);
                    861:   Darray=(int *) mymalloc(sizeof(int)*Pmn);
                    862:   for (i=0; i<Pmn; i++) Darray[i] = 0;
                    863:   Parray=(int **) mymalloc(sizeof(int *)*Pmn);
                    864:   for (i=0; i<Pmn; i++) Parray[i] = NULL;
                    865:   ParraySize=(int *) mymalloc(sizeof(int *)*Pmn);
                    866:   for (i=0; i<Pmn; i++) ParraySize[i] = 0;
                    867:   DR_parray=0;
                    868:   M_pExec = pExec_darray;
                    869:   pListPartition(M,N);  /* pExec_darray() is executed for all partitions */
                    870:   L = Parray;
                    871:
                    872:   Nk = (int *) mymalloc(sizeof(int)*(Pmn+1));
                    873:   for (I=0; I<Pmn; I++) Nk[I] = I;
                    874:   for (I=0; I<Pmn; I++) {
1.11      takayama  875:     mh_check_intr(100);
1.12    ! takayama  876:     K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
        !           877:     Ksize = plength(K);
        !           878:     if (Ksize >= M_n) {
        !           879:       if (Debug) {fprintf(stderr,"Ksize >= M_n\n");}
        !           880:       continue;
        !           881:     }
        !           882:     for (i=0; i<M_n; i++) Kone[i] = 0;
        !           883:     for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;
        !           884:     for (J=0; J<Pmn; J++) {
        !           885:       if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */
        !           886:     }
1.1       takayama  887:   }
                    888:   if (Debug) {
1.12    ! takayama  889:     printf("Darray=\n");
        !           890:     for (i=0; i<Pmn; i++) printf("%d\n",Darray[i]);
        !           891:     printf("-----------\n");
1.1       takayama  892:   }
                    893: }
                    894:
                    895:
                    896: /* main() {  genDarray2(4,3);}  */
                    897:
                    898: /* M_beta_0[*] value of beta_{kappa,mu}, M_beta_1[*] N_mu */
1.10      takayama  899: static int isHStrip(int Kap[],int Nu[]) {
1.1       takayama  900:   int N1,N2,I,P;
                    901:   N1 = plength(Kap); N2 = plength(Nu);
                    902:   if (N2 > N1) return(0);
                    903:   for (I=0; I<N2; I++) {
                    904:     if (I >= N1-1) P = 0; else P=Kap[I+1];
                    905:     if (Kap[I] < Nu[I]) return(0);
                    906:     if (Nu[I]  < P) return(0);
                    907:   }
                    908:   return(1);
                    909: }
                    910:
1.2       takayama  911: static void hsExec_beta(void) {
1.1       takayama  912:   int *Mu;
                    913:   int N,Nmu,Nnu,Done,J,K,OK,I,RR;
                    914:   int Kapt[M_m_MAX];
                    915:   int Nut[M_m_MAX];
1.3       takayama  916:   int Nu[M_nmx];
1.1       takayama  917:   int rrMax;
                    918:   hsExec_0();
                    919:   /* printf("M_beta_pt=%a\n",M_beta_pt); */
                    920:   /* Mu = cdr(vtol(HS_mu)); */
                    921:   Mu = HS_mu; /* buggy? need cloneP */
                    922:   if (M_beta_pt == 0) {
                    923:     M_beta_0[0] = 1; M_beta_1[0] = nk(Mu);
                    924:     M_beta_pt++; return;
                    925:   }
                    926:
                    927:   N = HS_n;
                    928:   Nmu = nk(Mu);
                    929:   M_beta_1[M_beta_pt] = Nmu;
                    930:   ptrans(M_beta_kap,Kapt);
                    931:   /* Mu, Nu is exchanged in this code. cf. the K-E paper  */
                    932:   copyP(Nu,Mu); /* buggy need clone? */
                    933:   for (I=0; I<N; I++) {
                    934:     Nu[I]++;
                    935:     if (!isHStrip(M_beta_kap,Nu)) {Nu[I]--; continue;}
                    936:     Nnu = nk(Nu);
                    937:     ptrans(Nu,Nut);
                    938:     Done=0;
                    939:     for (J=M_beta_pt-1; J>=0; J--) {
                    940:       if (M_beta_1[J] == Nnu) {
1.12    ! takayama  941:         K=I+1;
        !           942:         if (Debug) {
        !           943:           printf("Found at J=%d, K=%d, q3_10(Kap,Nu,K)=%lf,Nu,Mu= \n",
        !           944:                  J,K,q3_10(M_beta_kap,Nu,K));
        !           945:           printp(Nu); printf("\n");
        !           946:           printp(Mu); printf("\n");
        !           947:         }
        !           948:         /* Check other conditions. See Numata's mail on Dec 24, 2011. */
        !           949:         rrMax = Nu[I]-1;
        !           950:         if ((plength_t(Kapt) < rrMax) || (plength_t(Nut) < rrMax)) {
        !           951:           if (Debug) printf(" is not taken (length). \n");
        !           952:           break;
        !           953:         }
        !           954:         OK=1;
        !           955:         for (RR=0; RR<rrMax; RR++) {
        !           956:           if (Kapt[RR] != Nut[RR]) { OK=0; break;}
        !           957:         }
        !           958:         if (!OK) { if (Debug) printf(" is not taken.\n"); break; }
        !           959:         /* check done. */
        !           960:         M_beta_0[M_beta_pt]=M_beta_0[J]*q3_10(M_beta_kap,Nu,K);
        !           961:         Done = 1; break;
1.1       takayama  962:       }
                    963:     }
                    964:     if (Done) break; else Nu[I]--;
                    965:   }
                    966:   if (!Done) {
                    967:     if (Debug) printf("BUG: not found M_beta_pt=%d.\n",M_beta_pt);
                    968:     /* M_beta_0[M_beta_pt] = NAN; /* error("Not found."); */
                    969:     M_beta_0[M_beta_pt] = beta(M_beta_kap,Mu);
                    970:   }
                    971:   /* Fix the bug of mh.rr */
                    972:   M_beta_pt++;
                    973: }
1.10      takayama  974: static int genBeta(int Kap[]) {
1.1       takayama  975:   extern double *M_beta_0;
                    976:   extern int *M_beta_1;
                    977:   extern int M_beta_pt;
                    978:   extern int M_beta_kap[];
                    979:   extern int P_pmn;
                    980:   int I,J,N;
                    981:   if (Debug) {printp(Kap); printf("<-Kappa, P_pmn=%d\n",P_pmn);}
                    982:   /* M_beta = newmat(2,P_pmn+1); */
                    983:   M_beta_0 = (double *)mymalloc(sizeof(double)*(P_pmn+1));
1.8       takayama  984:   M_beta_1 = (int *)mymalloc(sizeof(int)*(P_pmn+1));
1.1       takayama  985:   M_beta_pt = 0;
                    986:   for (I=0; I<=P_pmn; I++) {M_beta_0[I] = NAN; M_beta_1[I] = -1;}
                    987:   N = plength(Kap);
                    988:   HS_hsExec = hsExec_beta;
                    989:   copyP(M_beta_kap,Kap);
                    990:   pListHS(Kap,N);
                    991: }
                    992: /*
                    993:   genDarray2(4,3);
                    994:   genBeta([2,2,0]);
                    995:   genBeta([2,1,1]);
                    996: */
                    997:
1.10      takayama  998: static int checkBeta1() {
1.1       takayama  999:   int Kap[3] = {2,2,0};
                   1000:   int Kap2[3] = {2,1,0};
                   1001:   int I;
                   1002:   int *Mu;
                   1003:   double Beta_km;
                   1004:   genDarray2(4,3);
                   1005:   genBeta(Kap);
                   1006:   for (I=0; I<M_beta_pt; I++) {
                   1007:     Mu = Parray[M_beta_1[I]];
                   1008:     Beta_km = M_beta_0[I];
1.12    ! takayama 1009:     if (Debug) {
        !          1010:       printp(Kap); printf("<--Kap, ");
        !          1011:       printp(Mu); printf("<--Mu,");
        !          1012:       printf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap,Mu));
        !          1013:     }
1.1       takayama 1014:   }
                   1015:   if (Debug) printf("-------------------------------------\n");
                   1016:   genBeta(Kap2);
                   1017:   for (I=0; I<M_beta_pt; I++) {
                   1018:     Mu = Parray[M_beta_1[I]];
                   1019:     Beta_km = M_beta_0[I];
1.12    ! takayama 1020:     if (Debug) {
        !          1021:       printp(Kap2); printf("<--Kap, ");
        !          1022:       printp(Mu); printf("<--Mu,");
        !          1023:       printf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap2,Mu));
        !          1024:     }
1.1       takayama 1025:   }
                   1026: }
                   1027:
                   1028: /*
1.12    ! takayama 1029:   def checkBeta2() {
1.1       takayama 1030:   genDarray2(3,3);
                   1031:   Kap = [2,1,0];
                   1032:   printf("Kap=%a\n",Kap);
                   1033:   genBeta(Kap);
                   1034:   for (I=0; I<M_beta_pt; I++) {
1.12    ! takayama 1035:   Mu = Parray[M_beta[1][I]];
        !          1036:   Beta_km = M_beta[0][I];
        !          1037:   printf("Mu=%a,",Mu);
        !          1038:   printf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));
        !          1039:   }
1.1       takayama 1040:   }
                   1041: */
                   1042:
                   1043: /* main() { checkBeta1(); } */
                   1044:
1.2       takayama 1045: static int psublen(int Kap[],int Mu[]) {
1.1       takayama 1046:   int L1,L2,A,I;
                   1047:   L1 = plength(Kap);
                   1048:   L2 = plength(Mu);
                   1049:   if (L2 > L1) myerror("psub, length mismatches.");
                   1050:   A = 0;
                   1051:   for (I=0; I<L2; I++) {
                   1052:     if (Kap[I] < Mu[I]) myerror("psub, not Kap >= Mu");
                   1053:     A += Kap[I]-Mu[I];
                   1054:   }
                   1055:   for (I=L2; I<L1; I++) A += Kap[I];
                   1056:   return(A);
                   1057: }
                   1058:
                   1059:
                   1060: /* Table of Jack polynomials
1.12    ! takayama 1061:    Jack[1]* one variable.
        !          1062:    Jack[2]* two variables.
1.1       takayama 1063:    ...
1.12    ! takayama 1064:    Jack[M_n]* n variables.
        !          1065:    Jack[P][J]*
        !          1066:    D^J(P variables jack of p variables). Example. J=001 d_1, 010 d_2, 100 d_3
        !          1067:    0<=J<=2^{M_n}-1
        !          1068:    Jack[P][J][nk(Kappa)]  Jack_Kappa, Kappa is a partition.
        !          1069:    0<=nk(Kappa)<=pmn(M_m,M_n)
1.1       takayama 1070: */
                   1071:
                   1072: #define aM_jack(i,j,k) ((M_jack[i])[(j)*(Pmn+1)+(k)])
1.10      takayama 1073: static int genJack(int M,int N) {
1.1       takayama 1074:   extern double **M_jack;
                   1075:   extern int M_2n;
                   1076:   extern int P_pmn;
                   1077:   extern int *M_beta_1;
                   1078:   int Pmn,I,J,K,L,Nv,H,P;
                   1079:   int *Kap,*Mu;
                   1080:   double Jack,Beta_km;
                   1081:   int Nk,JJ;
1.5       takayama 1082:   if (Debug) printf("genJack(%d,%d)\n",M,N);
1.3       takayama 1083:   M_jack = (double **) mymalloc(sizeof(double *)*(N+2));
1.1       takayama 1084:   M_2n = imypower(2,N);
                   1085:   Pmn = pmn(M,N);  /*P_pmn is initializeded.
                   1086:                      Warning. It is reset when pmn is called.*/
                   1087:   for (I=0; I<=N; I++) M_jack[I] = (double *)mymalloc(sizeof(double)*(M_2n*(Pmn+1))); /* newmat(M_2n,Pmn+1); */
1.3       takayama 1088:   M_jack[N+1] = NULL;
1.1       takayama 1089:   genDarray2(M,N); /* Darray, Parray is initialized */
                   1090:   for (I=1; I<=N; I++) aM_jack(I,0,0) = 1;
                   1091:   if (M_df) {
                   1092:     for (I=1; I<=N; I++) {
                   1093:       for (J=1; J<M_2n; J++) aM_jack(I,J,0) = 0;
                   1094:     }
                   1095:   }
                   1096:
1.3       takayama 1097:   /* N must satisfies N > 0 */
1.1       takayama 1098:   for (K=1; K<=M; K++) {
                   1099:     aM_jack(1,0,K) = jack1(K);
                   1100:     if (M_df) {
                   1101:       aM_jack(1,1,K) = jack1diff(K); /* diff(jack([K],1),x_1); */
                   1102:       for (J=2; J<M_2n; J++) aM_jack(1,J,K) = 0;
                   1103:     }
                   1104:   }
                   1105:   for (I=1; I<=N; I++) {
                   1106:     for (K=M+1; K<Pmn+1; K++) {
                   1107:       aM_jack(I,0,K) = NAN;
                   1108:       if (M_df) {
                   1109:         for (J=1; J<M_2n; J++) {
                   1110:           if (J >= 2^I) aM_jack(I,J,K) = 0;
1.12    ! takayama 1111:           else aM_jack(I,J,K) = NAN;
1.1       takayama 1112:         }
                   1113:       }
                   1114:     }
                   1115:   }
                   1116:
                   1117:   /* Start to evaluate the entries of the table */
                   1118:   for (K=1; K<=Pmn; K++) {
                   1119:     Kap = Parray[K]; /* bug. need copy? */
                   1120:     L = plength(Kap);
                   1121:     for (I=1; I<=L-1; I++) {
                   1122:       aM_jack(I,0,K) = 0;
                   1123:       if (M_df) {
                   1124:         for (J=1; J<M_2n; J++) aM_jack(I,J,K) = 0;
                   1125:       }
                   1126:     }
                   1127:     if (Debug) {printf("Kappa="); printp(Kap);}
                   1128:     /* Enumerate horizontal strip of Kappa */
                   1129:     genBeta(Kap);  /* M_beta_pt stores the number of hs */
                   1130:     /* Nv is the number of variables */
                   1131:     for (Nv = (L==1?2:L); Nv <= N; Nv++) {
                   1132:       Jack = 0;
                   1133:       for (H=0; H<M_beta_pt; H++) {
                   1134:         Nk = M_beta_1[H];
                   1135:         Mu = Parray[Nk];
1.12    ! takayama 1136:         if (UseTable) {
        !          1137:           Beta_km = M_beta_0[H];
        !          1138:         }else{
        !          1139:           Beta_km = beta(Kap,Mu);
        !          1140:           /* do not use the M_beta table. It's buggy. UseTable is experimental.*/
        !          1141:         }
1.1       takayama 1142:         if (Debug) {printf("Nv(number of variables)=%d, Beta_km=%lf, Mu=",Nv,Beta_km);
1.12    ! takayama 1143:           printp(Mu); printf("\n");}
1.1       takayama 1144:         P = psublen(Kap,Mu);
                   1145:         Jack += aM_jack(Nv-1,0,Nk)*Beta_km*xval(Nv,P); /* util_v(x,[Nv])^P;*/
1.12    ! takayama 1146:         if (Debug) printf("xval(%d,%d)=%lf\n",Nv,P,xval(Nv,P));
1.1       takayama 1147:       }
                   1148:       aM_jack(Nv,0,K) = Jack;
                   1149:       if (M_df) {
                   1150:         /* The case of M_df > 0. */
                   1151:         for (J=1; J<M_2n; J++) {
1.12    ! takayama 1152:           mh_check_intr(100);
        !          1153:           Jack = 0;
        !          1154:           for (H=0; H<M_beta_pt; H++) {
        !          1155:             Nk = M_beta_1[H];
        !          1156:             Mu = Parray[Nk];
        !          1157:             if (UseTable) {
        !          1158:               Beta_km = M_beta_0[H];
        !          1159:             }else{
        !          1160:               Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */
        !          1161:             }
        !          1162:             if (Debug) {printf("M_df: Nv(number of variables)=%d, Beta_km=%lf, Mu= ",Nv,Beta_km);
        !          1163:               printp(Mu); printf("\n"); }
        !          1164:             P = psublen(Kap,Mu);
        !          1165:             if (J & (1 << (Nv-1))) {
        !          1166:               JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */
        !          1167:               if (P != 0) {
        !          1168:                 Jack += aM_jack(Nv-1,JJ,Nk)*Beta_km*P*xval(Nv,P-1);
        !          1169:               }
        !          1170:             }else{
        !          1171:               Jack += aM_jack(Nv-1,J,Nk)*Beta_km*xval(Nv,P);
        !          1172:             }
        !          1173:           }
        !          1174:           aM_jack(Nv,J,K) = Jack;
        !          1175:           if (Debug) printf("aM_jack(%d,%d,%d) = %lf\n",Nv,J,K,Jack);
1.1       takayama 1176:         } /* end of J loop */
                   1177:       }
                   1178:     }
                   1179:   }
                   1180: }
                   1181:
                   1182:
                   1183: /* checkJack1(3,3)
1.12    ! takayama 1184:  */
1.10      takayama 1185: static int checkJack1(int M,int N) {
1.1       takayama 1186:   int I,K;
                   1187:   extern int P_pmn;
                   1188:   extern double M_x[];
                   1189:   int Pmn; /* used in aM_jack */
                   1190:   /* initialize x vars. */
                   1191:   for (I=1; I<=N; I++) {
                   1192:     M_x[I-1] = ((double)I)/10.0;
                   1193:   }
                   1194:   genJack(M,N);
                   1195:   Pmn = P_pmn;
                   1196:   for (I=1; I<=N; I++) {
                   1197:     for (K=0; K<=P_pmn; K++) {
                   1198:       printp(Parray[K]);
                   1199:       printf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
                   1200:     }
                   1201:   }
                   1202:   for (I=1; I<=N; I++) printf("%lf, ",M_x[I-1]);
                   1203:   printf("<--x\n");
                   1204: }
                   1205: /*main() {  checkJack1(3,3);  }*/
                   1206:
                   1207:
1.10      takayama 1208: static int checkJack2(int M,int N) {
1.1       takayama 1209:   int I,K,J;
                   1210:   extern int P_pmn;
                   1211:   extern double M_x[];
1.10      takayama 1212:   extern int M_df;
1.1       takayama 1213:   int Pmn; /* used in aM_jack */
                   1214:   M_df=1;
                   1215:   /* initialize x vars. */
                   1216:   for (I=1; I<=N; I++) {
                   1217:     M_x[I-1] = ((double)I)/10.0;
                   1218:   }
                   1219:   genJack(M,N);
                   1220:   Pmn = P_pmn;
                   1221:   for (I=1; I<=N; I++) {
                   1222:     for (K=0; K<=P_pmn; K++) {
                   1223:       printp(Parray[K]);
                   1224:       printf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
                   1225:     }
                   1226:   }
                   1227:   for (I=1; I<=N; I++) printf("%lf, ",M_x[I-1]);
                   1228:   printf("<--x\n");
                   1229:
                   1230:   for (I=1; I<=N; I++) {
                   1231:     for (K=0; K<=P_pmn; K++) {
                   1232:       for (J=0; J<M_2n; J++) {
1.12    ! takayama 1233:         printp(Parray[K]);
        !          1234:         printf("<--Kap, Nv=%d,J(diff)=%d, D^J Jack=%lf\n",
        !          1235:                I,J,aM_jack(I,J,K));
        !          1236:       }
        !          1237:     }
1.1       takayama 1238:   }
                   1239: }
                   1240:
                   1241: /* main() { checkJack2(3,3); } */
                   1242:
                   1243: double mh_t(double A[A_LEN],double B[B_LEN],int N,int M) {
                   1244:   double F,F2;
                   1245:   extern int M_df;
                   1246:   extern int P_pmn;
                   1247:   extern double *M_qk;
                   1248:   extern double M_rel_error;
                   1249:   int Pmn;
                   1250:   int K;
                   1251:   int *Kap;
                   1252:   int size;
                   1253:   F = 0; F2=0;
                   1254:   M_df=1;
                   1255:   genJack(M,N);
1.8       takayama 1256:   M_qk = (double *)mymalloc(sizeof(double)*(P_pmn+1)); /* found a bug. */
1.1       takayama 1257:   Pmn = P_pmn;
                   1258:   size = ParraySize[P_pmn];
                   1259:   for (K=0; K<=P_pmn; K++) {
1.11      takayama 1260:     mh_check_intr(100);
1.12    ! takayama 1261:     Kap = Parray[K];
        !          1262:     M_qk[K] = qk(Kap,A,B);
        !          1263:     F += M_qk[K]*aM_jack(N,0,K);
        !          1264:     if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);
        !          1265:     if (Debug) printf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);
        !          1266:     if (Debug && (ParraySize[K] == size)) printf("M_qk[K]=%lg, aM_jack=%lg\n",M_qk[K],aM_jack(N,0,K));
1.1       takayama 1267:   }
                   1268:   M_rel_error = F-F2;
                   1269:   return(F);
                   1270: }
                   1271: double mh_t2(int J) {
                   1272:   extern double *M_qk;
                   1273:   double F;
                   1274:   int K;
                   1275:   int Pmn;
                   1276:   extern int P_pmn;
1.3       takayama 1277:   if (M_qk == NULL) {myerror("Call mh_t first."); mh_exit(-1); }
1.1       takayama 1278:   F = 0;
                   1279:   Pmn = P_pmn;
                   1280:   for (K=0; K<P_pmn; K++) {
1.12    ! takayama 1281:     F += M_qk[K]*aM_jack(M_n,J,K);
1.1       takayama 1282:   }
                   1283:   return(F);
                   1284: }
                   1285:
1.10      takayama 1286: static int mtest1b() {
1.1       takayama 1287:   double A[1] = {1.5};
                   1288:   double B[1] = {1.5+5};
                   1289:   int I,N,M,J;
                   1290:   double F;
                   1291:   N=3; M=6;
                   1292:   for (I=1; I<=N; I++) {
                   1293:     M_x[I-1] = ((double)I)/10.0;
                   1294:   }
                   1295:   mh_t(A,B,N,M);
                   1296:   for (J=0; J<M_2n; J++) {
1.12    ! takayama 1297:     F=mh_t2(J);
        !          1298:     printf("J=%d, D^J mh_t=%lf\n",J,F);
1.1       takayama 1299:   }
                   1300: }
                   1301:
                   1302: /* main() { mtest1b(); }*/
                   1303:
                   1304:
                   1305:
                   1306:
                   1307: #define TEST 1
                   1308: #ifndef TEST
                   1309:
                   1310: #endif
                   1311:
                   1312: /****** from mh-n.c *****/
                   1313:
                   1314: #define SMAX 4096
1.3       takayama 1315: #define inci(i) { i++; if (i >= argc) { fprintf(stderr,"Option argument is not given.\n"); return(NULL); }}
1.1       takayama 1316:
1.2       takayama 1317: static int imypower(int x,int n) {
1.1       takayama 1318:   int i;
                   1319:   int v;
1.3       takayama 1320:   if (n < 0) {myerror("imypower"); mh_exit(-1);}
1.1       takayama 1321:   v = 1;
                   1322:   for (i=0; i<n; i++) v *= x;
                   1323:   return(v);
                   1324: }
                   1325:
1.11      takayama 1326: #ifdef STANDALONE2
1.1       takayama 1327: main(int argc,char *argv[]) {
1.3       takayama 1328:   mh_exit(MH_RESET_EXIT);
1.12    ! takayama 1329:   /*  jk_main(argc,argv);
        !          1330:       printf("second run.\n"); */
1.2       takayama 1331:   jk_main(argc,argv);
                   1332: }
1.3       takayama 1333: #endif
                   1334:
                   1335: struct MH_RESULT *jk_main(int argc,char *argv[]) {
1.1       takayama 1336:   double *y0;
                   1337:   double x0,xn;
                   1338:   double ef;
                   1339:   int i,j,rank;
                   1340:   double a[1]; double b[1];
                   1341:   extern double M_x[];
                   1342:   extern double *Beta;
                   1343:   extern int M_2n;
1.3       takayama 1344:   char swork[1024];
                   1345:   struct MH_RESULT *ans=NULL;
                   1346:   struct SFILE *ofp = NULL;
                   1347:   int idata=0;
                   1348:   JK_byFile = 1;
                   1349:   jk_initializeWorkArea();
1.1       takayama 1350:   UseTable = 1;
1.3       takayama 1351:   Mapprox=6;
1.1       takayama 1352:   for (i=1; i<argc; i++) {
1.12    ! takayama 1353:     if (strcmp(argv[i],"--idata")==0) {
        !          1354:       inci(i);
        !          1355:       setParam(argv[i]); idata=1;
        !          1356:     }else if (strcmp(argv[i],"--degree")==0) {
        !          1357:       inci(i);
        !          1358:       sscanf(argv[i],"%d",&Mapprox);
        !          1359:     }else if (strcmp(argv[i],"--x0")==0) {
        !          1360:       inci(i);
        !          1361:       sscanf(argv[i],"%lg",&X0g);
        !          1362:     }else if (strcmp(argv[i],"--notable")==0) {
        !          1363:       UseTable = 0;
        !          1364:     }else if (strcmp(argv[i],"--debug")==0) {
        !          1365:       Debug = 1;
        !          1366:     }else if (strcmp(argv[i],"--help")==0) {
        !          1367:       usage(); return(0);
        !          1368:     }else if (strcmp(argv[i],"--bystring")==0) {
        !          1369:       if (idata) {fprintf(stderr,"--bystring must come before --idata option.\n"); mh_exit(-1);}
        !          1370:       JK_byFile = 0;
        !          1371:     }else {
        !          1372:       fprintf(stderr,"Unknown option %s\n",argv[i]);
        !          1373:       usage();
        !          1374:       return(NULL);
        !          1375:     }
1.1       takayama 1376:   }
1.3       takayama 1377:   if (!idata) setParam(NULL);
                   1378:
                   1379:   /* Initialize global variables */
                   1380:   M_n = Mg;
                   1381:   HS_n=M_n;
                   1382:   if (!JK_byFile) ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));
                   1383:   else ans = NULL;
                   1384:   /* Output by a file=stdout */
                   1385:   ofp = mh_fopen("stdout","w",JK_byFile);
1.1       takayama 1386:
1.3       takayama 1387:   sprintf(swork,"%%%%Use --help option to see the help.\n"); mh_fputs(swork,ofp);
                   1388:   sprintf(swork,"%%%%Mapprox=%d\n",Mapprox); mh_fputs(swork,ofp);
1.1       takayama 1389:   if (M_n != Mg) {
1.12    ! takayama 1390:     myerror("Mg must be equal to M_n\n"); mh_exit(-1);
1.1       takayama 1391:   }
1.8       takayama 1392:   if (Debug) showParam(NULL,1);
1.1       takayama 1393:   for (i=0; i<M_n; i++) {
1.12    ! takayama 1394:     M_x[i] = Beta[i]*X0g;
1.1       takayama 1395:   }
                   1396:   a[0] = ((double)Mg+1.0)/2.0;
                   1397:   b[0] = ((double)Mg+1.0)/2.0 + ((double) (*Ng))/2.0; /* bug, double check */
                   1398:   if (Debug) printf("Calling mh_t with ([%lf],[%lf],%d,%d)\n",a[0],b[0],M_n,Mapprox);
                   1399:   mh_t(a,b,M_n,Mapprox);
                   1400:   if (imypower(2,M_n) != M_2n) {
1.12    ! takayama 1401:     sprintf(swork,"M_n=%d,M_2n=%d\n",M_n,M_2n); mh_fputs(swork,ofp);
        !          1402:     myerror("2^M_n != M_2n\n"); mh_exit(-1);
1.1       takayama 1403:   }
1.3       takayama 1404:   sprintf(swork,"%%%%M_rel_error=%lg\n",M_rel_error); mh_fputs(swork,ofp);
1.1       takayama 1405:   for (j=0; j<M_2n; j++) {
1.12    ! takayama 1406:     Iv[j] = mh_t2(j);
1.1       takayama 1407:   }
                   1408:   Ef = iv_factor();
1.8       takayama 1409:   showParam(ofp,0);
1.3       takayama 1410:
                   1411:   /* return the result */
                   1412:   if (!JK_byFile) {
1.12    ! takayama 1413:     ans->x = X0g;
        !          1414:     ans->rank = imypower(2,Mg);
        !          1415:     ans->y = (double *)mymalloc(sizeof(double)*(ans->rank));
        !          1416:     for (i=0; i<ans->rank; i++) (ans->y)[i] = Iv[i];
        !          1417:     ans->size=1;
        !          1418:     ans->sfpp = (struct SFILE **)mymalloc(sizeof(struct SFILE *)*(ans->size));
        !          1419:     (ans->sfpp)[0] = ofp;
1.3       takayama 1420:   }
1.7       takayama 1421:   if (Debug) printf("jk_freeWorkArea() starts\n");
1.3       takayama 1422:   jk_freeWorkArea();
1.7       takayama 1423:   if (Debug) printf("jk_freeWorkArea() has finished.\n");
1.3       takayama 1424:   return(ans);
1.1       takayama 1425: }
                   1426:
1.10      takayama 1427: static int usage() {
1.1       takayama 1428:   fprintf(stderr,"Usages:\n");
                   1429:   fprintf(stderr,"mh-m [--idata input_data_file --x0 x0 --degree approxm]\n");
                   1430:   fprintf(stderr,"\nThe command mh-m [options] generates an input for w-m, Pr({y | y<xmax}), which is the cumulative distribution function of the largest root of the m by m Wishart matrix with n degrees of freedom and the covariantce matrix sigma.\n");
                   1431:   fprintf(stderr,"The mh-m uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");
                   1432:   fprintf(stderr,"The degree of the approximation (Mapprox) is given by the --degree option.\n");
                   1433:   fprintf(stderr,"Parameters are specified by the input_data_file. Otherwise, default values are used.\n");
                   1434:   fprintf(stderr,"The format of the input_data_file. The orders of the input numbers must be kept.\n");
                   1435:   fprintf(stderr," Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\n");
                   1436:   fprintf(stderr," Iv: initial values at X0g*Beta (see our paper how to order them), are evaluated in this program. Give zeros. \n");
                   1437:   fprintf(stderr," Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");
                   1438:   fprintf(stderr," Hg: h (step size) which is for w-m, X0g: starting value of x(when --x0 option is used, this value is used), Xng: terminating value of x which is for w-m.\n");
                   1439:   fprintf(stderr," Dp: output data is stored in every Dp steps when output_data_file is specified, which is for w-m.\n");
                   1440:   fprintf(stderr," The line started with %% is a comment line.\n");
                   1441:   fprintf(stderr," With the --notable option, it does not use the Lemma 3.2 of Koev-Edelman (there is a typo: kappa'_r = mu'_r for 1<=r<=mu_k).\n");
                   1442:   fprintf(stderr," An example format of the input_data_file can be obtained by executing mh-m with no option.\n");
                   1443:   fprintf(stderr,"\nExamples:\n");
                   1444:   fprintf(stderr,"[1] ./mh-2 \n");
                   1445:   fprintf(stderr,"[2] ./mh-2 --x0 0.3 \n");
                   1446:   fprintf(stderr,"[3] ./mh-3 --x0 0.1 \n");
                   1447:   fprintf(stderr,"[4] ./mh-3 --x0 0.1 --degree 15 \n");
                   1448:   fprintf(stderr,"[5] ./mh-3 --idata test.txt --degree 15 \n");
                   1449:   fprintf(stderr,"[6] ./mh-3 --degree 15 >test2.txt\n");
                   1450:   fprintf(stderr,"    ./w-3 --idata test2.txt --gnuplotf test-g\n");
                   1451:   fprintf(stderr,"    gnuplot -persist <test-g-gp.txt\n");
                   1452: }
                   1453:
1.10      takayama 1454: static int setParamDefault() {
1.1       takayama 1455:   int rank;
                   1456:   int i;
1.3       takayama 1457:   Mg = M_n_default ;
1.1       takayama 1458:   rank = imypower(2,Mg);
                   1459:   Beta = (double *)mymalloc(sizeof(double)*Mg);
                   1460:   for (i=0; i<Mg; i++) Beta[i] = 1.0+i;
                   1461:   Ng = (double *)mymalloc(sizeof(double)); *Ng = 3.0;
                   1462:   Iv = (double *)mymalloc(sizeof(double)*rank);
                   1463:   Iv2 = (double *)mymalloc(sizeof(double)*rank);
                   1464:   for (i=0; i<rank; i++) Iv[i] = 0;
                   1465:   Ef = 0;
                   1466:   Ef2 = 0.01034957388338225707;
                   1467:   if (M_n == 2) {
                   1468:     Iv2[0] = 1.58693;
                   1469:     Iv2[1] = 0.811369;
                   1470:     Iv2[2] = 0.846874;
                   1471:     Iv2[3] = 0.413438;
                   1472:   }
                   1473:   X0g = (Beta[0]/Beta[Mg-1])*0.5;
                   1474:   Hg = 0.001;
                   1475:   Dp = 1;
                   1476:   Xng = 10.0;
                   1477: }
                   1478:
1.10      takayama 1479: static int next(struct SFILE *sfp,char *s,char *msg) {
1.1       takayama 1480:   s[0] = '%';
                   1481:   while (s[0] == '%') {
1.12    ! takayama 1482:     if (!mh_fgets(s,SMAX,sfp)) {
        !          1483:       fprintf(stderr,"Data format error at %s\n",msg);
        !          1484:       mh_exit(-1);
        !          1485:     }
        !          1486:     if (s[0] != '%') return(0);
1.1       takayama 1487:   }
                   1488: }
1.10      takayama 1489: static int setParam(char *fname) {
1.1       takayama 1490:   int rank;
                   1491:   char s[SMAX];
1.3       takayama 1492:   struct SFILE *fp;
1.1       takayama 1493:   int i;
                   1494:   if (fname == NULL) return(setParamDefault());
                   1495:
                   1496:   Sample = 0;
1.3       takayama 1497:   if ((fp=mh_fopen(fname,"r",JK_byFile)) == NULL) {
1.12    ! takayama 1498:     if (JK_byFile) fprintf(stderr,"File %s is not found.\n",fp->s);
        !          1499:     mh_exit(-1);
1.1       takayama 1500:   }
                   1501:   next(fp,s,"Mg(m)");
                   1502:   sscanf(s,"%d",&Mg);
                   1503:   rank = imypower(2,Mg);
                   1504:
                   1505:   Beta = (double *)mymalloc(sizeof(double)*Mg);
                   1506:   for (i=0; i<Mg; i++) {
                   1507:     next(fp,s,"Beta");
1.12    ! takayama 1508:     sscanf(s,"%lf",&(Beta[i]));
1.1       takayama 1509:   }
                   1510:
                   1511:   Ng = (double *)mymalloc(sizeof(double));
                   1512:   next(fp,s,"Ng(freedom parameter n)");
                   1513:   sscanf(s,"%lf",Ng);
                   1514:
                   1515:   next(fp,s,"X0g(initial point)");
                   1516:   sscanf(s,"%lf",&X0g);
                   1517:
                   1518:   Iv = (double *)mymalloc(sizeof(double)*rank);
                   1519:   for (i=0; i<rank; i++) {
1.12    ! takayama 1520:     next(fp,s,"Iv(initial values)");
        !          1521:     sscanf(s,"%lg",&(Iv[i]));
1.1       takayama 1522:   }
                   1523:
                   1524:   next(fp,s,"Ef(exponential factor)");
                   1525:   sscanf(s,"%lg",&Ef);
                   1526:
                   1527:   next(fp,s,"Hg (step size of rk)");
                   1528:   sscanf(s,"%lf",&Hg);
                   1529:
                   1530:   next(fp,s,"Dp (data sampling period)");
                   1531:   sscanf(s,"%d",&Dp);
                   1532:
                   1533:   next(fp,s,"Xng (the last point, cf. --xmax)");
                   1534:   sscanf(s,"%lf",&Xng);
1.3       takayama 1535:   mh_fclose(fp);
1.1       takayama 1536: }
                   1537:
1.10      takayama 1538: static int showParam(struct SFILE *fp,int fd) {
1.1       takayama 1539:   int rank,i;
1.3       takayama 1540:   char swork[1024];
1.8       takayama 1541:   if (fd) {
                   1542:     fp = mh_fopen("stdout","w",1);
                   1543:   }
1.1       takayama 1544:   rank = imypower(2,Mg);
1.3       takayama 1545:   sprintf(swork,"%%Mg=\n%d\n",Mg); mh_fputs(swork,fp);
1.1       takayama 1546:   for (i=0; i<Mg; i++) {
1.12    ! takayama 1547:     sprintf(swork,"%%Beta[%d]=\n%lf\n",i,Beta[i]); mh_fputs(swork,fp);
1.1       takayama 1548:   }
1.3       takayama 1549:   sprintf(swork,"%%Ng=\n%lf\n",*Ng); mh_fputs(swork,fp);
                   1550:   sprintf(swork,"%%X0g=\n%lf\n",X0g); mh_fputs(swork,fp);
1.1       takayama 1551:   for (i=0; i<rank; i++) {
1.12    ! takayama 1552:     sprintf(swork,"%%Iv[%d]=\n%lg\n",i,Iv[i]); mh_fputs(swork,fp);
        !          1553:     if (Sample && (M_n == 2) && (X0g == 0.3)) {
        !          1554:       sprintf(swork,"%%Iv[%d]-Iv2[%d]=%lg\n",i,i,Iv[i]-Iv2[i]); mh_fputs(swork,fp);
        !          1555:     }
1.3       takayama 1556:   }
                   1557:   sprintf(swork,"%%Ef=\n%lg\n",Ef); mh_fputs(swork,fp);
                   1558:   sprintf(swork,"%%Hg=\n%lf\n",Hg); mh_fputs(swork,fp);
                   1559:   sprintf(swork,"%%Dp=\n%d\n",Dp);  mh_fputs(swork,fp);
                   1560:   sprintf(swork,"%%Xng=\n%lf\n",Xng);mh_fputs(swork,fp);
1.1       takayama 1561: }
                   1562:
1.2       takayama 1563: static double gammam(double a,int n) {
1.1       takayama 1564:   double v,v2;
                   1565:   int i;
                   1566:   v=mypower(sqrt(M_PI),(n*(n-1))/2);
                   1567:   v2=0;
                   1568:   for (i=1; i<=n; i++) {
                   1569:     v2 += lgamma(a-((double)(i-1))/2.0); /* not for big n */
                   1570:   }
                   1571:   if (Debug) printf("gammam(%lg,%d)=%lg\n",a,n,v*exp(v2));
                   1572:   return(v*exp(v2));
                   1573: }
                   1574:
1.2       takayama 1575: static double iv_factor(void) {
1.1       takayama 1576:   double v1;
                   1577:   double t;
                   1578:   double b;
                   1579:   double detSigma;
                   1580:   double c;
                   1581:   int i,n;
                   1582:   n = (int) (*Ng);
                   1583:   v1= mypower(sqrt(X0g),n*M_n);
                   1584:   t = 0.0;
                   1585:   for (i=0; i<M_n; i++)  t += -X0g*Beta[i];
                   1586:   v1 = v1*exp(t);
                   1587:
                   1588:   b = 1; for (i=0; i<M_n; i++) b *= Beta[i];
                   1589:   detSigma = 1.0/(b*mypower(2.0,M_n));
                   1590:
                   1591:   c = gammam(((double)(M_n+1))/2.0, M_n)/
1.12    ! takayama 1592:     ( mypower(sqrt(2), M_n*n)*mypower(sqrt(detSigma),n)*gammam(((double)(M_n+n+1))/2.0,M_n) );
1.1       takayama 1593:   return( c*v1);
                   1594: }
                   1595:
                   1596:
                   1597:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>