678
678
{ if(rates) FOR(h,ls) rates[h]=1; }
681
DiscreteGamma (freqK, rK, alpha, alpha, K, DGammaMean);
681
DiscreteGamma(freqK, rK, alpha, alpha, K, DGammaUseMedian);
683
683
MultiNomialAliasSetTable(K, freqK, Falias, Lalias, space+5*K);
684
684
MultiNomialAlias(ls, K, Falias, Lalias, counts);
1806
int StirlingS2(int n, int k)
1808
/* Stirling number of the second type, calculated using the recursion (loop)
1809
S(n, k) = S(n - 1, k - 1) + k*S(n - 1, k).
1810
This works for small numbers of n<=15.
1812
int S[16]={0}, i, j;
1814
if((n==0 && k==0) || k==1 || k==n)
1819
return (int) ldexp(1,n-1) - 1;
1823
error2("n>15 too large in StirlingS2()");
1825
S[1] = S[2] = 1; /* start with n = 2 */
1826
for(i=3; i<=n; i++) {
1827
for(j=min2(k,i); j>=2; j--)
1828
S[j] = S[j-1] + j*S[j];
1833
double lnStirlingS2(int n, int k)
1835
/* This calculates the logarithm of the Stirling number of the second type.
1836
Temme NM. 1993. Asymptotic estimates of Stirling numbers. Stud Appl Math 89:233-243.
1839
double lnS=0, t0, x0, x, A, nk, y;
1841
if(k>n) error2("k<n in lnStirlingS2");
1850
return (n<50 ? log(ldexp(1,n-1) - 1) : (n-1)*0.693147);
1852
return log(n*(n-1)/2.0);
1854
return log((double)StirlingS2(n, k));
1857
for(i=0,x0=x=1; i<10000; i++) {
1858
x = (x0 + nk - nk*exp(-x0))/2;
1859
if(fabs(x-x0)/(1+x) < 1e-10) break;
1862
t0 = n/(double)k - 1;
1864
A = -n * log(x) + k*log(exp(x) - 1);
1866
A = -n * log(x) + k*x;
1868
A += -k*t0 + (n-k)*log(t0);
1869
lnS = A + (n-k)*log((double)k) + 0.5*log(t0/((1 + t0)*(x - t0)));
1870
lnS += log(Binomial(n, k, &y));
1806
1877
double LnGamma (double x)
1808
1879
/* returns ln(gamma(x)) for x>0, accurate to 10 decimal places.
1994
int DiscreteGamma (double freqK[], double rK[], double alpha, double beta, int K, int dgammamean)
1996
/* discretization of gamma distribution with equal proportions in each
2000
double t, factor=alpha/beta*K, lnga1;
2002
if (dgammamean==0) { /* mean */
2065
int DiscreteBeta (double freq[], double x[], double p, double q, int K, int UseMedian)
2067
/* discretization of beta(p, q), with equal proportions in each category.
2070
double mean=p/(p+q), lnbeta, lnbeta1, t;
2072
lnbeta = LnBeta(p, q);
2073
if(UseMedian) { /* median */
2074
for(i=0,t=0; i<K; i++)
2075
t += x[i] = QuantileBeta((i+0.5)/K, p, q, lnbeta);
2079
/* printf("\nmedian "); for(i=0; i<K; i++) printf("%9.5f", x[i]); */
2082
for(i=0; i<K-1; i++) /* cutting points */
2083
freq[i] = QuantileBeta((i+1.0)/K, p, q, lnbeta);
2086
/* printf("\npoints "); for(i=0; i<K; i++) printf("%9.5f", freq[i]); */
2087
lnbeta1 = lnbeta - log(1 + q/p);
2088
for(i=0; i<K-1; i++) /* CDF */
2089
freq[i] = CDFBeta(freq[i], p+1, q, lnbeta1);
2091
x[0] = freq[0]*mean*K;
2092
for (i=1; i<K-1; i++) x[i] = (freq[i] - freq[i-1])*mean*K;
2093
x[K-1] = (1 - freq[K-2])*mean*K;
2095
/* printf("\nmean "); for(i=0; i<K; i++) printf("%9.5f", x[i]); */
2096
for(i=0,t=0; i<K; i++) t += x[i]/K;
2099
for (i=0; i<K; i++) freq[i] = 1.0/K;
2103
int DiscreteGamma (double freqK[], double rK[], double alpha, double beta, int K, int UseMedian)
2105
/* discretization of G(alpha, beta) with equal proportions in each category.
2108
double t, mean=alpha/beta, lnga1;
2110
if(UseMedian) { /* median */
2111
for(i=0; i<K; i++) rK[i] = QuantileGamma((i*2.+1)/(2.*K), alpha, beta);
2112
for(i=0,t=0; i<K; i++) t += rK[i];
2113
for(i=0; i<K; i++) rK[i] *= mean*K/t; /* rescale so that the mean is alpha/beta. */
2003
2116
lnga1 = LnGamma(alpha+1);
2004
2117
for (i=0; i<K-1; i++) /* cutting points, Eq. 9 */
2005
2118
freqK[i] = QuantileGamma((i+1.0)/K, alpha, beta);
2006
2119
for (i=0; i<K-1; i++) /* Eq. 10 */
2007
2120
freqK[i] = IncompleteGamma(freqK[i]*beta, alpha+1, lnga1);
2008
rK[0] = freqK[0]*factor;
2009
rK[K-1] = (1-freqK[K-2])*factor;
2010
for (i=1; i<K-1; i++) rK[i] = (freqK[i] - freqK[i-1])*factor;
2013
for(i=0; i<K; i++) rK[i] = QuantileGamma((i*2.+1)/(2.*K), alpha, beta);
2014
for(i=0,t=0; i<K; i++) t += rK[i];
2015
for(i=0; i<K; i++) rK[i] *= factor/t;
2121
rK[0] = freqK[0]*mean*K;
2122
for (i=1; i<K-1; i++) rK[i] = (freqK[i] - freqK[i-1])*mean*K;
2123
rK[K-1] = (1-freqK[K-2])*mean*K;
2017
2126
for (i=0; i<K; i++) freqK[i] = 1.0/K;
3877
3986
/* this approximates the integral Nintegrate[fun[x], {x,a,b}].
3878
3987
npoints is 10, 20, 32 or 64 nodes for legendre.");
3881
double *x=NULL, *w=NULL, s=0, t[2];
3990
double *x=NULL, *w=NULL, sign, s=0, t;
3993
error2("this assumes even number of points.");
3883
3994
GaussLegendreRule(&x, &w, npoints);
3885
/* this goes through the natural order from a to b */
3886
for(j=npoints/2-1; j>=0; j--) {
3887
t[1] = (a+b)/2 - (b-a)/2*x[j];
3888
s += w[j]*fun(t[1]);
3890
for(j=0; j<npoints/2; j++) {
3891
t[0] = (a+b)/2 + (b-a)/2*x[j];
3892
s += w[j]*fun(t[0]);
3896
for(j=0,s=0; j<npoints/2; j++) {
3897
t[0] = (a+b)/2 + (b-a)/2*x[j];
3898
t[1] = (a+b)/2 - (b-a)/2*x[j];
3900
s += w[j]*fun(t[i]);
3903
return s *= (b-a)/2;
3996
/* x changes monotonically from a to b. */
3997
for(j=0; j<npoints; j++) {
3998
if(j<npoints/2) { ixw = npoints/2-1-j; sign=-1; }
3999
else { ixw = j-npoints/2; sign=1; }
4000
t = (a+b)/2 + sign*(b-a)/2*x[ixw];
4003
return s *= (b - a)/2;
5465
5565
for(i=0; i<n; i++) {
5466
5566
for (j=i; j<n; j++) {
5467
5567
for(k=0; k<n; k++) x1[k] = x[k];
5468
x1[i] += h[i]; x1[j] += h[j];
5469
5570
fpp = (*fun)(x1,n); /* (+hi, +hj) */
5470
x1[i] -= h[i]*2; x1[j] -= h[j]*2;
5471
5573
fmm = (*fun)(x1,n); /* (-hi, -hj) */
5473
H[i*n+i] = (fpp+fmm-2*f0)/(4*h[i]*h[i]);
5575
H[i*n+i] = (fpp + fmm - 2*f0)/(4*h[i]*h[i]);
5474
5576
g[i] = (fpp - fmm)/(h[i]*4);
5477
5579
x1[i] += 2*h[i]; fpm = (*fun)(x1,n); /* (+hi, -hj) */
5478
5580
x1[i] -= 2*h[i]; x1[j] += 2*h[j]; fmp = (*fun)(x1,n); /* (-hi, +hj) */
5479
H[i*n+j] = H[j*n+i] = (fpp+fmm-fpm-fmp)/(4*h[i]*h[j]);
5581
H[i*n+j] = H[j*n+i] = (fpp + fmm - fpm - fmp)/(4*h[i]*h[j]);
6007
6109
double *x0=space, *x1=space+n, eh0=Small_Diff, eh; /* eh0=1e-6 || 1e-7 */
6010
eh=eh0*(fabs(x[i])+1);
6112
eh = eh0*(fabs(x[i])+1);
6011
6113
if (xmark[i]==0 && (AlwaysCenter || SIZEp<1)) { /* central */
6012
FOR (j, n) x0[j]=x1[j]=x[j];
6013
eh=pow(eh,.67); x0[i]-=eh; x1[i]+=eh;
6014
g[i]=((*fun)(x1,n)-(*fun)(x0,n))/(eh*2.0);
6114
for(j=0; j<n; j++) x0[j] = x1[j] = x[j];
6115
eh = pow(eh, .67); x0[i] -= eh; x1[i] += eh;
6116
g[i] = ((*fun)(x1,n) - (*fun)(x0,n))/(eh*2.0);
6016
6118
else { /* forward or backward */
6017
FOR (j, n) x1[j]=x[j];
6018
if (xmark[i]) eh*=-xmark[i];
6119
for(j=0; j<n; j++) x1[j] = x[j];
6120
if (xmark[i]) eh *= -xmark[i];
6020
g[i]=((*fun)(x1,n)-f0)/eh;
6122
g[i] = ((*fun)(x1,n) - f0)/eh;
6191
6293
FOR (i,nfree) FOR (j,nfree)
6192
6294
H[i*nfree+j] += s[i]*s[j]/v - z[i]*z[j]/w;
6193
6295
#else /* BFGS */
6194
for (i=0,w=v=0.; i<nfree; i++) {
6195
for (j=0,z[i]=0.; j<nfree; j++) z[i]+=H[i*nfree+j]*y[j];
6196
w+=y[i]*z[i]; v+=y[i]*s[i];
6296
for(i=0,w=v=0.; i<nfree; i++) {
6297
for(j=0,z[i]=0.; j<nfree; j++) z[i] += H[i*nfree+j]*y[j];
6298
w += y[i]*z[i]; v += y[i]*s[i];
6198
6300
if (fabs(v)<small) { identity(H,nfree); fail=1; continue; }
6199
6301
FOR (i,nfree) FOR (j,nfree)