[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.40

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.40    ! takayama    8:   $OpenXM: OpenXM/src/hgm/mh/src/jack-n.c,v 1.39 2016/02/04 02:52:19 takayama Exp $
1.12      takayama    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:
1.40    ! takayama   18:   2016.02.04 Ef_type (exponential or scalar factor type)
1.38      takayama   19:   2016.02.01 ifdef C_2F1 ...
1.36      takayama   20:   2016.01.12 2F1
1.22      takayama   21:   2014.03.15 http://fe.math.kobe-u.ac.jp/Movies/oxvh/2014-03-11-jack-n-c-automatic  see also hgm/doc/ref.html, @s/2014/03/15-my-note-jack-automatic-order-F_A-casta.pdf.
1.18      takayama   22:   2014.03.14, --automatic option. Output estimation data.
1.12      takayama   23:   2012.02.21, porting to OpenXM/src/hgm
                     24:   2011.12.22, --table option, which is experimental.
                     25:   2011.12.19, bug fix.  jjk() should return double. It can become more than max int.
                     26:   2011.12.15, mh.r --> jack-n.c
1.1       takayama   27: */
                     28:
1.3       takayama   29: /****** from mh-n.c *****/
                     30: static int JK_byFile=1;
1.6       takayama   31: static int JK_deallocate=0;
1.3       takayama   32: #define M_n_default 3
1.4       takayama   33: #define Sample_default 1
1.3       takayama   34: static int M_n=0;
1.1       takayama   35: /* global variables. They are set in setParam() */
1.2       takayama   36: static int Mg;  /* n */
                     37: static int Mapprox; /* m, approximation degree */
                     38: static double *Beta; /* beta[0], ..., beta[m-1] */
                     39: static double *Ng;   /* freedom n.  c=(m+1)/2+n/2; Note that it is a pointer */
                     40: static double X0g;   /* initial point */
                     41: static double *Iv;   /* Initial values of mhg sorted by mhbase() in rd.rr at beta*x0 */
                     42: static double Ef;   /* exponential factor at beta*x0 */
                     43: static double Hg;   /* step size of rk defined in rk.c */
                     44: static int Dp;      /* Data sampling period */
                     45: static double Xng=0.0;   /* the last point */
1.4       takayama   46: static int Sample = Sample_default;
1.1       takayama   47:
                     48: /* for sample inputs */
1.2       takayama   49: static double *Iv2;
                     50: static double Ef2;
1.1       takayama   51:
                     52: #ifdef NAN
                     53: #else
1.2       takayama   54: #define NAN  3.40282e+38  /* for old 32 bit machines. Todo, configure */
1.1       takayama   55: #endif
                     56:
                     57: /* #define M_n  3  defined in the Makefile */ /* number of variables */
                     58: #define M_n0 3 /* used for tests. Must be equal to M_n */
                     59: #define M_m_MAX 200
1.3       takayama   60: #define M_nmx  M_m_MAX  /* maximal of M_n */
1.37      takayama   61: #ifdef C_2F1
                     62: #define A_LEN  2 /* (a_1) , (a_1, ..., a_p)*/
                     63: #define B_LEN  1 /* (b_1) */
                     64: static int P_pFq=2;
                     65: static int Q_pFq=1;
                     66: #else
1.1       takayama   67: #define A_LEN  1 /* (a_1) , (a_1, ..., a_p)*/
                     68: #define B_LEN  1 /* (b_1) */
1.36      takayama   69: static int P_pFq=1;
                     70: static int Q_pFq=1;
1.37      takayama   71: #endif
1.36      takayama   72: static double A_pFq[A_LEN];
                     73: static double B_pFq[B_LEN];
1.38      takayama   74: #ifndef C_2F1
1.36      takayama   75: static int Orig_1F1=1;
1.40    ! takayama   76: static int Ef_type=1;  /* 1F1 for Wishart */
1.38      takayama   77: #else
                     78: static int Orig_1F1=0;
1.40    ! takayama   79: static int Ef_type=2;  /* 2F1, Hashiguchi note (1) */
1.38      takayama   80: #endif
1.9       takayama   81: static int Debug = 0;
1.5       takayama   82: static int Alpha = 2;  /* 2 implies the zonal polynomial */
1.2       takayama   83: static int *Darray = NULL;
                     84: static int **Parray = NULL; /* array of partitions of size M_n */
                     85: static int *ParraySize = NULL; /* length of each partitions */
1.3       takayama   86: static int M_kap[M_nmx];
1.2       takayama   87: static int M_m=M_m_MAX-2;   /* | | <= M_m, bug do check of M_m <=M_m_MAX-2 */
1.1       takayama   88: void (*M_pExec)(void);
1.3       takayama   89: static int HS_mu[M_nmx];
                     90: static int HS_n=M_nmx;      /* It is initialized to M_n in jk_main */
1.1       takayama   91: void (*HS_hsExec)(void);
1.3       takayama   92: static double M_x[M_nmx];
1.1       takayama   93:
                     94: /* They are used in pmn */
1.2       takayama   95: static int *P_pki=NULL;
                     96: static int P_pmn=0;
1.1       takayama   97:
                     98: /* It is used genDarray2(), list partitions... */
1.2       takayama   99: static int DR_parray=0;
1.1       takayama  100:
                    101: /* Used in genBeta() and enumeration of horizontal strip. */
1.2       takayama  102: static double *M_beta_0=NULL;  /* M_beta[0][*] value of beta_{kappa,mu}, M_beta[1][*] N_mu */
                    103: static int *M_beta_1=NULL;
                    104: static int M_beta_pt=0;
1.3       takayama  105: static int M_beta_kap[M_nmx];
1.2       takayama  106: static int UseTable = 0;
                    107:
                    108: static double **M_jack;
                    109: static int M_df=1; /* Compute differentials? */
                    110: static int M_2n=0; /* 2^N */
1.1       takayama  111:
1.3       takayama  112: static double Xarray[M_nmx][M_m_MAX];
1.1       takayama  113: /* (x_1, ..., x_n) */
                    114: /* Xarray[i][0]  x_{i+1}^0, Xarray[i][1], x_{i+1}^1, ... */
                    115:
1.2       takayama  116: static double *M_qk=NULL;  /* saves pochhammerb */
                    117: static double M_rel_error=0.0; /* relative errors */
1.1       takayama  118:
1.16      takayama  119: /* For automatic degree and X0g setting. */
1.19      takayama  120: /*
                    121:  If automatic == 1, then the series is reevaluated as long as t_success!=1
                    122:  by increasing X0g (evaluation point) and M_m (approx degree);
                    123:  */
1.26      takayama  124: static int M_automatic=1;
1.19      takayama  125: /* Estimated degree bound for series expansion. See mh_t */
1.16      takayama  126: static int M_m_estimated_approx_deg=0;
1.19      takayama  127: /* Let F(i) be the approximation up to degree i.
                    128:    The i-th series_error is defined
                    129:    by |(F(i)-F(i-1))/F(i-1)|.
                    130: */
                    131: static double M_series_error;
                    132: /*
                    133:   M_series_error < M_assigend_series_error (A) is required for the
                    134:   estimated_approx_deg.
                    135:  */
1.26      takayama  136: static double M_assigned_series_error=M_ASSIGNED_SERIES_ERROR_DEFAULT;
1.19      takayama  137: /*
                    138:   Let Ef be the exponential factor ( Ef=(4)/1F1 of [HNTT] )
                    139:   If F(M_m)*Ef < x0value_min (B), the success=0 and X0g is increased.
                    140:   Note that minimal double is about 2e-308
                    141:  */
1.26      takayama  142: static double M_x0value_min=1e-60;
1.19      takayama  143: /*
                    144:   estimated_X0g is the suggested value of X0g.
                    145:  */
1.16      takayama  146: static double M_estimated_X0g=0.0;
1.19      takayama  147: /*
                    148:  X0g should be less than M_X0g_bound.
                    149:  */
                    150: static double M_X0g_bound = 1e+100;
                    151: /*
                    152:  success is set to 1 when (A) and (B) are satisfied.
                    153:  */
1.16      takayama  154: static int M_mh_t_success=1;
1.19      takayama  155: /*
                    156:   recommended_abserr is the recommended value of the absolute error
                    157:   for the Runge-Kutta method. It is defined as
                    158:   assigend_series_error(standing for significant digits)*Ig[0](initial value)
                    159:  */
                    160: static double M_recommended_abserr;
                    161: /*
1.27      takayama  162:   recommended_relerr is the recommended value of the relative error
                    163:   for the Runge-Kutta method..
                    164:  */
                    165: static double M_recommended_relerr;
                    166: /*
1.19      takayama  167:   max of beta(i)*x/2
                    168:  */
                    169: static double M_beta_i_x_o2_max;
                    170: /*
                    171:   minimum of |beta_i-beta_j|
                    172:  */
                    173: static double M_beta_i_beta_j_min;
                    174: /*
                    175:   Value of matrix hg
                    176: */
                    177: static double M_mh_t_value;
1.25      takayama  178: /*
                    179:  Show the process of updating degree.
                    180:  */
                    181: int M_show_autosteps=1;
1.16      takayama  182:
1.2       takayama  183: /* prototypes */
                    184: static void *mymalloc(int size);
1.10      takayama  185: static int myfree(void *p);
                    186: static int myerror(char *s);
1.2       takayama  187: static double jack1(int K);
                    188: static double jack1diff(int k);
                    189: static double xval(int i,int p); /* x_i^p */
                    190: static int mysum(int L[]);
                    191: static int plength(int P[]);
                    192: static int plength_t(int P[]);
1.3       takayama  193: static void ptrans(int P[M_nmx],int Pt[]);
1.2       takayama  194: static int huk(int K[],int I,int J);
                    195: static int hdk(int K[],int I,int J);
                    196: static double jjk(int K[]);
                    197: static double ppoch(double A,int K[]);
                    198: static double ppoch2(double A,double B,int K[]);
                    199: static double mypower(double x,int n);
                    200: static double qk(int K[],double A[A_LEN],double B[B_LEN]);
                    201: static int bb(int N[],int K[],int M[],int I,int J);
                    202: static double beta(int K[],int M[]);
1.10      takayama  203: static int printp(int kappa[]);
1.2       takayama  204: static double q3_10(int K[],int M[],int SK);
                    205: static int nk(int KK[]);
                    206: static int myeq(int P1[],int P2[]);
                    207: static int pListPartition(int M,int N);
                    208: static int pListPartition2(int Less,int From,int To, int M);
                    209: static void pExec_0();
                    210: static int pListHS(int Kap[],int N);
                    211: static int pListHS2(int From,int To,int Kap[]);
                    212: static void hsExec_0();
                    213: static int pmn(int M,int N);
                    214: static int *cloneP(int a[]);
1.10      takayama  215: static int copyP(int p[],int a[]);
1.2       takayama  216: static void pExec_darray(void);
1.10      takayama  217: static int genDarray2(int M,int N);
                    218: static int isHStrip(int Kap[],int Nu[]);
1.2       takayama  219: static void hsExec_beta(void);
1.10      takayama  220: static int genBeta(int Kap[]);
1.2       takayama  221: static int psublen(int Kap[],int Mu[]);
1.10      takayama  222: static int genJack(int M,int N);
1.2       takayama  223:
                    224: static int imypower(int x,int n);
1.10      takayama  225: static int usage();
                    226: static int setParamDefault();
                    227: static int next(struct SFILE *fp,char *s,char *msg);
1.2       takayama  228: static int setParam(char *fname);
1.8       takayama  229: static int showParam(struct SFILE *fp,int fd);
1.2       takayama  230: static double iv_factor(void);
                    231: static double gammam(double a,int n);
                    232: static double mypower(double a,int n);
                    233:
1.40    ! takayama  234: static double iv_factor_ef_type1(void);
        !           235: static double iv_factor_ef_type2(void);
        !           236: static void setM_x(void);
        !           237: static void setM_x_ef_type1(void);
        !           238: static void setM_x_ef_type2(void);
        !           239:
1.32      takayama  240: #ifdef STANDALONE
                    241: static int test_ptrans();
                    242: static int printp2(int kappa[]);
                    243: static int test_beta();
                    244: static void mtest4();
                    245: static void mtest4b();
                    246: static int plength2(int P1[],int P2[]);
                    247: static int checkBeta1();
                    248: static int checkJack1(int M,int N);
                    249: static int checkJack2(int M,int N);
                    250: static int mtest1b();
                    251: static double q3_5(double A[],double B[],int K[],int I);
                    252: #endif
                    253:
1.2       takayama  254: double mh_t(double A[A_LEN],double B[B_LEN],int N,int M);
                    255: double mh_t2(int J);
1.3       takayama  256: struct MH_RESULT *jk_main(int argc,char *argv[]);
1.16      takayama  257: struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree);
1.3       takayama  258: int jk_freeWorkArea();
                    259: int jk_initializeWorkArea();
                    260:
                    261: int jk_freeWorkArea() {
                    262:   /* bug, p in the cloneP will not be deallocated.
1.12      takayama  263:      Nk in genDarray2 will not be deallocated.
                    264:   */
1.3       takayama  265:   int i;
1.6       takayama  266:   JK_deallocate=1;
1.3       takayama  267:   if (Darray) {myfree(Darray); Darray=NULL;}
                    268:   if (Parray) {myfree(Parray); Parray=NULL;}
                    269:   if (ParraySize) {myfree(ParraySize); ParraySize=NULL;}
                    270:   if (M_beta_0) {myfree(M_beta_0); M_beta_0=NULL;}
                    271:   if (M_beta_1) {myfree(M_beta_1); M_beta_1=NULL;}
                    272:   if (M_jack) {
1.12      takayama  273:     for (i=0; M_jack[i] != NULL; i++) {
1.29      takayama  274:       if (Debug) oxprintf("Free M_jack[%d]\n",i);
1.12      takayama  275:       myfree(M_jack[i]); M_jack[i] = NULL;
                    276:     }
                    277:     myfree(M_jack); M_jack=NULL;
1.3       takayama  278:   }
                    279:   if (M_qk) {myfree(M_qk); M_qk=NULL;}
                    280:   if (P_pki) {myfree(P_pki); P_pki=NULL;}
1.6       takayama  281:   JK_deallocate=0;
1.13      takayama  282:   return(0);
1.3       takayama  283: }
                    284: int jk_initializeWorkArea() {
                    285:   int i,j;
1.6       takayama  286:   JK_deallocate=1;
                    287:   xval(0,0);
                    288:   JK_deallocate=0;
1.3       takayama  289:   Darray=NULL;
                    290:   Parray=NULL;
                    291:   ParraySize=NULL;
                    292:   M_beta_0=NULL;
                    293:   M_beta_1=NULL;
                    294:   M_jack=NULL;
                    295:   M_qk=NULL;
                    296:   for (i=0; i<M_nmx; i++) M_kap[i]=HS_mu[i]=0;
                    297:   for (i=0; i<M_nmx; i++) M_x[i]=0;
                    298:   for (i=0; i<M_nmx; i++) for (j=0; j<M_m_MAX; j++) Xarray[i][j]=0;
1.5       takayama  299:   for (i=0; i<M_nmx; i++) M_beta_kap[i]=0;
1.3       takayama  300:   M_m=M_m_MAX-2;
                    301:   Alpha = 2;
                    302:   HS_n=M_nmx;
                    303:   P_pki=NULL;
                    304:   P_pmn=0;
                    305:   DR_parray=0;
                    306:   M_beta_pt=0;
                    307:   M_df=1;
                    308:   M_2n=0;
                    309:   M_rel_error=0.0;
1.4       takayama  310:   Sample = Sample_default;
1.5       takayama  311:   Xng=0.0;
                    312:   M_n=0;
1.13      takayama  313:   return(0);
1.3       takayama  314: }
1.2       takayama  315:
                    316: static void *mymalloc(int size) {
1.1       takayama  317:   void *p;
1.29      takayama  318:   if (Debug) oxprintf("mymalloc(%d)\n",size);
1.8       takayama  319:   p = (void *)mh_malloc(size);
1.1       takayama  320:   if (p == NULL) {
1.29      takayama  321:     oxprintfe("No more memory.\n");
1.3       takayama  322:     mh_exit(-1);
1.1       takayama  323:   }
                    324:   return(p);
                    325: }
