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

Diff for /OpenXM/src/hgm/mh/src/jack-n.c between version 1.8 and 1.39

version 1.8, 2013/02/25 12:11:23 version 1.39, 2016/02/04 02:52:19
Line 5 
Line 5 
 #include <string.h>  #include <string.h>
 #include "sfile.h"  #include "sfile.h"
 /*  /*
 $OpenXM: OpenXM/src/hgm/mh/src/jack-n.c,v 1.7 2013/02/24 21:36:49 takayama Exp $    $OpenXM: OpenXM/src/hgm/mh/src/jack-n.c,v 1.38 2016/02/01 07:05:25 takayama Exp $
 Ref: copied from this11/misc-2011/A1/wishart/Prog    Ref: copied from this11/misc-2011/A1/wishart/Prog
 jack-n.c, translated from mh.rr or tk_jack.rr in the asir-contrib. License: LGPL    jack-n.c, translated from mh.rr or tk_jack.rr in the asir-contrib. License: LGPL
 Koev-Edelman for higher order derivatives.    Koev-Edelman for higher order derivatives.
 cf. 20-my-note-mh-jack-n.pdf,  /Movies/oxvh/priv-j1/2011-12-14-ke-mh-jack.mov    cf. 20-my-note-mh-jack-n.pdf,  /Movies/oxvh/priv-j1/2011-12-14-ke-mh-jack.mov
 Todo:    Todo:
 1. Cash the transposes of partitions.    1. Cash the transposes of partitions.
 2. Use the recurrence to obtain beta().    2. Use the recurrence to obtain beta().
 3. Easier input data file format for mh-n.c    3. Easier input data file format for mh-n.c
 Changelog:    Changelog:
 2012.02.21, porting to OpenXM/src/hgm    2016.02.01 ifdef C_2F1 ...
 2011.12.22, --table option, which is experimental.    2016.01.12 2F1
 2011.12.19, bug fix.  jjk() should return double. It can become more than max int.    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.
 2011.12.15, mh.r --> jack-n.c    2014.03.14, --automatic option. Output estimation data.
     2012.02.21, porting to OpenXM/src/hgm
     2011.12.22, --table option, which is experimental.
     2011.12.19, bug fix.  jjk() should return double. It can become more than max int.
     2011.12.15, mh.r --> jack-n.c
 */  */
   
 /****** from mh-n.c *****/  /****** from mh-n.c *****/
Line 53  static double Ef2; 
Line 57  static double Ef2; 
 #define M_n0 3 /* used for tests. Must be equal to M_n */  #define M_n0 3 /* used for tests. Must be equal to M_n */
 #define M_m_MAX 200  #define M_m_MAX 200
 #define M_nmx  M_m_MAX  /* maximal of M_n */  #define M_nmx  M_m_MAX  /* maximal of M_n */
   #ifdef C_2F1
   #define A_LEN  2 /* (a_1) , (a_1, ..., a_p)*/
   #define B_LEN  1 /* (b_1) */
   static int P_pFq=2;
   static int Q_pFq=1;
   #else
 #define A_LEN  1 /* (a_1) , (a_1, ..., a_p)*/  #define A_LEN  1 /* (a_1) , (a_1, ..., a_p)*/
 #define B_LEN  1 /* (b_1) */  #define B_LEN  1 /* (b_1) */
 static int Debug = 1;  static int P_pFq=1;
   static int Q_pFq=1;
   #endif
   static double A_pFq[A_LEN];
   static double B_pFq[B_LEN];
   #ifndef C_2F1
   static int Orig_1F1=1;
   #else
   static int Orig_1F1=0;
   #endif
   static int Debug = 0;
 static int Alpha = 2;  /* 2 implies the zonal polynomial */  static int Alpha = 2;  /* 2 implies the zonal polynomial */
 static int *Darray = NULL;  static int *Darray = NULL;
 static int **Parray = NULL; /* array of partitions of size M_n */  static int **Parray = NULL; /* array of partitions of size M_n */
Line 93  static double Xarray[M_nmx][M_m_MAX];  
Line 113  static double Xarray[M_nmx][M_m_MAX];  
 static double *M_qk=NULL;  /* saves pochhammerb */  static double *M_qk=NULL;  /* saves pochhammerb */
 static double M_rel_error=0.0; /* relative errors */  static double M_rel_error=0.0; /* relative errors */
   
   /* For automatic degree and X0g setting. */
   /*
    If automatic == 1, then the series is reevaluated as long as t_success!=1
    by increasing X0g (evaluation point) and M_m (approx degree);
    */
   static int M_automatic=1;
   /* Estimated degree bound for series expansion. See mh_t */
   static int M_m_estimated_approx_deg=0;
   /* Let F(i) be the approximation up to degree i.
      The i-th series_error is defined
      by |(F(i)-F(i-1))/F(i-1)|.
   */
   static double M_series_error;
   /*
     M_series_error < M_assigend_series_error (A) is required for the
     estimated_approx_deg.
    */
   static double M_assigned_series_error=M_ASSIGNED_SERIES_ERROR_DEFAULT;
   /*
     Let Ef be the exponential factor ( Ef=(4)/1F1 of [HNTT] )
     If F(M_m)*Ef < x0value_min (B), the success=0 and X0g is increased.
     Note that minimal double is about 2e-308
    */
   static double M_x0value_min=1e-60;
   /*
     estimated_X0g is the suggested value of X0g.
    */
   static double M_estimated_X0g=0.0;
   /*
    X0g should be less than M_X0g_bound.
    */
   static double M_X0g_bound = 1e+100;
   /*
    success is set to 1 when (A) and (B) are satisfied.
    */
   static int M_mh_t_success=1;
   /*
     recommended_abserr is the recommended value of the absolute error
     for the Runge-Kutta method. It is defined as
     assigend_series_error(standing for significant digits)*Ig[0](initial value)
    */
   static double M_recommended_abserr;
   /*
     recommended_relerr is the recommended value of the relative error
     for the Runge-Kutta method..
    */
   static double M_recommended_relerr;
   /*
     max of beta(i)*x/2
    */
   static double M_beta_i_x_o2_max;
   /*
     minimum of |beta_i-beta_j|
    */
   static double M_beta_i_beta_j_min;
   /*
     Value of matrix hg
   */
   static double M_mh_t_value;
   /*
    Show the process of updating degree.
    */
   int M_show_autosteps=1;
   
 /* prototypes */  /* prototypes */
 static void *mymalloc(int size);  static void *mymalloc(int size);
 static myfree(void *p);  static int myfree(void *p);
 static myerror(char *s);  static int myerror(char *s);
 static double jack1(int K);  static double jack1(int K);
 static double jack1diff(int k);  static double jack1diff(int k);
 static double xval(int i,int p); /* x_i^p */  static double xval(int i,int p); /* x_i^p */
Line 104  static int mysum(int L[]);
Line 188  static int mysum(int L[]);
 static int plength(int P[]);  static int plength(int P[]);
 static int plength_t(int P[]);  static int plength_t(int P[]);
 static void ptrans(int P[M_nmx],int Pt[]);  static void ptrans(int P[M_nmx],int Pt[]);
 static test_ptrans();  
 static int huk(int K[],int I,int J);  static int huk(int K[],int I,int J);
 static int hdk(int K[],int I,int J);  static int hdk(int K[],int I,int J);
 static double jjk(int K[]);  static double jjk(int K[]);
Line 114  static double mypower(double x,int n);
Line 197  static double mypower(double x,int n);
 static double qk(int K[],double A[A_LEN],double B[B_LEN]);  static double qk(int K[],double A[A_LEN],double B[B_LEN]);
 static int bb(int N[],int K[],int M[],int I,int J);  static int bb(int N[],int K[],int M[],int I,int J);
 static double beta(int K[],int M[]);  static double beta(int K[],int M[]);
 static printp(int kappa[]);  static int printp(int kappa[]);
 static printp2(int kappa[]);  
 static test_beta();  
 static double q3_10(int K[],int M[],int SK);  static double q3_10(int K[],int M[],int SK);
 static double q3_5(double A[],double B[],int K[],int I);  
 static void mtest4();  
 static void mtest4b();  
 static int nk(int KK[]);  static int nk(int KK[]);
 static int plength2(int P1[],int P2[]);  
 static int myeq(int P1[],int P2[]);  static int myeq(int P1[],int P2[]);
 static int pListPartition(int M,int N);  static int pListPartition(int M,int N);
 static int pListPartition2(int Less,int From,int To, int M);  static int pListPartition2(int Less,int From,int To, int M);
