[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.17 and 1.39

version 1.17, 2014/03/12 07:50:37 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.16 2014/03/11 05:20:45 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.
Line 15 
Line 15 
   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:
   2014.03.11,    2016.02.01 ifdef C_2F1 ...
     2016.01.12 2F1
     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.
     2014.03.14, --automatic option. Output estimation data.
   2012.02.21, porting to OpenXM/src/hgm    2012.02.21, porting to OpenXM/src/hgm
   2011.12.22, --table option, which is experimental.    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.19, bug fix.  jjk() should return double. It can become more than max int.
Line 54  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 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 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;
Line 95  static double *M_qk=NULL;  /* saves pochhammerb */
Line 114  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. */  /* 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;  static int M_m_estimated_approx_deg=0;
 static double M_assigned_series_error=0.00001;  /* Let F(i) be the approximation up to degree i.
 static int M_automatic=0;     The i-th series_error is defined
 static double M_x0value_min=0.000000001;     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;  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;  static int M_mh_t_success=1;
 #define myabs(x) ((x)<0?(-(x)):(x))  /*
 #define mymax(x,y) ((x)>(y)?(x):(y))    recommended_abserr is the recommended value of the absolute error
 #define mymin(x,y) ((x)<(y)?(x):(y))    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);
Line 116  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 int 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 127  static double qk(int K[],double A[A_LEN],double B[B_LE
Line 198  static double qk(int K[],double A[A_LEN],double B[B_LE
 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 int printp(int kappa[]);  static int printp(int kappa[]);
 static int printp2(int kappa[]);  
 static int 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 150  static int genDarray2(int M,int N);
Line 215  static int genDarray2(int M,int N);
 static int isHStrip(int Kap[],int Nu[]);  static int isHStrip(int Kap[],int Nu[]);
 static void hsExec_beta(void);  static void hsExec_beta(void);
 static int genBeta(int Kap[]);  static int genBeta(int Kap[]);
 static int checkBeta1();  
 static int psublen(int Kap[],int Mu[]);  static int psublen(int Kap[],int Mu[]);
 static int genJack(int M,int N);  static int genJack(int M,int N);
 static int checkJack1(int M,int N);  
 static int checkJack2(int M,int N);  
 static int mtest1b();  
   
 static int imypower(int x,int n);  static int imypower(int x,int n);
 static int usage();  static int usage();
 static int setParamDefault();  static int setParamDefault();
 static int 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[]);
Line 188  int jk_freeWorkArea() {
Line 262  int jk_freeWorkArea() {
   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;
Line 232  int jk_initializeWorkArea() {
Line 306  int jk_initializeWorkArea() {
   
 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 int myfree(void *p) {  static int myfree(void *p) {
   if (Debug) printf("myFree at %p\n",p);    if (Debug) oxprintf("myFree at %p\n",p);
   return(mh_free(p));    return(mh_free(p));
 }  }
 static int myerror(char *s) { fprintf(stderr,"%s: type in control-C\n",s); getchar(); getchar(); return(0);}  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 262  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 275  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 int init=0;    static int init=0;
   if (JK_deallocate) { init=0; return(0.0);}    if (JK_deallocate) { init=0; return(0.0);}
Line 295  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 344  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]
   }    }
 }  }
   
   #ifdef STANDALONE
 static int test_ptrans() {  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};
Line 351  static int test_ptrans() {
Line 425  static int test_ptrans() {
   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);    return(0);
 }  }
   #endif
   
   
 /*  /*
   upper hook length    upper hook length
   h_kappa^*(K)    h_kappa^*(K)
Line 365  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 380  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 390  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 400  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 456  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);
 }  }
   
Line 474  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 496  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 505  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);*/
     }      }
   }    }
   
Line 513  static double beta(int K[],int M[]) {
Line 597  static double beta(int K[],int M[]) {
 }  }
 static int 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);    return(0);
 }  }
   #ifdef STANDALONE
 static int printp2(int kappa[]) {  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);    return(0);
 }  }
Line 536  static int test_beta() {
Line 621  static int test_beta() {
   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(); } */
   
   
Line 566  static int test_beta() {
Line 651  static int test_beta() {
 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 592  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 624  static double q3_5(double A[],double B[],int K[],int I
Line 710  static double q3_5(double A[],double B[],int K[],int I
   }    }
   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 634  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 644  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(); } */
   
Line 665  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 677  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 704  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 722  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);    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");
   }    }
 }  }
   
Line 785  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");}
 }  }
   
 /*  /*
Line 824  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 835  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 876  static int genDarray2(int M,int N) {
Line 966  static int 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 895  static int genDarray2(int M,int N) {
Line 985  static int genDarray2(int M,int N) {
     K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */      K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
     Ksize = plength(K);      Ksize = plength(K);
     if (Ksize >= M_n) {      if (Ksize >= M_n) {
       if (Debug) {fprintf(stderr,"Ksize >= M_n\n");}        if (Debug) {oxprintfe("Ksize >= M_n\n");}
       continue;        continue;
     }      }
     for (i=0; i<M_n; i++) Kone[i] = 0;      for (i=0; i<M_n; i++) Kone[i] = 0;