1.10      takayama  326: static int myfree(void *p) {
1.29      takayama  327:   if (Debug) oxprintf("myFree at %p\n",p);
1.13      takayama  328:   return(mh_free(p));
1.7       takayama  329: }
1.29      takayama  330: static int myerror(char *s) { oxprintfe("%s: type in control-C\n",s); getchar(); getchar(); return(0);}
1.1       takayama  331:
1.2       takayama  332: static double jack1(int K) {
1.1       takayama  333:   double F;
                    334:   extern int Alpha;
1.32      takayama  335:   int J,II,JJ,N;   /*  int I,J,L,II,JJ,N; */
1.1       takayama  336:   N = 1;
                    337:   if (K == 0) return((double)1);
                    338:   F = xval(1,K);
                    339:   for (J=0; J<K; J++) {
                    340:     II = 1; JJ = J+1;
                    341:     F *= (N-(II-1)+Alpha*(JJ-1));
                    342:   }
                    343:   return(F);
                    344: }
1.2       takayama  345: static double jack1diff(int K) {
1.1       takayama  346:   double F;
                    347:   extern int Alpha;
1.32      takayama  348:   int J,II,JJ,N;  /* int I,J,S,L,II,JJ,N; */
1.1       takayama  349:   N = 1;
                    350:   if (K == 0) return((double)1);
                    351:   F = K*xval(1,K-1);
                    352:   for (J=0; J<K; J++) {
                    353:     II = 1; JJ = J+1;
                    354:     F *= (N-(II-1)+Alpha*(JJ-1));
                    355:   }
                    356:   return(F);
                    357: }
                    358:
1.2       takayama  359: static double xval(int ii,int p) { /* x_i^p */
1.1       takayama  360:   extern double M_x[];
                    361:   int i,j;
1.10      takayama  362:   static int init=0;
1.6       takayama  363:   if (JK_deallocate) { init=0; return(0.0);}
1.1       takayama  364:   if (!init) {
                    365:     for (i=1; i<=M_n; i++) {
                    366:       for (j=0; j<M_m_MAX; j++) {
1.12      takayama  367:         if (j != 0) {
                    368:           Xarray[i-1][j] = M_x[i-1]*Xarray[i-1][j-1];
                    369:         }else{
                    370:           Xarray[i-1][0] = 1;
                    371:         }
1.1       takayama  372:       }
                    373:     }
                    374:     init = 1;
                    375:   }
                    376:   if (ii < 1) myerror("xval, index out of bound.");
                    377:   if (p > M_m_MAX-2) myerror("xval, p is too large.");
                    378:   if (p < 0) {
                    379:     myerror("xval, p is negative.");
1.29      takayama  380:     oxprintf("ii=%d, p=%d\n",ii,p);
1.3       takayama  381:     mh_exit(-1);
1.1       takayama  382:   }
                    383:   return(Xarray[ii-1][p]);
                    384: }
                    385:
1.2       takayama  386: static int mysum(int L[]) {
1.1       takayama  387:   int S,I,N;
                    388:   N=M_n;
                    389:   S=0;
                    390:   for (I=0; I<N; I++) S += L[I];
                    391:   return(S);
                    392: }
                    393:
                    394: /*
1.12      takayama  395:   (3,2,2,0,0) --> 3
1.1       takayama  396: */
1.2       takayama  397: static int plength(int P[]) {
1.1       takayama  398:   int I;
                    399:   for (I=0; I<M_n; I++) {
                    400:     if (P[I] == 0) return(I);
                    401:   }
                    402:   return(M_n);
                    403: }
                    404: /* plength for transpose */
1.2       takayama  405: static int plength_t(int P[]) {
1.1       takayama  406:   int I;
                    407:   for (I=0; I<M_m; I++) {
                    408:     if (P[I] == 0) return(I);
                    409:   }
                    410:   return(M_m);
                    411: }
                    412:
                    413: /*
1.12      takayama  414:     ptrans(P)  returns Pt
1.1       takayama  415: */
1.3       takayama  416: static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m] */
1.1       takayama  417:   extern int M_m;
                    418:   int i,j,len;
1.3       takayama  419:   int p[M_nmx];
1.1       takayama  420:   for (i=0; i<M_n; i++) p[i] = P[i];
                    421:   for (i=0; i<M_m+1; i++) Pt[i] = 0;
                    422:   for (i=0; i<M_m; i++) {
                    423:     len=plength(p); Pt[i] = len;
                    424:     if (len == 0) return;
                    425:     for (j=0; j<len; j++) p[j] -= 1;
                    426:   }
                    427: }
                    428:
1.32      takayama  429: #ifdef STANDALONE
1.10      takayama  430: static int test_ptrans() {
1.1       takayama  431:   extern int M_m;
                    432:   int p[M_n0]={5,3,2};
                    433:   int pt[10];
                    434:   int i;
                    435:   M_m = 10;
                    436:   ptrans(p,pt);
1.29      takayama  437:   if (Debug) {for (i=0; i<10; i++) oxprintf("%d,",pt[i]);  oxprintf("\n");}
1.13      takayama  438:   return(0);
1.1       takayama  439: }
1.32      takayama  440: #endif
1.1       takayama  441:
                    442: /*
                    443:   upper hook length
                    444:   h_kappa^*(K)
                    445: */
1.2       takayama  446: static int huk(int K[],int I,int J) {
1.1       takayama  447:   extern int Alpha;
                    448:   int Kp[M_m_MAX];
                    449:   int A,H;
                    450:   A=Alpha;
1.29      takayama  451:   /*oxprintf("h^k(%a,%a,%a,%a)\n",K,I,J,A);*/
1.1       takayama  452:   ptrans(K,Kp);
                    453:   H=Kp[J-1]-I+A*(K[I-1]-J+1);
                    454:   return(H);
                    455: }
                    456:
                    457: /*
                    458:   lower hook length
                    459:   h^kappa_*(K)
                    460: */
1.2       takayama  461: static int hdk(int K[],int I,int J) {
1.1       takayama  462:   extern int Alpha;
                    463:   int Kp[M_m_MAX];
                    464:   int A,H;
                    465:   A = Alpha;
1.29      takayama  466:   /*oxprintf("h_k(%a,%a,%a,%a)\n",K,I,J,A);*/
1.1       takayama  467:   ptrans(K,Kp);
                    468:   H=Kp[J-1]-I+1+A*(K[I-1]-J);
                    469:   return(H);
                    470: }
                    471: /*
                    472:   j_kappa.  cf. Stanley.
                    473: */
1.2       takayama  474: static double jjk(int K[]) {
1.1       takayama  475:   extern int Alpha;
1.33      takayama  476:   int L,I,J;
1.1       takayama  477:   double V;
1.33      takayama  478:
1.1       takayama  479:   V=1;
                    480:   L=plength(K);
                    481:   for (I=0; I<L; I++) {
                    482:     for (J=0; J<K[I]; J++) {
                    483:       V *= huk(K,I+1,J+1)*hdk(K,I+1,J+1);
                    484:     }
                    485:   }
1.29      takayama  486:   if (Debug) {printp(K); oxprintf("<--K, jjk=%lg\n",V);}
1.1       takayama  487:   return(V);
                    488: }
                    489: /*
                    490:   (a)_kappa^\alpha, Pochhammer symbol
                    491:   Note that  ppoch(a,[n]) = (a)_n, Alpha=2
                    492: */
1.2       takayama  493: static double ppoch(double A,int K[]) {
1.1       takayama  494:   extern int Alpha;
                    495:   double V;
                    496:   int L,I,J,II,JJ;
                    497:   V = 1;
                    498:   L=plength(K);
                    499:   for (I=0; I<L; I++) {
                    500:     for (J=0; J<K[I]; J++) {
                    501:       II = I+1; JJ = J+1;
                    502:       V *= (A-((double)(II-1))/((double)Alpha)+JJ-1);
                    503:     }
                    504:   }
                    505:   return(V);
                    506: }
1.2       takayama  507: static double ppoch2(double A,double B,int K[]) {
1.1       takayama  508:   extern int Alpha;
                    509:   double V;
                    510:   int L,I,J,II,JJ;
                    511:   V = 1;
                    512:   L=plength(K);
                    513:   for (I=0; I<L; I++) {
                    514:     for (J=0; J<K[I]; J++) {
                    515:       II = I+1; JJ = J+1;
                    516:       V *= (A-((double)(II-1))/((double)Alpha)+JJ-1);
                    517:       V /= (B-((double)(II-1))/((double)Alpha)+JJ-1);
                    518:     }
                    519:   }
                    520:   return(V);
                    521: }
1.2       takayama  522: static double mypower(double x,int n) {
1.1       takayama  523:   int i;
                    524:   double v;
                    525:   if (n < 0) return(1/mypower(x,-n));
                    526:   v = 1;
                    527:   for (i=0; i<n; i++) v *= x;
                    528:   return(v);
                    529: }
                    530: /* Q_kappa
1.12      takayama  531:  */
1.2       takayama  532: static double qk(int K[],double A[A_LEN],double B[B_LEN]) {
1.1       takayama  533:   extern int Alpha;
                    534:   int P,Q,I;
                    535:   double V;
                    536:   P = A_LEN;
                    537:   Q = B_LEN;
                    538:   V = mypower((double) Alpha,mysum(K))/jjk(K);
1.2       takayama  539:   /* to reduce numerical errors, temporary. */
1.1       takayama  540:   if (P == Q) {
                    541:     for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);
1.38      takayama  542:        return(V);
1.1       takayama  543:   }
                    544:
1.38      takayama  545:   if (P > Q) {
                    546:        for (I=0; I<Q; I++) V = V*ppoch2(A[I],B[I],K);
                    547:        for (I=Q; I<P; I++) V = V*ppoch(A[I],K);
                    548:   }else {
                    549:        for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);
                    550:        for (I=P; I<Q; I++) V = V/ppoch(B[I],K);
                    551:   }
                    552:   /* for debug
                    553:   printf("K=");
                    554:   for (I=0; I<3; I++) printf("%d, ",K[I]);
                    555:   printf("qk=%lg\n",V);
                    556:   */
1.1       takayama  557:   return(V);
                    558: }
                    559:
                    560: /*
1.12      takayama  561:   B^nu_{kappa,mu}(i,j)
                    562:   bb(N,K,M,I,J)
1.1       takayama  563: */
1.2       takayama  564: static int bb(int N[],int K[],int M[],int I,int J) {
1.1       takayama  565:   int Kp[M_m_MAX]; int Mp[M_m_MAX];
                    566:   ptrans(K,Kp);
                    567:   ptrans(M,Mp);
                    568:
                    569:   /*
1.29      takayama  570:     printp(K); oxprintf("K<--, "); printp2(Kp); oxprintf("<--Kp\n");
                    571:     printp(M); oxprintf("M<--, "); printp2(Mp); oxprintf("<--Mp\n");
1.1       takayama  572:   */
                    573:
                    574:   if ((plength_t(Kp) < J) || (plength_t(Mp) < J)) return(hdk(N,I,J));
                    575:   if (Kp[J-1] == Mp[J-1]) return(huk(N,I,J));
                    576:   else return(hdk(N,I,J));
                    577: }
                    578: /*
                    579:   beta_{kappa,mu}
                    580:   beta(K,M)
                    581: */
