Skip to content

Commit

Permalink
Merge pull request #1 from wellington36/fix_mcmc
Browse files Browse the repository at this point in the history
Fix Bounding pairs approach
  • Loading branch information
wellington36 authored Oct 15, 2024
2 parents aa26b9e + ed393e1 commit 0b4e64c
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 34 deletions.
2 changes: 1 addition & 1 deletion stan/ErrorBounding.stan
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ array[] real log_Z_COMP_EB(real log_mu, real nu, real eps, int M) {
reject("nu must be finite");
}
return(
infiniteErrorBoundingPairs({log_mu, nu}, eps, M, log(0), 0)
infiniteErrorBoundingPairs({log_mu, nu}, eps, M, 0)
);
}
5 changes: 1 addition & 4 deletions stan/MCMC_COMP_2_ErrorBounding.stan
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,13 @@ data{
real<lower=0> eps;
int<lower=0> M;
}
transformed data{
real logL = log(0);
}
parameters{
real<lower=0> mu;
real<lower=0> nu;
}
transformed parameters{
real log_mu = log(mu);
array[2] real log_norm_const = infiniteErrorBoundingPairs({log_mu, nu}, eps, M, logL, 0);
array[2] real log_norm_const = infiniteErrorBoundingPairs({log_mu, nu}, eps, M, 0);
}
model{
mu ~ gamma(s_mu, r_mu);
Expand Down
37 changes: 8 additions & 29 deletions stan/infiniteErrorBoundingPairs.stan
Original file line number Diff line number Diff line change
@@ -1,29 +1,9 @@
// Internal use
int adaptiveConvergenceCheck(real oldT, real newT, real lepsilon, real log1mL) {
// if L = 0, there is a simpler check
if (log1mL == 0) return oldT - newT < log1p_exp(newT - lepsilon);

real logZ = newT + oldT - log_diff_exp(oldT, newT);
real ls = newT - log1mL;

if (logZ > ls){
return log_diff_exp(logZ, ls) >= lepsilon;
}else{
return log_diff_exp(ls, logZ) >= lepsilon;
}
}

// Adaptive inifinite sum algorithm
// Requires definition of logFunction with two arguments:
// int k and real[] parameters
array[] real infiniteErrorBoundingPairs(array[] real p, real epsilon, int maxIter, real logL, int n0) {
array[] real infiniteErrorBoundingPairs(array[] real p, real epsilon, int maxIter, int n0) {
vector[maxIter + 1] storeVal;
real leps = log(epsilon) + log2();
real leps = log(epsilon);
int n = 2;
int n0_ = n0;
real temp;
real log1mL = log_diff_exp(0, logL);


// Setting up first iterations
storeVal[1] = logFunction(n0_, p);
n0_ += 1;
Expand All @@ -36,15 +16,14 @@ array[] real infiniteErrorBoundingPairs(array[] real p, real epsilon, int maxIte
storeVal[n] = logFunction(n0_, p);
if (n >= maxIter) return({log_sum_exp(storeVal[:n]), 1. * n}); // Return if maxIter is reached
}
// Start testing convergence after the maximum
while ( adaptiveConvergenceCheck(storeVal[n - 1], storeVal[n], leps, log1mL) ) {

while (storeVal[n] - log(-expm1(storeVal[n] - storeVal[n - 1])) >= leps + log2()) {
n0_ += 1;
n += 1;
storeVal[n] = logFunction(n0_, p);
if (n >= maxIter) break;
}
temp = storeVal[n];
storeVal[n] = temp - log_diff_exp(0, temp - storeVal[n - 1]) - log2();
storeVal[n + 1] = temp - log1mL - log2();

storeVal[n + 1] = storeVal[n] - log(-expm1(storeVal[n] - storeVal[n - 1])) - log2();
return {log_sum_exp(sort_asc(storeVal[:(n + 1)])), 1. * n};
}
}

0 comments on commit 0b4e64c

Please sign in to comment.