Line 905  static int genDarray2(int M,int N) {
Line 995  static int genDarray2(int M,int N) {
     }      }
   }    }
   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);    return(0);
 }  }
Line 936  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 960  static void hsExec_beta(void) {
Line 1050  static void hsExec_beta(void) {
       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;
Line 984  static void hsExec_beta(void) {
Line 1074  static void hsExec_beta(void) {
     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);
   }    }
Line 997  static int genBeta(int Kap[]) {
Line 1087  static int genBeta(int Kap[]) {
   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 1007  static int genBeta(int Kap[]) {
Line 1097  static int 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 int 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};
Line 1027  static int checkBeta1() {
Line 1117  static int checkBeta1() {
     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);    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));
   }    }
   }    }
 */  */
Line 1099  static int genJack(int M,int N) {
Line 1189  static int 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 1123  static int genJack(int M,int N) {
Line 1213  static int 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 1145  static int genJack(int M,int N) {
Line 1235  static int 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 1160  static int genJack(int M,int N) {
Line 1250  static int genJack(int M,int N) {
           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) {
Line 1180  static int genJack(int M,int N) {
Line 1270  static int genJack(int M,int N) {
             }else{              }else{
               Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */                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);              if (Debug) {oxprintf("M_df: 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);
             if (J & (1 << (Nv-1))) {              if (J & (1 << (Nv-1))) {
               JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */                JJ = J & ((1 << (Nv-1)) ^ 0xffff);  /* NOTE!! Up to 16 bits. mh-15 */
Line 1193  static int genJack(int M,int N) {
Line 1283  static int genJack(int M,int N) {
             }              }
           }            }
           aM_jack(Nv,J,K) = Jack;            aM_jack(Nv,J,K) = Jack;
           if (Debug) printf("aM_jack(%d,%d,%d) = %lf\n",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 int checkJack1(int M,int N) {  static int checkJack1(int M,int N) {
Line 1217  static int checkJack1(int M,int N) {
Line 1307  static int 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);    return(0);
 }  }
 /*main() {  checkJack1(3,3);  }*/  /*main() {  checkJack1(3,3);  }*/
Line 1243  static int checkJack2(int M,int N) {
Line 1333  static int 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));
       }        }
     }      }
Line 1262  static int checkJack2(int M,int N) {
Line 1352  static int checkJack2(int M,int N) {
 }  }
   
 /* 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 1292  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
Line 1383  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
     M_qk[K] = qk(Kap,A,B);      M_qk[K] = qk(Kap,A,B);
     F += M_qk[K]*aM_jack(N,0,K);      F += M_qk[K]*aM_jack(N,0,K);
     if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);      if (ParraySize[K] < size) F2 += M_qk[K]*aM_jack(N,0,K);
     if (Debug) printf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);      if (Debug) oxprintf("ParraySize[K] = %d, size=%d\n",ParraySize[K],size);
     if (Debug && (ParraySize[K] == size)) printf("M_qk[K]=%lg, aM_jack=%lg\n",M_qk[K],aM_jack(N,0,K));      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;
   
Line 1304  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
Line 1395  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
       if (ParraySize[K] == i) partial_sum[i] += M_qk[K]*aM_jack(N,0,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) partial_sum[i] += partial_sum[i-1];
     serror = myabs((partial_sum[i]-partial_sum[i-1])/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)) {      if ((i>0)&&(M_m_estimated_approx_deg < 0)&&(serror<M_assigned_series_error)) {
       M_m_estimated_approx_deg = i; break;        M_m_estimated_approx_deg = i; break;
     }      }
Line 1314  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
Line 1405  double mh_t(double A[A_LEN],double B[B_LEN],int N,int 
   }    }
   /*    /*
   for (K=0; K<=P_pmn; K++) {    for (K=0; K<=P_pmn; K++) {
     printf("Kappa="); for (i=0; i<N; i++) printf("%d ",Parray[K][i]); printf("\n");      oxprintf("Kappa="); for (i=0; i<N; i++) oxprintf("%d ",Parray[K][i]); oxprintf("\n");
     printf("ParraySize(%d)=%d (|kappa|),   M_m=%d\n",K,ParraySize[K],M_m);      oxprintf("ParraySize(%d)=%d (|kappa|),   M_m=%d\n",K,ParraySize[K],M_m);
   }    }
   for (i=0; i<=M_m; i++) {    for (i=0; i<=M_m; i++) {
     printf("partial_sum[%d]=%lg\n",i,partial_sum[i]);      oxprintf("partial_sum[%d]=%lg\n",i,partial_sum[i]);
   }    }
   */    */
   M_estimated_X0g = X0g;    M_estimated_X0g = X0g;
   iv=myabs(F*iv_factor());    iv=myabs(F*iv_factor());
   if (iv < M_x0value_min) M_estimated_X0g = X0g*mymax(2,log(log(1/iv)));   /* This is heuristic */    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;    M_mh_t_success = 1;
   if (M_automatic) {    if (M_estimated_X0g != X0g) M_mh_t_success=0;
     if (M_estimated_X0g != X0g) M_mh_t_success=0;    if (M_m_estimated_approx_deg > M_m) M_mh_t_success=0;
     if (M_m_estimated_approx_deg > M_m) M_mh_t_success=0;  
   }  
   
   printf("%%%%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);    M_series_error = serror;
   printf("%%%%F=%lg,Ef=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),M_estimated_X0g,X0g);    M_recommended_abserr = iv*M_assigned_series_error;
   fprintf(stderr,"%%%%(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);    M_recommended_relerr = M_series_error;
   fprintf(stderr,"%%%%(stderr) F=%lg,Ef=%lg,M_estimated_X0g=%lg, X0g=%lg\n",F,iv_factor(),M_estimated_X0g,X0g);  
   
     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 1353  double mh_t2(int J) {
Line 1451  double mh_t2(int J) {
   return(F);    return(F);
 }  }
   
   #ifdef STANDALONE
 static int mtest1b() {  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};
Line 1365  static int mtest1b() {
Line 1464  static int 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 1382  static int mtest1b() {
Line 1482  static int 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 1394  static int imypower(int x,int n) {
Line 1494  static int imypower(int x,int n) {
 }  }
   
 #ifdef STANDALONE2  #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);    return(0);
 }  }
Line 1427  struct MH_RESULT *jk_main(int argc,char *argv[]) {
Line 1527  struct MH_RESULT *jk_main(int argc,char *argv[]) {
 }  }
   
 struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree) {  struct MH_RESULT *jk_main2(int argc,char *argv[],int automode,double newX0g,int newDegree) {
   double *y0;    // double *y0;
   double x0,xn;    //  double x0,xn;
   double ef;    // double ef;
   int i,j,rank;  
   double a[1]; double b[1];    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;
Line 1461  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
Line 1562  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
     }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 if (strcmp(argv[i],"--automatic")==0) {      }else if (strcmp(argv[i],"--automatic")==0) {
       inci(i); /* ignore, in this function */        inci(i); /* ignore, in this function */
     }else if (strcmp(argv[i],"--assigend_series_error")==0) {      }else if (strcmp(argv[i],"--assigned_series_error")==0) {
       inci(i);        inci(i);
       sscanf(argv[i],"%lg",&M_assigned_series_error);        sscanf(argv[i],"%lg",&M_assigned_series_error);
     }else if (strcmp(argv[i],"--x0value_min")==0) {      }else if (strcmp(argv[i],"--x0value_min")==0) {
       inci(i);        inci(i);
       sscanf(argv[i],"%lg",&M_x0value_min);        sscanf(argv[i],"%lg",&M_x0value_min);
     }else {      }else {
       fprintf(stderr,"Unknown option %s\n",argv[i]);        oxprintfe("Unknown option %s\n",argv[i]);
       usage();        usage();
       return(NULL);        return(NULL);
     }      }
Line 1489  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
Line 1590  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
   if (!JK_byFile) {    if (!JK_byFile) {
     ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));      ans = (struct MH_RESULT *)mymalloc(sizeof(struct MH_RESULT));
     ans->message = NULL;      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);
   
Line 1503  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
Line 1611  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
   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) {    if ((!M_mh_t_success) && M_automatic) {
     jk_freeWorkArea();      jk_freeWorkArea();
     return NULL;      return NULL;
   }    }
Line 1531  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
Line 1661  struct MH_RESULT *jk_main2(int argc,char *argv[],int a
     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 int usage() {  static int usage() {
   fprintf(stderr,"Usages:\n");    oxprintfe("Usages:\n");
   fprintf(stderr,"hgm_jack-n [--idata input_data_file --x0 x0 --degree approxm]\n");  #ifdef C_2F1
   fprintf(stderr,"           [--automatic n --assigend_series_error e --x0value_min e2]\n");    oxprintfe("hgm_jack-n-2f1");
   fprintf(stderr,"\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 matrix with n degrees of freedom and the covariantce matrix sigma.\n");  #else
   fprintf(stderr,"The hgm_jack-n uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");    oxprintfe("hgm_jack-n    ");
   fprintf(stderr,"The degree of the approximation (Mapprox) is given by the --degree option.\n");  #endif
   fprintf(stderr,"Parameters are specified by the input_data_file. Otherwise, default values are used.\n");    oxprintfe(" [--idata input_data_file --x0 x0 --degree approxm]\n");
   fprintf(stderr,"The format of the input_data_file. The orders of the input numbers must be kept.\n");    oxprintfe("           [--automatic n --assigned_series_error e --x0value_min e2]\n");
   fprintf(stderr," Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\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," (Add a comment line %Ng= before the data Ng to check the number of beta.)\n");    oxprintfe("The hgm_jack-n uses the Koev-Edelman algorithm to evalute the matrix hypergeometric function.\n");
   fprintf(stderr," X0g: starting value of x(when --x0 option is used, this value is used)\n");    oxprintfe("The degree of the approximation (Mapprox) is given by the --degree option.\n");
   fprintf(stderr," 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");    oxprintfe("Parameters are specified by the input_data_file. Otherwise, default values are used.\n\n");
   fprintf(stderr," Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");    oxprintfe("The format of the input_data_file: (The orders of the input data must be kept.)\n");
   fprintf(stderr," Hg: h (step size) which is for hgm_w-n, \n");    oxprintfe(" Mg: m(the number of variables), Beta: beta=sigma^(-1)/2 (diagonized), Ng: n,\n");
   fprintf(stderr," Dp: output data is stored in every Dp steps when output_data_file is specified, which is for hgm_w-n.\n");    oxprintfe(" (Add a comment line %%Ng= before the data Ng to check the number of beta.)\n");
   fprintf(stderr," Xng: terminating value of x which is for hgm_w-n.\n");    oxprintfe(" X0g: starting value of x(when --x0 option is used, this value is used)\n");
   fprintf(stderr," The line started with %% is a comment line.\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," 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(" Ef: a scalar factor to the initial value. It is calculated by this program. Give the zero.\n");
   fprintf(stderr," An example format of the input_data_file can be obtained by executing hgm_jack-n with no option.\n");    oxprintfe(" Hg: h (step size) which is for hgm_w-n, \n");
   fprintf(stderr,"By --automatic option, X0g and degree are automatically searched. The current strategy is described in mh_t in jack-n.c\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,"Default values for the papameters of the automatic mode: assigned_series_error=%lg, x0value_min=%lg\n",M_assigned_series_error,M_x0value_min);    oxprintfe(" Xng: terminating value of x. This is for hgm_w-n.\n");
   fprintf(stderr,"Todo: automatic mode throws away all computation of the previous degree and reevaluate them. They should be kept.\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,"\nExamples:\n");    oxprintfe("Parameters are redefined when they appear more than once in the idata file and the command line options.\n\n");
   fprintf(stderr,"[1] ./hgm_jack-n \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");
   fprintf(stderr,"[2] ./hgm_jack-n --x0 0.1 \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");
   fprintf(stderr,"[3] ./hgm_jack-n --x0 0.1 --degree 15 \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");
   fprintf(stderr,"[4] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --degree 15 \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);
   fprintf(stderr,"[5] ./hgm_jack-n --degree 15 >test2.txt\n");  #ifdef C_2F1
   fprintf(stderr,"    ./hgm_w-n --idata test2.txt --gnuplotf test-g\n");    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");
   fprintf(stderr,"    gnuplot -persist <test-g-gp.txt\n");  #endif
   fprintf(stderr,"[6] ./hgm_jack-n --idata Testdata/tmp-idata3.txt --automatic 1\n");    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);    return(0);
 }  }
   
Line 1595  static int setParamDefault() {
Line 1740  static int 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);    return(0);
 }  }
   
 static int next(struct SFILE *sfp,char *s,char *msg) {  static int next(struct SFILE *sfp,char *s,char *msg) {
   static int check=1;    static int check=1;
   char *ng="%Ng=";    char *ng="%%Ng=";
   int i;    // 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 (check && (strncmp(msg,ng,4)==0)) {      if (check && (strncmp(msg,ng,4)==0)) {
       if (strncmp(s,ng,4) != 0) {        if (strncmp(s,ng,5) != 0) {
         fprintf(stderr,"Warning, there is no %%Ng= at the border of Beta's and Ng, s=%s\n",s);          oxprintfe("Warning, there is no %%Ng= at the border of Beta's and Ng, s=%s\n",s);
       }        }
       check=0;        /* check=0; */
     }      }
     if (s[0] != '%') return(0);      if (s[0] != '%') return(0);
   }    }
Line 1624  static int setParam(char *fname) {
Line 1775  static int setParam(char *fname) {
   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)");
Line 1670  static int setParam(char *fname) {
Line 1822  static int 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);    return(0);
 }  }
Line 1697  static int showParam(struct SFILE *fp,int fd) {
Line 1958  static int showParam(struct SFILE *fp,int fd) {
   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);    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 1719  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;

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

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