1.2       takayama  582: static double beta(int K[],int M[]) {
1.1       takayama  583:   double V;
                    584:   int L,I,J,II,JJ;
                    585:   V = 1;
                    586:
                    587:   L=plength(K);
                    588:   for (I=0; I<L; I++) {
                    589:     for (J=0; J<K[I]; J++) {
                    590:       II = I+1; JJ = J+1;
                    591:       V *= (double)bb(K,K,M,II,JJ);
1.29      takayama  592:       /* oxprintf("[%d,%d,%lf]\n",I,J,V); */
1.1       takayama  593:     }
                    594:   }
                    595:
                    596:   L=plength(M);
                    597:   for (I=0; I<L; I++) {
                    598:     for (J=0; J<M[I]; J++) {
                    599:       II = I+1; JJ = J+1;
                    600:       V /= (double)bb(M,K,M,II,JJ);
1.29      takayama  601:       /* oxprintf("[%d,%d,%lf]\n",I,J,V);*/
1.1       takayama  602:     }
                    603:   }
                    604:
                    605:   return(V);
                    606: }
1.10      takayama  607: static int printp(int kappa[]) {
1.1       takayama  608:   int i;
1.29      takayama  609:   oxprintf("(");
1.1       takayama  610:   for (i=0; i<M_n; i++) {
1.29      takayama  611:     if (i <M_n-1) oxprintf("%d,",kappa[i]);
                    612:     else oxprintf("%d)",kappa[i]);
1.1       takayama  613:   }
1.13      takayama  614:   return(0);
1.1       takayama  615: }
1.32      takayama  616: #ifdef STANDALONE
1.10      takayama  617: static int printp2(int kappa[]) {
1.1       takayama  618:   int i,ell;
1.29      takayama  619:   oxprintf("(");
1.1       takayama  620:   ell = plength_t(kappa);
                    621:   for (i=0; i<ell+1; i++) {
1.29      takayama  622:     if (i <ell+1-1) oxprintf("%d,",kappa[i]);
                    623:     else oxprintf("%d)",kappa[i]);
1.1       takayama  624:   }
1.13      takayama  625:   return(0);
1.1       takayama  626: }
                    627:
1.10      takayama  628: static int test_beta() {
1.1       takayama  629:   int kappa[M_n0]={2,1,0};
                    630:   int mu1[M_n0]={1,0,0};
                    631:   int mu2[M_n0]={1,1,0};
                    632:   int mu3[M_n0]={2,0,0};
1.29      takayama  633:   printp(kappa); oxprintf(","); printp(mu3); oxprintf(": beta = %lf\n",beta(kappa,mu3));
                    634:   printp(kappa); oxprintf(","); printp(mu1); oxprintf(": beta = %lf\n",beta(kappa,mu1));
1.30      takayama  635:   printp(kappa); oxprintf(","); printp(mu2); oxprintf(": beta = %lf\n",beta(kappa,mu2)); return(0);
1.1       takayama  636: }
1.32      takayama  637: #endif
1.1       takayama  638: /* main() { test_beta(); } */
                    639:
                    640:
                    641: /*
1.12      takayama  642:   cf. w1m.rr
1.1       takayama  643:   matrix hypergeometric by jack
                    644:   N variables, up to degree M.
                    645: */
                    646: /* todo
1.12      takayama  647:    def mhgj(A,B,N,M) {
                    648:    F = 0;
                    649:    P = partition_a(N,M);
                    650:    for (I=0; I<length(P); I++) {
                    651:    K = P[I];
                    652:    F += qk(K,A,B)*jack(K,N);
                    653:    }
                    654:    return(F);
                    655:    }
1.1       takayama  656: */
                    657:
                    658:
                    659: /* The quotient of (3.10) of Koev-Edelman K=kappa, M=mu, SK=k */
1.2       takayama  660: static double q3_10(int K[],int M[],int SK) {
1.1       takayama  661:   extern int Alpha;
                    662:   int Mp[M_m_MAX];
1.33      takayama  663:   //  int ML[M_nmx];
1.3       takayama  664:   int N[M_nmx];
1.1       takayama  665:   int i,R;
                    666:   double T,Q,V,Ur,Vr,Wr;
                    667:   ptrans(M,Mp);
1.33      takayama  668:   for (i=0; i<M_n; i++) {N[i] = M[i];}
1.1       takayama  669:   N[SK-1] = N[SK-1]-1;
                    670:
                    671:   T = SK-Alpha*M[SK-1];
                    672:   Q = T+1;
                    673:   V = Alpha;
                    674:   for (R=1; R<=SK; R++) {
                    675:     Ur = Q-R+Alpha*K[R-1];
                    676:     V *= Ur/(Ur+Alpha-1);
                    677:   }
                    678:   for (R=1; R<=SK-1; R++) {
                    679:     Vr = T-R+Alpha*M[R-1];
                    680:     V *= (Vr+Alpha)/Vr;
                    681:   }
                    682:   for (R=1; R<=M[SK-1]-1; R++) {
                    683:     Wr = Mp[R-1]-T-Alpha*R;
                    684:     V *= (Wr+Alpha)/Wr;
                    685:   }
                    686:   return(V);
                    687: }
                    688:
1.32      takayama  689: #ifdef STANDALONE
1.2       takayama  690: static double q3_5(double A[],double B[],int K[],int I) {
1.1       takayama  691:   extern int Alpha;
                    692:   int Kp[M_m_MAX];
                    693:   double C,D,V,Ej,Fj,Gj,Hj,Lj;
                    694:   int J,P,Q;
                    695:   ptrans(K,Kp);
                    696:   P=A_LEN;; Q = B_LEN;
                    697:   C = -((double)(I-1))/Alpha+K[I-1]-1;
                    698:   D = K[I-1]*Alpha-I;
                    699:
                    700:   V=1;
                    701:
                    702:   for (J=1; J<=P; J++)  {
1.12      takayama  703:     V *= (A[J-1]+C);
1.1       takayama  704:   }
                    705:   for (J=1; J<=Q; J++) {
1.12      takayama  706:     V /= (B[J-1]+C);
1.1       takayama  707:   }
                    708:
                    709:   for (J=1; J<=K[I-1]-1; J++) {
1.12      takayama  710:     Ej = D-J*Alpha+Kp[J-1];
                    711:     Gj = Ej+1;
                    712:     V *= (Gj-Alpha)*Ej/(Gj*(Ej+Alpha));
1.1       takayama  713:   }
                    714:   for (J=1; J<=I-1; J++) {
1.12      takayama  715:     Fj=K[J-1]*Alpha-J-D;
                    716:     Hj=Fj+Alpha;
                    717:     Lj=Hj*Fj;
                    718:     V *= (Lj-Fj)/(Lj+Hj);
1.1       takayama  719:   }
                    720:   return(V);
                    721: }
1.32      takayama  722: #endif
                    723: #ifdef STANDALONE
1.2       takayama  724: static void mtest4() {
1.1       takayama  725:   double A[A_LEN] = {1.5};
                    726:   double B[B_LEN]={6.5};
                    727:   int K[M_n0] = {3,2,0};
                    728:   int I=2;
                    729:   int Ki[M_n0]={3,1,0};
                    730:   double V1,V2;
                    731:   V1=q3_5(A,B,K,I);
                    732:   V2=qk(K,A,B)/qk(Ki,A,B);
1.29      takayama  733:   oxprintf("%lf== %lf?\n",V1,V2);
1.1       takayama  734: }
1.2       takayama  735: static void mtest4b() {
1.1       takayama  736:   int K[M_n0]={3,2,0};
                    737:   int M[M_n0]={2,1,0};
                    738:   int N[M_n0]={2,0};
                    739:   int SK=2;
                    740:   double V1,V2;
                    741:   V1=q3_10(K,M,SK);
                    742:   V2=beta(K,N)/beta(K,M);
1.29      takayama  743:   oxprintf("%lf== %lf?\n",V1,V2);
1.1       takayama  744: }
1.32      takayama  745: #endif
1.1       takayama  746:
                    747: /* main() { mtest4(); mtest4b(); } */
                    748:
                    749: /* nk in (4.1),
1.12      takayama  750:  */
1.2       takayama  751: static int nk(int KK[]) {
1.1       takayama  752:   extern int *Darray;
                    753:   int N,I,Ki;
1.3       takayama  754:   int Kpp[M_nmx];
1.1       takayama  755:   int i;
                    756:   N = plength(KK);
                    757:   if (N == 0) return(0);
                    758:   if (N == 1) return(KK[0]);
                    759:   for (i=0; i<M_n; i++) Kpp[i] = 0;
                    760:   for (I=0; I<N-1; I++) Kpp[I] = KK[I];
                    761:   Ki = KK[N-1];
                    762:   /* K = (Kpp,Ki) */
                    763:   return(Darray[nk(Kpp)]+Ki-1);
                    764: }
1.32      takayama  765: #ifdef STANDALONE
1.2       takayama  766: static int plength2(int P1[],int P2[]) {
1.1       takayama  767:   int S1,S2;
                    768:   S1 = plength(P1); S2 = plength(P2);
                    769:   if (S1 > S2) return(1);
                    770:   else if (S1 == S2) {
                    771:     S1=mysum(P1); S2=mysum(P2);
                    772:     if(S1 > S2) return(1);
                    773:     else if (S1 == S2) return(0);
                    774:     else return(-1);
                    775:   }
                    776:   else return(-1);
                    777: }
1.32      takayama  778: #endif
1.2       takayama  779: static int myeq(int P1[],int P2[]) {
1.1       takayama  780:   int I,L1;
                    781:   if ((L1=plength(P1)) != plength(P2)) return(0);
                    782:   for (I=0; I<L1; I++) {
                    783:     if (P1[I] != P2[I]) return(0);
                    784:   }
                    785:   return(1);
                    786: }
                    787: /*
                    788:   M is a degree, N is a number of variables
                    789:   genDarray(3,3);
                    790:   N(0)=0;
                    791:   N(1)=1;
                    792:   N(2)=2;
                    793:   N(3)=3;
                    794:   N(1,1)=4;  D[1] = 4
                    795:   N(2,1)=5;  D[2] = 5;
                    796:   N(1,1,1)=6; D[4] = 6;
                    797:   still buggy.
                    798: */
                    799:
1.2       takayama  800: static int pListPartition(int M,int N) {
1.1       takayama  801:   extern int M_m;
                    802:   extern int M_kap[];
                    803:   int I;
                    804:   /* initialize */
                    805:   if (M_n != N) {
1.29      takayama  806:     oxprintfe("M_n != N\n"); mh_exit(-1);
1.1       takayama  807:   }
                    808:   M_m = M;
                    809:   /* M_plist = []; */
                    810:   /* end of initialize */
                    811:   (*M_pExec)();  /* exec for 0 */
                    812:   for (I=1; I<=M_n; I++) {
                    813:     pListPartition2(M_m,1,I,M_m);
                    814:   }
                    815:   /* M_plist = reverse(M_plist); */
                    816:   return(1);
                    817: }
                    818:
                    819: /*
                    820:   Enumerate all such that
                    821:   Less >= M_kap[From], ..., M_kap[To],  |(M_kap[From],...,M_kap[To])|<=M,
                    822: */
1.2       takayama  823: static int pListPartition2(int Less,int From,int To, int M) {
1.33      takayama  824:   int I;
1.11      takayama  825:   mh_check_intr(100);
1.1       takayama  826:   if (To < From) {
1.12      takayama  827:     (*M_pExec)(); return(0);
1.1       takayama  828:   }
                    829:   for (I=1; (I<=Less) && (I<=M) ; I++) {
                    830:     M_kap[From-1] = I;
1.33      takayama  831:     pListPartition2(I,From+1,To,M-I);
1.1       takayama  832:   }
                    833:   return(1);
                    834: }
                    835:
                    836: /*
1.33      takayama  837:   Commands to do for each partition are given here.
1.1       takayama  838: */
1.2       takayama  839: static void pExec_0() {
1.1       takayama  840:   if (Debug) {
1.29      takayama  841:     oxprintf("M_kap=");
1.12      takayama  842:     printp(M_kap);
1.29      takayama  843:     oxprintf("\n");
1.1       takayama  844:   }
                    845: }
                    846:
                    847: /* Test.
1.12      takayama  848:    Compare pListPartition(4,3);  genDarray(4,3);
                    849:    Compare pListPartition(5,3);  genDarray(5,3);
1.1       takayama  850:
                    851: */
                    852:
                    853: /*
1.12      takayama  854:   main() {
1.1       takayama  855:   M_pExec = pExec_0;
                    856:   pListPartition(5,3);
1.12      takayama  857:   }
1.1       takayama  858: */
                    859:
                    860:
                    861: /*
                    862:   List all horizontal strips.
                    863:   Kap[0] is not a dummy in C code. !(Start from Kap[1].)
                    864: */
1.2       takayama  865: static int pListHS(int Kap[],int N) {
1.1       takayama  866:   extern int HS_n;
                    867:   extern int HS_mu[];
                    868:   int i;
                    869:   HS_n = N;
                    870:   /* Clear HS_mu. Do not forget when N < M_n  */
                    871:   for (i=0; i<M_n; i++) HS_mu[i] = 0;
1.13      takayama  872:   return(pListHS2(1,N,Kap));
1.1       takayama  873: }
                    874:
