⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randomlib.c

📁 Fit a multivariate gaussian mixture by a cross-entropy method. Cross-Entropy is a powerfull tool to
💻 C
📖 第 1 页 / 共 5 页
字号:
    p = 0;S60:/*     P = (A2*S*H)MOD M*/    if(!(a1 != 0)) goto S90;    q = m/a1;    k = s/q;    p -= (k*(m-a1*q));    if(p > 0) p -= m;    p += (a1*(s-k*q));S70:    if(!(p < 0)) goto S80;    p += m;    goto S70;S90:S80:    k = p/qh;/*     P = ((A2*H + A1)*S)MOD M*/    p = h*(p-k*qh)-k*rh;S100:    if(!(p < 0)) goto S110;    p += m;    goto S100;S120:S110:    if(!(a0 != 0)) goto S150;/*     P = ((A2*H + A1)*H*S)MOD M*/    q = m/a0;    k = s/q;    p -= (k*(m-a0*q));    if(p > 0) p -= m;    p += (a0*(s-k*q));S130:    if(!(p < 0)) goto S140;    p += m;    goto S130;S150:S140:    mltmod = p;    return mltmod;#undef h}void phrtsd(char* phrase,long *seed1,long *seed2)/***********************************************************************     void phrtsd(char* phrase,long *seed1,long *seed2)               PHRase To SeeDs                              Function     Uses a phrase (character string) to generate two seeds for the RGN     random number generator.                              Arguments     phrase --> Phrase to be used for random number generation           seed1 <-- First seed for generator                             seed2 <-- Second seed for generator                                                      Note     Trailing blanks are eliminated before the seeds are generated.     Generated seed values will fall in the range 1..2^30     (1..1,073,741,824)***********************************************************************/{static char table[] ="abcdefghijklmnopqrstuvwxyz\ABCDEFGHIJKLMNOPQRSTUVWXYZ\0123456789\!@#$%^&*()_+[];:'\\\"<>?,./";long ix;static long twop30 = 1073741824L;static long shift[5] = {    1L,64L,4096L,262144L,16777216L};static long i,ichr,j,lphr,values[5];extern long lennob(char *str);    *seed1 = 1234567890L;    *seed2 = 123456789L;    lphr = lennob(phrase);     if(lphr < 1) return;    for(i=0; i<=(lphr-1); i++) {	for (ix=0; table[ix]; ix++) if (*(phrase+i) == table[ix]) break; 	/* JJV added ix++; to bring index in line with fortran's index*/	ix++;        if (!table[ix]) ix = 0;        ichr = ix % 64;        if(ichr == 0) ichr = 63;        for(j=1; j<=5; j++) {            *(values+j-1) = ichr-j;            if(*(values+j-1) < 1) *(values+j-1) += 63;        }        for(j=1; j<=5; j++) {            *seed1 = ( *seed1+*(shift+j-1)**(values+j-1) ) % twop30;            *seed2 = ( *seed2+*(shift+j-1)**(values+6-j-1) )  % twop30;        }    }}float ranf(void)/***********************************************************************     float ranf(void)                RANDom number generator as a Function     Returns a random floating point number from a uniform distribution     over 0 - 1 (endpoints of this interval are not returned) using the     current generator     This is a transcription from Pascal to Fortran of routine     Uniform_01 from the paper     L'Ecuyer, P. and Cote, S. "Implementing a Random Number Package     with Splitting Facilities." ACM Transactions on Mathematical     Software, 17:98-111 (1991)***********************************************************************/{static float ranf;/*     4.656613057E-10 is 1/M1  M1 is set in a data statement in IGNLGI      and is currently 2147483563. If M1 changes, change this also.*/    ranf = ignlgi()*4.656613057E-10;    return ranf;}void setgmn(float *meanv,float *covm,long p,float *parm)/***********************************************************************     void setgmn(float *meanv,float *covm,long p,float *parm)            SET Generate Multivariate Normal random deviate                              Function      Places P, MEANV, and the Cholesky factoriztion of COVM      in GENMN.                              Arguments     meanv --> Mean vector of multivariate normal distribution.     covm   <--> (Input) Covariance   matrix    of  the  multivariate                 normal distribution                 (Output) Destroyed on output     p     --> Dimension of the normal, or length of MEANV.     parm <-- Array of parameters needed to generate multivariate norma                deviates (P, MEANV and Cholesky decomposition of                COVM).                1 : 1                - P                2 : P + 1            - MEANV                P+2 : P*(P+3)/2 + 1  - Cholesky decomposition of COVM               Needed dimension is (p*(p+3)/2 + 1)***********************************************************************/{extern void spofa(float *a,long lda,long n,long *info);static long T1;static long i,icount,info,j,D2,D3,D4,D5;    T1 = p*(p+3)/2+1;/*     TEST THE INPUT*/    if(!(p <= 0)) goto S10;      mexPrintf("Value of P: %12ld\n",p);    mexErrMsgTxt("Problem generating multivariate normal deviate");    exit(1);S10:    *parm = p;/*     PUT P AND MEANV INTO PARM*/    for(i=2,D2=1,D3=(p+1-i+D2)/D2; D3>0; D3--,i+=D2) *(parm+i-1) = *(meanv+i-2);/*      Cholesky decomposition to find A s.t. trans(A)*(A) = COVM*/    spofa(covm,p,p,&info);    if(!(info != 0)) goto S30;    mexErrMsgTxt(" COVM not positive definite in SETGMN\n");    exit(1);S30:    icount = p+1;/*     PUT UPPER HALF OF A, WHICH IS NOW THE CHOLESKY FACTOR, INTO PARM          COVM(1,1) = PARM(P+2)          COVM(1,2) = PARM(P+3)                    :          COVM(1,P) = PARM(2P+1)          COVM(2,2) = PARM(2P+2)  ...*/    for(i=1,D4=1,D5=(p-i+D4)/D4; D5>0; D5--,i+=D4) {        for(j=i-1; j<p; j++) {            icount += 1;            *(parm+icount-1) = *(covm+i-1+j*p);        }    }}float sexpo(void)/***********************************************************************                                                                                                                                                 (STANDARD-)  E X P O N E N T I A L   DISTRIBUTION                                                                                                                                                            ********************************************************************************************************************************************                                                                           FOR DETAILS SEE:                                                                                                                                      AHRENS, J.H. AND DIETER, U.                                           COMPUTER METHODS FOR SAMPLING FROM THE                                EXPONENTIAL AND NORMAL DISTRIBUTIONS.                                 COMM. ACM, 15,10 (OCT. 1972), 873 - 882.                                                                                          ALL STATEMENT NUMBERS CORRESPOND TO THE STEPS OF ALGORITHM            'SA' IN THE ABOVE PAPER (SLIGHTLY MODIFIED IMPLEMENTATION)                                                                                  Modified by Barry W. Brown, Feb 3, 1988 to use RANF instead of        SUNIF.  The argument IR thus goes away.                                                                                                **********************************************************************     Q(N) = SUM(ALOG(2.0)**K/K!)    K=1,..,N ,      THE HIGHEST N     (HERE 8) IS DETERMINED BY Q(N)=1.0 WITHIN STANDARD PRECISION*/{static float q[8] = {    0.6931472,0.9333737,0.9888778,0.9984959,0.9998293,0.9999833,0.9999986,    .9999999};static long i;static float sexpo,a,u,ustar,umin;static float *q1 = q;    a = 0.0;    u = ranf();    goto S30;S20:    a += *q1;S30:    u += u;/* * JJV changed the following to reflect the true algorithm and prevent * JJV unpredictable behavior if U is initially 0.5. *  if(u <= 1.0) goto S20; */    if(u < 1.0) goto S20;    u -= 1.0;    if(u > *q1) goto S60;    sexpo = a+u;    return sexpo;S60:    i = 1;    ustar = ranf();    umin = ustar;S70:    ustar = ranf();    if(ustar < umin) umin = ustar;    i += 1;    if(u > *(q+i-1)) goto S70;    sexpo = a+umin**q1;    return sexpo;}float sgamma(float a)/***********************************************************************                                                                                                                                                 (STANDARD-)  G A M M A  DISTRIBUTION                                                                                                                                                                         ********************************************************************************************************************************************                                                                                     PARAMETER  A >= 1.0  !                                                                                                       **********************************************************************                                                                           FOR DETAILS SEE:                                                                                                                                      AHRENS, J.H. AND DIETER, U.                                           GENERATING GAMMA VARIATES BY A                                        MODIFIED REJECTION TECHNIQUE.                                         COMM. ACM, 25,1 (JAN. 1982), 47 - 54.                                                                                             STEP NUMBERS CORRESPOND TO ALGORITHM 'GD' IN THE ABOVE PAPER                                      (STRAIGHTFORWARD IMPLEMENTATION)                                                                                Modified by Barry W. Brown, Feb 3, 1988 to use RANF instead of        SUNIF.  The argument IR thus goes away.                                                                                                **********************************************************************                                                                                     PARAMETER  0.0 < A < 1.0  !                                                                                                  **********************************************************************                                                                           FOR DETAILS SEE:                                                                                                                                      AHRENS, J.H. AND DIETER, U.                                           COMPUTER METHODS FOR SAMPLING FROM GAMMA,                             BETA, POISSON AND BINOMIAL DISTRIBUTIONS.                             COMPUTING, 12 (1974), 223 - 246.                                                                                                  (ADAPTED IMPLEMENTATION OF ALGORITHM 'GS' IN THE ABOVE PAPER)                                                                          **********************************************************************     INPUT: A =PARAMETER (MEAN) OF THE STANDARD GAMMA DISTRIBUTION     OUTPUT: SGAMMA = SAMPLE FROM THE GAMMA-(A)-DISTRIBUTION     COEFFICIENTS Q(K) - FOR Q0 = SUM(Q(K)*A**(-K))     COEFFICIENTS A(K) - FOR Q = Q0+(T*T/2)*SUM(A(K)*V**K)     COEFFICIENTS E(K) - FOR EXP(Q)-1 = SUM(E(K)*Q**K)     PREVIOUS A PRE-SET TO ZERO - AA IS A', AAA IS A"     SQRT32 IS THE SQUAREROOT OF 32 = 5.656854249492380*/{extern float fsign( float num, float sign );static float q1 = 4.166669E-2;static float q2 = 2.083148E-2;static float q3 = 8.01191E-3;static float q4 = 1.44121E-3;static float q5 = -7.388E-5;static float q6 = 2.4511E-4;static float q7 = 2.424E-4;static float a1 = 0.3333333;static float a2 = -0.250003;static float a3 = 0.2000062;static float a4 = -0.1662921;static float a5 = 0.1423657;static float a6 = -0.1367177;static float a7 = 0.1233795;static float e1 = 1.0;static float e2 = 0.4999897;static float e3 = 0.166829;static float e4 = 4.07753E-2;static float e5 = 1.0293E-2;static float aa = 0.0;static float aaa = 0.0;static float sqrt32 = 5.656854;/* JJV added b0 to fix rare and subtle bug */static float sgamma,s2,s,d,t,x,u,r,q0,b,b0,si,c,v,q,e,w,p;    if(a == aa) goto S10;    if(a < 1.0) goto S120;/*     STEP  1:  RECALCULATIONS OF S2,S,D IF A HAS CHANGED*/    aa = a;    s2 = a-0.5;    s = sqrt(s2);    d = sqrt32-12.0*s;S10:/*     STEP  2:  T=STANDARD NORMAL DEVIATE,               X=(S,1/2)-NORMAL DEVIATE.               IMMEDIATE ACCEPTANCE (I)*/    t = snorm();    x = s+0.5*t;    sgamma = x*x;    if(t >= 0.0) return sgamma;/*     STEP  3:  U= 0,1 -UNIFORM SAMPLE. SQUEEZE ACCEPTANCE (S)*/    u = ranf();    if(d*u <= t*t*t) return sgamma;/*     STEP  4:  RECALCULATIONS OF Q0,B,SI,C IF NECESSARY*/    if(a == aaa) goto S40;    aaa = a;    r = 1.0/ a;    q0 = ((((((q7*r+q6)*r+q5)*r+q4)*r+q3)*r+q2)*r+q1)*r;/*               APPROXIMATION DEPENDING ON SIZE OF PARAMETER A               THE CONSTANTS IN THE EXPRESSIONS FOR B, SI AND               C WERE ESTABLISHED BY NUMERICAL EXPERIMENTS*/    if(a <= 3.686) goto S30;    if(a <= 13.022) goto S20;/*               CASE 3:  A .GT. 13.022*/    b = 1.77;    si = 0.75;    c = 0.1515/s;    goto S40;S20:/*               CASE 2:  3.686 .LT. A .LE. 13.022*/    b = 1.654+7.6E-3*s2;    si = 1.68/s+0.275;    c = 6.2E-2/s+2.4E-2;    goto S40;S30:/*               CASE 1:  A .LE. 3.686*/    b = 0.463+s+0.178*s2;    si = 1.235;    c = 0.195/s-7.9E-2+1.6E-1*s;S40:/*     STEP  5:  NO QUOTIENT TEST IF X NOT POSITIVE*/    if(x <= 0.0) goto S70;/*     STEP  6:  CALCULATION OF V AND QUOTIENT Q*/    v = t/(s+s);    if(fabs(v) <= 0.25) goto S50;    q = q0-s*t+0.25*t*t+(s2+s2)*log(1.0+v);    goto S60;S50:    q = q0+0.5*t*t*((((((a7*v+a6)*v+a5)*v+a4)*v+a3)*v+a2)*v+a1)*v;S60:/*     STEP  7:  QUOTIENT ACCEPTANCE (Q)*/    if(log(1.0-u) <= q) return sgamma;S70:/*     STEP  8:  E=STANDARD EXPONENTIAL DEVIATE               U= 0,1 -UNIFORM DEVIATE               T=(B,SI)-DOUBLE EXPONENTIAL (LAPLACE) SAMPLE*/    e = sexpo();    u = ranf();    u += (u-1.0);    t = b+fsign(si*e,u);/*     STEP  9:  REJECTION IF T .LT. TAU(1) = -.71874483771719*/    if(t < -0.7187449) goto S70;/*     STEP 10:  CALCULATION OF V AND QUOTIENT Q*/    v = t/(s+s);    if(fabs(v) <= 0.25) goto S80;    q = q0-s*t+0.25*t*t+(s2+s2)*log(1.0+v);    goto S90;S80:    q = q0+0.5*t*t*((((((a7*v+a6)*v+a5)*v+a4)*v+a3)*v+a2)*v+a1)*v;S90:/*     STEP 11:  HAT ACCEPTANCE (H) (IF Q NOT POSITIVE GO TO STEP 8)*/    if(q <= 0.0) goto S70;    if(q <= 0.5) goto S100;/* * JJV modified the code through line 115 to handle large Q case */    if(q < 15.0) goto S95;/* * JJV Here Q is large enough that Q = log(exp(Q) - 1.0) (for real Q) * JJV so reformulate test at 110 in terms of one EXP, if not too big * JJV 87.49823 is close to the largest real which can be * JJV exponentiated (87.49823 = log(1.0E38)) */    if((q+e-0.5*t*t) > 87.49823) got

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -