From f38abeb91ca3e214249f73c7e8d9fedcbea07573 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Fri, 26 Jun 2026 14:13:23 -0400 Subject: [PATCH 01/15] NUTS sampler updated numDivergences --- nimbleHMC/DESCRIPTION | 4 ++-- nimbleHMC/R/HMC_samplers.R | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/nimbleHMC/DESCRIPTION b/nimbleHMC/DESCRIPTION index d9e2663..212707a 100644 --- a/nimbleHMC/DESCRIPTION +++ b/nimbleHMC/DESCRIPTION @@ -1,7 +1,7 @@ Package: nimbleHMC Title: Hamiltonian Monte Carlo and Other Gradient-Based MCMC Sampling Algorithms for 'nimble' -Version: 0.2.4 -Date: 2025-12-15 +Version: 0.2.5 +Date: 2026-06-26 Authors@R: c(person("Daniel", "Turek", role = c("aut", "cre"), email = "danielturek@gmail.com"), person("Perry", "de Valpine", role = "aut"), person("Christopher", "Paciorek", role = "aut")) diff --git a/nimbleHMC/R/HMC_samplers.R b/nimbleHMC/R/HMC_samplers.R index 9da05c5..bd26eff 100644 --- a/nimbleHMC/R/HMC_samplers.R +++ b/nimbleHMC/R/HMC_samplers.R @@ -985,7 +985,10 @@ sampler_NUTS <- nimbleFunction( p_bf <- branch$p_beg copy_state(state_b, state_current) } - if(!valid_subtree) done <- TRUE + if(!valid_subtree) { + done <- TRUE + if(divergent) numDivergences <<- numDivergences + 1 + } if(!done) { depth <- depth + 1 accept <- FALSE From b5096bb9cdf237f96e5cbb9ba357060c0bd49a28 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Fri, 26 Jun 2026 14:16:49 -0400 Subject: [PATCH 02/15] after_chain no longer resets numDivergences and numTimesMaxTreeDepth --- nimbleHMC/R/HMC_samplers.R | 4 ---- 1 file changed, 4 deletions(-) diff --git a/nimbleHMC/R/HMC_samplers.R b/nimbleHMC/R/HMC_samplers.R index bd26eff..43d851e 100644 --- a/nimbleHMC/R/HMC_samplers.R +++ b/nimbleHMC/R/HMC_samplers.R @@ -682,8 +682,6 @@ sampler_NUTS_classic <- nimbleFunction( if(numDivergences > 1) print(' [Note] NUTS_classic sampler (nodes: ', targetNodesToPrint, ') encountered ', numDivergences, ' divergent paths.') if(numTimesMaxTreeDepth == 1) print(' [Note] NUTS_classic sampler (nodes: ', targetNodesToPrint, ') reached the maximum search tree depth ', numTimesMaxTreeDepth, ' time.') if(numTimesMaxTreeDepth > 1) print(' [Note] NUTS_classic sampler (nodes: ', targetNodesToPrint, ') reached the maximum search tree depth ', numTimesMaxTreeDepth, ' times.') - numDivergences <<- 0 ## reset counters for numDivergences and numTimesMaxTreeDepth, - numTimesMaxTreeDepth <<- 0 ## even when using reset=FALSE to continue the same chain } if(warningInd > 0) { for(i in 1:warningInd) { @@ -1286,8 +1284,6 @@ sampler_NUTS <- nimbleFunction( if(numDivergences > 1) print(' [Note] NUTS sampler (nodes: ', targetNodesToPrint, ') encountered ', numDivergences, ' divergent paths.') if(numTimesMaxTreeDepth == 1) print(' [Note] NUTS sampler (nodes: ', targetNodesToPrint, ') reached the maximum search tree depth ', numTimesMaxTreeDepth, ' time.') if(numTimesMaxTreeDepth > 1) print(' [Note] NUTS sampler (nodes: ', targetNodesToPrint, ') reached the maximum search tree depth ', numTimesMaxTreeDepth, ' times.') - numDivergences <<- 0 ## reset counters for numDivergences and numTimesMaxTreeDepth, - numTimesMaxTreeDepth <<- 0 ## even when using reset=FALSE to continue the same chain } if(warningInd > 0) { for(i in 1:warningInd) { From 0c4e859dc344167591235660e04545715f053e86 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Fri, 26 Jun 2026 14:20:38 -0400 Subject: [PATCH 03/15] update to makePackage.R --- make_package.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make_package.R b/make_package.R index 26fcb46..c651660 100644 --- a/make_package.R +++ b/make_package.R @@ -21,7 +21,7 @@ suppressMessages(try(remove.packages('nimbleHMC'), silent = TRUE)) (tarFiles <- grep('\\.tar\\.gz', list.files(), value = TRUE)) (lastTarFile <- tarFiles[length(tarFiles)]) message('installing package version ', gsub('\\.tar\\.gz$', '', lastTarFile)) -system(paste0('R CMD install ', lastTarFile)) +system(paste0('/usr/local/bin/R CMD install ', lastTarFile)) ##devtools::install('nimbleHMC') From 381fea41df37e5ff53f596099714c56caa766e06 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 07:29:06 -0400 Subject: [PATCH 04/15] combine accoutning for divergent paths --- nimbleHMC/R/HMC_samplers.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nimbleHMC/R/HMC_samplers.R b/nimbleHMC/R/HMC_samplers.R index 43d851e..b0a5e48 100644 --- a/nimbleHMC/R/HMC_samplers.R +++ b/nimbleHMC/R/HMC_samplers.R @@ -983,10 +983,7 @@ sampler_NUTS <- nimbleFunction( p_bf <- branch$p_beg copy_state(state_b, state_current) } - if(!valid_subtree) { - done <- TRUE - if(divergent) numDivergences <<- numDivergences + 1 - } + if(!valid_subtree) done <- TRUE if(!done) { depth <- depth + 1 accept <- FALSE @@ -1078,7 +1075,10 @@ sampler_NUTS <- nimbleFunction( new_H <- state_current$H if(is.nan(new_H)) new_H <- Inf deltaH <- new_H - H0 - if(deltaH > deltaMax) divergent <<- TRUE + if(deltaH > deltaMax) { + divergent <<- TRUE + numDivergences <<- numDivergences + 1 + } branch$log_sum_wt <- log_sum_exp(branch$log_sum_wt, -deltaH) if((-deltaH) > 0) sum_metropolis_prob <<- sum_metropolis_prob + 1 else sum_metropolis_prob <<- sum_metropolis_prob + exp(-deltaH) From 174b0d9173e762e8a40b005249a6cbadb5c1643f Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 08:58:31 -0400 Subject: [PATCH 05/15] minor change to tolerance --- nimbleHMC/tests/testthat/test-HMC.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nimbleHMC/tests/testthat/test-HMC.R b/nimbleHMC/tests/testthat/test-HMC.R index 687dc8f..f9829cd 100644 --- a/nimbleHMC/tests/testthat/test-HMC.R +++ b/nimbleHMC/tests/testthat/test-HMC.R @@ -271,7 +271,7 @@ test_that('HMC on MVN node', { set.seed(0) samples <- runMCMC(Cmcmc, niter = 20000, nburnin = 10000) expect_equal(as.numeric(apply(samples, 2, mean)), c(10,20,30), tol = .001) - expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .065) + expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .075) }) ## copied from 'test of conjugate Wishart' test in test-mcmc.R From d830fb94531c1896cd95bcf1155cd1492463668e Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 09:10:51 -0400 Subject: [PATCH 06/15] trouble shooting test failure --- nimbleHMC/tests/testthat/test-HMC.R | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nimbleHMC/tests/testthat/test-HMC.R b/nimbleHMC/tests/testthat/test-HMC.R index f9829cd..203f7da 100644 --- a/nimbleHMC/tests/testthat/test-HMC.R +++ b/nimbleHMC/tests/testthat/test-HMC.R @@ -272,6 +272,10 @@ test_that('HMC on MVN node', { samples <- runMCMC(Cmcmc, niter = 20000, nburnin = 10000) expect_equal(as.numeric(apply(samples, 2, mean)), c(10,20,30), tol = .001) expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .075) + print(as.numeric(apply(samples, 2, var))) + print(diag(solve(Q))) + print(as.numeric(apply(samples, 2, var)) - diag(solve(Q))) + expect_true(max(abs(as.numeric(apply(samples, 2, var)) - diag(solve(Q)))) < 0.075) }) ## copied from 'test of conjugate Wishart' test in test-mcmc.R From 881055d24d5e2a9ac110021b61a7950c49df6b55 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 09:18:32 -0400 Subject: [PATCH 07/15] updates --- nimbleHMC/tests/testthat/test-HMC.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nimbleHMC/tests/testthat/test-HMC.R b/nimbleHMC/tests/testthat/test-HMC.R index 203f7da..d6e402a 100644 --- a/nimbleHMC/tests/testthat/test-HMC.R +++ b/nimbleHMC/tests/testthat/test-HMC.R @@ -271,11 +271,11 @@ test_that('HMC on MVN node', { set.seed(0) samples <- runMCMC(Cmcmc, niter = 20000, nburnin = 10000) expect_equal(as.numeric(apply(samples, 2, mean)), c(10,20,30), tol = .001) - expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .075) + ##expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .075) print(as.numeric(apply(samples, 2, var))) print(diag(solve(Q))) print(as.numeric(apply(samples, 2, var)) - diag(solve(Q))) - expect_true(max(abs(as.numeric(apply(samples, 2, var)) - diag(solve(Q)))) < 0.075) + expect_true(max(abs(as.numeric(apply(samples, 2, var)) - diag(solve(Q)))) < 0.055) }) ## copied from 'test of conjugate Wishart' test in test-mcmc.R From 14fd1505e803d6dd6f7ab3c7c2a3e3e4e245c980 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 11:48:20 -0400 Subject: [PATCH 08/15] trouble shooting test failure --- nimbleHMC/tests/testthat/test-HMC.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nimbleHMC/tests/testthat/test-HMC.R b/nimbleHMC/tests/testthat/test-HMC.R index d6e402a..8281df9 100644 --- a/nimbleHMC/tests/testthat/test-HMC.R +++ b/nimbleHMC/tests/testthat/test-HMC.R @@ -259,7 +259,7 @@ test_that('HMC on MVN node', { set.seed(0) samples <- runMCMC(Cmcmc, niter = 20000, nburnin = 10000) expect_equal(as.numeric(apply(samples, 2, mean)), c(10,20,30), tol = .001) - expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .03) + expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .065) ## cat(paste0('testing NUTS sampler\n')) Rmodel <- nimbleModel(code, constants, data, inits, buildDerivs = TRUE) From ee08322a84c9628682ac5ff770d32143f475bd8f Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Sat, 27 Jun 2026 15:15:29 -0400 Subject: [PATCH 09/15] trouble shooting test failure --- nimbleHMC/tests/testthat/test-HMC.R | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nimbleHMC/tests/testthat/test-HMC.R b/nimbleHMC/tests/testthat/test-HMC.R index 8281df9..f13ff77 100644 --- a/nimbleHMC/tests/testthat/test-HMC.R +++ b/nimbleHMC/tests/testthat/test-HMC.R @@ -271,11 +271,7 @@ test_that('HMC on MVN node', { set.seed(0) samples <- runMCMC(Cmcmc, niter = 20000, nburnin = 10000) expect_equal(as.numeric(apply(samples, 2, mean)), c(10,20,30), tol = .001) - ##expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .075) - print(as.numeric(apply(samples, 2, var))) - print(diag(solve(Q))) - print(as.numeric(apply(samples, 2, var)) - diag(solve(Q))) - expect_true(max(abs(as.numeric(apply(samples, 2, var)) - diag(solve(Q)))) < 0.055) + expect_equal(as.numeric(apply(samples, 2, var)), diag(solve(Q)), tol = .065) }) ## copied from 'test of conjugate Wishart' test in test-mcmc.R From 176819cb08f6aa560366006af4f1f77316e0bfe1 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Wed, 1 Jul 2026 14:54:03 -0400 Subject: [PATCH 10/15] removed Imports methods from DESCRIPTION --- nimbleHMC/DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/nimbleHMC/DESCRIPTION b/nimbleHMC/DESCRIPTION index 212707a..77eadaf 100644 --- a/nimbleHMC/DESCRIPTION +++ b/nimbleHMC/DESCRIPTION @@ -8,7 +8,6 @@ Authors@R: c(person("Daniel", "Turek", role = c("aut", "cre"), email = "danieltu Maintainer: Daniel Turek Description: Provides gradient-based MCMC sampling algorithms for use with the MCMC engine provided by the 'nimble' package. This includes two versions of Hamiltonian Monte Carlo (HMC) No-U-Turn (NUTS) sampling, and (under development) Langevin samplers. The `NUTS_classic` sampler implements the original HMC-NUTS algorithm as described in Hoffman and Gelman (2014) . The `NUTS` sampler is a modern version of HMC-NUTS sampling matching the HMC sampler available in version 2.32.2 of Stan (Stan Development Team, 2023). In addition, convenience functions are provided for generating and modifying MCMC configuration objects which employ HMC sampling. Functionality of the 'nimbleHMC' package is described further in Turek, et al (2024) . Depends: R (>= 3.5.0), nimble (>= 1.4.0) -Imports: methods Suggests: testthat License: BSD_3_clause + file LICENSE | GPL (>= 2) Copyright: See COPYRIGHTS file. From 6f54e1b9987872392c768dc1ae67e8c4e485b2f1 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Wed, 1 Jul 2026 14:59:45 -0400 Subject: [PATCH 11/15] updated Windows testing runner to R version 4.6 --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index db69934..5f2425d 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: config: - - {os: windows-latest, r: '4.4'} + - {os: windows-latest, r: '4.6'} - {os: macOS-latest, r: 'release'} - {os: ubuntu-24.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/noble/latest"} - {os: ubuntu-24.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/noble/latest"} From 03e1458fd53b3ac27c670191733298627a0ec6c5 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Wed, 1 Jul 2026 17:13:56 -0400 Subject: [PATCH 12/15] updated date in DESCRIPTION --- nimbleHMC/DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nimbleHMC/DESCRIPTION b/nimbleHMC/DESCRIPTION index 77eadaf..7ee5dbf 100644 --- a/nimbleHMC/DESCRIPTION +++ b/nimbleHMC/DESCRIPTION @@ -1,7 +1,7 @@ Package: nimbleHMC Title: Hamiltonian Monte Carlo and Other Gradient-Based MCMC Sampling Algorithms for 'nimble' Version: 0.2.5 -Date: 2026-06-26 +Date: 2026-07-01 Authors@R: c(person("Daniel", "Turek", role = c("aut", "cre"), email = "danielturek@gmail.com"), person("Perry", "de Valpine", role = "aut"), person("Christopher", "Paciorek", role = "aut")) From b1fe3ff62dd7fb51dc19f4186c6e0599c61b9ab3 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Wed, 1 Jul 2026 20:05:10 -0400 Subject: [PATCH 13/15] added import(methods) to NAMESPACE --- make_package.R | 6 ++++++ nimbleHMC/NAMESPACE | 1 + 2 files changed, 7 insertions(+) diff --git a/make_package.R b/make_package.R index c651660..cc2e8fe 100644 --- a/make_package.R +++ b/make_package.R @@ -13,6 +13,12 @@ setwd('~/github/nimble/nimbleHMC') devtools::document('nimbleHMC') +## add `import(methods)` to NAMESPACE +namespaceFilename <- 'nimbleHMC/NAMESPACE' +namespace <- readLines(namespaceFilename) +namespace <- c(namespace, 'import(methods)') +writeLines(namespace, namespaceFilename) + devtools::build('nimbleHMC') check('nimbleHMC') diff --git a/nimbleHMC/NAMESPACE b/nimbleHMC/NAMESPACE index e6d72a9..97e2015 100644 --- a/nimbleHMC/NAMESPACE +++ b/nimbleHMC/NAMESPACE @@ -9,3 +9,4 @@ export(sampler_NUTS_classic) export(stateNL_NUTS) export(treebranchNL_NUTS) import(nimble) +import(methods) From b87a1de97b1e57a83d759e1f3cbf54ab54f69dc6 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Wed, 1 Jul 2026 21:31:38 -0400 Subject: [PATCH 14/15] added Depends methods to DESCRIPTION --- nimbleHMC/DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nimbleHMC/DESCRIPTION b/nimbleHMC/DESCRIPTION index 7ee5dbf..b6d7ec6 100644 --- a/nimbleHMC/DESCRIPTION +++ b/nimbleHMC/DESCRIPTION @@ -7,7 +7,7 @@ Authors@R: c(person("Daniel", "Turek", role = c("aut", "cre"), email = "danieltu person("Christopher", "Paciorek", role = "aut")) Maintainer: Daniel Turek Description: Provides gradient-based MCMC sampling algorithms for use with the MCMC engine provided by the 'nimble' package. This includes two versions of Hamiltonian Monte Carlo (HMC) No-U-Turn (NUTS) sampling, and (under development) Langevin samplers. The `NUTS_classic` sampler implements the original HMC-NUTS algorithm as described in Hoffman and Gelman (2014) . The `NUTS` sampler is a modern version of HMC-NUTS sampling matching the HMC sampler available in version 2.32.2 of Stan (Stan Development Team, 2023). In addition, convenience functions are provided for generating and modifying MCMC configuration objects which employ HMC sampling. Functionality of the 'nimbleHMC' package is described further in Turek, et al (2024) . -Depends: R (>= 3.5.0), nimble (>= 1.4.0) +Depends: R (>= 3.5.0), nimble (>= 1.4.0), methods Suggests: testthat License: BSD_3_clause + file LICENSE | GPL (>= 2) Copyright: See COPYRIGHTS file. From 922c1cde2f92a27cc71ec29c46e92549c6278773 Mon Sep 17 00:00:00 2001 From: Daniel Turek Date: Thu, 2 Jul 2026 16:14:33 -0400 Subject: [PATCH 15/15] changed DESCRIPTION to Imports methods --- nimbleHMC/DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nimbleHMC/DESCRIPTION b/nimbleHMC/DESCRIPTION index b6d7ec6..13305fa 100644 --- a/nimbleHMC/DESCRIPTION +++ b/nimbleHMC/DESCRIPTION @@ -7,7 +7,8 @@ Authors@R: c(person("Daniel", "Turek", role = c("aut", "cre"), email = "danieltu person("Christopher", "Paciorek", role = "aut")) Maintainer: Daniel Turek Description: Provides gradient-based MCMC sampling algorithms for use with the MCMC engine provided by the 'nimble' package. This includes two versions of Hamiltonian Monte Carlo (HMC) No-U-Turn (NUTS) sampling, and (under development) Langevin samplers. The `NUTS_classic` sampler implements the original HMC-NUTS algorithm as described in Hoffman and Gelman (2014) . The `NUTS` sampler is a modern version of HMC-NUTS sampling matching the HMC sampler available in version 2.32.2 of Stan (Stan Development Team, 2023). In addition, convenience functions are provided for generating and modifying MCMC configuration objects which employ HMC sampling. Functionality of the 'nimbleHMC' package is described further in Turek, et al (2024) . -Depends: R (>= 3.5.0), nimble (>= 1.4.0), methods +Depends: R (>= 3.5.0), nimble (>= 1.4.0) +Imports: methods Suggests: testthat License: BSD_3_clause + file LICENSE | GPL (>= 2) Copyright: See COPYRIGHTS file.