1.2       takayama  875: static int pListHS2(int From,int To,int Kap[]) {
1.1       takayama  876:   int More,I;
                    877:   if (To <From) {(*HS_hsExec)(); return(0);}
                    878:   if (From == HS_n) More=0; else More=Kap[From];
                    879:   for (I=Kap[From-1]; I>= More; I--) {
                    880:     HS_mu[From-1] = I;
                    881:     pListHS2(From+1,To,Kap);
                    882:   }
                    883:   return(1);
                    884: }
                    885:
1.2       takayama  886: static void hsExec_0() {
1.32      takayama  887:   /* int i; */
1.29      takayama  888:   if(Debug) {oxprintf("hsExec: "); printp(HS_mu); oxprintf("\n");}
1.1       takayama  889: }
                    890:
                    891: /*
                    892:   pListHS([0,4,2,1],3);
                    893: */
                    894: /*
1.12      takayama  895:   main() {
1.1       takayama  896:   int Kap[3]={4,2,1};
                    897:   HS_hsExec = hsExec_0;
                    898:   pListHS(Kap,3);
1.12      takayama  899:   }
1.1       takayama  900: */
                    901:
                    902: /* The number of partitions <= M, with N parts.
1.12      takayama  903:    (0,0,...,0) is excluded.
1.1       takayama  904: */
                    905: #define aP_pki(i,j) P_pki[(i)*(M+1)+(j)]
1.2       takayama  906: static int pmn(int M,int N) {
1.1       takayama  907:   int Min_m_n,I,K,S,T,i,j;
                    908:   extern int P_pmn;
                    909:   extern int *P_pki;
                    910:   Min_m_n = (M>N?N:M);
                    911:   /* P_pki=newmat(Min_m_n+1,M+1); */
                    912:   P_pki = (int *) mymalloc(sizeof(int)*(Min_m_n+1)*(M+1));
                    913:   for (i=0; i<Min_m_n+1; i++) for (j=0; j<M+1; j++) aP_pki(i,j) = 0;
                    914:   for (I=1; I<=M; I++) aP_pki(1,I) = 1;
                    915:   for (K=1; K<=Min_m_n; K++) aP_pki(K,0) = 0;
                    916:   S = M;
                    917:   for (K=2; K<=Min_m_n; K++) {
                    918:     for (I=1; I<=M; I++) {
                    919:       if (I-K < 0) T=0; else T=aP_pki(K,I-K);
                    920:       aP_pki(K,I) = aP_pki(K-1,I-1)+T;
                    921:       S += aP_pki(K,I);
                    922:     }
                    923:   }
                    924:   P_pmn=S;
                    925:   if (Debug) {
1.29      takayama  926:     oxprintf("P_pmn=%d\n",P_pmn);
1.1       takayama  927:     for (i=0; i<=Min_m_n; i++) {
1.29      takayama  928:       for (j=0; j<=M; j++) oxprintf("%d,",aP_pki(i,j));
                    929:       oxprintf("\n");
1.1       takayama  930:     }
                    931:   }
                    932:   myfree(P_pki); P_pki=NULL;
                    933:   return(S);
                    934: }
                    935:
                    936: /*
1.29      takayama  937:   main() {pmn(4,3); oxprintf("P_pmn=%d\n",P_pmn);}
1.1       takayama  938: */
                    939:
1.2       takayama  940: static int *cloneP(int a[]) {
1.1       takayama  941:   int *p;
                    942:   int i;
                    943:   p = (int *) mymalloc(sizeof(int)*M_n);
                    944:   for (i=0; i<M_n; i++) p[i] = a[i];
                    945:   return(p);
                    946: }
1.10      takayama  947: static int copyP(int p[],int a[]) {
1.1       takayama  948:   int i;
                    949:   for (i=0; i<M_n; i++) p[i] = a[i];
1.13      takayama  950:   return(0);
1.1       takayama  951: }
                    952:
1.2       takayama  953: static void pExec_darray(void) {
1.1       takayama  954:   extern int DR_parray;
                    955:   extern int M_kap[];
                    956:   extern int **Parray;
                    957:   extern int *ParraySize;
                    958:   int *K;
                    959:   pExec_0();
                    960:   K = cloneP(M_kap);
                    961:   Parray[DR_parray] = K;
                    962:   ParraySize[DR_parray] = mysum(K);
                    963:   DR_parray++;
                    964: }
1.10      takayama  965: static int genDarray2(int M,int N) {
1.1       takayama  966:   extern int *Darray;
                    967:   extern int **Parray;
                    968:   extern int DR_parray;
                    969:   extern int M_m;
                    970:   int Pmn,I,J,Ksize,i;
                    971:   int **L;
                    972:   int *Nk;
                    973:   int *K;
1.3       takayama  974:   int Kone[M_nmx];
1.1       takayama  975:
                    976:   M_m = M;
                    977:   Pmn = pmn(M,N)+1;
1.29      takayama  978:   if (Debug) oxprintf("Degree M = %d, N of vars N = %d, Pmn+1=%d\n",M,N,Pmn);
1.1       takayama  979:   Darray=(int *) mymalloc(sizeof(int)*Pmn);
                    980:   for (i=0; i<Pmn; i++) Darray[i] = 0;
                    981:   Parray=(int **) mymalloc(sizeof(int *)*Pmn);
                    982:   for (i=0; i<Pmn; i++) Parray[i] = NULL;
                    983:   ParraySize=(int *) mymalloc(sizeof(int *)*Pmn);
                    984:   for (i=0; i<Pmn; i++) ParraySize[i] = 0;
                    985:   DR_parray=0;
                    986:   M_pExec = pExec_darray;
                    987:   pListPartition(M,N);  /* pExec_darray() is executed for all partitions */
                    988:   L = Parray;
                    989:
                    990:   Nk = (int *) mymalloc(sizeof(int)*(Pmn+1));
                    991:   for (I=0; I<Pmn; I++) Nk[I] = I;
                    992:   for (I=0; I<Pmn; I++) {
1.11      takayama  993:     mh_check_intr(100);
1.12      takayama  994:     K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
                    995:     Ksize = plength(K);
                    996:     if (Ksize >= M_n) {
1.29      takayama  997:       if (Debug) {oxprintfe("Ksize >= M_n\n");}
1.12      takayama  998:       continue;
                    999:     }
                   1000:     for (i=0; i<M_n; i++) Kone[i] = 0;
                   1001:     for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;
                   1002:     for (J=0; J<Pmn; J++) {
                   1003:       if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */
                   1004:     }
1.1       takayama 1005:   }
                   1006:   if (Debug) {
1.29      takayama 1007:     oxprintf("Darray=\n");
                   1008:     for (i=0; i<Pmn; i++) oxprintf("%d\n",Darray[i]);
                   1009:     oxprintf("-----------\n");
1.1       takayama 1010:   }
1.13      takayama 1011:   return(0);
1.1       takayama 1012: }
                   1013:
                   1014:
                   1015: /* main() {  genDarray2(4,3);}  */
                   1016:
                   1017: /* M_beta_0[*] value of beta_{kappa,mu}, M_beta_1[*] N_mu */
1.10      takayama 1018: static int isHStrip(int Kap[],int Nu[]) {
1.1       takayama 1019:   int N1,N2,I,P;
                   1020:   N1 = plength(Kap); N2 = plength(Nu);
                   1021:   if (N2 > N1) return(0);
                   1022:   for (I=0; I<N2; I++) {
                   1023:     if (I >= N1-1) P = 0; else P=Kap[I+1];
                   1024:     if (Kap[I] < Nu[I]) return(0);
                   1025:     if (Nu[I]  < P) return(0);
                   1026:   }
                   1027:   return(1);
                   1028: }
                   1029:
1.2       takayama 1030: static void hsExec_beta(void) {
1.1       takayama 1031:   int *Mu;
                   1032:   int N,Nmu,Nnu,Done,J,K,OK,I,RR;
                   1033:   int Kapt[M_m_MAX];
                   1034:   int Nut[M_m_MAX];
1.3       takayama 1035:   int Nu[M_nmx];
1.1       takayama 1036:   int rrMax;
                   1037:   hsExec_0();
1.29      takayama 1038:   /* oxprintf("M_beta_pt=%a\n",M_beta_pt); */
1.1       takayama 1039:   /* Mu = cdr(vtol(HS_mu)); */
                   1040:   Mu = HS_mu; /* buggy? need cloneP */
                   1041:   if (M_beta_pt == 0) {
                   1042:     M_beta_0[0] = 1; M_beta_1[0] = nk(Mu);
                   1043:     M_beta_pt++; return;
                   1044:   }
                   1045:
                   1046:   N = HS_n;
                   1047:   Nmu = nk(Mu);
                   1048:   M_beta_1[M_beta_pt] = Nmu;
                   1049:   ptrans(M_beta_kap,Kapt);
                   1050:   /* Mu, Nu is exchanged in this code. cf. the K-E paper  */
                   1051:   copyP(Nu,Mu); /* buggy need clone? */
                   1052:   for (I=0; I<N; I++) {
                   1053:     Nu[I]++;
                   1054:     if (!isHStrip(M_beta_kap,Nu)) {Nu[I]--; continue;}
                   1055:     Nnu = nk(Nu);
                   1056:     ptrans(Nu,Nut);
                   1057:     Done=0;
                   1058:     for (J=M_beta_pt-1; J>=0; J--) {
                   1059:       if (M_beta_1[J] == Nnu) {
1.12      takayama 1060:         K=I+1;
                   1061:         if (Debug) {
1.29      takayama 1062:           oxprintf("Found at J=%d, K=%d, q3_10(Kap,Nu,K)=%lf,Nu,Mu= \n",
1.12      takayama 1063:                  J,K,q3_10(M_beta_kap,Nu,K));
1.29      takayama 1064:           printp(Nu); oxprintf("\n");
                   1065:           printp(Mu); oxprintf("\n");
1.12      takayama 1066:         }
                   1067:         /* Check other conditions. See Numata's mail on Dec 24, 2011. */
                   1068:         rrMax = Nu[I]-1;
                   1069:         if ((plength_t(Kapt) < rrMax) || (plength_t(Nut) < rrMax)) {
1.29      takayama 1070:           if (Debug) oxprintf(" is not taken (length). \n");
1.12      takayama 1071:           break;
                   1072:         }
                   1073:         OK=1;
                   1074:         for (RR=0; RR<rrMax; RR++) {
                   1075:           if (Kapt[RR] != Nut[RR]) { OK=0; break;}
                   1076:         }
1.29      takayama 1077:         if (!OK) { if (Debug) oxprintf(" is not taken.\n"); break; }
1.12      takayama 1078:         /* check done. */
                   1079:         M_beta_0[M_beta_pt]=M_beta_0[J]*q3_10(M_beta_kap,Nu,K);
                   1080:         Done = 1; break;
1.1       takayama 1081:       }
                   1082:     }
                   1083:     if (Done) break; else Nu[I]--;
                   1084:   }
                   1085:   if (!Done) {
1.29      takayama 1086:     if (Debug) oxprintf("BUG: not found M_beta_pt=%d.\n",M_beta_pt);
1.13      takayama 1087:     /* M_beta_0[M_beta_pt] = NAN;  error("Not found."); */
1.1       takayama 1088:     M_beta_0[M_beta_pt] = beta(M_beta_kap,Mu);
                   1089:   }
                   1090:   /* Fix the bug of mh.rr */
                   1091:   M_beta_pt++;
                   1092: }
1.10      takayama 1093: static int genBeta(int Kap[]) {
1.1       takayama 1094:   extern double *M_beta_0;
                   1095:   extern int *M_beta_1;
                   1096:   extern int M_beta_pt;
                   1097:   extern int M_beta_kap[];
                   1098:   extern int P_pmn;
1.32      takayama 1099:   int I,N;
1.29      takayama 1100:   if (Debug) {printp(Kap); oxprintf("<-Kappa, P_pmn=%d\n",P_pmn);}
1.1       takayama 1101:   /* M_beta = newmat(2,P_pmn+1); */
                   1102:   M_beta_0 = (double *)mymalloc(sizeof(double)*(P_pmn+1));
1.8       takayama 1103:   M_beta_1 = (int *)mymalloc(sizeof(int)*(P_pmn+1));
1.1       takayama 1104:   M_beta_pt = 0;
                   1105:   for (I=0; I<=P_pmn; I++) {M_beta_0[I] = NAN; M_beta_1[I] = -1;}
                   1106:   N = plength(Kap);
                   1107:   HS_hsExec = hsExec_beta;
                   1108:   copyP(M_beta_kap,Kap);
1.30      takayama 1109:   pListHS(Kap,N); return(0);
1.1       takayama 1110: }
                   1111: /*
                   1112:   genDarray2(4,3);
                   1113:   genBeta([2,2,0]);
                   1114:   genBeta([2,1,1]);
                   1115: */
1.32      takayama 1116: #ifdef STANDALONE
1.10      takayama 1117: static int checkBeta1() {
1.1       takayama 1118:   int Kap[3] = {2,2,0};
                   1119:   int Kap2[3] = {2,1,0};
                   1120:   int I;
                   1121:   int *Mu;
                   1122:   double Beta_km;
                   1123:   genDarray2(4,3);
                   1124:   genBeta(Kap);
                   1125:   for (I=0; I<M_beta_pt; I++) {
                   1126:     Mu = Parray[M_beta_1[I]];
                   1127:     Beta_km = M_beta_0[I];
1.12      takayama 1128:     if (Debug) {
1.29      takayama 1129:       printp(Kap); oxprintf("<--Kap, ");
                   1130:       printp(Mu); oxprintf("<--Mu,");
                   1131:       oxprintf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap,Mu));
1.12      takayama 1132:     }
1.1       takayama 1133:   }
1.29      takayama 1134:   if (Debug) oxprintf("-------------------------------------\n");
1.1       takayama 1135:   genBeta(Kap2);
                   1136:   for (I=0; I<M_beta_pt; I++) {
                   1137:     Mu = Parray[M_beta_1[I]];
                   1138:     Beta_km = M_beta_0[I];
1.12      takayama 1139:     if (Debug) {
1.29      takayama 1140:       printp(Kap2); oxprintf("<--Kap, ");
                   1141:       printp(Mu); oxprintf("<--Mu,");
                   1142:       oxprintf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap2,Mu));