Line 132  static int pListHS2(int From,int To,int Kap[]);
Line 209  static int pListHS2(int From,int To,int Kap[]);
 static void hsExec_0();  static void hsExec_0();
 static int pmn(int M,int N);  static int pmn(int M,int N);
 static int *cloneP(int a[]);  static int *cloneP(int a[]);
 static copyP(int p[],int a[]);  static int copyP(int p[],int a[]);
 static void pExec_darray(void);  static void pExec_darray(void);
 static genDarray2(int M,int N);  static int genDarray2(int M,int N);
 static isHStrip(int Kap[],int Nu[]);  static int isHStrip(int Kap[],int Nu[]);
 static void hsExec_beta(void);  static void hsExec_beta(void);
 static genBeta(int Kap[]);  static int genBeta(int Kap[]);
 static checkBeta1();  
 static int psublen(int Kap[],int Mu[]);  static int psublen(int Kap[],int Mu[]);
 static genJack(int M,int N);  static int genJack(int M,int N);
 static checkJack1(int M,int N);  
 static checkJack2(int M,int N);  
 static mtest1b();  
   
 static int imypower(int x,int n);  static int imypower(int x,int n);
 static usage();  static int usage();
 static setParamDefault();  static int setParamDefault();
 static next(struct SFILE *fp,char *s,char *msg);  static int next(struct SFILE *fp,char *s,char *msg);
 static int gopen_file(void);  
 static int setParam(char *fname);  static int setParam(char *fname);
 static int showParam(struct SFILE *fp,int fd);  static int showParam(struct SFILE *fp,int fd);
 static double iv_factor(void);  static double iv_factor(void);
 static double gammam(double a,int n);  static double gammam(double a,int n);
 static double mypower(double a,int n);  static double mypower(double a,int n);
   
   #ifdef STANDALONE
   static int test_ptrans();
   static int printp2(int kappa[]);
   static int test_beta();
   static void mtest4();
   static void mtest4b();
   static int plength2(int P1[],int P2[]);
   static int checkBeta1();
   static int checkJack1(int M,int N);
   static int checkJack2(int M,int N);
   static int mtest1b();
   static double q3_5(double A[],double B[],int K[],int I);
   #endif
   
 double mh_t(double A[A_LEN],double B[B_LEN],int N,int M);  double mh_t(double A[A_LEN],double B[B_LEN],int N,int M);
 double mh_t2(int J);  double mh_t2(int J);
 struct MH_RESULT *jk_main(int argc,char *argv[]);  struct MH_RESULT *jk_main(int argc,char *argv[]);
   struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree);
 int jk_freeWorkArea();  int jk_freeWorkArea();
 int jk_initializeWorkArea();  int jk_initializeWorkArea();
   
 int jk_freeWorkArea() {  int jk_freeWorkArea() {
   /* bug, p in the cloneP will not be deallocated.    /* bug, p in the cloneP will not be deallocated.
               Nk in genDarray2 will not be deallocated.       Nk in genDarray2 will not be deallocated.
    */    */
   int i;    int i;
   JK_deallocate=1;    JK_deallocate=1;
   if (Darray) {myfree(Darray); Darray=NULL;}    if (Darray) {myfree(Darray); Darray=NULL;}
Line 174  int jk_freeWorkArea() {
Line 261  int jk_freeWorkArea() {
   if (M_beta_0) {myfree(M_beta_0); M_beta_0=NULL;}    if (M_beta_0) {myfree(M_beta_0); M_beta_0=NULL;}
   if (M_beta_1) {myfree(M_beta_1); M_beta_1=NULL;}    if (M_beta_1) {myfree(M_beta_1); M_beta_1=NULL;}
   if (M_jack) {    if (M_jack) {
         for (i=0; M_jack[i] != NULL; i++) {      for (i=0; M_jack[i] != NULL; i++) {
           if (Debug) printf("Free M_jack[%d]\n",i);        if (Debug) oxprintf("Free M_jack[%d]\n",i);
           myfree(M_jack[i]); M_jack[i] = NULL;        myfree(M_jack[i]); M_jack[i] = NULL;
         }      }
         myfree(M_jack); M_jack=NULL;      myfree(M_jack); M_jack=NULL;
   }    }
   if (M_qk) {myfree(M_qk); M_qk=NULL;}    if (M_qk) {myfree(M_qk); M_qk=NULL;}
   if (P_pki) {myfree(P_pki); P_pki=NULL;}    if (P_pki) {myfree(P_pki); P_pki=NULL;}
   JK_deallocate=0;    JK_deallocate=0;
     return(0);
 }  }
 int jk_initializeWorkArea() {  int jk_initializeWorkArea() {
   int i,j;    int i,j;
Line 213  int jk_initializeWorkArea() {
Line 301  int jk_initializeWorkArea() {
   Sample = Sample_default;    Sample = Sample_default;
   Xng=0.0;    Xng=0.0;
   M_n=0;    M_n=0;
     return(0);
 }  }
   
 static void *mymalloc(int size) {  static void *mymalloc(int size) {
   void *p;    void *p;
   if (Debug) printf("mymalloc(%d)\n",size);    if (Debug) oxprintf("mymalloc(%d)\n",size);
   p = (void *)mh_malloc(size);    p = (void *)mh_malloc(size);
   if (p == NULL) {    if (p == NULL) {
     fprintf(stderr,"No more memory.\n");      oxprintfe("No more memory.\n");
     mh_exit(-1);      mh_exit(-1);
   }    }
   return(p);    return(p);
 }  }
 static myfree(void *p) {  static int myfree(void *p) {
   if (Debug) printf("myFree at %p\n",p);    if (Debug) oxprintf("myFree at %p\n",p);
   mh_free(p);    return(mh_free(p));
 }  }
 static myerror(char *s) { fprintf(stderr,"%s: type in control-C\n",s); getchar(); getchar();}  static int myerror(char *s) { oxprintfe("%s: type in control-C\n",s); getchar(); getchar(); return(0);}
   
 static double jack1(int K) {  static double jack1(int K) {
   double F;    double F;
   extern int Alpha;    extern int Alpha;
   int I,J,L,II,JJ,N;    int J,II,JJ,N;   /*  int I,J,L,II,JJ,N; */
   N = 1;    N = 1;
   if (K == 0) return((double)1);    if (K == 0) return((double)1);
   F = xval(1,K);    F = xval(1,K);
Line 247  static double jack1(int K) {
Line 336  static double jack1(int K) {
 static double jack1diff(int K) {  static double jack1diff(int K) {
   double F;    double F;
   extern int Alpha;    extern int Alpha;
   int I,J,S,L,II,JJ,N;    int J,II,JJ,N;  /* int I,J,S,L,II,JJ,N; */
   N = 1;    N = 1;
   if (K == 0) return((double)1);    if (K == 0) return((double)1);
   F = K*xval(1,K-1);    F = K*xval(1,K-1);
Line 260  static double jack1diff(int K) {
Line 349  static double jack1diff(int K) {
   
 static double xval(int ii,int p) { /* x_i^p */  static double xval(int ii,int p) { /* x_i^p */
   extern double M_x[];    extern double M_x[];
   double F;  
   int i,j;    int i,j;
   static init=0;    static int init=0;
   if (JK_deallocate) { init=0; return(0.0);}    if (JK_deallocate) { init=0; return(0.0);}
   if (!init) {    if (!init) {
     for (i=1; i<=M_n; i++) {      for (i=1; i<=M_n; i++) {
       for (j=0; j<M_m_MAX; j++) {        for (j=0; j<M_m_MAX; j++) {
         if (j != 0) {          if (j != 0) {
           Xarray[i-1][j] = M_x[i-1]*Xarray[i-1][j-1];            Xarray[i-1][j] = M_x[i-1]*Xarray[i-1][j-1];
         }else{          }else{
           Xarray[i-1][0] = 1;            Xarray[i-1][0] = 1;
         }          }
       }        }
     }      }
     init = 1;      init = 1;
Line 280  static double xval(int ii,int p) { /* x_i^p */
Line 368  static double xval(int ii,int p) { /* x_i^p */
   if (p > M_m_MAX-2) myerror("xval, p is too large.");    if (p > M_m_MAX-2) myerror("xval, p is too large.");
   if (p < 0) {    if (p < 0) {
     myerror("xval, p is negative.");      myerror("xval, p is negative.");
     printf("ii=%d, p=%d\n",ii,p);      oxprintf("ii=%d, p=%d\n",ii,p);
     mh_exit(-1);      mh_exit(-1);
   }    }
   return(Xarray[ii-1][p]);    return(Xarray[ii-1][p]);
Line 295  static int mysum(int L[]) {
Line 383  static int mysum(int L[]) {
 }  }
   
 /*  /*
  (3,2,2,0,0) --> 3    (3,2,2,0,0) --> 3
 */  */
 static int plength(int P[]) {  static int plength(int P[]) {
   int I;    int I;
Line 314  static int plength_t(int P[]) {  
Line 402  static int plength_t(int P[]) {  
 }  }
   
 /*  /*
  ptrans(P)  returns Pt      ptrans(P)  returns Pt
 */  */
 static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m] */  static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m] */
   extern int M_m;    extern int M_m;
Line 329  static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m]
Line 417  static void ptrans(int P[M_nmx],int Pt[]) { /* Pt[M_m]
   }    }
 }  }
   
 static test_ptrans() {  #ifdef STANDALONE
   static int test_ptrans() {
   extern int M_m;    extern int M_m;
   int p[M_n0]={5,3,2};    int p[M_n0]={5,3,2};
   int pt[10];    int pt[10];
   int i;    int i;
   M_m = 10;    M_m = 10;
   ptrans(p,pt);    ptrans(p,pt);
   if (Debug) {for (i=0; i<10; i++) printf("%d,",pt[i]);  printf("\n");}    if (Debug) {for (i=0; i<10; i++) oxprintf("%d,",pt[i]);  oxprintf("\n");}
     return(0);
 }  }
   #endif
   
   
 /*  /*
   upper hook length    upper hook length
   h_kappa^*(K)    h_kappa^*(K)
Line 349  static int huk(int K[],int I,int J) {
Line 439  static int huk(int K[],int I,int J) {
   int Kp[M_m_MAX];    int Kp[M_m_MAX];
   int A,H;    int A,H;
   A=Alpha;    A=Alpha;
   /*printf("h^k(%a,%a,%a,%a)\n",K,I,J,A);*/    /*oxprintf("h^k(%a,%a,%a,%a)\n",K,I,J,A);*/
   ptrans(K,Kp);    ptrans(K,Kp);
   H=Kp[J-1]-I+A*(K[I-1]-J+1);    H=Kp[J-1]-I+A*(K[I-1]-J+1);
   return(H);    return(H);
Line 364  static int hdk(int K[],int I,int J) {
Line 454  static int hdk(int K[],int I,int J) {
   int Kp[M_m_MAX];    int Kp[M_m_MAX];
   int A,H;    int A,H;
   A = Alpha;    A = Alpha;
   /*printf("h_k(%a,%a,%a,%a)\n",K,I,J,A);*/    /*oxprintf("h_k(%a,%a,%a,%a)\n",K,I,J,A);*/
   ptrans(K,Kp);    ptrans(K,Kp);
   H=Kp[J-1]-I+1+A*(K[I-1]-J);    H=Kp[J-1]-I+1+A*(K[I-1]-J);
   return(H);    return(H);
Line 374  static int hdk(int K[],int I,int J) {
Line 464  static int hdk(int K[],int I,int J) {
 */  */
 static double jjk(int K[]) {  static double jjk(int K[]) {
   extern int Alpha;    extern int Alpha;
   int A,L,I,J;    int L,I,J;
   double V;    double V;
   A=Alpha;  
   V=1;    V=1;
   L=plength(K);    L=plength(K);
   for (I=0; I<L; I++) {    for (I=0; I<L; I++) {
Line 384  static double jjk(int K[]) {
Line 474  static double jjk(int K[]) {
       V *= huk(K,I+1,J+1)*hdk(K,I+1,J+1);        V *= huk(K,I+1,J+1)*hdk(K,I+1,J+1);
     }      }
   }    }
   if (Debug) {printp(K); printf("<--K, jjk=%lg\n",V);}    if (Debug) {printp(K); oxprintf("<--K, jjk=%lg\n",V);}
   return(V);    return(V);
 }  }
 /*  /*
Line 429  static double mypower(double x,int n) {
Line 519  static double mypower(double x,int n) {
   return(v);    return(v);
 }  }
 /* Q_kappa  /* Q_kappa
 */   */
 static double qk(int K[],double A[A_LEN],double B[B_LEN]) {  static double qk(int K[],double A[A_LEN],double B[B_LEN]) {
   extern int Alpha;    extern int Alpha;
   int P,Q,I;    int P,Q,I;
Line 440  static double qk(int K[],double A[A_LEN],double B[B_LE
Line 530  static double qk(int K[],double A[A_LEN],double B[B_LE
   /* to reduce numerical errors, temporary. */    /* to reduce numerical errors, temporary. */
   if (P == Q) {    if (P == Q) {
     for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);      for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);
           return(V);
   }    }
   return(V);  
   
   for (I=0; I<P; I++) V = V*ppoch(A[I],K);    if (P > Q) {
   for (I=0; I<Q; I++) V = V/ppoch(B[I],K);          for (I=0; I<Q; I++) V = V*ppoch2(A[I],B[I],K);
           for (I=Q; I<P; I++) V = V*ppoch(A[I],K);
     }else {
           for (I=0; I<P; I++) V = V*ppoch2(A[I],B[I],K);
           for (I=P; I<Q; I++) V = V/ppoch(B[I],K);
     }
     /* for debug
     printf("K=");
     for (I=0; I<3; I++) printf("%d, ",K[I]);
     printf("qk=%lg\n",V);
     */
   return(V);    return(V);
 }  }
   
 /*  /*
  B^nu_{kappa,mu}(i,j)    B^nu_{kappa,mu}(i,j)
  bb(N,K,M,I,J)    bb(N,K,M,I,J)
 */  */
 static int bb(int N[],int K[],int M[],int I,int J) {  static int bb(int N[],int K[],int M[],int I,int J) {
   int Kp[M_m_MAX]; int Mp[M_m_MAX];    int Kp[M_m_MAX]; int Mp[M_m_MAX];
Line 458  static int bb(int N[],int K[],int M[],int I,int J) {
Line 558  static int bb(int N[],int K[],int M[],int I,int J) {
   ptrans(M,Mp);    ptrans(M,Mp);
   
   /*    /*
   printp(K); printf("K<--, "); printp2(Kp); printf("<--Kp\n");      printp(K); oxprintf("K<--, "); printp2(Kp); oxprintf("<--Kp\n");
   printp(M); printf("M<--, "); printp2(Mp); printf("<--Mp\n");      printp(M); oxprintf("M<--, "); printp2(Mp); oxprintf("<--Mp\n");
   */    */
   
   if ((plength_t(Kp) < J) || (plength_t(Mp) < J)) return(hdk(N,I,J));    if ((plength_t(Kp) < J) || (plength_t(Mp) < J)) return(hdk(N,I,J));
Line 480  static double beta(int K[],int M[]) {
Line 580  static double beta(int K[],int M[]) {
     for (J=0; J<K[I]; J++) {      for (J=0; J<K[I]; J++) {
       II = I+1; JJ = J+1;        II = I+1; JJ = J+1;
       V *= (double)bb(K,K,M,II,JJ);        V *= (double)bb(K,K,M,II,JJ);
       /* printf("[%d,%d,%lf]\n",I,J,V); */        /* oxprintf("[%d,%d,%lf]\n",I,J,V); */
     }      }
   }    }
   
Line 489  static double beta(int K[],int M[]) {
Line 589  static double beta(int K[],int M[]) {
     for (J=0; J<M[I]; J++) {      for (J=0; J<M[I]; J++) {
       II = I+1; JJ = J+1;        II = I+1; JJ = J+1;
       V /= (double)bb(M,K,M,II,JJ);        V /= (double)bb(M,K,M,II,JJ);
       /* printf("[%d,%d,%lf]\n",I,J,V);*/        /* oxprintf("[%d,%d,%lf]\n",I,J,V);*/
     }      }
   }    }
   
   return(V);    return(V);
 }  }
 static printp(int kappa[]) {  static int printp(int kappa[]) {
   int i;    int i;
   printf("(");    oxprintf("(");
   for (i=0; i<M_n; i++) {    for (i=0; i<M_n; i++) {
     if (i <M_n-1) printf("%d,",kappa[i]);      if (i <M_n-1) oxprintf("%d,",kappa[i]);
     else printf("%d)",kappa[i]);      else oxprintf("%d)",kappa[i]);
   }    }
     return(0);
 }  }
 static printp2(int kappa[]) {  #ifdef STANDALONE
   static int printp2(int kappa[]) {
   int i,ell;    int i,ell;
   printf("(");    oxprintf("(");
   ell = plength_t(kappa);    ell = plength_t(kappa);
   for (i=0; i<ell+1; i++) {    for (i=0; i<ell+1; i++) {
     if (i <ell+1-1) printf("%d,",kappa[i]);      if (i <ell+1-1) oxprintf("%d,",kappa[i]);
     else printf("%d)",kappa[i]);      else oxprintf("%d)",kappa[i]);
   }    }
     return(0);
 }  }
   
 static test_beta() {  static int test_beta() {
   int kappa[M_n0]={2,1,0};    int kappa[M_n0]={2,1,0};
   int mu1[M_n0]={1,0,0};    int mu1[M_n0]={1,0,0};
   int mu2[M_n0]={1,1,0};    int mu2[M_n0]={1,1,0};
   int mu3[M_n0]={2,0,0};    int mu3[M_n0]={2,0,0};
   printp(kappa); printf(","); printp(mu3); printf(": beta = %lf\n",beta(kappa,mu3));    printp(kappa); oxprintf(","); printp(mu3); oxprintf(": beta = %lf\n",beta(kappa,mu3));
   printp(kappa); printf(","); printp(mu1); printf(": beta = %lf\n",beta(kappa,mu1));    printp(kappa); oxprintf(","); printp(mu1); oxprintf(": beta = %lf\n",beta(kappa,mu1));
   printp(kappa); printf(","); printp(mu2); printf(": beta = %lf\n",beta(kappa,mu2));    printp(kappa); oxprintf(","); printp(mu2); oxprintf(": beta = %lf\n",beta(kappa,mu2)); return(0);
 }  }
   #endif
 /* main() { test_beta(); } */  /* main() { test_beta(); } */
   
   
 /*  /*
  cf. w1m.rr    cf. w1m.rr
   matrix hypergeometric by jack    matrix hypergeometric by jack
   N variables, up to degree M.    N variables, up to degree M.
 */  */
 /* todo  /* todo
 def mhgj(A,B,N,M) {     def mhgj(A,B,N,M) {
   F = 0;     F = 0;
   P = partition_a(N,M);     P = partition_a(N,M);
   for (I=0; I<length(P); I++) {     for (I=0; I<length(P); I++) {
      K = P[I];     K = P[I];
      F += qk(K,A,B)*jack(K,N);     F += qk(K,A,B)*jack(K,N);
   }     }
   return(F);     return(F);
 }     }
 */  */
   
   
Line 548  def mhgj(A,B,N,M) {
Line 651  def mhgj(A,B,N,M) {
 static double q3_10(int K[],int M[],int SK) {  static double q3_10(int K[],int M[],int SK) {
   extern int Alpha;    extern int Alpha;
   int Mp[M_m_MAX];    int Mp[M_m_MAX];
   int ML[M_nmx];    //  int ML[M_nmx];
   int N[M_nmx];    int N[M_nmx];
   int i,R;    int i,R;
   double T,Q,V,Ur,Vr,Wr;    double T,Q,V,Ur,Vr,Wr;
   ptrans(M,Mp);    ptrans(M,Mp);
   for (i=0; i<M_n; i++) {ML[i] = M[i]; N[i] = M[i];}    for (i=0; i<M_n; i++) {N[i] = M[i];}
   N[SK-1] = N[SK-1]-1;    N[SK-1] = N[SK-1]-1;
   
   T = SK-Alpha*M[SK-1];    T = SK-Alpha*M[SK-1];
Line 574  static double q3_10(int K[],int M[],int SK) {
Line 677  static double q3_10(int K[],int M[],int SK) {
   return(V);    return(V);
 }  }
   
   #ifdef STANDALONE
 static double q3_5(double A[],double B[],int K[],int I) {  static double q3_5(double A[],double B[],int K[],int I) {
   extern int Alpha;    extern int Alpha;
   int Kp[M_m_MAX];    int Kp[M_m_MAX];
Line 587  static double q3_5(double A[],double B[],int K[],int I
Line 691  static double q3_5(double A[],double B[],int K[],int I
   V=1;    V=1;
   
   for (J=1; J<=P; J++)  {    for (J=1; J<=P; J++)  {
      V *= (A[J-1]+C);      V *= (A[J-1]+C);
   }    }
   for (J=1; J<=Q; J++) {    for (J=1; J<=Q; J++) {
      V /= (B[J-1]+C);      V /= (B[J-1]+C);
   }    }
   
   for (J=1; J<=K[I-1]-1; J++) {    for (J=1; J<=K[I-1]-1; J++) {
      Ej = D-J*Alpha+Kp[J-1];      Ej = D-J*Alpha+Kp[J-1];
      Gj = Ej+1;      Gj = Ej+1;
      V *= (Gj-Alpha)*Ej/(Gj*(Ej+Alpha));      V *= (Gj-Alpha)*Ej/(Gj*(Ej+Alpha));
   }    }
   for (J=1; J<=I-1; J++) {    for (J=1; J<=I-1; J++) {
      Fj=K[J-1]*Alpha-J-D;      Fj=K[J-1]*Alpha-J-D;
      Hj=Fj+Alpha;      Hj=Fj+Alpha;
      Lj=Hj*Fj;      Lj=Hj*Fj;
      V *= (Lj-Fj)/(Lj+Hj);      V *= (Lj-Fj)/(Lj+Hj);
   }    }
   return(V);    return(V);
 }  }
   #endif
   #ifdef STANDALONE
 static void mtest4() {  static void mtest4() {
   double A[A_LEN] = {1.5};    double A[A_LEN] = {1.5};
   double B[B_LEN]={6.5};    double B[B_LEN]={6.5};
Line 616  static void mtest4() {
Line 721  static void mtest4() {
   double V1,V2;    double V1,V2;
   V1=q3_5(A,B,K,I);    V1=q3_5(A,B,K,I);
   V2=qk(K,A,B)/qk(Ki,A,B);    V2=qk(K,A,B)/qk(Ki,A,B);
   printf("%lf== %lf?\n",V1,V2);    oxprintf("%lf== %lf?\n",V1,V2);
 }  }
 static void mtest4b() {  static void mtest4b() {
   int K[M_n0]={3,2,0};    int K[M_n0]={3,2,0};
Line 626  static void mtest4b() {
Line 731  static void mtest4b() {
   double V1,V2;    double V1,V2;
   V1=q3_10(K,M,SK);    V1=q3_10(K,M,SK);
   V2=beta(K,N)/beta(K,M);    V2=beta(K,N)/beta(K,M);
   printf("%lf== %lf?\n",V1,V2);    oxprintf("%lf== %lf?\n",V1,V2);
 }  }
   #endif
   
 /* main() { mtest4(); mtest4b(); } */  /* main() { mtest4(); mtest4b(); } */
   
 /* nk in (4.1),  /* nk in (4.1),
 */   */
 static int nk(int KK[]) {  static int nk(int KK[]) {
   extern int *Darray;    extern int *Darray;
   int N,I,Ki;    int N,I,Ki;
Line 647  static int nk(int KK[]) {
Line 753  static int nk(int KK[]) {
   /* K = (Kpp,Ki) */    /* K = (Kpp,Ki) */
   return(Darray[nk(Kpp)]+Ki-1);    return(Darray[nk(Kpp)]+Ki-1);
 }  }
   #ifdef STANDALONE
 static int plength2(int P1[],int P2[]) {  static int plength2(int P1[],int P2[]) {
   int S1,S2;    int S1,S2;
   S1 = plength(P1); S2 = plength(P2);    S1 = plength(P1); S2 = plength(P2);
Line 659  static int plength2(int P1[],int P2[]) {
Line 766  static int plength2(int P1[],int P2[]) {
   }    }
   else return(-1);    else return(-1);
 }  }
   #endif
 static int myeq(int P1[],int P2[]) {  static int myeq(int P1[],int P2[]) {
   int I,L1;    int I,L1;
   if ((L1=plength(P1)) != plength(P2)) return(0);    if ((L1=plength(P1)) != plength(P2)) return(0);
Line 686  static int pListPartition(int M,int N) {
Line 794  static int pListPartition(int M,int N) {
   int I;    int I;
   /* initialize */    /* initialize */
   if (M_n != N) {    if (M_n != N) {
     fprintf(stderr,"M_n != N\n"); mh_exit(-1);      oxprintfe("M_n != N\n"); mh_exit(-1);
   }    }
   M_m = M;    M_m = M;
   /* M_plist = []; */    /* M_plist = []; */
Line 704  static int pListPartition(int M,int N) {
Line 812  static int pListPartition(int M,int N) {
   Less >= M_kap[From], ..., M_kap[To],  |(M_kap[From],...,M_kap[To])|<=M,    Less >= M_kap[From], ..., M_kap[To],  |(M_kap[From],...,M_kap[To])|<=M,
 */  */
 static int pListPartition2(int Less,int From,int To, int M) {  static int pListPartition2(int Less,int From,int To, int M) {
   int I,R;    int I;
     mh_check_intr(100);
   if (To < From) {    if (To < From) {
      (*M_pExec)(); return(0);      (*M_pExec)(); return(0);
   }    }
   for (I=1; (I<=Less) && (I<=M) ; I++) {    for (I=1; (I<=Less) && (I<=M) ; I++) {
     M_kap[From-1] = I;      M_kap[From-1] = I;
     R = pListPartition2(I,From+1,To,M-I);      pListPartition2(I,From+1,To,M-I);
   }    }
   return(1);    return(1);
 }  }
   
 /*  /*
   partition $B$KBP$7$F$d$k;E;v$r$3$A$i$X=q$/(B.    Commands to do for each partition are given here.
 */  */
 static void pExec_0() {  static void pExec_0() {
   if (Debug) {    if (Debug) {
         printf("M_kap=");      oxprintf("M_kap=");
         printp(M_kap);      printp(M_kap);
         printf("\n");      oxprintf("\n");
   }    }
 }  }
   
 /* Test.  /* Test.
   Compare pListPartition(4,3);  genDarray(4,3);     Compare pListPartition(4,3);  genDarray(4,3);
   Compare pListPartition(5,3);  genDarray(5,3);     Compare pListPartition(5,3);  genDarray(5,3);
   
 */  */
   
 /*  /*
 main() {    main() {
   M_pExec = pExec_0;    M_pExec = pExec_0;
   pListPartition(5,3);    pListPartition(5,3);
 }    }
 */  */
   
   
Line 751  static int pListHS(int Kap[],int N) {
Line 860  static int pListHS(int Kap[],int N) {
   HS_n = N;    HS_n = N;
   /* Clear HS_mu. Do not forget when N < M_n  */    /* Clear HS_mu. Do not forget when N < M_n  */
   for (i=0; i<M_n; i++) HS_mu[i] = 0;    for (i=0; i<M_n; i++) HS_mu[i] = 0;
   pListHS2(1,N,Kap);    return(pListHS2(1,N,Kap));
 }  }
   
 static int pListHS2(int From,int To,int Kap[]) {  static int pListHS2(int From,int To,int Kap[]) {
Line 766  static int pListHS2(int From,int To,int Kap[]) {
Line 875  static int pListHS2(int From,int To,int Kap[]) {
 }  }
   
 static void hsExec_0() {  static void hsExec_0() {
   int i;    /* int i; */
   if(Debug) {printf("hsExec: "); printp(HS_mu); printf("\n");}    if(Debug) {oxprintf("hsExec: "); printp(HS_mu); oxprintf("\n");}
 }  }
   
 /*  /*
   pListHS([0,4,2,1],3);    pListHS([0,4,2,1],3);
 */  */
 /*  /*
 main() {    main() {
   int Kap[3]={4,2,1};    int Kap[3]={4,2,1};
   HS_hsExec = hsExec_0;    HS_hsExec = hsExec_0;
   pListHS(Kap,3);    pListHS(Kap,3);
 }    }
 */  */
   
 /* The number of partitions <= M, with N parts.  /* The number of partitions <= M, with N parts.
   (0,0,...,0) is excluded.     (0,0,...,0) is excluded.
 */  */
 #define aP_pki(i,j) P_pki[(i)*(M+1)+(j)]  #define aP_pki(i,j) P_pki[(i)*(M+1)+(j)]
 static int pmn(int M,int N) {  static int pmn(int M,int N) {
Line 805  static int pmn(int M,int N) {
Line 914  static int pmn(int M,int N) {
   }    }
   P_pmn=S;    P_pmn=S;
   if (Debug) {    if (Debug) {
     printf("P_pmn=%d\n",P_pmn);      oxprintf("P_pmn=%d\n",P_pmn);
     for (i=0; i<=Min_m_n; i++) {      for (i=0; i<=Min_m_n; i++) {
       for (j=0; j<=M; j++) printf("%d,",aP_pki(i,j));        for (j=0; j<=M; j++) oxprintf("%d,",aP_pki(i,j));
       printf("\n");        oxprintf("\n");
     }      }
   }    }
   myfree(P_pki); P_pki=NULL;    myfree(P_pki); P_pki=NULL;
Line 816  static int pmn(int M,int N) {
Line 925  static int pmn(int M,int N) {
 }  }
   
 /*  /*
 main() {pmn(4,3); printf("P_pmn=%d\n",P_pmn);}    main() {pmn(4,3); oxprintf("P_pmn=%d\n",P_pmn);}
 */  */
   
 static int *cloneP(int a[]) {  static int *cloneP(int a[]) {
Line 826  static int *cloneP(int a[]) {
Line 935  static int *cloneP(int a[]) {
   for (i=0; i<M_n; i++) p[i] = a[i];    for (i=0; i<M_n; i++) p[i] = a[i];
   return(p);    return(p);
 }  }
 static copyP(int p[],int a[]) {  static int copyP(int p[],int a[]) {
   int i;    int i;
   for (i=0; i<M_n; i++) p[i] = a[i];    for (i=0; i<M_n; i++) p[i] = a[i];
     return(0);
 }  }
   
 static void pExec_darray(void) {  static void pExec_darray(void) {
Line 843  static void pExec_darray(void) {
Line 953  static void pExec_darray(void) {
   ParraySize[DR_parray] = mysum(K);    ParraySize[DR_parray] = mysum(K);
   DR_parray++;    DR_parray++;
 }  }
 static genDarray2(int M,int N) {  static int genDarray2(int M,int N) {
   extern int *Darray;    extern int *Darray;
   extern int **Parray;    extern int **Parray;
   extern int DR_parray;    extern int DR_parray;
Line 856  static genDarray2(int M,int N) {
Line 966  static genDarray2(int M,int N) {
   
   M_m = M;    M_m = M;
   Pmn = pmn(M,N)+1;    Pmn = pmn(M,N)+1;
   if (Debug) printf("Degree M = %d, N of vars N = %d, Pmn+1=%d\n",M,N,Pmn);    if (Debug) oxprintf("Degree M = %d, N of vars N = %d, Pmn+1=%d\n",M,N,Pmn);
   Darray=(int *) mymalloc(sizeof(int)*Pmn);    Darray=(int *) mymalloc(sizeof(int)*Pmn);
   for (i=0; i<Pmn; i++) Darray[i] = 0;    for (i=0; i<Pmn; i++) Darray[i] = 0;
   Parray=(int **) mymalloc(sizeof(int *)*Pmn);    Parray=(int **) mymalloc(sizeof(int *)*Pmn);
Line 871  static genDarray2(int M,int N) {
Line 981  static genDarray2(int M,int N) {
   Nk = (int *) mymalloc(sizeof(int)*(Pmn+1));    Nk = (int *) mymalloc(sizeof(int)*(Pmn+1));
   for (I=0; I<Pmn; I++) Nk[I] = I;    for (I=0; I<Pmn; I++) Nk[I] = I;
   for (I=0; I<Pmn; I++) {    for (I=0; I<Pmn; I++) {
      K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */      mh_check_intr(100);
      Ksize = plength(K);      K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
      if (Ksize >= M_n) {      Ksize = plength(K);
        if (Debug) {fprintf(stderr,"Ksize >= M_n\n");}      if (Ksize >= M_n) {
            continue;        if (Debug) {oxprintfe("Ksize >= M_n\n");}
      }        continue;
      for (i=0; i<M_n; i++) Kone[i] = 0;      }
      for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;      for (i=0; i<M_n; i++) Kone[i] = 0;
      for (J=0; J<Pmn; J++) {      for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;
         if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */      for (J=0; J<Pmn; J++) {
      }        if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */
       }
   }    }
   if (Debug) {    if (Debug) {
         printf("Darray=\n");      oxprintf("Darray=\n");
         for (i=0; i<Pmn; i++) printf("%d\n",Darray[i]);      for (i=0; i<Pmn; i++) oxprintf("%d\n",Darray[i]);
         printf("-----------\n");      oxprintf("-----------\n");
   }    }
     return(0);
 }  }
   
   
 /* main() {  genDarray2(4,3);}  */  /* main() {  genDarray2(4,3);}  */
   
 /* M_beta_0[*] value of beta_{kappa,mu}, M_beta_1[*] N_mu */  /* M_beta_0[*] value of beta_{kappa,mu}, M_beta_1[*] N_mu */
 static isHStrip(int Kap[],int Nu[]) {  static int isHStrip(int Kap[],int Nu[]) {
   int N1,N2,I,P;    int N1,N2,I,P;
   N1 = plength(Kap); N2 = plength(Nu);    N1 = plength(Kap); N2 = plength(Nu);
   if (N2 > N1) return(0);    if (N2 > N1) return(0);
Line 914  static void hsExec_beta(void) {
Line 1026  static void hsExec_beta(void) {
   int Nu[M_nmx];    int Nu[M_nmx];
   int rrMax;    int rrMax;
   hsExec_0();    hsExec_0();
   /* printf("M_beta_pt=%a\n",M_beta_pt); */    /* oxprintf("M_beta_pt=%a\n",M_beta_pt); */
   /* Mu = cdr(vtol(HS_mu)); */    /* Mu = cdr(vtol(HS_mu)); */
   Mu = HS_mu; /* buggy? need cloneP */    Mu = HS_mu; /* buggy? need cloneP */
   if (M_beta_pt == 0) {    if (M_beta_pt == 0) {
Line 936  static void hsExec_beta(void) {
Line 1048  static void hsExec_beta(void) {
     Done=0;      Done=0;
     for (J=M_beta_pt-1; J>=0; J--) {      for (J=M_beta_pt-1; J>=0; J--) {
       if (M_beta_1[J] == Nnu) {        if (M_beta_1[J] == Nnu) {
          K=I+1;          K=I+1;
                  if (Debug) {          if (Debug) {
                    printf("Found at J=%d, K=%d, q3_10(Kap,Nu,K)=%lf,Nu,Mu= \n",            oxprintf("Found at J=%d, K=%d, q3_10(Kap,Nu,K)=%lf,Nu,Mu= \n",
                                   J,K,q3_10(M_beta_kap,Nu,K));                   J,K,q3_10(M_beta_kap,Nu,K));
                    printp(Nu); printf("\n");            printp(Nu); oxprintf("\n");
                    printp(Mu); printf("\n");            printp(Mu); oxprintf("\n");
                  }          }
          /* Check other conditions. See Numata's mail on Dec 24, 2011. */          /* Check other conditions. See Numata's mail on Dec 24, 2011. */
                  rrMax = Nu[I]-1;          rrMax = Nu[I]-1;
          if ((plength_t(Kapt) < rrMax) || (plength_t(Nut) < rrMax)) {          if ((plength_t(Kapt) < rrMax) || (plength_t(Nut) < rrMax)) {
              if (Debug) printf(" is not taken (length). \n");            if (Debug) oxprintf(" is not taken (length). \n");
                          break;            break;
          }          }
          OK=1;          OK=1;
          for (RR=0; RR<rrMax; RR++) {          for (RR=0; RR<rrMax; RR++) {
             if (Kapt[RR] != Nut[RR]) { OK=0; break;}            if (Kapt[RR] != Nut[RR]) { OK=0; break;}
          }          }
          if (!OK) { if (Debug) printf(" is not taken.\n"); break; }          if (!OK) { if (Debug) oxprintf(" is not taken.\n"); break; }
          /* check done. */          /* check done. */
          M_beta_0[M_beta_pt]=M_beta_0[J]*q3_10(M_beta_kap,Nu,K);          M_beta_0[M_beta_pt]=M_beta_0[J]*q3_10(M_beta_kap,Nu,K);
          Done = 1; break;          Done = 1; break;
       }        }
     }      }
     if (Done) break; else Nu[I]--;      if (Done) break; else Nu[I]--;
   }    }
   if (!Done) {    if (!Done) {
     if (Debug) printf("BUG: not found M_beta_pt=%d.\n",M_beta_pt);      if (Debug) oxprintf("BUG: not found M_beta_pt=%d.\n",M_beta_pt);
     /* M_beta_0[M_beta_pt] = NAN; /* error("Not found."); */      /* M_beta_0[M_beta_pt] = NAN;  error("Not found."); */
     M_beta_0[M_beta_pt] = beta(M_beta_kap,Mu);      M_beta_0[M_beta_pt] = beta(M_beta_kap,Mu);
   }    }
   /* Fix the bug of mh.rr */    /* Fix the bug of mh.rr */
   M_beta_pt++;    M_beta_pt++;
 }  }
 static genBeta(int Kap[]) {  static int genBeta(int Kap[]) {
   extern double *M_beta_0;    extern double *M_beta_0;
   extern int *M_beta_1;    extern int *M_beta_1;
   extern int M_beta_pt;    extern int M_beta_pt;
   extern int M_beta_kap[];    extern int M_beta_kap[];
   extern int P_pmn;    extern int P_pmn;
   int I,J,N;    int I,N;
   if (Debug) {printp(Kap); printf("<-Kappa, P_pmn=%d\n",P_pmn);}    if (Debug) {printp(Kap); oxprintf("<-Kappa, P_pmn=%d\n",P_pmn);}
   /* M_beta = newmat(2,P_pmn+1); */    /* M_beta = newmat(2,P_pmn+1); */
   M_beta_0 = (double *)mymalloc(sizeof(double)*(P_pmn+1));    M_beta_0 = (double *)mymalloc(sizeof(double)*(P_pmn+1));
   M_beta_1 = (int *)mymalloc(sizeof(int)*(P_pmn+1));    M_beta_1 = (int *)mymalloc(sizeof(int)*(P_pmn+1));
Line 985  static genBeta(int Kap[]) {
Line 1097  static genBeta(int Kap[]) {
   N = plength(Kap);    N = plength(Kap);
   HS_hsExec = hsExec_beta;    HS_hsExec = hsExec_beta;
   copyP(M_beta_kap,Kap);    copyP(M_beta_kap,Kap);
   pListHS(Kap,N);    pListHS(Kap,N); return(0);
 }  }
 /*  /*
   genDarray2(4,3);    genDarray2(4,3);
   genBeta([2,2,0]);    genBeta([2,2,0]);
   genBeta([2,1,1]);    genBeta([2,1,1]);
 */  */
   #ifdef STANDALONE
 static checkBeta1() {  static int checkBeta1() {
   int Kap[3] = {2,2,0};    int Kap[3] = {2,2,0};
   int Kap2[3] = {2,1,0};    int Kap2[3] = {2,1,0};
   int I;    int I;
Line 1004  static checkBeta1() {
Line 1116  static checkBeta1() {
   for (I=0; I<M_beta_pt; I++) {    for (I=0; I<M_beta_pt; I++) {
     Mu = Parray[M_beta_1[I]];      Mu = Parray[M_beta_1[I]];
     Beta_km = M_beta_0[I];      Beta_km = M_beta_0[I];
         if (Debug) {      if (Debug) {
           printp(Kap); printf("<--Kap, ");        printp(Kap); oxprintf("<--Kap, ");
           printp(Mu); printf("<--Mu,");        printp(Mu); oxprintf("<--Mu,");
           printf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap,Mu));        oxprintf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap,Mu));
         }      }
   }    }
   if (Debug) printf("-------------------------------------\n");    if (Debug) oxprintf("-------------------------------------\n");
   genBeta(Kap2);    genBeta(Kap2);
   for (I=0; I<M_beta_pt; I++) {    for (I=0; I<M_beta_pt; I++) {
     Mu = Parray[M_beta_1[I]];      Mu = Parray[M_beta_1[I]];
     Beta_km = M_beta_0[I];      Beta_km = M_beta_0[I];
         if (Debug) {      if (Debug) {
           printp(Kap2); printf("<--Kap, ");        printp(Kap2); oxprintf("<--Kap, ");
           printp(Mu); printf("<--Mu,");        printp(Mu); oxprintf("<--Mu,");
           printf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap2,Mu));        oxprintf("Beta_km(by table)=%lf, beta(Kap,Mu)=%lf\n",Beta_km,beta(Kap2,Mu));
         }      }
   }    }
     return(0);
 }  }
   #endif
 /*  /*
 def checkBeta2() {    def checkBeta2() {
   genDarray2(3,3);    genDarray2(3,3);
   Kap = [2,1,0];    Kap = [2,1,0];
   printf("Kap=%a\n",Kap);    oxprintf("Kap=%a\n",Kap);
   genBeta(Kap);    genBeta(Kap);
   for (I=0; I<M_beta_pt; I++) {    for (I=0; I<M_beta_pt; I++) {
     Mu = Parray[M_beta[1][I]];    Mu = Parray[M_beta[1][I]];
     Beta_km = M_beta[0][I];    Beta_km = M_beta[0][I];
     printf("Mu=%a,",Mu);    oxprintf("Mu=%a,",Mu);
     printf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));    oxprintf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));
   }    }
 }    }
 */  */
   
 /* main() { checkBeta1(); } */  /* main() { checkBeta1(); } */
Line 1056  static int psublen(int Kap[],int Mu[]) {
Line 1169  static int psublen(int Kap[],int Mu[]) {
   
   
 /* Table of Jack polynomials  /* Table of Jack polynomials
   Jack[1]* one variable.     Jack[1]* one variable.
   Jack[2]* two variables.     Jack[2]* two variables.
    ...     ...
   Jack[M_n]* n variables.     Jack[M_n]* n variables.
   Jack[P][J]*     Jack[P][J]*
        D^J(P variables jack of p variables). Example. J=001 d_1, 010 d_2, 100 d_3     D^J(P variables jack of p variables). Example. J=001 d_1, 010 d_2, 100 d_3
        0<=J<=2^{M_n}-1     0<=J<=2^{M_n}-1
   Jack[P][J][nk(Kappa)]  Jack_Kappa, Kappa is a partition.     Jack[P][J][nk(Kappa)]  Jack_Kappa, Kappa is a partition.
   0<=nk(Kappa)<=pmn(M_m,M_n)     0<=nk(Kappa)<=pmn(M_m,M_n)
 */  */
   
 #define aM_jack(i,j,k) ((M_jack[i])[(j)*(Pmn+1)+(k)])  #define aM_jack(i,j,k) ((M_jack[i])[(j)*(Pmn+1)+(k)])
 static genJack(int M,int N) {  static int genJack(int M,int N) {
   extern double **M_jack;    extern double **M_jack;
   extern int M_2n;    extern int M_2n;
   extern int P_pmn;    extern int P_pmn;
Line 1076  static genJack(int M,int N) {
Line 1189  static genJack(int M,int N) {
   int Pmn,I,J,K,L,Nv,H,P;    int Pmn,I,J,K,L,Nv,H,P;
   int *Kap,*Mu;    int *Kap,*Mu;
   double Jack,Beta_km;    double Jack,Beta_km;
   int Nk,JJ;    int Nk,JJ, two_to_I;
   if (Debug) printf("genJack(%d,%d)\n",M,N);    if (Debug) oxprintf("genJack(%d,%d)\n",M,N);
   M_jack = (double **) mymalloc(sizeof(double *)*(N+2));    M_jack = (double **) mymalloc(sizeof(double *)*(N+2));
   M_2n = imypower(2,N);    M_2n = imypower(2,N);
   Pmn = pmn(M,N);  /*P_pmn is initializeded.    Pmn = pmn(M,N);  /*P_pmn is initializeded.
Line 1100  static genJack(int M,int N) {
Line 1213  static genJack(int M,int N) {
       for (J=2; J<M_2n; J++) aM_jack(1,J,K) = 0;        for (J=2; J<M_2n; J++) aM_jack(1,J,K) = 0;
     }      }
   }    }
   for (I=1; I<=N; I++) {    for (I=1; I<=N; I++) {   two_to_I = imypower(2,I);
     for (K=M+1; K<Pmn+1; K++) {      for (K=M+1; K<Pmn+1; K++) {
       aM_jack(I,0,K) = NAN;        aM_jack(I,0,K) = NAN;
       if (M_df) {        if (M_df) {
         for (J=1; J<M_2n; J++) {          for (J=1; J<M_2n; J++) {
           if (J >= 2^I) aM_jack(I,J,K) = 0;            if (J >= two_to_I) aM_jack(I,J,K) = 0; /* J >= 2^I */
           else aM_jack(I,J,K) = NAN;            else aM_jack(I,J,K) = NAN;
         }          }
       }        }
     }      }
Line 1122  static genJack(int M,int N) {
Line 1235  static genJack(int M,int N) {
         for (J=1; J<M_2n; J++) aM_jack(I,J,K) = 0;          for (J=1; J<M_2n; J++) aM_jack(I,J,K) = 0;
       }        }
     }      }
     if (Debug) {printf("Kappa="); printp(Kap);}      if (Debug) {oxprintf("Kappa="); printp(Kap);}
     /* Enumerate horizontal strip of Kappa */      /* Enumerate horizontal strip of Kappa */
     genBeta(Kap);  /* M_beta_pt stores the number of hs */      genBeta(Kap);  /* M_beta_pt stores the number of hs */
     /* Nv is the number of variables */      /* Nv is the number of variables */
Line 1131  static genJack(int M,int N) {
Line 1244  static genJack(int M,int N) {
       for (H=0; H<M_beta_pt; H++) {        for (H=0; H<M_beta_pt; H++) {
         Nk = M_beta_1[H];          Nk = M_beta_1[H];
         Mu = Parray[Nk];          Mu = Parray[Nk];
         if (UseTable) {          if (UseTable) {
           Beta_km = M_beta_0[H];            Beta_km = M_beta_0[H];
         }else{          }else{
           Beta_km = beta(Kap,Mu);            Beta_km = beta(Kap,Mu);
   /* do not use the M_beta table. It's buggy. UseTable is experimental.*/            /* do not use the M_beta table. It's buggy. UseTable is experimental.*/
         }          }
         if (Debug) {printf("Nv(number of variables)=%d, Beta_km=%lf, Mu=",Nv,Beta_km);          if (Debug) {oxprintf("Nv(number of variables)=%d, Beta_km=%lf, Mu=",Nv,Beta_km);
                 printp(Mu); printf("\n");}            printp(Mu); oxprintf("\n");}
         P = psublen(Kap,Mu);          P = psublen(Kap,Mu);
         Jack += aM_jack(Nv-1,0,Nk)*Beta_km*xval(Nv,P); /* util_v(x,[Nv])^P;*/          Jack += aM_jack(Nv-1,0,Nk)*Beta_km*xval(Nv,P); /* util_v(x,[Nv])^P;*/
                 if (Debug) printf("xval(%d,%d)=%lf\n",Nv,P,xval(Nv,P));          if (Debug) oxprintf("xval(%d,%d)=%lf\n",Nv,P,xval(Nv,P));
       }        }
       aM_jack(Nv,0,K) = Jack;        aM_jack(Nv,0,K) = Jack;
       if (M_df) {        if (M_df) {
         /* The case of M_df > 0. */          /* The case of M_df > 0. */
         for (J=1; J<M_2n; J++) {          for (J=1; J<M_2n; J++) {
       Jack = 0;            mh_check_intr(100);
       for (H=0; H<M_beta_pt; H++) {            Jack = 0;
         Nk = M_beta_1[H];            for (H=0; H<M_beta_pt; H++) {
         Mu = Parray[Nk];              Nk = M_beta_1[H];
         if (UseTable) {              Mu = Parray[Nk];
           Beta_km = M_beta_0[H];              if (UseTable) {
         }else{                Beta_km = M_beta_0[H];
           Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */              }else{
         }                Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */
         if (Debug) {printf("M_df: Nv(number of variables)=%d, Beta_km=%lf, Mu= ",Nv,Beta_km);              }
                 printp(Mu); printf("\n"); }              if (Debug) {oxprintf("M_df: Nv(number of variables)=%d, Beta_km=%lf, Mu= ",Nv,Beta_km);
         P = psublen(Kap,Mu);                printp(Mu); oxprintf("\n"); }
         if (J & (1 << (Nv-1))) {              P = psublen(Kap,Mu);
           JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */              if (J & (1 << (Nv-1))) {
           if (P != 0) {                JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */
             Jack += aM_jack(Nv-1,JJ,Nk)*Beta_km*P*xval(Nv,P-1);                if (P != 0) {
           }                  Jack += aM_jack(Nv-1,JJ,Nk)*Beta_km*P*xval(Nv,P-1);
         }else{                }
           Jack += aM_jack(Nv-1,J,Nk)*Beta_km*xval(Nv,P);              }else{
         }                Jack += aM_jack(Nv-1,J,Nk)*Beta_km*xval(Nv,P);
       }              }
       aM_jack(Nv,J,K) = Jack;            }
       if (Debug) printf("aM_jack(%d,%d,%d) = %lf\n",Nv,J,K,Jack);            aM_jack(Nv,J,K) = Jack;
             if (Debug) oxprintf("aM_jack(%d,%d,%d) = %lf\n",Nv,J,K,Jack);
         } /* end of J loop */          } /* end of J loop */
       }        }
     }      }
   }    } return(0);
 }  }
   
   #ifdef STANDALONE
 /* checkJack1(3,3)  /* checkJack1(3,3)
 */   */
 static checkJack1(int M,int N) {  static int checkJack1(int M,int N) {
   int I,K;    int I,K;
   extern int P_pmn;    extern int P_pmn;
   extern double M_x[];    extern double M_x[];
Line 1193  static checkJack1(int M,int N) {
Line 1307  static checkJack1(int M,int N) {
   for (I=1; I<=N; I++) {    for (I=1; I<=N; I++) {
     for (K=0; K<=P_pmn; K++) {      for (K=0; K<=P_pmn; K++) {
       printp(Parray[K]);        printp(Parray[K]);
       printf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));        oxprintf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
     }      }
   }    }
   for (I=1; I<=N; I++) printf("%lf, ",M_x[I-1]);    for (I=1; I<=N; I++) oxprintf("%lf, ",M_x[I-1]);
   printf("<--x\n");    oxprintf("<--x\n");
     return(0);
 }  }
 /*main() {  checkJack1(3,3);  }*/  /*main() {  checkJack1(3,3);  }*/
   
   
 static checkJack2(int M,int N) {  static int checkJack2(int M,int N) {
   int I,K,J;    int I,K,J;
   extern int P_pmn;    extern int P_pmn;
   extern double M_x[];    extern double M_x[];
   extern M_df;    extern int M_df;
   int Pmn; /* used in aM_jack */    int Pmn; /* used in aM_jack */
   M_df=1;    M_df=1;
   /* initialize x vars. */    /* initialize x vars. */
Line 1218  static checkJack2(int M,int N) {
Line 1333  static checkJack2(int M,int N) {
   for (I=1; I<=N; I++) {    for (I=1; I<=N; I++) {
     for (K=0; K<=P_pmn; K++) {      for (K=0; K<=P_pmn; K++) {
       printp(Parray[K]);        printp(Parray[K]);
       printf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));        oxprintf("<--Kap, Nv=%d, TableJack=%lf\n",I,aM_jack(I,0,K));
     }      }
   }    }
   for (I=1; I<=N; I++) printf("%lf, ",M_x[I-1]);    for (I=1; I<=N; I++) oxprintf("%lf, ",M_x[I-1]);
   printf("<--x\n");    oxprintf("<--x\n");
   
   for (I=1; I<=N; I++) {    for (I=1; I<=N; I++) {
     for (K=0; K<=P_pmn; K++) {      for (K=0; K<=P_pmn; K++) {
       for (J=0; J<M_2n; J++) {        for (J=0; J<M_2n; J++) {
                 printp(Parray[K]);          printp(Parray[K]);
                 printf("<--Kap, Nv=%d,J(diff)=%d, D^J Jack=%lf\n",          oxprintf("<--Kap, Nv=%d,J(diff)=%d, D^J Jack=%lf\n",
                            I,J,aM_jack(I,J,K));                 I,J,aM_jack(I,J,K));
           }        }
         }      }
   }    }
     return(0);
 }  }
   
 /* main() { checkJack2(3,3); } */  /* main() { checkJack2(3,3); } */
   #endif
   
 double mh_t(double A[A_LEN],double B[B_LEN],int N,int M) {  double mh_t(double A[A_LEN],double B[B_LEN],int N,int M) {
   double F,F2;    double F,F2;
Line 1243  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
Line 1360  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
   extern int P_pmn;    extern int P_pmn;
   extern double *M_qk;    extern double *M_qk;
   extern double M_rel_error;    extern double M_rel_error;
     extern int M_m;
     extern int M_m_estimated_approx_deg;
     extern double M_assigned_series_error;
   int Pmn;    int Pmn;
   int K;    int K;
   int *Kap;    int *Kap;
   int size;    int size;
     int i;
     double partial_sum[M_m_MAX+1];
     double iv;
     double serror;
   F = 0; F2=0;    F = 0; F2=0;
   M_df=1;    M_df=1;
   genJack(M,N);    genJack(M,N);
Line 1254  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
Line 1378  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
   Pmn = P_pmn;    Pmn = P_pmn;
   size = ParraySize[P_pmn];    size = ParraySize[P_pmn];
   for (K=0; K<=P_pmn; K++) {    for (K=0; K<=P_pmn; K++) {
         Kap = Parray[K];      mh_check_intr(100);
         M_qk[K] = qk(Kap,A,B);      Kap = Parray[K];
         F += M_qk[K]*aM_jack(N,0,K);      M_qk[K] = qk(Kap,A,B);
         if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);      F += M_qk[K]*aM_jack(N,0,K);
         if (Debug) printf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);      if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);
         if (Debug && (ParraySize[K] == size)) printf("M_qk[K]=%lg, aM_jack=%lg\n",M_qk[K],aM_jack(N,0,K));      if (Debug) oxprintf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);
       if (Debug && (ParraySize[K] == size)) oxprintf("M_qk[K]=%lg, aM_jack=%lg\n",M_qk[K],aM_jack(N,0,K));
   }    }
   M_rel_error = F-F2;    M_rel_error = F-F2;
   
     M_m_estimated_approx_deg = -1; serror=1;
     for (i=0; i<=M_m; i++) {
       partial_sum[i] = 0.0; partial_sum[i+1] = 0.0;
       for (K=0; K<=P_pmn; K++) {
         if (ParraySize[K] == i) partial_sum[i] += M_qk[K]*aM_jack(N,0,K);
       }
       if (i>0) partial_sum[i] += partial_sum[i-1];
       if (i>0) serror = myabs((partial_sum[i]-partial_sum[i-1])/partial_sum[i-1]);
       if ((i>0)&&(M_m_estimated_approx_deg < 0)&&(serror<M_assigned_series_error)) {
         M_m_estimated_approx_deg = i; break;
       }
     }
     if (M_m_estimated_approx_deg < 0) {
       M_m_estimated_approx_deg = M_m+mymin(5,mymax(1,(int)log(serror/M_assigned_series_error))); /* Heuristic */
     }
     /*
     for (K=0; K<=P_pmn; K++) {
       oxprintf("Kappa="); for (i=0; i<N; i++) oxprintf("%d ",Parray[K][i]); oxprintf("\n");
       oxprintf("ParraySize(%d)=%d (|kappa|),   M_m=%d\n",K,ParraySize[K],M_m);
     }
     for (i=0; i<=M_m; i++) {
       oxprintf("partial_sum[%d]=%lg\n",i,partial_sum[i]);
     }
     */
     M_estimated_X0g = X0g;
     iv=myabs(F*iv_factor());
     if (iv < M_x0value_min) M_estimated_X0g = X0g*mymax(2,log(log(1/iv)));   /* This is heuristic */
     M_estimated_X0g = mymin(M_estimated_X0g,M_X0g_bound);
     M_mh_t_success = 1;
     if (M_estimated_X0g != X0g) M_mh_t_success=0;
     if (M_m_estimated_approx_deg > M_m) M_mh_t_success=0;
   
     M_series_error = serror;
     M_recommended_abserr = iv*M_assigned_series_error;
     M_recommended_relerr = M_series_error;
   
     if (M_show_autosteps) {
       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);
       oxprintf("%%%%x0value_min=%lg, x0g_bound=%lg\n",M_x0value_min, M_X0g_bound);
       oxprintf("%%%%F=%lg,Ef=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),M_estimated_X0g,X0g);
       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);
       oxprintfe("%%%%(stderr) x0value_min=%lg, x0g_bound=%lg\n",M_x0value_min, M_X0g_bound);
       oxprintfe("%%%%(stderr) F=%lg,Ef=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),M_estimated_X0g,X0g);
     }
   
     M_mh_t_value=F;
   return(F);    return(F);
 }  }
 double mh_t2(int J) {  double mh_t2(int J) {
Line 1274  double mh_t2(int J) {
Line 1446  double mh_t2(int J) {
   F = 0;    F = 0;
   Pmn = P_pmn;    Pmn = P_pmn;
   for (K=0; K<P_pmn; K++) {    for (K=0; K<P_pmn; K++) {
      F += M_qk[K]*aM_jack(M_n,J,K);      F += M_qk[K]*aM_jack(M_n,J,K);
   }    }
   return(F);    return(F);
 }  }
   
 static mtest1b() {  #ifdef STANDALONE
   static int mtest1b() {
   double A[1] = {1.5};    double A[1] = {1.5};
   double B[1] = {1.5+5};    double B[1] = {1.5+5};
   int I,N,M,J;    int I,N,M,J;
Line 1290  static mtest1b() {
Line 1463  static mtest1b() {
   }    }
   mh_t(A,B,N,M);    mh_t(A,B,N,M);
   for (J=0; J<M_2n; J++) {    for (J=0; J<M_2n; J++) {
         F=mh_t2(J);      F=mh_t2(J);
         printf("J=%d, D^J mh_t=%lf\n",J,F);      oxprintf("J=%d, D^J mh_t=%lf\n",J,F);
   }    }
     return(0);
 }  }
   
 /* main() { mtest1b(); }*/  /* main() { mtest1b(); }*/
   #endif
   
   
   
   
 #define TEST 1  #define TEST 1
 #ifndef TEST  #ifndef TEST
   
Line 1308  static mtest1b() {
Line 1482  static mtest1b() {
 /****** from mh-n.c *****/  /****** from mh-n.c *****/
   
 #define SMAX 4096  #define SMAX 4096
 #define inci(i) { i++; if (i >= argc) { fprintf(stderr,"Option argument is not given.\n"); return(NULL); }}  #define inci(i) { i++; if (i >= argc) { oxprintfe("Option argument is not given.\n"); return(NULL); }}
   
 static int imypower(int x,int n) {  static int imypower(int x,int n) {
   int i;    int i;
Line 1319  static int imypower(int x,int n) {
Line 1493  static int imypower(int x,int n) {
   return(v);    return(v);
 }  }
   
 #ifdef STANDALONE  #ifdef STANDALONE2
 main(int argc,char *argv[]) {  int main(int argc,char *argv[]) {
   mh_exit(MH_RESET_EXIT);    mh_exit(MH_RESET_EXIT);
 /*  jk_main(argc,argv);    /*  jk_main(argc,argv);
         printf("second run.\n"); */        oxprintf("second run.\n"); */
   jk_main(argc,argv);    jk_main(argc,argv);
     return(0);
 }  }
 #endif  #endif
   
 struct MH_RESULT *jk_main(int argc,char *argv[]) {  struct MH_RESULT *jk_main(int argc,char *argv[]) {
   double *y0;    int i;
   double x0,xn;    struct MH_RESULT *ans;
   double ef;    extern int M_automatic;
   int i,j,rank;    extern int M_mh_t_success;
   double a[1]; double b[1];    extern double M_estimated_X0g;
     extern int M_m_estimated_approx_deg;
     for (i=1; i<argc; i++) {
       if (strcmp(argv[i],"--automatic")==0) {
         inci(i);
         sscanf(argv[i],"%d",&M_automatic);
         break;
       }
     }
     ans=jk_main2(argc,argv,0,0.0,0);
     if (!M_automatic) return(ans);
     if (M_mh_t_success) return(ans);
     while (!M_mh_t_success) {
       ans=jk_main2(argc,argv,1,M_estimated_X0g,M_m_estimated_approx_deg);
     }
     return(ans);
   }
   
   struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree) {
     // double *y0;
     //  double x0,xn;
     // double ef;
   
     int i,j; // int i,j,rank;
     double a[A_LEN]; double b[B_LEN];
   extern double M_x[];    extern double M_x[];
   extern double *Beta;    extern double *Beta;
   extern int M_2n;    extern int M_2n;
     extern int M_mh_t_success;
   char swork[1024];    char swork[1024];
   struct MH_RESULT *ans=NULL;    struct MH_RESULT *ans=NULL;
   struct SFILE *ofp = NULL;    struct SFILE *ofp = NULL;
Line 1346  struct MH_RESULT *jk_main(int argc,char *argv[]) {
Line 1546  struct MH_RESULT *jk_main(int argc,char *argv[]) {
   UseTable = 1;    UseTable = 1;
   Mapprox=6;    Mapprox=6;
   for (i=1; i<argc; i++) {    for (i=1; i<argc; i++) {
         if (strcmp(argv[i],"--idata")==0) {      if (strcmp(argv[i],"--idata")==0) {
           inci(i);        inci(i);
           setParam(argv[i]); idata=1;        setParam(argv[i]); idata=1;
         }else if (strcmp(argv[i],"--degree")==0) {      }else if (strcmp(argv[i],"--degree")==0) {
           inci(i);        inci(i);
           sscanf(argv[i],"%d",&Mapprox);        sscanf(argv[i],"%d",&Mapprox);
         }else if (strcmp(argv[i],"--x0")==0) {      }else if (strcmp(argv[i],"--x0")==0) {
           inci(i);        inci(i);
           sscanf(argv[i],"%lg",&X0g);        sscanf(argv[i],"%lg",&X0g);
         }else if (strcmp(argv[i],"--notable")==0) {      }else if (strcmp(argv[i],"--notable")==0) {
           UseTable = 0;        UseTable = 0;
         }else if (strcmp(argv[i],"--debug")==0) {      }else if (strcmp(argv[i],"--debug")==0) {
           Debug = 1;        Debug = 1;
         }else if (strcmp(argv[i],"--help")==0) {      }else if (strcmp(argv[i],"--help")==0) {
           usage(); return(0);        usage(); return(0);
         }else if (strcmp(argv[i],"--bystring")==0) {      }else if (strcmp(argv[i],"--bystring")==0) {
           if (idata) {fprintf(stderr,"--bystring must come before --idata option.\n"); mh_exit(-1);}        if (idata) {oxprintfe("--bystring must come before --idata option.\n"); mh_exit(-1);}
           JK_byFile = 0;        JK_byFile = 0;
         }else {      }else if (strcmp(argv[i],"--automatic")==0) {
           fprintf(stderr,"Unknown option %s\n",argv[i]);        inci(i); /* ignore, in this function */
           usage();      }else if (strcmp(argv[i],"--assigned_series_error")==0) {
           return(NULL);        inci(i);
         }        sscanf(argv[i],"%lg",&M_assigned_series_error);
       }else if (strcmp(argv[i],"--x0value_min")==0) {
         inci(i);
         sscanf(argv[i],"%lg",&M_x0value_min);
       }else {
         oxprintfe("Unknown option %s\n",argv[i]);
         usage();
         return(NULL);
       }
   }    }
   if (!idata) setParam(NULL);    if (!idata) setParam(NULL);
     if (automode) {
       Mapprox = newDegree;
       X0g = newX0g;
     }
   
   /* Initialize global variables */    /* Initialize global variables */
   M_n = Mg;    M_n = Mg;
   HS_n=M_n;    HS_n=M_n;
   if (!JK_byFile) ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));    if (!JK_byFile) {
       ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));
       ans->message = NULL;
       ans->t_success = 0;
       ans->series_error = 1.0e+10;
       ans->recommended_abserr = 1.0e-10;
     }
   else ans = NULL;    else ans = NULL;
     if (M_automatic) {
       /* Differentiation can be M_m in the bit pattern in the M_n variable case.*/
       if (M_n > Mapprox) Mapprox=M_n;
     }
   /* Output by a file=stdout */    /* Output by a file=stdout */
   ofp = mh_fopen("stdout","w",JK_byFile);    ofp = mh_fopen("stdout","w",JK_byFile);
   
   sprintf(swork,"%%%%Use --help option to see the help.\n"); mh_fputs(swork,ofp);    sprintf(swork,"%%%%Use --help option to see the help.\n"); mh_fputs(swork,ofp);
   sprintf(swork,"%%%%Mapprox=%d\n",Mapprox); mh_fputs(swork,ofp);    sprintf(swork,"%%%%Mapprox=%d\n",Mapprox); mh_fputs(swork,ofp);
   if (M_n != Mg) {    if (M_n != Mg) {
         myerror("Mg must be equal to M_n\n"); mh_exit(-1);      myerror("Mg must be equal to M_n\n"); mh_exit(-1);
   }    }
   if (Debug) showParam(NULL,1);    if (Debug) showParam(NULL,1);
   for (i=0; i<M_n; i++) {    for (i=0; i<M_n; i++) {
         M_x[i] = Beta[i]*X0g;      M_x[i] = Beta[i]*X0g;
   }    }
   a[0] = ((double)Mg+1.0)/2.0;  
   b[0] = ((double)Mg+1.0)/2.0 + ((double) (*Ng))/2.0; /* bug, double check */    M_beta_i_x_o2_max=myabs(M_x[0]/2);
   if (Debug) printf("Calling mh_t with ([%lf],[%lf],%d,%d)\n",a[0],b[0],M_n,Mapprox);    if (M_n <= 1) M_beta_i_beta_j_min = myabs(Beta[0]);
     else M_beta_i_beta_j_min = myabs(Beta[1]-Beta[0]);
     for (i=0; i<M_n; i++) {
       if (myabs(M_x[i]/2) > M_beta_i_x_o2_max) M_beta_i_x_o2_max = myabs(M_x[i]/2);
       for (j=i+1; j<M_n; j++) {
         if (myabs(Beta[i]-Beta[j]) < M_beta_i_beta_j_min)
           M_beta_i_beta_j_min = myabs(Beta[i]-Beta[j]);
       }
     }
   
     if ((P_pFq != A_LEN) || (Q_pFq != B_LEN)) {
       oxprintfe("It must be P_pFq == A_LEN and Q_pFq == B_LEN in this version. %s\n","");
       mh_exit(-1);
     }
     oxprintfe("%%%%(stderr) Orig_1F1=%d\n",Orig_1F1);
     if ((P_pFq == 1) && (Q_pFq == 1) && (Orig_1F1)) {
       A_pFq[0] = a[0] = ((double)Mg+1.0)/2.0;
       B_pFq[0] = b[0] = ((double)Mg+1.0)/2.0 + ((double) (*Ng))/2.0; /* bug, double check */
       if (Debug) oxprintf("Calling mh_t with ([%lf],[%lf],%d,%d)\n",a[0],b[0],M_n,Mapprox);
     }else{
       for (i=0; i<P_pFq; i++) a[i] = A_pFq[i];
       for (i=0; i<Q_pFq; i++) b[i] = B_pFq[i];
     }
   mh_t(a,b,M_n,Mapprox);    mh_t(a,b,M_n,Mapprox);
     if ((!M_mh_t_success) && M_automatic) {
       jk_freeWorkArea();
       return NULL;
     }
   if (imypower(2,M_n) != M_2n) {    if (imypower(2,M_n) != M_2n) {
         sprintf(swork,"M_n=%d,M_2n=%d\n",M_n,M_2n); mh_fputs(swork,ofp);      sprintf(swork,"M_n=%d,M_2n=%d\n",M_n,M_2n); mh_fputs(swork,ofp);
         myerror("2^M_n != M_2n\n"); mh_exit(-1);      myerror("2^M_n != M_2n\n"); mh_exit(-1);
   }    }
   sprintf(swork,"%%%%M_rel_error=%lg\n",M_rel_error); mh_fputs(swork,ofp);    sprintf(swork,"%%%%M_rel_error=%lg\n",M_rel_error); mh_fputs(swork,ofp);
   for (j=0; j<M_2n; j++) {    for (j=0; j<M_2n; j++) {
         Iv[j] = mh_t2(j);      Iv[j] = mh_t2(j);
   }    }
   Ef = iv_factor();    Ef = iv_factor();
   showParam(ofp,0);    showParam(ofp,0);
   
   /* return the result */    /* return the result */
   if (!JK_byFile) {    if (!JK_byFile) {
         ans->x = X0g;      ans->x = X0g;
         ans->rank = imypower(2,Mg);      ans->rank = imypower(2,Mg);
         ans->y = (double *)mymalloc(sizeof(double)*(ans->rank));      ans->y = (double *)mymalloc(sizeof(double)*(ans->rank));
         for (i=0; i<ans->rank; i++) (ans->y)[i] = Iv[i];      for (i=0; i<ans->rank; i++) (ans->y)[i] = Iv[i];
         ans->size=1;      ans->size=1;
         ans->sfpp = (struct SFILE **)mymalloc(sizeof(struct SFILE *)*(ans->size));      ans->sfpp = (struct SFILE **)mymalloc(sizeof(struct SFILE *)*(ans->size));
         (ans->sfpp)[0] = ofp;      (ans->sfpp)[0] = ofp;
   
       ans->t_success = M_mh_t_success;
       ans->series_error = M_series_error;
       ans->recommended_abserr = M_recommended_abserr;
   }    }
   if (Debug) printf("jk_freeWorkArea() starts\n");    if (Debug) oxprintf("jk_freeWorkArea() starts\n");
   jk_freeWorkArea();    jk_freeWorkArea();
   if (Debug) printf("jk_freeWorkArea() has finished.\n");    if (Debug) oxprintf("jk_freeWorkArea() has finished.\n");
   return(ans);    return(ans);
 }  }
   
 static usage() {  static int usage() {
   fprintf(stderr,"Usages:\n");    oxprintfe("Usages:\n");
   fprintf(stderr,"mh-m [--idata input_data_file --x0 x0 --degree approxm]\n");  #ifdef C_2F1
   fprintf(stderr,"\nThe command mh-m [options] generates an input for w-m, Pr({y | y<xmax}), which is the cumulative distribution function of the largest root of the m by m Wishart matrix with n degrees of freedom and the covariantce matrix sigma.\n");    oxprintfe("hgm_jack-n-2f1");
   fprintf(stderr,"The mh-m uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");  #else
   fprintf(stderr,"The degree of the approximation (Mapprox) is given by the --degree option.\n");    oxprintfe("hgm_jack-n    ");
   fprintf(stderr,"Parameters are specified by the input_data_file. Otherwise, default values are used.\n");  #endif
   fprintf(stderr,"The format of the input_data_file. The orders of the input numbers must be kept.\n");    oxprintfe(" [--idata input_data_file --x0 x0 --degree approxm]\n");
   fprintf(stderr," Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\n");    oxprintfe("           [--automatic n --assigned_series_error e --x0value_min e2]\n");
   fprintf(stderr," Iv: initial values at X0g*Beta (see our paper how to order them), are evaluated in this program. Give zeros. \n");    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");
   fprintf(stderr," Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");    oxprintfe("The hgm_jack-n uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");
   fprintf(stderr," Hg: h (step size) which is for w-m, X0g: starting value of x(when --x0 option is used, this value is used), Xng: terminating value of x which is for w-m.\n");    oxprintfe("The degree of the approximation (Mapprox) is given by the --degree option.\n");
   fprintf(stderr," Dp: output data is stored in every Dp steps when output_data_file is specified, which is for w-m.\n");    oxprintfe("Parameters are specified by the input_data_file. Otherwise, default values are used.\n\n");
   fprintf(stderr," The line started with %% is a comment line.\n");    oxprintfe("The format of the input_data_file: (The orders of the input data must be kept.)\n");
   fprintf(stderr," With the --notable option, it does not use the Lemma 3.2 of Koev-Edelman (there is a typo: kappa'_r = mu'_r for 1<=r<=mu_k).\n");    oxprintfe(" Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\n");
   fprintf(stderr," An example format of the input_data_file can be obtained by executing mh-m with no option.\n");    oxprintfe(" (Add a comment line %%Ng= before the data Ng to check the number of beta.)\n");
   fprintf(stderr,"\nExamples:\n");    oxprintfe(" X0g: starting value of x(when --x0 option is used, this value is used)\n");
   fprintf(stderr,"[1] ./mh-2 \n");    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");
   fprintf(stderr,"[2] ./mh-2 --x0 0.3 \n");    oxprintfe(" Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");
   fprintf(stderr,"[3] ./mh-3 --x0 0.1 \n");    oxprintfe(" Hg: h (step size) which is for hgm_w-n, \n");
   fprintf(stderr,"[4] ./mh-3 --x0 0.1 --degree 15 \n");    oxprintfe(" Dp: output data is stored in every Dp steps when output_data_file is specified. This is for hgm_w-n.\n");
   fprintf(stderr,"[5] ./mh-3 --idata test.txt --degree 15 \n");    oxprintfe(" Xng: terminating value of x. This is for hgm_w-n.\n");
   fprintf(stderr,"[6] ./mh-3 --degree 15 >test2.txt\n");    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");
   fprintf(stderr,"    ./w-3 --idata test2.txt --gnuplotf test-g\n");    oxprintfe("Parameters are redefined when they appear more than once in the idata file and the command line options.\n\n");
   fprintf(stderr,"    gnuplot -persist <test-g-gp.txt\n");    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");
     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");
     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");
     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);
   #ifdef C_2F1
     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");
   #endif
     oxprintfe("Todo: automatic mode throws away the table of Jack polynomials of the previous degrees and reevaluate them. They should be kept.\n");
     oxprintfe("\nExamples:\n");
     oxprintfe("[1] ./hgm_jack-n \n");
     oxprintfe("[2] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --degree 15  --automatic 0\n");
     oxprintfe("[3] ./hgm_jack-n --idata Testdata/tmp-idata2.txt --degree 15 >test2.txt\n");
     oxprintfe("    ./hgm_w-n --idata test2.txt --gnuplotf test-g\n");
     oxprintfe("    gnuplot -persist <test-g-gp.txt\n");
     oxprintfe("[4] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --automatic 1 --assigned_series_error=1e-12\n");
     oxprintfe("[5] ./hgm_jack-n --idata Testdata/tmp-idata4.txt\n");
   #ifdef C_2F1
     oxprintfe("Todo for 2F1: example for hgm_jack-n-2f1 has not been written.\niv_factor? Ef?");
   #endif
     return(0);
 }  }
   
 static setParamDefault() {  static int setParamDefault() {
   int rank;    int rank;
   int i;    int i;
   Mg = M_n_default ;    Mg = M_n_default ;
Line 1469  static setParamDefault() {
Line 1740  static setParamDefault() {
   X0g = (Beta[0]/Beta[Mg-1])*0.5;    X0g = (Beta[0]/Beta[Mg-1])*0.5;
   Hg = 0.001;    Hg = 0.001;
   Dp = 1;    Dp = 1;
   Xng = 10.0;    if ((P_pFq == 1) && (Q_pFq == 1)) {
       Xng = 10.0;
     }else {
           Xng=0.25;
           for (i=0; i<A_LEN; i++) A_pFq[i] = (i+1)/5.0;
           for (i=0; i<B_LEN; i++) B_pFq[i] = (A_LEN+i+1)/7.0;
     }
     return(0);
 }  }
   
 static next(struct SFILE *sfp,char *s,char *msg) {  static int next(struct SFILE *sfp,char *s,char *msg) {
     static int check=1;
     char *ng="%%Ng=";
     // int i;
   s[0] = '%';    s[0] = '%';
   while (s[0] == '%') {    while (s[0] == '%') {
         if (!mh_fgets(s,SMAX,sfp)) {      if (!mh_fgets(s,SMAX,sfp)) {
           fprintf(stderr,"Data format error at %s\n",msg);        oxprintfe("Data format error at %s\n",msg);
           mh_exit(-1);        mh_exit(-1);
         }      }
         if (s[0] != '%') return(0);      if (check && (strncmp(msg,ng,4)==0)) {
         if (strncmp(s,ng,5) != 0) {
           oxprintfe("Warning, there is no %%Ng= at the border of Beta's and Ng, s=%s\n",s);
         }
         /* check=0; */
       }
       if (s[0] != '%') return(0);
   }    }
     return(0);
 }  }
 static setParam(char *fname) {  static int setParam(char *fname) {
   int rank;    int rank;
   char s[SMAX];    char s[SMAX];
   struct SFILE *fp;    struct SFILE *fp;
   int i;    int i;
     struct mh_token tk;
   if (fname == NULL) return(setParamDefault());    if (fname == NULL) return(setParamDefault());
   
   Sample = 0;    Sample = 0;
   if ((fp=mh_fopen(fname,"r",JK_byFile)) == NULL) {    if ((fp=mh_fopen(fname,"r",JK_byFile)) == NULL) {
         if (JK_byFile) fprintf(stderr,"File %s is not found.\n",fp->s);      if (JK_byFile) oxprintfe("File %s is not found.\n",fp->s);
         mh_exit(-1);      mh_exit(-1);
   }    }
   next(fp,s,"Mg(m)");    next(fp,s,"Mg(m)");
   sscanf(s,"%d",&Mg);    sscanf(s,"%d",&Mg);
Line 1501  static setParam(char *fname) {
Line 1790  static setParam(char *fname) {
   Beta = (double *)mymalloc(sizeof(double)*Mg);    Beta = (double *)mymalloc(sizeof(double)*Mg);
   for (i=0; i<Mg; i++) {    for (i=0; i<Mg; i++) {
     next(fp,s,"Beta");      next(fp,s,"Beta");
         sscanf(s,"%lf",&(Beta[i]));      sscanf(s,"%lf",&(Beta[i]));
   }    }
   
   Ng = (double *)mymalloc(sizeof(double));    Ng = (double *)mymalloc(sizeof(double));
   next(fp,s,"Ng(freedom parameter n)");    next(fp,s,"%Ng= (freedom parameter n)");
   sscanf(s,"%lf",Ng);    sscanf(s,"%lf",Ng);
   
   next(fp,s,"X0g(initial point)");    next(fp,s,"X0g(initial point)");
   sscanf(s,"%lf",&X0g);    sscanf(s,"%lf",&X0g);
   
   Iv = (double *)mymalloc(sizeof(double)*rank);    Iv = (double *)mymalloc(sizeof(double)*rank);
   for (i=0; i<rank; i++) {    for (i=0; i<rank; i++) {
         next(fp,s,"Iv(initial values)");      next(fp,s,"Iv(initial values)");
         sscanf(s,"%lg",&(Iv[i]));          if (strncmp(s,"*",1)==0) {
             for (i=0; i<rank; i++) Iv[i] = 0.0;
             break;
           }
       sscanf(s,"%lg",&(Iv[i]));
   }    }
   
   next(fp,s,"Ef(exponential factor)");    next(fp,s,"Ef(exponential factor)");
   sscanf(s,"%lg",&Ef);    if (strncmp(s,"*",1)==0) Ef=0.0;
     else sscanf(s,"%lg",&Ef);
   
   next(fp,s,"Hg (step size of rk)");    next(fp,s,"Hg (step size of rk)");
   sscanf(s,"%lf",&Hg);    sscanf(s,"%lf",&Hg);
Line 1528  static setParam(char *fname) {
Line 1822  static setParam(char *fname) {
   
   next(fp,s,"Xng (the last point, cf. --xmax)");    next(fp,s,"Xng (the last point, cf. --xmax)");
   sscanf(s,"%lf",&Xng);    sscanf(s,"%lf",&Xng);
   
     /* Reading the optional parameters */
     while ((tk = mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_EOF) {
       /* expect ID */
       if (tk.type != MH_TOKEN_ID) {
         oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
       }
       if (strcmp(s,"automatic")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         M_automatic = tk.ival;
         continue;
       }
       if (strcmp(s,"assigned_series_error")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         M_assigned_series_error = tk.dval;
         continue;
       }
       if (strcmp(s,"x0value_min")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         M_x0value_min = tk.dval;
         continue;
       }
       if ((strcmp(s,"Mapprox")==0) || (strcmp(s,"degree")==0)) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         Mapprox = tk.ival;
         continue;
       }
       if (strcmp(s,"X0g_bound")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_DOUBLE) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         M_X0g_bound = tk.dval;
         continue;
       }
       if (strcmp(s,"show_autosteps")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         M_show_autosteps = tk.ival;
         continue;
       }
       // Format: #p_pFq=2  1.5  3.2
       if (strcmp(s,"p_pFq")==0) {
         Orig_1F1=0;
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         P_pFq = tk.ival;
         for (i=0; i<P_pFq; i++) {
           if ((tk=mh_getoken(s,SMAX-1,fp)).type == MH_TOKEN_DOUBLE) {
             A_pFq[i] = tk.dval;
           }else if (tk.type == MH_TOKEN_INT) {
             A_pFq[i] = tk.ival;
           }else{
             oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
           }
         }
         continue;
       }
       if (strcmp(s,"q_pFq")==0) {
         if (mh_getoken(s,SMAX-1,fp).type != MH_TOKEN_EQ) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         if ((tk=mh_getoken(s,SMAX-1,fp)).type != MH_TOKEN_INT) {
           oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
         }
         Q_pFq = tk.ival;
         for (i=0; i<Q_pFq; i++) {
           if ((tk=mh_getoken(s,SMAX-1,fp)).type == MH_TOKEN_DOUBLE) {
             B_pFq[i] = tk.dval;
           }else if (tk.type == MH_TOKEN_INT) {
             B_pFq[i] = tk.ival;
           }else{
             oxprintfe("Syntax error at %s\n",s); mh_exit(-1);
           }
         }
         continue;
       }
       oxprintfe("Unknown ID at %s\n",s); mh_exit(-1);
     }
   mh_fclose(fp);    mh_fclose(fp);
     return(0);
 }  }
   
 static showParam(struct SFILE *fp,int fd) {  static int showParam(struct SFILE *fp,int fd) {
   int rank,i;    int rank,i;
   char swork[1024];    char swork[1024];
   if (fd) {    if (fd) {
Line 1540  static showParam(struct SFILE *fp,int fd) {
Line 1944  static showParam(struct SFILE *fp,int fd) {
   rank = imypower(2,Mg);    rank = imypower(2,Mg);
   sprintf(swork,"%%Mg=\n%d\n",Mg); mh_fputs(swork,fp);    sprintf(swork,"%%Mg=\n%d\n",Mg); mh_fputs(swork,fp);
   for (i=0; i<Mg; i++) {    for (i=0; i<Mg; i++) {
         sprintf(swork,"%%Beta[%d]=\n%lf\n",i,Beta[i]); mh_fputs(swork,fp);      sprintf(swork,"%%Beta[%d]=\n%lf\n",i,Beta[i]); mh_fputs(swork,fp);
   }    }
   sprintf(swork,"%%Ng=\n%lf\n",*Ng); mh_fputs(swork,fp);    sprintf(swork,"%%Ng=\n%lf\n",*Ng); mh_fputs(swork,fp);
   sprintf(swork,"%%X0g=\n%lf\n",X0g); mh_fputs(swork,fp);    sprintf(swork,"%%X0g=\n%lf\n",X0g); mh_fputs(swork,fp);
   for (i=0; i<rank; i++) {    for (i=0; i<rank; i++) {
         sprintf(swork,"%%Iv[%d]=\n%lg\n",i,Iv[i]); mh_fputs(swork,fp);      sprintf(swork,"%%Iv[%d]=\n%lg\n",i,Iv[i]); mh_fputs(swork,fp);
         if (Sample && (M_n == 2) && (X0g == 0.3)) {      if (Sample && (M_n == 2) && (X0g == 0.3)) {
           sprintf(swork,"%%Iv[%d]-Iv2[%d]=%lg\n",i,i,Iv[i]-Iv2[i]); mh_fputs(swork,fp);        sprintf(swork,"%%Iv[%d]-Iv2[%d]=%lg\n",i,i,Iv[i]-Iv2[i]); mh_fputs(swork,fp);
         }      }
   }    }
   sprintf(swork,"%%Ef=\n%lg\n",Ef); mh_fputs(swork,fp);    sprintf(swork,"%%Ef=\n%lg\n",Ef); mh_fputs(swork,fp);
   sprintf(swork,"%%Hg=\n%lf\n",Hg); mh_fputs(swork,fp);    sprintf(swork,"%%Hg=\n%lf\n",Hg); mh_fputs(swork,fp);
   sprintf(swork,"%%Dp=\n%d\n",Dp);  mh_fputs(swork,fp);    sprintf(swork,"%%Dp=\n%d\n",Dp);  mh_fputs(swork,fp);
   sprintf(swork,"%%Xng=\n%lf\n",Xng);mh_fputs(swork,fp);    sprintf(swork,"%%Xng=\n%lf\n",Xng);mh_fputs(swork,fp);
   
     sprintf(swork,"%%%% Optional paramters\n"); mh_fputs(swork,fp);
     sprintf(swork,"#success=%d\n",M_mh_t_success); mh_fputs(swork,fp);
     sprintf(swork,"#automatic=%d\n",M_automatic); mh_fputs(swork,fp);
     sprintf(swork,"#series_error=%lg\n",M_series_error); mh_fputs(swork,fp);
     sprintf(swork,"#recommended_abserr\n"); mh_fputs(swork,fp);
     sprintf(swork,"#abserror=%lg\n",M_recommended_abserr); mh_fputs(swork,fp);
     if (M_recommended_relerr < MH_RELERR_DEFAULT) {
       sprintf(swork,"%%relerror=%lg\n",M_recommended_relerr); mh_fputs(swork,fp);
     }
     sprintf(swork,"#mh_t_value=%lg # Value of matrix hg at X0g.\n",M_mh_t_value); mh_fputs(swork,fp);
     sprintf(swork,"# M_m=%d  # Approximation degree of matrix hg.\n",M_m); mh_fputs(swork,fp);
     sprintf(swork,"#beta_i_x_o2_max=%lg #max(|beta[i]*x|/2)\n",M_beta_i_x_o2_max); mh_fputs(swork,fp);
     sprintf(swork,"#beta_i_beta_j_min=%lg #min(|beta[i]-beta[j]|)\n",M_beta_i_beta_j_min); mh_fputs(swork,fp);
     sprintf(swork,"# change # to %% to read as an optional parameter.\n"); mh_fputs(swork,fp);
     sprintf(swork,"%%p_pFq=%d, ",P_pFq); mh_fputs(swork,fp);
     for (i=0; i<P_pFq; i++) {
       if (i != P_pFq-1) sprintf(swork," %lg,",A_pFq[i]);
       else sprintf(swork," %lg\n",A_pFq[i]);
       mh_fputs(swork,fp);
     }
     sprintf(swork,"%%q_pFq=%d, ",Q_pFq); mh_fputs(swork,fp);
     for (i=0; i<Q_pFq; i++) {
       if (i != Q_pFq-1) sprintf(swork," %lg,",B_pFq[i]);
       else sprintf(swork," %lg\n",B_pFq[i]);
       mh_fputs(swork,fp);
     }
     return(0);
 }  }
   
 static double gammam(double a,int n) {  static double gammam(double a,int n) {
   double v,v2;    double v,v2;
   int i;    int i;
   v=mypower(sqrt(M_PI),(n*(n-1))/2);    v=mypower(sqrt(M_PI),(n*(n-1))/2); /* pi^(n*(n-1)/2) */
   v2=0;    v2=0;
   for (i=1; i<=n; i++) {    for (i=1; i<=n; i++) {
     v2 += lgamma(a-((double)(i-1))/2.0); /* not for big n */      v2 += lgamma(a-((double)(i-1))/2.0); /* not for big n */
   }    }
   if (Debug) printf("gammam(%lg,%d)=%lg\n",a,n,v*exp(v2));    if (Debug) oxprintf("gammam(%lg,%d)=%lg\n",a,n,v*exp(v2));
   return(v*exp(v2));    return(v*exp(v2));
 }  }
   
Line 1575  static double iv_factor(void) {
Line 2007  static double iv_factor(void) {
   double detSigma;    double detSigma;
   double c;    double c;
   int i,n;    int i,n;
     if ((P_pFq != 1) || (Q_pFq != 1)) return(1.0);
   n = (int) (*Ng);    n = (int) (*Ng);
   v1= mypower(sqrt(X0g),n*M_n);    v1= mypower(sqrt(X0g),n*M_n);
   t = 0.0;    t = 0.0;
Line 1585  static double iv_factor(void) {
Line 2018  static double iv_factor(void) {
   detSigma = 1.0/(b*mypower(2.0,M_n));    detSigma = 1.0/(b*mypower(2.0,M_n));
   
   c = gammam(((double)(M_n+1))/2.0, M_n)/    c = gammam(((double)(M_n+1))/2.0, M_n)/
      ( mypower(sqrt(2), M_n*n)*mypower(sqrt(detSigma),n)*gammam(((double)(M_n+n+1))/2.0,M_n) );      ( mypower(sqrt(2), M_n*n)*mypower(sqrt(detSigma),n)*gammam(((double)(M_n+n+1))/2.0,M_n) );
   return( c*v1);    return( c*v1);
 }  }
   

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.39

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