From c26aedb7ea2d6fa40bee8a173286f988994c47e3 Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Mon, 16 Jun 2025 13:31:18 -0700 Subject: [PATCH 1/2] Make nf name conflict more efficient by memoizing the check within each `compileNimble` call. --- packages/nimble/R/genCpp_sizeProcessing.R | 30 ++++++++++++++--------- packages/nimble/R/nimbleProject.R | 3 ++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/nimble/R/genCpp_sizeProcessing.R b/packages/nimble/R/genCpp_sizeProcessing.R index 0442506e7..82d3480ad 100644 --- a/packages/nimble/R/genCpp_sizeProcessing.R +++ b/packages/nimble/R/genCpp_sizeProcessing.R @@ -184,6 +184,24 @@ scalarOutputTypes <- list(decide = 'logical', ## and it will set the size expressions for A and for itself to 1. expressionSymbolTypeReplacements <- c('symbolNimbleListGenerator', 'symbolNimbleList', 'symbolNimbleFunction', 'symbolMemberFunction') +checkNameConflict <- function(nm) { + if(!exists(nm, nimbleUserNamespace$.checkedNames)) { + nimbleUserNamespace$.checkedNames[[nm]] <- 1 + ## Handle replacements such as `gamma` -> `gammafn`. + if(nm %in% specificCallReplacements) { + nm <- names(specificCallReplacements)[which(nm == specificCallReplacements)] + } else if(nm %in% nimKeyWords) + nm <- names(nimKeyWords)[which(nm == nimKeyWords)] + for(i in seq_along(nm)) { # `lgammafn` will give back two items, not one. + objs <- sapply(nm[i], function(x) getAnywhere(x)$objs) + if(any(sapply(objs, is.rcf))) + stop("The name of the nimbleFunction `", nm[i], "` conflicts with a function in the NIMBLE language (DSL); please use a different name") + } + } +} + + + exprClasses_setSizes <- function(code, symTab, typeEnv) { ## input code is exprClass ## name: if(code$isName) { @@ -263,17 +281,7 @@ exprClasses_setSizes <- function(code, symTab, typeEnv) { ## input code is exprC } sizeCall <- sizeCalls[[code$name]] if(!is.null(sizeCall)) { - nm <- code$name - ## Handle replacements such as `gamma` -> `gammafn`. - if(nm %in% specificCallReplacements) { - nm <- names(specificCallReplacements)[which(nm == specificCallReplacements)] - } else if(nm %in% nimKeyWords) - nm <- names(nimKeyWords)[which(nm == nimKeyWords)] - for(i in seq_along(nm)) { # `lgammafn` will give back two items, not one. - objs <- sapply(nm[i], function(x) getAnywhere(x)$objs) - if(any(sapply(objs, is.rcf))) - stop("The name of the nimbleFunction `", nm[i], "` conflicts with a function in the NIMBLE language (DSL); please use a different name") - } + checkNameConflict(code$name) if(.nimbleOptions$debugSizeProcessing) { browser() eval( diff --git a/packages/nimble/R/nimbleProject.R b/packages/nimble/R/nimbleProject.R index 51824b828..690470696 100644 --- a/packages/nimble/R/nimbleProject.R +++ b/packages/nimble/R/nimbleProject.R @@ -1160,7 +1160,8 @@ compileNimble <- function(..., project, dirName = NULL, projectName = '', for(i in names(controlDefaults)) { if(!i %in% names(control)) control[[i]] <- controlDefaults[[i]] } - + + nimbleUserNamespace$.checkedNames <- new.env() # Memoization for checking nf name conflicts in `checkNameConflict()`. ## Units should be either Rmodel, nimbleFunction, or RCfunction (now coming from nimbleFunction with no setup) if(!showCompilerOutput) { From bd6d2887866571d73fe10227fe4812284a71478e Mon Sep 17 00:00:00 2001 From: Christopher Paciorek Date: Mon, 16 Jun 2025 17:46:00 -0700 Subject: [PATCH 2/2] Fix bug in revised nf conflict checking. --- packages/nimble/R/genCpp_sizeProcessing.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nimble/R/genCpp_sizeProcessing.R b/packages/nimble/R/genCpp_sizeProcessing.R index 82d3480ad..c0da0de9e 100644 --- a/packages/nimble/R/genCpp_sizeProcessing.R +++ b/packages/nimble/R/genCpp_sizeProcessing.R @@ -185,7 +185,7 @@ scalarOutputTypes <- list(decide = 'logical', expressionSymbolTypeReplacements <- c('symbolNimbleListGenerator', 'symbolNimbleList', 'symbolNimbleFunction', 'symbolMemberFunction') checkNameConflict <- function(nm) { - if(!exists(nm, nimbleUserNamespace$.checkedNames)) { + if(!exists(nm, nimbleUserNamespace$.checkedNames, inherits = FALSE)) { nimbleUserNamespace$.checkedNames[[nm]] <- 1 ## Handle replacements such as `gamma` -> `gammafn`. if(nm %in% specificCallReplacements) {