1.12      takayama 1143:     }
1.1       takayama 1144:   }
1.13      takayama 1145:   return(0);
1.1       takayama 1146: }
1.32      takayama 1147: #endif
1.1       takayama 1148: /*
1.12      takayama 1149:   def checkBeta2() {
1.1       takayama 1150:   genDarray2(3,3);
                   1151:   Kap = [2,1,0];
1.29      takayama 1152:   oxprintf("Kap=%a\n",Kap);
1.1       takayama 1153:   genBeta(Kap);
                   1154:   for (I=0; I<M_beta_pt; I++) {
1.12      takayama 1155:   Mu = Parray[M_beta[1][I]];
                   1156:   Beta_km = M_beta[0][I];
1.29      takayama 1157:   oxprintf("Mu=%a,",Mu);
                   1158:   oxprintf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));
1.12      takayama 1159:   }
1.1       takayama 1160:   }
                   1161: */
                   1162:
                   1163: /* main() { checkBeta1(); } */
                   1164:
1.2       takayama 1165: static int psublen(int Kap[],int Mu[]) {
1.1       takayama 1166:   int L1,L2,A,I;
                   1167:   L1 = plength(Kap);
                   1168:   L2 = plength(Mu);
                   1169:   if (L2 > L1) myerror("psub, length mismatches.");
                   1170:   A = 0;
                   1171:   for (I=0; I<L2; I++) {
                   1172:     if (Kap[I] < Mu[I]) myerror("psub, not Kap >= Mu");
                   1173:     A += Kap[I]-Mu[I];
                   1174:   }
                   1175:   for (I=L2; I<L1; I++) A += Kap[I];
                   1176:   return(A);
                   1177: }
                   1178:
                   1179:
                   1180: /* Table of Jack polynomials
1.12      takayama 1181:    Jack[1]* one variable.
                   1182:    Jack[2]* two variables.
1.1       takayama 1183:    ...
1.12      takayama 1184:    Jack[M_n]* n variables.
                   1185:    Jack[P][J]*
                   1186:    D^J(P variables jack of p variables). Example. J=001 d_1, 010 d_2, 100 d_3
                   1187:    0<=J<=2^{M_n}-1
                   1188:    Jack[P][J][nk(Kappa)]  Jack_Kappa, Kappa is a partition.
                   1189:    0<=nk(Kappa)<=pmn(M_m,M_n)
1.1       takayama 1190: */
                   1191:
                   1192: #define aM_jack(i,j,k) ((M_jack[i])[(j)*(Pmn+1)+(k)])
1.10      takayama 1193: static int genJack(int M,int N) {
1.1       takayama 1194:   extern double **M_jack;
                   1195:   extern int M_2n;
                   1196:   extern int P_pmn;
                   1197:   extern int *M_beta_1;
                   1198:   int Pmn,I,J,K,L,Nv,H,P;
                   1199:   int *Kap,*Mu;
                   1200:   double Jack,Beta_km;
1.32      takayama 1201:   int Nk,JJ, two_to_I;
1.29      takayama 1202:   if (Debug) oxprintf("genJack(%d,%d)\n",M,N);
1.3       takayama 1203:   M_jack = (double **) mymalloc(sizeof(double *)*(N+2));
1.1       takayama 1204:   M_2n = imypower(2,N);
                   1205:   Pmn = pmn(M,N);  /*P_pmn is initializeded.
                   1206:                      Warning. It is reset when pmn is called.*/
                   1207:   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 1208:   M_jack[N+1] = NULL;
1.1       takayama 1209:   genDarray2(M,N); /* Darray, Parray is initialized */
                   1210:   for (I=1; I<=N; I++) aM_jack(I,0,0) = 1;
                   1211:   if (M_df) {
                   1212:     for (I=1; I<=N; I++) {
                   1213:       for (J=1; J<M_2n; J++) aM_jack(I,J,0) = 0;
                   1214:     }
                   1215:   }
                   1216:
1.3       takayama 1217:   /* N must satisfies N > 0 */
1.1       takayama 1218:   for (K=1; K<=M; K++) {
                   1219:     aM_jack(1,0,K) = jack1(K);
                   1220:     if (M_df) {
                   1221:       aM_jack(1,1,K) = jack1diff(K); /* diff(jack([K],1),x_1); */
                   1222:       for (J=2; J<M_2n; J++) aM_jack(1,J,K) = 0;
                   1223:     }
                   1224:   }
1.32      takayama 1225:   for (I=1; I<=N; I++) {   two_to_I = imypower(2,I);
1.1       takayama 1226:     for (K=M+1; K<Pmn+1; K++) {
                   1227:       aM_jack(I,0,K) = NAN;
                   1228:       if (M_df) {
                   1229:         for (J=1; J<M_2n; J++) {
1.32      takayama 1230:           if (J >= two_to_I) aM_jack(I,J,K) = 0; /* J >= 2^I */
1.12      takayama 1231:           else aM_jack(I,J,K) = NAN;
1.1       takayama 1232:         }
                   1233:       }
                   1234:     }
                   1235:   }
                   1236:
                   1237:   /* Start to evaluate the entries of the table */
                   1238:   for (K=1; K<=Pmn; K++) {
                   1239:     Kap = Parray[K]; /* bug. need copy? */
                   1240:     L = plength(Kap);
                   1241:     for (I=1; I<=L-1; I++) {
                   1242:       aM_jack(I,0,K) = 0;
                   1243:       if (M_df) {
                   1244:         for (J=1; J<M_2n; J++) aM_jack(I,J,K) = 0;
                   1245:       }
                   1246:     }
1.29      takayama 1247:     if (Debug) {oxprintf("Kappa="); printp(Kap);}
1.1       takayama 1248:     /* Enumerate horizontal strip of Kappa */
                   1249:     genBeta(Kap);  /* M_beta_pt stores the number of hs */
                   1250:     /* Nv is the number of variables */
                   1251:     for (Nv = (L==1?2:L); Nv <= N; Nv++) {
                   1252:       Jack = 0;
                   1253:       for (H=0; H<M_beta_pt; H++) {
                   1254:         Nk = M_beta_1[H];
                   1255:         Mu = Parray[Nk];
1.12      takayama 1256:         if (UseTable) {
                   1257:           Beta_km = M_beta_0[H];
                   1258:         }else{
                   1259:           Beta_km = beta(Kap,Mu);
                   1260:           /* do not use the M_beta table. It's buggy. UseTable is experimental.*/
                   1261:         }
1.29      takayama 1262:         if (Debug) {oxprintf("Nv(number of variables)=%d, Beta_km=%lf, Mu=",Nv,Beta_km);
                   1263:           printp(Mu); oxprintf("\n");}
1.1       takayama 1264:         P = psublen(Kap,Mu);
                   1265:         Jack += aM_jack(Nv-1,0,Nk)*Beta_km*xval(Nv,P); /* util_v(x,[Nv])^P;*/
1.29      takayama 1266:         if (Debug) oxprintf("xval(%d,%d)=%lf\n",Nv,P,xval(Nv,P));
1.1       takayama 1267:       }
                   1268:       aM_jack(Nv,0,K) = Jack;
                   1269:       if (M_df) {
                   1270:         /* The case of M_df > 0. */
                   1271:         for (J=1; J<M_2n; J++) {
1.12      takayama 1272:           mh_check_intr(100);
                   1273:           Jack = 0;
                   1274:           for (H=0; H<M_beta_pt; H++) {
                   1275:             Nk = M_beta_1[H];
                   1276:             Mu = Parray[Nk];
                   1277:             if (UseTable) {
                   1278:               Beta_km = M_beta_0[H];
                   1279:             }else{
                   1280:               Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */
                   1281:             }
1.29      takayama 1282:             if (Debug) {oxprintf("M_df: Nv(number of variables)=%d, Beta_km=%lf, Mu= ",Nv,Beta_km);
                   1283:               printp(Mu); oxprintf("\n"); }
1.12      takayama 1284:             P = psublen(Kap,Mu);
                   1285:             if (J & (1 << (Nv-1))) {
                   1286:               JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */
                   1287:               if (P != 0) {
                   1288:                 Jack += aM_jack(Nv-1,JJ,Nk)*Beta_km*P*xval(Nv,P-1);
                   1289:               }
                   1290:             }else{
                   1291:               Jack += aM_jack(Nv-1,J,Nk)*Beta_km*xval(Nv,P);
                   1292:             }
                   1293:           }
                   1294:           aM_jack(Nv,J,K) = Jack;
1.29      takayama 1295:           if (Debug) oxprintf("aM_jack(%d,%d,%d) = %lf\n",Nv,J,K,Jack);
1.1       takayama 1296:         } /* end of J loop */
                   1297:       }
                   1298:     }
1.30      takayama 1299:   } return(0);
1.1       takayama 1300: }
                   1301:
1.32      takayama 1302: #ifdef STANDALONE
1.1       takayama 1303: /* checkJack1(3,3)
1.12      takayama 1304:  */
1.10      takayama 1305: static int checkJack1(int M,int N) {
1.1       takayama 1306:   int I,K;
                   1307:   extern int P_pmn;
                   1308:   extern double M_x[];
                   1309:   int Pmn; /* used in aM_jack */
                   1310:   /* initialize x vars. */
                   1311:   for (I=1; I<=N; I++) {
                   1312:     M_x[I-1] = ((double)I)/10.0;
                   1313:   }
                   1314:   genJack(M,N);
                   1315:   Pmn = P_pmn;
                   1316:   for (I=1; I<=N; I++) {
                   1317:     for (K=0; K<=P_pmn; K++) {
                   1318:       printp(Parray[K]);
1.29      takayama 1319:       oxprintf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
1.1       takayama 1320:     }
                   1321:   }
1.29      takayama 1322:   for (I=1; I<=N; I++) oxprintf("%lf, ",M_x[I-1]);
                   1323:   oxprintf("<--x\n");
1.13      takayama 1324:   return(0);
1.1       takayama 1325: }
                   1326: /*main() {  checkJack1(3,3);  }*/
                   1327:
                   1328:
1.10      takayama 1329: static int checkJack2(int M,int N) {
1.1       takayama 1330:   int I,K,J;
                   1331:   extern int P_pmn;
                   1332:   extern double M_x[];
1.10      takayama 1333:   extern int M_df;
1.1       takayama 1334:   int Pmn; /* used in aM_jack */
                   1335:   M_df=1;
                   1336:   /* initialize x vars. */
                   1337:   for (I=1; I<=N; I++) {
                   1338:     M_x[I-1] = ((double)I)/10.0;
                   1339:   }
                   1340:   genJack(M,N);
                   1341:   Pmn = P_pmn;
                   1342:   for (I=1; I<=N; I++) {
                   1343:     for (K=0; K<=P_pmn; K++) {
                   1344:       printp(Parray[K]);
1.29      takayama 1345:       oxprintf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
1.1       takayama 1346:     }
                   1347:   }
1.29      takayama 1348:   for (I=1; I<=N; I++) oxprintf("%lf, ",M_x[I-1]);
                   1349:   oxprintf("<--x\n");
1.1       takayama 1350:
                   1351:   for (I=1; I<=N; I++) {
                   1352:     for (K=0; K<=P_pmn; K++) {
                   1353:       for (J=0; J<M_2n; J++) {
1.12      takayama 1354:         printp(Parray[K]);
1.29      takayama 1355:         oxprintf("<--Kap, Nv=%d,J(diff)=%d, D^J Jack=%lf\n",
1.12      takayama 1356:                I,J,aM_jack(I,J,K));
                   1357:       }
                   1358:     }
1.1       takayama 1359:   }
1.13      takayama 1360:   return(0);
1.1       takayama 1361: }
                   1362:
                   1363: /* main() { checkJack2(3,3); } */
1.32      takayama 1364: #endif
1.1       takayama 1365:
                   1366: double mh_t(double A[A_LEN],double B[B_LEN],int N,int M) {
                   1367:   double F,F2;
                   1368:   extern int M_df;
                   1369:   extern int P_pmn;
                   1370:   extern double *M_qk;
                   1371:   extern double M_rel_error;
1.15      takayama 1372:   extern int M_m;
1.16      takayama 1373:   extern int M_m_estimated_approx_deg;
                   1374:   extern double M_assigned_series_error;
1.1       takayama 1375:   int Pmn;
                   1376:   int K;
                   1377:   int *Kap;
                   1378:   int size;
1.15      takayama 1379:   int i;
                   1380:   double partial_sum[M_m_MAX+1];
1.16      takayama 1381:   double iv;
                   1382:   double serror;
1.1       takayama 1383:   F = 0; F2=0;
                   1384:   M_df=1;
                   1385:   genJack(M,N);
1.8       takayama 1386:   M_qk = (double *)mymalloc(sizeof(double)*(P_pmn+1)); /* found a bug. */
1.1       takayama 1387:   Pmn = P_pmn;
                   1388:   size = ParraySize[P_pmn];
                   1389:   for (K=0; K<=P_pmn; K++) {
1.11      takayama 1390:     mh_check_intr(100);
1.12      takayama 1391:     Kap = Parray[K];
                   1392:     M_qk[K] = qk(Kap,A,B);
                   1393:     F += M_qk[K]*aM_jack(N,0,K);
                   1394:     if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);
1.29      takayama 1395:     if (Debug) oxprintf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);
                   1396:     if (Debug && (ParraySize[K] == size)) oxprintf("M_qk[K]=%lg, aM_jack=%lg\n",M_qk[K],aM_jack(N,0,K));
