From 849ebaa6ab1bd39e4921c877a8b8fa3939eab44b Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Sat, 26 Jul 2025 10:41:40 -0700 Subject: [PATCH 1/2] Revise formatting of new addSampler allowData messaging. --- packages/nimble/R/MCMC_configuration.R | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/nimble/R/MCMC_configuration.R b/packages/nimble/R/MCMC_configuration.R index ff3df2676..129654df2 100644 --- a/packages/nimble/R/MCMC_configuration.R +++ b/packages/nimble/R/MCMC_configuration.R @@ -787,8 +787,23 @@ The second usage of \'multivariateNodesAsScalars\' occurs when \'default\' is TR For internal use only ' if(!allowData && !allowData_global) { +<<<<<<< Updated upstream if(all(model$isData(targetOne))) return() if(any(model$isData(targetOne))) targetOne <- filterOutDataNodes(targetOne) +======= + if(all(model$isData(targetOne))) { + messageIfVerbose(' [Note] Samplers not added to data node: `', paste0(targetOne, collapse = '`, `'), '`.\n', + ' Provide argument `allowData = TRUE` to `addSampler` method, to force sampler assignment.') + return() + } + if(any(model$isData(targetOne))) { + targetWithSomeData <- model$expandNodeNames(targetOne) + targetOne <- filterOutDataNodes(targetOne) ## this is the salient step of this entire block + targetDataComponents <- setdiff(targetWithSomeData, targetOne) + messageIfVerbose(' [Note] Samplers not added to data node: `', paste0(targetDataComponents, collapse = '`, `'), '`.\n', + ' Provide argument `allowData = TRUE` to `addSampler` method, to force sampler assignment.') + } +>>>>>>> Stashed changes } newInd <- length(samplerConfs) + 1 samplerConfs[[newInd]] <<- samplerConf(name=thisSamplerName, samplerFunction=samplerFunction, target=targetOne, control=thisControlList, model=model) From 28d7c39c256f3446dc1edb498df9a0a650459ce1 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Sat, 26 Jul 2025 15:22:56 -0700 Subject: [PATCH 2/2] Fix nimOptimDefaultControl default types. Ensure fnscale=-1 in inner Laplace when using updateSettings. Use `working_maxit` consistently in nimOptim solve. --- packages/nimble/R/Laplace.R | 2 ++ packages/nimble/R/nimbleFunction_Rexecution.R | 8 ++++---- packages/nimble/inst/CppCode/nimOptim.cpp | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/nimble/R/Laplace.R b/packages/nimble/R/Laplace.R index 756b81fc9..89ecda317 100644 --- a/packages/nimble/R/Laplace.R +++ b/packages/nimble/R/Laplace.R @@ -323,6 +323,7 @@ buildOneAGHQuad1D <- nimbleFunction( ## transMethod <<- gridType ## } if(replace_optimControl) { + optimControl$fnscale <- -1 optimControl_ <<- optimControl } }, @@ -1163,6 +1164,7 @@ buildOneAGHQuad <- nimbleFunction( transMethod <<- gridType } if(replace_optimControl) { + optimControl$fnscale <- -1 optimControl_ <<- optimControl } }, diff --git a/packages/nimble/R/nimbleFunction_Rexecution.R b/packages/nimble/R/nimbleFunction_Rexecution.R index d1ccdad4b..be758d574 100644 --- a/packages/nimble/R/nimbleFunction_Rexecution.R +++ b/packages/nimble/R/nimbleFunction_Rexecution.R @@ -1497,15 +1497,15 @@ nimOptimDefaultControl <- function() { control <- optimControlNimbleList$new() control$trace <- 0 control$fnscale <- 1 - control$parscale <- NA # Must be filled in to length of par - control$ndeps <- NA # Ditto - control$maxit <- NA ## The default value depends on method. + control$parscale <- as.numeric(NA) # Must be filled in to length of par + control$ndeps <- as.numeric(NA) # Ditto + control$maxit <- as.integer(NA) ## The default value depends on method. control$abstol = -Inf control$reltol <- sqrt(.Machine$double.eps) control$alpha <- 1.0 control$beta <- 0.5 control$gamma <- 2.0 - control$REPORT <- NA # Method dependent and not used in compiled version + control$REPORT <- as.integer(NA) # Method dependent and not used in compiled version control$type <- 1 control$lmm <- 5 control$factr <- 1e7 diff --git a/packages/nimble/inst/CppCode/nimOptim.cpp b/packages/nimble/inst/CppCode/nimOptim.cpp index c7e9e5f2a..1fe2fac77 100644 --- a/packages/nimble/inst/CppCode/nimOptim.cpp +++ b/packages/nimble/inst/CppCode/nimOptim.cpp @@ -185,6 +185,7 @@ nimSmartPtr NimOptimProblem::solve( result->hessian.initialize(NA_REAL, true, n, n); } + // Parameters common to all methods. double* dpar = par.getPtr(); double* X = result->par.getPtr(); @@ -248,7 +249,7 @@ nimSmartPtr NimOptimProblem::solve( SEXP Scontrol = PROTECT(Rf_allocVector(VECSXP, 6)); SET_VECTOR_ELT(Scontrol, 0, PROTECT(double_2_SEXP(control_->abstol))); SET_VECTOR_ELT(Scontrol, 1, PROTECT(double_2_SEXP(control_->reltol))); - SET_VECTOR_ELT(Scontrol, 2, PROTECT(int_2_SEXP(control_->maxit))); + SET_VECTOR_ELT(Scontrol, 2, PROTECT(int_2_SEXP(working_maxit))); SET_VECTOR_ELT(Scontrol, 3, PROTECT(NimArr_2_SEXP<1>(working_parscale))); SET_VECTOR_ELT(Scontrol, 4, PROTECT(double_2_SEXP(control_->fnscale))); SET_VECTOR_ELT(Scontrol, 5, PROTECT(int_2_SEXP(control_->trace))); @@ -321,7 +322,6 @@ nimSmartPtr NimOptimProblem::solve( // NIMERROR("Unknown method_: %s", method_.c_str()); //} result->value *= control_->fnscale; - // Compute Hessian. // Parameters are still on the optimization scale, // i.e. divided by parscale