Skip to content

Commit 1b1492e

Browse files
committed
Fix bug introduced in handling nodes vs components for efficiency
in makeModelDerivsInfo_impl.
1 parent f00ece0 commit 1b1492e

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

packages/nimble/R/nimbleFunction_keywordProcessing.R

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2206,15 +2206,17 @@ makeModelDerivsInfo_impl <- function(model,
22062206

22072207
wrtNodes <- model$expandNodeNames(wrtNodeComps)
22082208
allWrtComps <- model$expandNodeNames(wrtNodes, returnScalarComponents = TRUE)
2209-
if(identical(wrtNodeComps, allWrtComps) && !exists('paciorek')) {
2209+
if(identical(wrtNodeComps, allWrtComps)) {
22102210
## wrt consists of full nodes for computational efficiency.
22112211
## If original wrtNodeComps has components, then this `setdiff` could incorrectly
22122212
## exclude the components of the `wrtNodes` not in `wrtNodeComps` from `parentNodes`,
22132213
## so we need the other branch here.
2214+
usingNodes <- TRUE
22142215
neededParentNodes <- setdiff(parentNodes, c(wrtNodes, nonWrtCalcNodes))
22152216
extraInputNodes <- c(neededParentNodes, nonWrtStochCalcNodes)
22162217
} else {
22172218
## `expandNodeNames` can be costly, so only use this branch if necessary.
2219+
usingNodes <- FALSE
22182220
parentNodeComps <- model$expandNodeNames(parentNodes, returnScalarComponents = TRUE)
22192221
neededParentNodeComps <- setdiff(parentNodeComps, c(wrtNodeComps, nonWrtCalcNodeComps))
22202222
extraInputNodes <- model$expandNodeNames(c(neededParentNodeComps, nonWrtStochCalcNodes))
@@ -2223,16 +2225,24 @@ makeModelDerivsInfo_impl <- function(model,
22232225
constantNodes <- character()
22242226
if(dataAsConstantNodes) {
22252227
boolData <- model$isData(extraInputNodes)
2226-
constantNodes <- model$expandNodeNames(extraInputNodes[boolData], returnScalarComponents = TRUE, sort = TRUE)
2227-
extraInputNodes <- model$expandNodeNames(extraInputNodes[!boolData], returnScalarComponents = TRUE, sort = TRUE)
22282228
## "wrt" components could have crept in when initializing `extraInputNodes` based on nodes.
2229-
extraInputNodes <- setdiff(extraInputNodes, wrtNodeComps)
2230-
constantNodes <- setdiff(constantNodes, wrtNodeComps)
2229+
if(usingNodes) { # Screen using nodes for efficiency, then get components.
2230+
constantNodes <- setdiff(extraInputNodes[boolData], wrtNodes)
2231+
extraInputNodes <- setdiff(extraInputNodes[!boolData], wrtNodes)
2232+
extraInputNodeComps <- model$expandNodeNames(extraInputNodes, returnScalarComponents = TRUE, sort = TRUE)
2233+
constantNodeComps <- model$expandNodeNames(constantNodes, returnScalarComponents = TRUE, sort = TRUE)
2234+
} else { # Screen using components.
2235+
constantNodeComps <- model$expandNodeNames(extraInputNodes[boolData], returnScalarComponents = TRUE, sort = TRUE)
2236+
extraInputNodeComps <- model$expandNodeNames(extraInputNodes[!boolData], returnScalarComponents = TRUE, sort = TRUE)
2237+
extraInputNodeComps <- setdiff(extraInputNodeComps, wrtNodeComps)
2238+
constantNodeComps <- setdiff(constantNodeComps, wrtNodeComps)
2239+
}
22312240
} else {
2232-
extraInputNodes <- setdiff(model$expandNodeNames(extraInputNodes,returnScalarComponents = TRUE, sort = TRUE), wrtNodeComps)
2241+
extraInputNodeComps <- setdiff(model$expandNodeNames(extraInputNodes,returnScalarComponents = TRUE, sort = TRUE), wrtNodeComps)
2242+
constantNodeComps <- character()
22332243
}
2234-
list(updateNodes = extraInputNodes,
2235-
constantNodes = constantNodes)
2244+
list(updateNodes = extraInputNodeComps,
2245+
constantNodes = constantNodeComps)
22362246
}
22372247

22382248
nimDerivsInfoClass_update_init_impl <- function(.self,

0 commit comments

Comments
 (0)