1.1       takayama 1397:   }
                   1398:   M_rel_error = F-F2;
1.15      takayama 1399:
1.16      takayama 1400:   M_m_estimated_approx_deg = -1; serror=1;
1.15      takayama 1401:   for (i=0; i<=M_m; i++) {
                   1402:     partial_sum[i] = 0.0; partial_sum[i+1] = 0.0;
                   1403:     for (K=0; K<=P_pmn; K++) {
                   1404:       if (ParraySize[K] == i) partial_sum[i] += M_qk[K]*aM_jack(N,0,K);
                   1405:     }
                   1406:     if (i>0) partial_sum[i] += partial_sum[i-1];
1.31      takayama 1407:     if (i>0) serror = myabs((partial_sum[i]-partial_sum[i-1])/partial_sum[i-1]);
1.16      takayama 1408:     if ((i>0)&&(M_m_estimated_approx_deg < 0)&&(serror<M_assigned_series_error)) {
                   1409:       M_m_estimated_approx_deg = i; break;
                   1410:     }
                   1411:   }
                   1412:   if (M_m_estimated_approx_deg < 0) {
                   1413:     M_m_estimated_approx_deg = M_m+mymin(5,mymax(1,(int)log(serror/M_assigned_series_error))); /* Heuristic */
1.15      takayama 1414:   }
                   1415:   /*
                   1416:   for (K=0; K<=P_pmn; K++) {
1.29      takayama 1417:     oxprintf("Kappa="); for (i=0; i<N; i++) oxprintf("%d ",Parray[K][i]); oxprintf("\n");
                   1418:     oxprintf("ParraySize(%d)=%d (|kappa|),   M_m=%d\n",K,ParraySize[K],M_m);
1.15      takayama 1419:   }
                   1420:   for (i=0; i<=M_m; i++) {
1.29      takayama 1421:     oxprintf("partial_sum[%d]=%lg\n",i,partial_sum[i]);
1.15      takayama 1422:   }
                   1423:   */
1.16      takayama 1424:   M_estimated_X0g = X0g;
                   1425:   iv=myabs(F*iv_factor());
                   1426:   if (iv < M_x0value_min) M_estimated_X0g = X0g*mymax(2,log(log(1/iv)));   /* This is heuristic */
1.19      takayama 1427:   M_estimated_X0g = mymin(M_estimated_X0g,M_X0g_bound);
1.16      takayama 1428:   M_mh_t_success = 1;
1.19      takayama 1429:   if (M_estimated_X0g != X0g) M_mh_t_success=0;
                   1430:   if (M_m_estimated_approx_deg > M_m) M_mh_t_success=0;
1.16      takayama 1431:
1.19      takayama 1432:   M_series_error = serror;
                   1433:   M_recommended_abserr = iv*M_assigned_series_error;
1.27      takayama 1434:   M_recommended_relerr = M_series_error;
1.25      takayama 1435:
                   1436:   if (M_show_autosteps) {
1.29      takayama 1437:     oxprintf("%%%%serror=%lg, M_assigned_series_error=%lg, M_m_estimated_approx_deg=%d,M_m=%d\n",serror,M_assigned_series_error,M_m_estimated_approx_deg,M_m);
                   1438:     oxprintf("%%%%x0value_min=%lg, x0g_bound=%lg\n",M_x0value_min, M_X0g_bound);
                   1439:     oxprintf("%%%%F=%lg,Ef=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),M_estimated_X0g,X0g);
                   1440:     oxprintfe("%%%%(stderr) serror=%lg, M_assigned_series_error=%lg, M_m_estimated_approx_deg=%d,M_m=%d\n",serror,M_assigned_series_error,M_m_estimated_approx_deg,M_m);
                   1441:     oxprintfe("%%%%(stderr) x0value_min=%lg, x0g_bound=%lg\n",M_x0value_min, M_X0g_bound);
1.40    ! takayama 1442:     oxprintfe("%%%%(stderr) F=%lg,Ef=%lg,iv=|F*Ef|=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),iv,M_estimated_X0g,X0g);
1.25      takayama 1443:   }
1.16      takayama 1444:
1.19      takayama 1445:   M_mh_t_value=F;
1.1       takayama 1446:   return(F);
                   1447: }
                   1448: double mh_t2(int J) {
                   1449:   extern double *M_qk;
                   1450:   double F;
                   1451:   int K;
                   1452:   int Pmn;
                   1453:   extern int P_pmn;
1.3       takayama 1454:   if (M_qk == NULL) {myerror("Call mh_t first."); mh_exit(-1); }
1.1       takayama 1455:   F = 0;
                   1456:   Pmn = P_pmn;
                   1457:   for (K=0; K<P_pmn; K++) {
1.12      takayama 1458:     F += M_qk[K]*aM_jack(M_n,J,K);
1.1       takayama 1459:   }
                   1460:   return(F);
                   1461: }
                   1462:
1.32      takayama 1463: #ifdef STANDALONE
1.10      takayama 1464: static int mtest1b() {
1.1       takayama 1465:   double A[1] = {1.5};
                   1466:   double B[1] = {1.5+5};
                   1467:   int I,N,M,J;
                   1468:   double F;
                   1469:   N=3; M=6;
                   1470:   for (I=1; I<=N; I++) {
                   1471:     M_x[I-1] = ((double)I)/10.0;
                   1472:   }
                   1473:   mh_t(A,B,N,M);
                   1474:   for (J=0; J<M_2n; J++) {
1.12      takayama 1475:     F=mh_t2(J);
1.29      takayama 1476:     oxprintf("J=%d, D^J mh_t=%lf\n",J,F);
1.1       takayama 1477:   }
1.30      takayama 1478:   return(0);
1.1       takayama 1479: }
                   1480:
                   1481: /* main() { mtest1b(); }*/
1.32      takayama 1482: #endif
1.1       takayama 1483:
                   1484:
                   1485:
                   1486: #define TEST 1
                   1487: #ifndef TEST
                   1488:
                   1489: #endif
                   1490:
                   1491: /****** from mh-n.c *****/
                   1492:
                   1493: #define SMAX 4096
1.29      takayama 1494: #define inci(i) { i++; if (i >= argc) { oxprintfe("Option argument is not given.\n"); return(NULL); }}
1.1       takayama 1495:
1.2       takayama 1496: static int imypower(int x,int n) {
1.1       takayama 1497:   int i;
                   1498:   int v;
1.3       takayama 1499:   if (n < 0) {myerror("imypower"); mh_exit(-1);}
1.1       takayama 1500:   v = 1;
                   1501:   for (i=0; i<n; i++) v *= x;
                   1502:   return(v);
                   1503: }
                   1504:
1.11      takayama 1505: #ifdef STANDALONE2
1.32      takayama 1506: int main(int argc,char *argv[]) {
1.3       takayama 1507:   mh_exit(MH_RESET_EXIT);
1.12      takayama 1508:   /*  jk_main(argc,argv);
1.29      takayama 1509:       oxprintf("second run.\n"); */
1.2       takayama 1510:   jk_main(argc,argv);
1.17      takayama 1511:   return(0);
1.2       takayama 1512: }
1.3       takayama 1513: #endif
                   1514:
                   1515: struct MH_RESULT *jk_main(int argc,char *argv[]) {
1.16      takayama 1516:   int i;
                   1517:   struct MH_RESULT *ans;
                   1518:   extern int M_automatic;
                   1519:   extern int M_mh_t_success;
                   1520:   extern double M_estimated_X0g;
                   1521:   extern int M_m_estimated_approx_deg;
                   1522:   for (i=1; i<argc; i++) {
                   1523:     if (strcmp(argv[i],"--automatic")==0) {
                   1524:       inci(i);
                   1525:       sscanf(argv[i],"%d",&M_automatic);
                   1526:       break;
                   1527:     }
                   1528:   }
                   1529:   ans=jk_main2(argc,argv,0,0.0,0);
                   1530:   if (!M_automatic) return(ans);
                   1531:   if (M_mh_t_success) return(ans);
                   1532:   while (!M_mh_t_success) {
                   1533:     ans=jk_main2(argc,argv,1,M_estimated_X0g,M_m_estimated_approx_deg);
                   1534:   }
                   1535:   return(ans);
                   1536: }
                   1537:
                   1538: struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree) {
1.32      takayama 1539:   // double *y0;
                   1540:   //  double x0,xn;
                   1541:   // double ef;
                   1542:
                   1543:   int i,j; // int i,j,rank;
1.35      takayama 1544:   double a[A_LEN]; double b[B_LEN];
1.1       takayama 1545:   extern double M_x[];
                   1546:   extern double *Beta;
                   1547:   extern int M_2n;
1.16      takayama 1548:   extern int M_mh_t_success;
1.3       takayama 1549:   char swork[1024];
                   1550:   struct MH_RESULT *ans=NULL;
                   1551:   struct SFILE *ofp = NULL;
                   1552:   int idata=0;
                   1553:   JK_byFile = 1;
                   1554:   jk_initializeWorkArea();
1.1       takayama 1555:   UseTable = 1;
1.3       takayama 1556:   Mapprox=6;
1.1       takayama 1557:   for (i=1; i<argc; i++) {
1.12      takayama 1558:     if (strcmp(argv[i],"--idata")==0) {
                   1559:       inci(i);
                   1560:       setParam(argv[i]); idata=1;
                   1561:     }else if (strcmp(argv[i],"--degree")==0) {
                   1562:       inci(i);
                   1563:       sscanf(argv[i],"%d",&Mapprox);
                   1564:     }else if (strcmp(argv[i],"--x0")==0) {
                   1565:       inci(i);
                   1566:       sscanf(argv[i],"%lg",&X0g);
                   1567:     }else if (strcmp(argv[i],"--notable")==0) {
                   1568:       UseTable = 0;
                   1569:     }else if (strcmp(argv[i],"--debug")==0) {
                   1570:       Debug = 1;
                   1571:     }else if (strcmp(argv[i],"--help")==0) {
                   1572:       usage(); return(0);
                   1573:     }else if (strcmp(argv[i],"--bystring")==0) {
1.29      takayama 1574:       if (idata) {oxprintfe("--bystring must come before --idata option.\n"); mh_exit(-1);}
1.12      takayama 1575:       JK_byFile = 0;
1.16      takayama 1576:     }else if (strcmp(argv[i],"--automatic")==0) {
                   1577:       inci(i); /* ignore, in this function */
1.23      takayama 1578:     }else if (strcmp(argv[i],"--assigned_series_error")==0) {
1.16      takayama 1579:       inci(i);
                   1580:       sscanf(argv[i],"%lg",&M_assigned_series_error);
                   1581:     }else if (strcmp(argv[i],"--x0value_min")==0) {
                   1582:       inci(i);
                   1583:       sscanf(argv[i],"%lg",&M_x0value_min);
1.12      takayama 1584:     }else {
1.29      takayama 1585:       oxprintfe("Unknown option %s\n",argv[i]);
1.12      takayama 1586:       usage();
                   1587:       return(NULL);
                   1588:     }
1.1       takayama 1589:   }
1.16      takayama 1590:   if (!idata) setParam(NULL);
                   1591:   if (automode) {
                   1592:     Mapprox = newDegree;
                   1593:     X0g = newX0g;
                   1594:   }
1.3       takayama 1595:
                   1596:   /* Initialize global variables */
                   1597:   M_n = Mg;
                   1598:   HS_n=M_n;
1.16      takayama 1599:   if (!JK_byFile) {
                   1600:     ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));
                   1601:     ans->message = NULL;
1.19      takayama 1602:     ans->t_success = 0;
                   1603:     ans->series_error = 1.0e+10;
                   1604:     ans->recommended_abserr = 1.0e-10;
1.16      takayama 1605:   }
1.3       takayama 1606:   else ans = NULL;
1.26      takayama 1607:   if (M_automatic) {
                   1608:     /* Differentiation can be M_m in the bit pattern in the M_n variable case.*/
                   1609:     if (M_n > Mapprox) Mapprox=M_n;
                   1610:   }
1.3       takayama 1611:   /* Output by a file=stdout */
1.34      takayama 1612:   ofp = mh_fopen("stdout","w",JK_byFile);
1.1       takayama 1613:
1.3       takayama 1614:   sprintf(swork,"%%%%Use --help option to see the help.\n"); mh_fputs(swork,ofp);
                   1615:   sprintf(swork,"%%%%Mapprox=%d\n",Mapprox); mh_fputs(swork,ofp);
1.1       takayama 1616:   if (M_n != Mg) {
1.12      takayama 1617:     myerror("Mg must be equal to M_n\n"); mh_exit(-1);
1.1       takayama 1618:   }
1.8       takayama 1619:   if (Debug) showParam(NULL,1);
1.40    ! takayama 1620:   setM_x();
1.19      takayama 1621:
                   1622:   M_beta_i_x_o2_max=myabs(M_x[0]/2);
                   1623:   if (M_n <= 1) M_beta_i_beta_j_min = myabs(Beta[0]);
                   1624:   else M_beta_i_beta_j_min = myabs(Beta[1]-Beta[0]);
                   1625:   for (i=0; i<M_n; i++) {
                   1626:     if (myabs(M_x[i]/2) > M_beta_i_x_o2_max) M_beta_i_x_o2_max = myabs(M_x[i]/2);
                   1627:     for (j=i+1; j<M_n; j++) {
                   1628:       if (myabs(Beta[i]-Beta[j]) < M_beta_i_beta_j_min)
                   1629:         M_beta_i_beta_j_min = myabs(Beta[i]-Beta[j]);
                   1630:     }
                   1631:   }
                   1632:
