Relating back to Adrian's question -
I was hoping I could just ignore the warnings it produces and it would figure itself out when it compiled. However, when I run my model using HMC, it produces the shared library error, which seems to be regarding the dimensions of objects in my custom functions. When I run the code with buildDerivs = FALSE, the code runs fine.
I suspect the error occurs because the buildDerivs of my custom function fails and then later it tries to reference it, even though none of the nodes in the custom sampler are using the HMC part.
Here's the basic setup:
library(nimble)
library(nimbleHMC)
library(coda)
nimbleOptions(MCMCusePredictiveDependenciesInCalculations = TRUE) #needed if using custom sampler
nimbleOptions(MCMCsaveHistory = TRUE)
nimbleOptions(buildInterfacesForCompiledNestedNimbleFunctions = TRUE)
prepbirds <- nimbleModel(code = nimIBM, constants = nc,
data = nd, inits = ni, calculate = T, check = T, buildDerivs = FALSE) #goes fast w/ fake data :)
#plenty of warnings about functions that we can ignore
prepbirds$phi.p[,1] <- 1
prepbirds$initializeInfo()
#can ignore PrAtLeastOne and liftedPrAtLeastOne warnings as well
prepbirds$calculate()
mcmcbirds <- configureMCMC(prepbirds, monitors = pars, print = T, adaptive = TRUE)
#mcmcbirds <- configureHMC(prepbirds, monitors = pars, print = T, adaptive = TRUE, nodes = c("beta0", "beta1", "delta0", "delta1", "age0", "age1", "omega", "p.s", "phi_HY", "alpha0", "alpha1", "age.prob", "g0", "sigma", "k", "nFledglings", "sex"), )
mcmcbirds$removeSampler(c("s", "z", "parent", "age.pre", "k"))
mcmcbirds$addSampler(target = c("s", "z", "parent", "age.pre"),
type = "myRWtrajectoryPotentialSampler", silent = F,
control = list(scale=SamplerScale, adaptScaleOnly = T, adaptive = TRUE,
npix = nc$npix, pxw = nc$pxw, xmin = nc$xmin, ymin = nc$ymin,
xmax = nc$xmax, ymax = nc$ymax,
gcoords = nc$gcoords, pixels = nd$pixels, pixcol = nc$pixcol, pixrow = nc$pixrow,
known.z = known.z,
known.parent = known.parent,
known.s = known.s, known.age = known.age,
known.fledge = known.fledge, east = nd$east,
north = nd$north, nocc = nc$nocc, M = nc$M, xoffset = nc$xoffset,
yoffset = nc$yoffset, ntrap = nc$ntrap, nind = nc$nind,
open = nc$open, trap = nc$trap, seen_t = seen_t, tune = Tune
))
mcmcbirds$addSampler(target = "k[1]", type = "RW", control = list(adapative = TRUE, scale = .05))
mcmcbirds$addSampler(target = "k[2]", type = "RW", control = list(adapative = TRUE, scale = .025))
mcmcbirds$getUnsampledNodes() #make sure this is 0
birdsMCMC <- buildMCMC(mcmcbirds)
Cmodel <- compileNimble(prepbirds) #takes a long time (sometimes)
Compbirds <- compileNimble(birdsMCMC, project = prepbirds, showCompilerOutput = TRUE)
The error it produces is:
Error: Failed to create the shared library. Run 'printErrors()' to see the compilation errors.
> printErrors()
P_16_nimIBM_MID_7_nfCode.cpp:4952:74: error: no matching function for call to 'rcFun_R_GlobalEnv73'
(**ADproxyModel_logProb_s)((ARG1_INDEXEDNODEINFO__.info[0]) - 1, 0, 0) = rcFun_R_GlobalEnv73(Interm_4896, Interm_4897, 64, 0.125, 0, 1, 0, 1, Interm_4898, Interm_4899, 0, 0, 1);
^~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:4726:9: note: candidate function not viable: no known conversion from 'NimArr<1, TYPE_>' (aka 'NimArr<1, AD<double>>') to 'NimArr<1, double> &' for 1st argument
double rcFun_R_GlobalEnv73 ( NimArr<1, double> & ARG1_x_, NimArr<1, double> & ARG2_pi_, double ARG3_npix_, double ARG4_pxw_, double ARG5_xmin_, double ARG6_xmax_, double ARG7_ymin_, double ARG8_ymax_, NimArr<2, double> & ARG9_pixMat_, NimArr<2, double> & ARG10_gcoords_, double ARG11_xoffset_, double ARG12_yoffset_, int ARG13_log_ ) {
^
P_16_nimIBM_MID_7_nfCode.cpp:5977:65: error: no matching function for call to 'rcFun_R_GlobalEnv71'
(**ADproxyModel_pix)((ARG1_INDEXEDNODEINFO__.info[0]) - 1, 0) = rcFun_R_GlobalEnv71(Interm_4931, 0.125, Interm_4932, 0, 0);
^~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:5899:9: note: candidate function not viable: no known conversion from 'NimArr<1, TYPE_>' (aka 'NimArr<1, AD<double>>') to 'NimArr<1, double> &' for 1st argument
double rcFun_R_GlobalEnv71 ( NimArr<1, double> & ARG1_s_, double ARG2_pxw_, NimArr<2, double> & ARG3_pixMat_, double ARG4_xoffset_, double ARG5_yoffset_ ) {
^
P_16_nimIBM_MID_7_nfCode.cpp:7386:108: error: no matching function for call to object of type 'NimArr<2, CppAD::AD<double>>'
(**ADproxyModel_phi_dot_p)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[0]) - 1) = ((**ADproxyModel_phi_dot_loc)(((**ADproxyModel_pix)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1)) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) * (**ADproxyModel_phi_dot_age)[((**ADproxyModel_age)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1)) - 1]) * (**ADproxyModel_z)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) + (**ADproxyModel_a)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) * (**ADproxyModel_Ent_Prob)[(ARG1_INDEXEDNODEINFO__.info[2]) - 1];
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/heather/Library/R/x86_64/4.1/library/nimble/include/nimble/NimArr.h:345:6: note: candidate function not viable: no known conversion from 'AD<double>' to 'int' for 1st argument
T &operator()(int i, int j) const {
^
P_16_nimIBM_MID_7_nfCode.cpp:7386:309: error: no viable overloaded operator[] for type 'NimArr<1, CppAD::AD<double>>'
(**ADproxyModel_phi_dot_p)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[0]) - 1) = ((**ADproxyModel_phi_dot_loc)(((**ADproxyModel_pix)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1)) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) * (**ADproxyModel_phi_dot_age)[((**ADproxyModel_age)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1)) - 1]) * (**ADproxyModel_z)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) + (**ADproxyModel_a)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[2]) - 1) * (**ADproxyModel_Ent_Prob)[(ARG1_INDEXEDNODEINFO__.info[2]) - 1];
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/heather/Library/R/x86_64/4.1/library/nimble/include/nimble/NimArrBase.h:127:6: note: candidate function not viable: no known conversion from 'AD<double>' to 'int' for 1st argument
T &operator[](int i) const { return ((*vPtr)[offset + i * stride1]); }
^
P_16_nimIBM_MID_7_nfCode.cpp:8279:41: error: cannot convert 'AD<double>' to 'int' without a conversion operator
Interm_5009.setMap((**ADproxyModel_s), static_cast<int>(((**ADproxyModel_parent)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[0]) - 1) - 1) * (**ADproxyModel_s).strides()[0] + (ARG1_INDEXEDNODEINFO__.info[2] - 1) * (**ADproxyModel_s).strides()[2]), (**ADproxyModel_s).strides()[1], 2);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:8285:110: error: no matching function for call to 'rcFun_R_GlobalEnv75'
(**ADproxyModel_logProb_s)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, 0, (ARG1_INDEXEDNODEINFO__.info[0]) - 1) = rcFun_R_GlobalEnv75(Interm_5002, Interm_5003, Interm_5004, Interm_5005, Interm_5006, Interm_5007, Interm_5008, Interm_5009, Interm_5010, Interm_5011, Interm_5012, Interm_5013, Interm_5014, 0, 1, 0, 1, 1);
^~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:7880:9: note: candidate function not viable: no known conversion from 'NimArr<1, TYPE_>' (aka 'NimArr<1, AD<double>>') to 'NimArr<1, double> &' for 1st argument
double rcFun_R_GlobalEnv75 ( NimArr<1, double> & ARG1_x_, NimArr<1, double> & ARG2_kappa_, double ARG3_id_, double ARG4_t_, NimArr<1, double> & ARG5_s_dot_pre_, NimArr<1, double> & ARG6_omega_, NimArr<1, double> & ARG7_prev_dot_pix_, NimArr<1, double> & ARG8_s_dot_parent_, NimArr<1, double> & ARG9_a_, NimArr<1, double> & ARG10_z_, NimArr<2, double> & ARG11_east_, NimArr<2, double> & ARG12_north_, double ARG13_myparent_, double ARG14_xmin_, double ARG15_xmax_, double ARG16_ymin_, double ARG17_ymax_, int ARG18_log_ ) {
^
P_16_nimIBM_MID_7_nfCode.cpp:8663:100: error: no matching function for call to 'rcFun_R_GlobalEnv71'
(**ADproxyModel_pix)((ARG1_INDEXEDNODEINFO__.info[1]) - 1, (ARG1_INDEXEDNODEINFO__.info[0]) - 1) = rcFun_R_GlobalEnv71(Interm_5044, 0.125, Interm_5045, 0, 0);
^~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:5899:9: note: candidate function not viable: no known conversion from 'NimArr<1, TYPE_>' (aka 'NimArr<1, AD<double>>') to 'NimArr<1, double> &' for 1st argument
double rcFun_R_GlobalEnv71 ( NimArr<1, double> & ARG1_s_, double ARG2_pxw_, NimArr<2, double> & ARG3_pixMat_, double ARG4_xoffset_, double ARG5_yoffset_ ) {
^
P_16_nimIBM_MID_7_nfCode.cpp:10068:15: error: no matching function for call to 'rcFun_R_GlobalEnv72'
Interm_5061 = rcFun_R_GlobalEnv72(Interm_5057, Interm_5058, Interm_5059, Interm_5060, 144);
^~~~~~~~~~~~~~~~~~~
P_16_nimIBM_MID_7_nfCode.cpp:9975:20: note: candidate function not viable: no known conversion from 'NimArr<1, TYPE_>' (aka 'NimArr<1, AD<double>>') to 'NimArr<1, double> &' for 1st argument
NimArr<1, double> rcFun_R_GlobalEnv72 ( NimArr<1, double> & ARG1_s_, double ARG2_g0_, double ARG3_sigma_, NimArr<2, double> & ARG4_trap_, double ARG5_J_ ) {
^
8 errors generated.
make: *** [P_16_nimIBM_MID_7_nfCode.o] Error 1