1.36      takayama 1633:   if ((P_pFq != A_LEN) || (Q_pFq != B_LEN)) {
                   1634:     oxprintfe("It must be P_pFq == A_LEN and Q_pFq == B_LEN in this version. %s\n","");
                   1635:     mh_exit(-1);
                   1636:   }
                   1637:   oxprintfe("%%%%(stderr) Orig_1F1=%d\n",Orig_1F1);
                   1638:   if ((P_pFq == 1) && (Q_pFq == 1) && (Orig_1F1)) {
                   1639:     A_pFq[0] = a[0] = ((double)Mg+1.0)/2.0;
                   1640:     B_pFq[0] = b[0] = ((double)Mg+1.0)/2.0 + ((double) (*Ng))/2.0; /* bug, double check */
                   1641:     if (Debug) oxprintf("Calling mh_t with ([%lf],[%lf],%d,%d)\n",a[0],b[0],M_n,Mapprox);
                   1642:   }else{
                   1643:     for (i=0; i<P_pFq; i++) a[i] = A_pFq[i];
                   1644:     for (i=0; i<Q_pFq; i++) b[i] = B_pFq[i];
                   1645:   }
1.1       takayama 1646:   mh_t(a,b,M_n,Mapprox);
1.19      takayama 1647:   if ((!M_mh_t_success) && M_automatic) {
1.16      takayama 1648:     jk_freeWorkArea();
                   1649:     return NULL;
                   1650:   }
1.1       takayama 1651:   if (imypower(2,M_n) != M_2n) {
1.12      takayama 1652:     sprintf(swork,"M_n=%d,M_2n=%d\n",M_n,M_2n); mh_fputs(swork,ofp);
                   1653:     myerror("2^M_n != M_2n\n"); mh_exit(-1);
1.1       takayama 1654:   }
1.3       takayama 1655:   sprintf(swork,"%%%%M_rel_error=%lg\n",M_rel_error); mh_fputs(swork,ofp);
1.1       takayama 1656:   for (j=0; j<M_2n; j++) {
1.12      takayama 1657:     Iv[j] = mh_t2(j);
1.1       takayama 1658:   }
                   1659:   Ef = iv_factor();
1.8       takayama 1660:   showParam(ofp,0);
1.3       takayama 1661:
                   1662:   /* return the result */
1.16      takayama 1663:   if (!JK_byFile) {
1.12      takayama 1664:     ans->x = X0g;
                   1665:     ans->rank = imypower(2,Mg);
                   1666:     ans->y = (double *)mymalloc(sizeof(double)*(ans->rank));
                   1667:     for (i=0; i<ans->rank; i++) (ans->y)[i] = Iv[i];
                   1668:     ans->size=1;
                   1669:     ans->sfpp = (struct SFILE **)mymalloc(sizeof(struct SFILE *)*(ans->size));
                   1670:     (ans->sfpp)[0] = ofp;
1.19      takayama 1671:
                   1672:     ans->t_success = M_mh_t_success;
                   1673:     ans->series_error = M_series_error;
                   1674:     ans->recommended_abserr = M_recommended_abserr;
1.3       takayama 1675:   }
1.29      takayama 1676:   if (Debug) oxprintf("jk_freeWorkArea() starts\n");
1.3       takayama 1677:   jk_freeWorkArea();
1.29      takayama 1678:   if (Debug) oxprintf("jk_freeWorkArea() has finished.\n");
1.3       takayama 1679:   return(ans);
1.1       takayama 1680: }
                   1681:
1.10      takayama 1682: static int usage() {
1.29      takayama 1683:   oxprintfe("Usages:\n");
1.37      takayama 1684: #ifdef C_2F1
                   1685:   oxprintfe("hgm_jack-n-2f1");
                   1686: #else
                   1687:   oxprintfe("hgm_jack-n    ");
                   1688: #endif
                   1689:   oxprintfe(" [--idata input_data_file --x0 x0 --degree approxm]\n");
1.29      takayama 1690:   oxprintfe("           [--automatic n --assigned_series_error e --x0value_min e2]\n");
                   1691:   oxprintfe("\nThe command hgm_jack-n [options] generates an input for hgm_w-n, Pr({y | y<xmax}), which is the cumulative distribution function of the largest root of the m by m Wishart matrices with n degrees of freedom and the covariantce matrix sigma.\n");
                   1692:   oxprintfe("The hgm_jack-n uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");
                   1693:   oxprintfe("The degree of the approximation (Mapprox) is given by the --degree option.\n");
                   1694:   oxprintfe("Parameters are specified by the input_data_file. Otherwise, default values are used.\n\n");
                   1695:   oxprintfe("The format of the input_data_file: (The orders of the input data must be kept.)\n");
                   1696:   oxprintfe(" Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\n");
                   1697:   oxprintfe(" (Add a comment line %%Ng= before the data Ng to check the number of beta.)\n");
                   1698:   oxprintfe(" X0g: starting value of x(when --x0 option is used, this value is used)\n");
                   1699:   oxprintfe(" Iv: initial values at X0g*Beta (see our paper how to order them), are evaluated in this program. Give zeros or the symbol * to skip rank many inputs.\n");
                   1700:   oxprintfe(" Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");
                   1701:   oxprintfe(" Hg: h (step size) which is for hgm_w-n, \n");
                   1702:   oxprintfe(" Dp: output data is stored in every Dp steps when output_data_file is specified. This is for hgm_w-n.\n");
                   1703:   oxprintfe(" Xng: terminating value of x. This is for hgm_w-n.\n");
                   1704:   oxprintfe("Optional parameters automatic, ... are interpreted by a parser. See setParam() in jack-n.c and Testdata/tmp-idata2.txt as an example. Optional paramters are given as %%parameter_name=value  Lines starting with %%%% or # are comment lines.\n");
                   1705:   oxprintfe("Parameters are redefined when they appear more than once in the idata file and the command line options.\n\n");
                   1706:   oxprintfe("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");
                   1707:   oxprintfe("An example format of the input_data_file can be obtained by executing hgm_jack-n with no option. When there is no --idata file, all options are ignored.\n");
                   1708:   oxprintfe("By --automatic option, X0g and degree are automatically determined from assigend_series_error. The current strategy is described in mh_t in jack-n.c\n");
                   1709:   oxprintfe("Default values for the papameters of the automatic mode: automatic=%d, assigned_series_error=%lg, x0value_min=%lg\n",M_automatic,M_assigned_series_error,M_x0value_min);
1.37      takayama 1710: #ifdef C_2F1
                   1711:   oxprintfe("The parameters a,b,c of 2F1 are given by %%p_pFq=2, a,b  and  %%q_pFq=1, c\nNg is ignored.\n");
                   1712: #endif
1.29      takayama 1713:   oxprintfe("Todo: automatic mode throws away the table of Jack polynomials of the previous degrees and reevaluate them. They should be kept.\n");
                   1714:   oxprintfe("\nExamples:\n");
                   1715:   oxprintfe("[1] ./hgm_jack-n \n");
                   1716:   oxprintfe("[2] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --degree 15  --automatic 0\n");
                   1717:   oxprintfe("[3] ./hgm_jack-n --idata Testdata/tmp-idata2.txt --degree 15 >test2.txt\n");
                   1718:   oxprintfe("    ./hgm_w-n --idata test2.txt --gnuplotf test-g\n");
                   1719:   oxprintfe("    gnuplot -persist <test-g-gp.txt\n");
                   1720:   oxprintfe("[4] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --automatic 1 --assigned_series_error=1e-12\n");
                   1721:   oxprintfe("[5] ./hgm_jack-n --idata Testdata/tmp-idata4.txt\n");
1.37      takayama 1722: #ifdef C_2F1
                   1723:   oxprintfe("Todo for 2F1: example for hgm_jack-n-2f1 has not been written.\niv_factor? Ef?");
                   1724: #endif
1.13      takayama 1725:   return(0);
1.1       takayama 1726: }
                   1727:
1.10      takayama 1728: static int setParamDefault() {
1.1       takayama 1729:   int rank;
                   1730:   int i;
1.3       takayama 1731:   Mg = M_n_default ;
1.1       takayama 1732:   rank = imypower(2,Mg);
                   1733:   Beta = (double *)mymalloc(sizeof(double)*Mg);
                   1734:   for (i=0; i<Mg; i++) Beta[i] = 1.0+i;
                   1735:   Ng = (double *)mymalloc(sizeof(double)); *Ng = 3.0;
                   1736:   Iv = (double *)mymalloc(sizeof(double)*rank);
                   1737:   Iv2 = (double *)mymalloc(sizeof(double)*rank);
                   1738:   for (i=0; i<rank; i++) Iv[i] = 0;
                   1739:   Ef = 0;
                   1740:   Ef2 = 0.01034957388338225707;
                   1741:   if (M_n == 2) {
                   1742:     Iv2[0] = 1.58693;
                   1743:     Iv2[1] = 0.811369;
                   1744:     Iv2[2] = 0.846874;
                   1745:     Iv2[3] = 0.413438;
                   1746:   }
                   1747:   X0g = (Beta[0]/Beta[Mg-1])*0.5;
                   1748:   Hg = 0.001;
                   1749:   Dp = 1;
1.38      takayama 1750:   if ((P_pFq == 1) && (Q_pFq == 1)) {
                   1751:     Xng = 10.0;
                   1752:   }else {
                   1753:        Xng=0.25;
                   1754:        for (i=0; i<A_LEN; i++) A_pFq[i] = (i+1)/5.0;
                   1755:        for (i=0; i<B_LEN; i++) B_pFq[i] = (A_LEN+i+1)/7.0;
                   1756:   }
1.13      takayama 1757:   return(0);
1.1       takayama 1758: }
                   1759:
1.10      takayama 1760: static int next(struct SFILE *sfp,char *s,char *msg) {
1.14      takayama 1761:   static int check=1;
1.31      takayama 1762:   char *ng="%%Ng=";
1.32      takayama 1763:   // int i;
1.1       takayama 1764:   s[0] = '%';
                   1765:   while (s[0] == '%') {
1.12      takayama 1766:     if (!mh_fgets(s,SMAX,sfp)) {
1.29      takayama 1767:       oxprintfe("Data format error at %s\n",msg);
1.12      takayama 1768:       mh_exit(-1);
                   1769:     }
1.14      takayama 1770:     if (check && (strncmp(msg,ng,4)==0)) {
1.31      takayama 1771:       if (strncmp(s,ng,5) != 0) {
1.29      takayama 1772:         oxprintfe("Warning, there is no %%Ng= at the border of Beta's and Ng, s=%s\n",s);
1.14      takayama 1773:       }
1.31      takayama 1774:       /* check=0; */
1.14      takayama 1775:     }
1.12      takayama 1776:     if (s[0] != '%') return(0);
1.1       takayama 1777:   }
1.13      takayama 1778:   return(0);
1.1       takayama 1779: }
1.10      takayama 1780: static int setParam(char *fname) {
1.1       takayama 1781:   int rank;
                   1782:   char s[SMAX];
1.3       takayama 1783:   struct SFILE *fp;
1.1       takayama 1784:   int i;
1.19      takayama 1785:   struct mh_token tk;
1.1       takayama 1786:   if (fname == NULL) return(setParamDefault());
                   1787:
                   1788:   Sample = 0;
1.3       takayama 1789:   if ((fp=mh_fopen(fname,"r",JK_byFile)) == NULL) {
1.29      takayama 1790:     if (JK_byFile) oxprintfe("File %s is not found.\n",fp->s);
1.12      takayama 1791:     mh_exit(-1);
1.1       takayama 1792:   }
                   1793:   next(fp,s,"Mg(m)");
                   1794:   sscanf(s,"%d",&Mg);
                   1795:   rank = imypower(2,Mg);
                   1796:
                   1797:   Beta = (double *)mymalloc(sizeof(double)*Mg);
                   1798:   for (i=0; i<Mg; i++) {
                   1799:     next(fp,s,"Beta");
1.12      takayama 1800:     sscanf(s,"%lf",&(Beta[i]));
1.1       takayama 1801:   }
                   1802:
                   1803:   Ng = (double *)mymalloc(sizeof(double));
1.14      takayama 1804:   next(fp,s,"%Ng= (freedom parameter n)");
1.1       takayama 1805:   sscanf(s,"%lf",Ng);
                   1806:
                   1807:   next(fp,s,"X0g(initial point)");
                   1808:   sscanf(s,"%lf",&X0g);
1.14      takayama 1809:
1.1       takayama 1810:   Iv = (double *)mymalloc(sizeof(double)*rank);
                   1811:   for (i=0; i<rank; i++) {
1.12      takayama 1812:     next(fp,s,"Iv(initial values)");
1.14      takayama 1813:        if (strncmp(s,"*",1)==0) {
                   1814:          for (i=0; i<rank; i++) Iv[i] = 0.0;
                   1815:          break;
                   1816:        }
1.12      takayama 1817:     sscanf(s,"%lg",&(Iv[i]));
1.1       takayama 1818:   }
                   1819:
                   1820:   next(fp,s,"Ef(exponential factor)");
1.14      takayama 1821:   if (strncmp(s,"*",1)==0) Ef=0.0;
                   1822:   else sscanf(s,"%lg",&Ef);
1.1       takayama 1823:
                   1824:   next(fp,s,"Hg (step size of rk)");
                   1825:   sscanf(s,"%lf",&Hg);
                   1826:
                   1827:   next(fp,s,"Dp (data sampling period)");
                   1828:   sscanf(s,"%d",&Dp);
                   1829:
                   1830:   next(fp,s,"Xng (the last point, cf. --xmax)");
                   1831:   sscanf(s,"%lf",&Xng);
1.19      takayama 1832:
                   1833:   /* Reading the optional parameters */
                   1834:   while ((tk = mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_EOF) {
                   1835:     /* expect ID */
                   1836:     if (tk.type != MH_TOKEN_ID) {
1.29      takayama 1837:       oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1838:     }
                   1839:     if (strcmp(s,"automatic")==0) {
                   1840:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1841:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1842:       }
                   1843:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
1.29      takayama 1844:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1845:       }
                   1846:       M_automatic = tk.ival;
                   1847:       continue;
                   1848:     }
                   1849:     if (strcmp(s,"assigned_series_error")==0) {
                   1850:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1851:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1852:       }
                   1853:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
1.29      takayama 1854:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1855:       }
                   1856:       M_assigned_series_error = tk.dval;
                   1857:       continue;
                   1858:     }
                   1859:     if (strcmp(s,"x0value_min")==0) {
                   1860:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1861:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1862:       }
                   1863:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
1.29      takayama 1864:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1865:       }
                   1866:       M_x0value_min = tk.dval;
                   1867:       continue;
                   1868:     }
                   1869:     if ((strcmp(s,"Mapprox")==0) || (strcmp(s,"degree")==0)) {
                   1870:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1871:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1872:       }
                   1873:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
1.29      takayama 1874:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1875:       }
                   1876:       Mapprox = tk.ival;
                   1877:       continue;
                   1878:     }
                   1879:     if (strcmp(s,"X0g_bound")==0) {
                   1880:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1881:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1882:       }
                   1883:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
1.29      takayama 1884:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.19      takayama 1885:       }
                   1886:       M_X0g_bound = tk.dval;
                   1887:       continue;
                   1888:     }
1.25      takayama 1889:     if (strcmp(s,"show_autosteps")==0) {
                   1890:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
1.29      takayama 1891:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.25      takayama 1892:       }
                   1893:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
1.29      takayama 1894:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
1.25      takayama 1895:       }
                   1896:       M_show_autosteps = tk.ival;
                   1897:       continue;
                   1898:     }
1.36      takayama 1899:     // Format: #p_pFq=2  1.5  3.2
                   1900:     if (strcmp(s,"p_pFq")==0) {
                   1901:       Orig_1F1=0;
                   1902:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
                   1903:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1904:       }
                   1905:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
                   1906:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1907:       }
                   1908:       P_pFq = tk.ival;
                   1909:       for (i=0; i<P_pFq; i++) {
                   1910:        if ((tk=mh_getoken(s,SMAX-1,fp)).type == MH_TOKEN_DOUBLE) {
                   1911:          A_pFq[i] = tk.dval;
                   1912:        }else if (tk.type == MH_TOKEN_INT) {
                   1913:          A_pFq[i] = tk.ival;
                   1914:        }else{
                   1915:          oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1916:        }
                   1917:       }
                   1918:       continue;
                   1919:     }
                   1920:     if (strcmp(s,"q_pFq")==0) {
                   1921:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
                   1922:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1923:       }
                   1924:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
                   1925:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1926:       }
                   1927:       Q_pFq = tk.ival;
                   1928:       for (i=0; i<Q_pFq; i++) {
                   1929:        if ((tk=mh_getoken(s,SMAX-1,fp)).type == MH_TOKEN_DOUBLE) {
                   1930:          B_pFq[i] = tk.dval;
                   1931:        }else if (tk.type == MH_TOKEN_INT) {
                   1932:          B_pFq[i] = tk.ival;
                   1933:        }else{
                   1934:          oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
                   1935:        }
                   1936:       }
                   1937:       continue;
                   1938:     }
1.40    ! takayama 1939:     if (strcmp(s,"ef_type")==0) {
        !          1940:       if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
        !          1941:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
        !          1942:       }
        !          1943:       if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
        !          1944:         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
        !          1945:       }
        !          1946:       Ef_type = tk.ival;
        !          1947:       continue;
        !          1948:     }
1.29      takayama 1949:     oxprintfe("Unknown ID at %s\n",s); mh_exit(-1);
1.19      takayama 1950:   }
1.3       takayama 1951:   mh_fclose(fp);
1.13      takayama 1952:   return(0);
1.1       takayama 1953: }
                   1954:
1.10      takayama 1955: static int showParam(struct SFILE *fp,int fd) {
1.1       takayama 1956:   int rank,i;
1.3       takayama 1957:   char swork[1024];
1.8       takayama 1958:   if (fd) {
1.34      takayama 1959:     fp = mh_fopen("stdout","w",1);
1.8       takayama 1960:   }
1.1       takayama 1961:   rank = imypower(2,Mg);
1.3       takayama 1962:   sprintf(swork,"%%Mg=\n%d\n",Mg); mh_fputs(swork,fp);
1.1       takayama 1963:   for (i=0; i<Mg; i++) {
1.12      takayama 1964:     sprintf(swork,"%%Beta[%d]=\n%lf\n",i,Beta[i]); mh_fputs(swork,fp);
1.1       takayama 1965:   }
1.3       takayama 1966:   sprintf(swork,"%%Ng=\n%lf\n",*Ng); mh_fputs(swork,fp);
                   1967:   sprintf(swork,"%%X0g=\n%lf\n",X0g); mh_fputs(swork,fp);
1.1       takayama 1968:   for (i=0; i<rank; i++) {
1.12      takayama 1969:     sprintf(swork,"%%Iv[%d]=\n%lg\n",i,Iv[i]); mh_fputs(swork,fp);
                   1970:     if (Sample && (M_n == 2) && (X0g == 0.3)) {
                   1971:       sprintf(swork,"%%Iv[%d]-Iv2[%d]=%lg\n",i,i,Iv[i]-Iv2[i]); mh_fputs(swork,fp);
                   1972:     }
1.3       takayama 1973:   }
                   1974:   sprintf(swork,"%%Ef=\n%lg\n",Ef); mh_fputs(swork,fp);
                   1975:   sprintf(swork,"%%Hg=\n%lf\n",Hg); mh_fputs(swork,fp);
                   1976:   sprintf(swork,"%%Dp=\n%d\n",Dp);  mh_fputs(swork,fp);
                   1977:   sprintf(swork,"%%Xng=\n%lf\n",Xng);mh_fputs(swork,fp);
1.19      takayama 1978:
                   1979:   sprintf(swork,"%%%% Optional paramters\n"); mh_fputs(swork,fp);
                   1980:   sprintf(swork,"#success=%d\n",M_mh_t_success); mh_fputs(swork,fp);
                   1981:   sprintf(swork,"#automatic=%d\n",M_automatic); mh_fputs(swork,fp);
                   1982:   sprintf(swork,"#series_error=%lg\n",M_series_error); mh_fputs(swork,fp);
                   1983:   sprintf(swork,"#recommended_abserr\n"); mh_fputs(swork,fp);
1.36      takayama 1984:   sprintf(swork,"#abserror=%lg\n",M_recommended_abserr); mh_fputs(swork,fp);
1.27      takayama 1985:   if (M_recommended_relerr < MH_RELERR_DEFAULT) {
                   1986:     sprintf(swork,"%%relerror=%lg\n",M_recommended_relerr); mh_fputs(swork,fp);
                   1987:   }
1.19      takayama 1988:   sprintf(swork,"#mh_t_value=%lg # Value of matrix hg at X0g.\n",M_mh_t_value); mh_fputs(swork,fp);
                   1989:   sprintf(swork,"# M_m=%d  # Approximation degree of matrix hg.\n",M_m); mh_fputs(swork,fp);
                   1990:   sprintf(swork,"#beta_i_x_o2_max=%lg #max(|beta[i]*x|/2)\n",M_beta_i_x_o2_max); mh_fputs(swork,fp);
                   1991:   sprintf(swork,"#beta_i_beta_j_min=%lg #min(|beta[i]-beta[j]|)\n",M_beta_i_beta_j_min); mh_fputs(swork,fp);
1.36      takayama 1992:   sprintf(swork,"# change # to %% to read as an optional parameter.\n"); mh_fputs(swork,fp);
1.39      takayama 1993:   sprintf(swork,"%%p_pFq=%d, ",P_pFq); mh_fputs(swork,fp);
1.36      takayama 1994:   for (i=0; i<P_pFq; i++) {
                   1995:     if (i != P_pFq-1) sprintf(swork," %lg,",A_pFq[i]);
                   1996:     else sprintf(swork," %lg\n",A_pFq[i]);
                   1997:     mh_fputs(swork,fp);
                   1998:   }
1.39      takayama 1999:   sprintf(swork,"%%q_pFq=%d, ",Q_pFq); mh_fputs(swork,fp);
1.36      takayama 2000:   for (i=0; i<Q_pFq; i++) {
                   2001:     if (i != Q_pFq-1) sprintf(swork," %lg,",B_pFq[i]);
                   2002:     else sprintf(swork," %lg\n",B_pFq[i]);
                   2003:     mh_fputs(swork,fp);
                   2004:   }
1.40    ! takayama 2005:   sprintf(swork,"%%ef_type=%d\n",Ef_type); mh_fputs(swork,fp);
1.13      takayama 2006:   return(0);
1.1       takayama 2007: }
                   2008:
1.2       takayama 2009: static double gammam(double a,int n) {
1.1       takayama 2010:   double v,v2;
                   2011:   int i;
1.39      takayama 2012:   v=mypower(sqrt(M_PI),(n*(n-1))/2); /* pi^(n*(n-1)/2) */
1.1       takayama 2013:   v2=0;
                   2014:   for (i=1; i<=n; i++) {
                   2015:     v2 += lgamma(a-((double)(i-1))/2.0); /* not for big n */
                   2016:   }
1.29      takayama 2017:   if (Debug) oxprintf("gammam(%lg,%d)=%lg\n",a,n,v*exp(v2));
1.1       takayama 2018:   return(v*exp(v2));
                   2019: }
                   2020:
1.2       takayama 2021: static double iv_factor(void) {
1.40    ! takayama 2022:   if (Ef_type < 1) return(1.0);
        !          2023:   if (Ef_type == 1) return(iv_factor_ef_type1());
        !          2024:   else if (Ef_type==2) return(iv_factor_ef_type2());
        !          2025:   return(1.0);
        !          2026: }
        !          2027:
        !          2028: static double iv_factor_ef_type1(void) {
1.1       takayama 2029:   double v1;
                   2030:   double t;
                   2031:   double b;
                   2032:   double detSigma;
                   2033:   double c;
                   2034:   int i,n;
                   2035:   n = (int) (*Ng);
                   2036:   v1= mypower(sqrt(X0g),n*M_n);
                   2037:   t = 0.0;
                   2038:   for (i=0; i<M_n; i++)  t += -X0g*Beta[i];
                   2039:   v1 = v1*exp(t);
                   2040:
                   2041:   b = 1; for (i=0; i<M_n; i++) b *= Beta[i];
                   2042:   detSigma = 1.0/(b*mypower(2.0,M_n));
                   2043:
                   2044:   c = gammam(((double)(M_n+1))/2.0, M_n)/
1.12      takayama 2045:     ( mypower(sqrt(2), M_n*n)*mypower(sqrt(detSigma),n)*gammam(((double)(M_n+n+1))/2.0,M_n) );
1.1       takayama 2046:   return( c*v1);
                   2047: }
                   2048:
1.40    ! takayama 2049: static double iv_factor_ef_type2(void) {
        !          2050:   double ef;
        !          2051:   int i,m;
        !          2052:   double a,b,c;
        !          2053:   double t;
        !          2054:   a = A_pFq[0]; b = A_pFq[1]; c= B_pFq[0];
        !          2055:   m = M_n;
        !          2056:   ef = 1.0;
        !          2057:
        !          2058:   /*fprintf(stderr,"iv_factor_ef_type2: a=%lf, b=%lf, c=%lf, m=%d\n",a,b,c,m);*/
        !          2059:   /* Ref: note 2016.02.04 */
        !          2060:   if (X0g<0){ myerror("Negative X0g\n"); mh_exit(-1);}
        !          2061:   t = 0;
        !          2062:   for (i=0; i<m; i++) if (Beta[i]<0){ myerror("Negative beta\n"); mh_exit(-1);}
        !          2063:   for (i=0; i<m; i++) t += log(Beta[i]);
        !          2064:   ef *= exp((a+b-c)*t);
        !          2065:
        !          2066:   t = 0;
        !          2067:   for (i=0; i<m; i++) t += log(Beta[i]+X0g);
        !          2068:   ef *= exp(-b*t);
        !          2069:
        !          2070:   ef *= exp((c-a)*(2*a-1)*log(X0g));
        !          2071:
        !          2072:   ef *= gammam(b,m)/gammam(a+b-c,m);
        !          2073:   ef *= gammam(a,m)/gammam(c,m);
        !          2074:   return(ef);
        !          2075: }
        !          2076: static void setM_x(void) {
        !          2077:   if (Ef_type <= 1)    return(setM_x_ef_type1());
        !          2078:   else if (Ef_type==2) return(setM_x_ef_type2());
        !          2079:   setM_x_ef_type1();
        !          2080: }
        !          2081: static void setM_x_ef_type1(void) {
        !          2082:   int i;
        !          2083:   for (i=0; i<M_n; i++) {
        !          2084:        M_x[i] = Beta[i]*X0g;
        !          2085:   }
        !          2086: }
        !          2087: static void setM_x_ef_type2(void) {
        !          2088:   int i;
        !          2089:   for (i=0; i<M_n; i++) {
        !          2090:        M_x[i] = X0g/(Beta[i]+X0g);
        !          2091:   }
        !          2092: }
1.1       takayama 2093:
                   2094:

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