From e648a0f3bdc36a06658b2d21aca0586f1f19e03f Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 8 Jan 2024 08:37:42 +0200 Subject: [PATCH 01/20] Methods --- inst/include/model_methods.cpp | 9 ++- methods_tmp/bernoulli.o | Bin 0 -> 287304 bytes methods_tmp/model_methods.cpp | 122 +++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 methods_tmp/bernoulli.o create mode 100644 methods_tmp/model_methods.cpp diff --git a/inst/include/model_methods.cpp b/inst/include/model_methods.cpp index 196d7db68..60a892a48 100644 --- a/inst/include/model_methods.cpp +++ b/inst/include/model_methods.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -9,6 +10,10 @@ #include #endif +stan::model::model_base& +new_model(stan::io::var_context& data_context, unsigned int seed, + std::ostream* msg_stream); + std::shared_ptr var_context(std::string file_path) { if (file_path == "") { stan::io::empty_var_context empty_context; @@ -27,8 +32,8 @@ using json_data_t = stan::json::json_data; // [[Rcpp::export]] Rcpp::List model_ptr(std::string data_path, boost::uint32_t seed) { - Rcpp::XPtr ptr( - new stan_model(*var_context(data_path), seed, &Rcpp::Rcout) + Rcpp::XPtr ptr( + &new_model(*var_context(data_path), seed, &Rcpp::Rcout) ); Rcpp::XPtr base_rng(new boost::ecuyer1988(seed)); return Rcpp::List::create( diff --git a/methods_tmp/bernoulli.o b/methods_tmp/bernoulli.o new file mode 100644 index 0000000000000000000000000000000000000000..e80ce9ec39d77530dc57bc5233c910fca4b73635 GIT binary patch literal 287304 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 +#include +#include +#include +#include +#ifdef CMDSTAN_JSON +#include +#else +#include +#include +#endif + +stan::model::model_base& +new_model(stan::io::var_context& data_context, unsigned int seed, + std::ostream* msg_stream); + +std::shared_ptr var_context(std::string file_path) { + if (file_path == "") { + stan::io::empty_var_context empty_context; + return std::make_shared(empty_context); + } + + std::fstream stream(file_path.c_str(), std::fstream::in); +#ifdef CMDSTAN_JSON +using json_data_t = cmdstan::json::json_data; +#else +using json_data_t = stan::json::json_data; +#endif + json_data_t data_context(stream); + return std::make_shared(data_context); +} + +// [[Rcpp::export]] +Rcpp::List model_ptr(std::string data_path, boost::uint32_t seed) { + Rcpp::XPtr ptr( + &new_model(*var_context(data_path), seed, &Rcpp::Rcout) + ); + Rcpp::XPtr base_rng(new boost::ecuyer1988(seed)); + return Rcpp::List::create( + Rcpp::Named("model_ptr") = ptr, + Rcpp::Named("base_rng") = base_rng + ); +} + +// [[Rcpp::export]] +double log_prob(SEXP ext_model_ptr, std::vector upars, + bool jac_adjust) { + Rcpp::XPtr ptr(ext_model_ptr); + std::vector params_i; + if (jac_adjust) { + return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); + } else { + return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); + } +} + +// [[Rcpp::export]] +Rcpp::NumericVector grad_log_prob(SEXP ext_model_ptr, std::vector upars, + bool jac_adjust) { + Rcpp::XPtr ptr(ext_model_ptr); + std::vector gradients; + std::vector params_i; + + double lp; + if (jac_adjust) { + lp = stan::model::log_prob_grad( + *ptr.get(), upars, params_i, gradients); + } else { + lp = stan::model::log_prob_grad( + *ptr.get(), upars, params_i, gradients); + } + Rcpp::NumericVector grad_rtn = Rcpp::wrap(gradients); + grad_rtn.attr("log_prob") = lp; + return grad_rtn; +} + +// [[Rcpp::export]] +size_t get_num_upars(SEXP ext_model_ptr) { + Rcpp::XPtr ptr(ext_model_ptr); + return ptr->num_params_r(); +} + +// [[Rcpp::export]] +Rcpp::List get_param_metadata(SEXP ext_model_ptr) { + Rcpp::XPtr ptr(ext_model_ptr); + std::vector param_names; + std::vector > param_dims; + ptr->get_param_names(param_names); + ptr->get_dims(param_dims); + + Rcpp::List param_metadata = Rcpp::List::create( + Rcpp::Named(param_names[0]) = param_dims[0] + ); + for (size_t i = 1; i < param_names.size(); i++) { + param_metadata.push_back(param_dims[i], param_names[i]); + } + + return param_metadata; +} + +// [[Rcpp::export]] +std::vector unconstrain_variables(SEXP ext_model_ptr, std::string init_path) { + Rcpp::XPtr ptr(ext_model_ptr); + std::vector params_i; + std::vector vars; + ptr->transform_inits(*var_context(init_path), params_i, vars, &Rcpp::Rcout); + return vars; +} + +// [[Rcpp::export]] +std::vector constrain_variables(SEXP ext_model_ptr, SEXP base_rng, + std::vector upars, + bool return_trans_pars, + bool return_gen_quants) { + Rcpp::XPtr ptr(ext_model_ptr); + Rcpp::XPtr rng(base_rng); + std::vector params_i; + std::vector vars; + + ptr->write_array(*rng.get(), upars, params_i, vars, return_trans_pars, return_gen_quants); + return vars; +} From 4f9be7f6df2287fe4c5fc4bc7503e7a7103a1d7e Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 10 Jan 2024 13:13:00 +0200 Subject: [PATCH 02/20] dev --- R/model.R | 7 ++- R/utils.R | 6 ++ inst/include/model_methods.cpp | 107 +++++++++++++++++++++++---------- 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/R/model.R b/R/model.R index 7f298b118..b49caad99 100644 --- a/R/model.R +++ b/R/model.R @@ -655,7 +655,7 @@ compile <- function(quiet = TRUE, run_log <- wsl_compatible_run( command = make_cmd(), args = c(wsl_safe_path(tmp_exe), - cpp_options_to_compile_flags(cpp_options), + cpp_options_to_compile_flags(c(cpp_options, list("KEEP_OBJECT"="true"))), stancflags_val), wd = cmdstan_path(), echo = !quiet || is_verbose_mode(), @@ -708,6 +708,11 @@ compile <- function(quiet = TRUE, file.remove(exe) } file.copy(tmp_exe, exe, overwrite = TRUE) + model_obj_file <- paste0(temp_file_no_ext, ".o") + if (file.exists(model_obj_file)) { + private$model_methods_env_$obj_file_location_ <- model_obj_file + private$model_methods_env_$obj_file_ <- readBin(model_obj_file, "raw") + } if (os_is_wsl()) { res <- processx::run( command = "wsl", diff --git a/R/utils.R b/R/utils.R index 00fe3faeb..5873f7688 100644 --- a/R/utils.R +++ b/R/utils.R @@ -753,6 +753,12 @@ rcpp_source_stan <- function(code, env, verbose = FALSE) { invisible(NULL) } +compile_model_methods <- function(verbose = FALSE) { + source_file <- system.file("include", "model_methods.cpp", + package = "cmdstanr", mustWork = TRUE) + +} + expose_model_methods <- function(env, verbose = FALSE, hessian = FALSE) { code <- c(env$hpp_code_, readLines(system.file("include", "model_methods.cpp", diff --git a/inst/include/model_methods.cpp b/inst/include/model_methods.cpp index 60a892a48..cda74bd8e 100644 --- a/inst/include/model_methods.cpp +++ b/inst/include/model_methods.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -10,6 +9,9 @@ #include #endif +#include +#include + stan::model::model_base& new_model(stan::io::var_context& data_context, unsigned int seed, std::ostream* msg_stream); @@ -30,8 +32,10 @@ using json_data_t = stan::json::json_data; return std::make_shared(data_context); } -// [[Rcpp::export]] -Rcpp::List model_ptr(std::string data_path, boost::uint32_t seed) { +RcppExport SEXP model_ptr_(SEXP data_path_, SEXP seed_) { + BEGIN_RCPP + std::string data_path = Rcpp::as(data_path_); + boost::uint32_t seed = Rcpp::as(seed_); Rcpp::XPtr ptr( &new_model(*var_context(data_path), seed, &Rcpp::Rcout) ); @@ -40,48 +44,78 @@ Rcpp::List model_ptr(std::string data_path, boost::uint32_t seed) { Rcpp::Named("model_ptr") = ptr, Rcpp::Named("base_rng") = base_rng ); + END_RCPP } -// [[Rcpp::export]] -double log_prob(SEXP ext_model_ptr, std::vector upars, - bool jac_adjust) { +RcppExport SEXP log_prob_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); - std::vector params_i; - if (jac_adjust) { - return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); + double rtn; + Eigen::VectorXd upars = Rcpp::as>(upars_); + if (Rcpp::as(jacobian_)) { + rtn = stan::model::log_prob_propto(*ptr.get(), upars, &Rcpp::Rcout); } else { - return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); + rtn = stan::model::log_prob_propto(*ptr.get(), upars, &Rcpp::Rcout); } + return Rcpp::wrap(rtn); + END_RCPP } -// [[Rcpp::export]] -Rcpp::NumericVector grad_log_prob(SEXP ext_model_ptr, std::vector upars, - bool jac_adjust) { +RcppExport SEXP grad_log_prob_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); - std::vector gradients; - std::vector params_i; + Eigen::VectorXd gradients; + Eigen::VectorXd upars = Rcpp::as(upars_); double lp; - if (jac_adjust) { + if (Rcpp::as(jacobian_)) { lp = stan::model::log_prob_grad( - *ptr.get(), upars, params_i, gradients); + *ptr.get(), upars, gradients); } else { lp = stan::model::log_prob_grad( - *ptr.get(), upars, params_i, gradients); + *ptr.get(), upars, gradients); } - Rcpp::NumericVector grad_rtn = Rcpp::wrap(gradients); + Rcpp::NumericVector grad_rtn(Rcpp::wrap(gradients)); grad_rtn.attr("log_prob") = lp; return grad_rtn; + END_RCPP +} + +RcppExport SEXP hessian_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) { + BEGIN_RCPP + Rcpp::XPtr ptr(ext_model_ptr); + Eigen::Map upars = Rcpp::as>(upars_); + + auto hessian_functor = [&](auto&& x) { + if (Rcpp::as(jacobian_)) { + return ptr->log_prob(x, 0); + } else { + return ptr->log_prob(x, 0); + } + }; + + double log_prob; + Eigen::VectorXd grad; + Eigen::MatrixXd hessian; + + stan::math::internal::finite_diff_hessian_auto(hessian_functor, upars, log_prob, grad, hessian); + + return Rcpp::List::create( + Rcpp::Named("log_prob") = log_prob, + Rcpp::Named("grad_log_prob") = grad, + Rcpp::Named("hessian") = hessian); + END_RCPP } -// [[Rcpp::export]] -size_t get_num_upars(SEXP ext_model_ptr) { +RcppExport SEXP get_num_upars_(SEXP ext_model_ptr) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); - return ptr->num_params_r(); + return Rcpp::wrap(ptr->num_params_r()); + END_RCPP } -// [[Rcpp::export]] -Rcpp::List get_param_metadata(SEXP ext_model_ptr) { +RcppExport SEXP get_param_metadata_(SEXP ext_model_ptr) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); std::vector param_names; std::vector > param_dims; @@ -96,27 +130,34 @@ Rcpp::List get_param_metadata(SEXP ext_model_ptr) { } return param_metadata; + END_RCPP } -// [[Rcpp::export]] -std::vector unconstrain_variables(SEXP ext_model_ptr, std::string init_path) { +RcppExport SEXP unconstrain_variables_(SEXP ext_model_ptr, SEXP init_path_) { + BEGIN_RCPP + std::string init_path = Rcpp::as(init_path_); Rcpp::XPtr ptr(ext_model_ptr); std::vector params_i; std::vector vars; ptr->transform_inits(*var_context(init_path), params_i, vars, &Rcpp::Rcout); - return vars; + return Rcpp::wrap(vars); + END_RCPP } -// [[Rcpp::export]] -std::vector constrain_variables(SEXP ext_model_ptr, SEXP base_rng, - std::vector upars, - bool return_trans_pars, - bool return_gen_quants) { +RcppExport SEXP constrain_variables_(SEXP ext_model_ptr, SEXP base_rng, + SEXP upars_, + SEXP return_trans_pars_, + SEXP return_gen_quants_) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); Rcpp::XPtr rng(base_rng); + std::vector upars = Rcpp::as>(upars_); + bool return_trans_pars = Rcpp::as(return_trans_pars_); + bool return_gen_quants = Rcpp::as(return_gen_quants_); std::vector params_i; std::vector vars; ptr->write_array(*rng.get(), upars, params_i, vars, return_trans_pars, return_gen_quants); - return vars; + return Rcpp::wrap(vars); + END_RCPP } From fb6fab58fcb5407acb3a5b815f376ee246a760e3 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 10 Jan 2024 23:09:13 +0200 Subject: [PATCH 03/20] Tests passing, doc updated --- R/fit.R | 15 ++--- R/install.R | 2 + R/model.R | 22 +++---- R/utils.R | 94 +++++++++++++++++++++------- man/fit-method-init_model_methods.Rd | 7 ++- man/model-method-compile.Rd | 10 +-- model.o | 1 + tests/testthat/test-model-methods.R | 54 +++++++++++----- 8 files changed, 142 insertions(+), 63 deletions(-) create mode 100644 model.o diff --git a/R/fit.R b/R/fit.R index b1c99e97a..00a9f7725 100644 --- a/R/fit.R +++ b/R/fit.R @@ -332,7 +332,7 @@ CmdStanFit$set("public", name = "init", value = init) #' [unconstrain_variables()], [unconstrain_draws()], [variable_skeleton()], #' [hessian()] #' -init_model_methods <- function(seed = 0, verbose = FALSE, hessian = FALSE) { +init_model_methods <- function(seed = 0, verbose = FALSE, hessian = FALSE, force_recompile = FALSE) { if (os_is_wsl()) { stop("Additional model methods are not currently available with ", "WSL CmdStan and will not be compiled", @@ -340,18 +340,19 @@ init_model_methods <- function(seed = 0, verbose = FALSE, hessian = FALSE) { } require_suggested_package("Rcpp") require_suggested_package("RcppEigen") - if (length(private$model_methods_env_$hpp_code_) == 0) { + if (length(private$model_methods_env_$hpp_code_) == 0 && + (is.null(private$model_methods_env_$obj_file_) || + !file.exists(private$model_methods_env_$obj_file_))) { stop("Model methods cannot be used with a pre-compiled Stan executable, ", "the model must be compiled again", call. = FALSE) } if (hessian) { - message("The hessian method relies on higher-order autodiff ", - "which is still experimental. Please report any compilation ", - "errors that you encounter") + warning("The hessian argument is deprecated and will be removed in a future release.\n", + "The hessian method is now exposed by default.") } - message("Compiling additional model methods...") if (is.null(private$model_methods_env_$model_ptr)) { - expose_model_methods(private$model_methods_env_, verbose, hessian) + expose_model_methods(private$model_methods_env_, verbose = verbose, + force_recompile = force_recompile) } initialize_model_pointer(private$model_methods_env_, self$data_file(), seed) invisible(NULL) diff --git a/R/install.R b/R/install.R index 7d92f5e95..692eddbd9 100644 --- a/R/install.R +++ b/R/install.R @@ -475,6 +475,8 @@ build_cmdstan <- function(dir, clean_cmdstan <- function(dir = cmdstan_path(), cores = getOption("mc.cores", 2), quiet = FALSE) { + unlink(file.path(dir, "model_methods.o")) + unlink(file.path(dir, "model_methods.cpp")) withr::with_path( c( toolchain_PATH_env_var(), diff --git a/R/model.R b/R/model.R index b49caad99..aa35548f4 100644 --- a/R/model.R +++ b/R/model.R @@ -405,8 +405,6 @@ CmdStanModel <- R6::R6Class( #' @param compile_model_methods (logical) Compile additional model methods #' (`log_prob()`, `grad_log_prob()`, `constrain_variables()`, #' `unconstrain_variables()`). -#' @param compile_hessian_method (logical) Should the (experimental) `hessian()` method be -#' be compiled with the model methods? #' @param compile_standalone (logical) Should functions in the Stan model be #' compiled for use in R? If `TRUE` the functions will be available via the #' `functions` field in the compiled model object. This can also be done after @@ -417,6 +415,8 @@ CmdStanModel <- R6::R6Class( #' #' @param threads Deprecated and will be removed in a future release. Please #' turn on threading via `cpp_options = list(stan_threads = TRUE)` instead. +#' @param compile_hessian_method (logical) Deprecated and will be removed in a future release. +#' The hessian method is now compiled by default. #' #' @return The `$compile()` method is called for its side effect of creating the #' executable and adding its path to the [`CmdStanModel`] object, but it also @@ -465,11 +465,11 @@ compile <- function(quiet = TRUE, stanc_options = list(), force_recompile = getOption("cmdstanr_force_recompile", default = FALSE), compile_model_methods = FALSE, - compile_hessian_method = FALSE, compile_standalone = FALSE, dry_run = FALSE, #deprecated - threads = FALSE) { + threads = FALSE, + compile_hessian_method = FALSE) { if (length(self$stan_file()) == 0) { stop("'$compile()' cannot be used because the 'CmdStanModel' was not created with a Stan file.", call. = FALSE) @@ -504,6 +504,10 @@ compile <- function(quiet = TRUE, warning("'threads' is deprecated. Please use 'cpp_options = list(stan_threads = TRUE)' instead.") cpp_options[["stan_threads"]] <- TRUE } + if (isTRUE(compile_hessian_method)) { + warning("'compile_hessian_method' is deprecated. The hessian method is now compiled by default.") + compile_hessian_method <- FALSE + } if (length(self$exe_file()) == 0) { if (is.null(dir)) { @@ -710,8 +714,7 @@ compile <- function(quiet = TRUE, file.copy(tmp_exe, exe, overwrite = TRUE) model_obj_file <- paste0(temp_file_no_ext, ".o") if (file.exists(model_obj_file)) { - private$model_methods_env_$obj_file_location_ <- model_obj_file - private$model_methods_env_$obj_file_ <- readBin(model_obj_file, "raw") + private$model_methods_env_$obj_file_ <- model_obj_file } if (os_is_wsl()) { res <- processx::run( @@ -728,13 +731,10 @@ compile <- function(quiet = TRUE, private$precompile_stanc_options_ <- NULL private$precompile_include_paths_ <- NULL - if(!dry_run) { if (compile_model_methods) { - expose_model_methods(env = private$model_methods_env_, - verbose = !quiet, - hessian = compile_hessian_method) + expose_model_methods(private$model_methods_env_, verbose = !quiet) } - } + invisible(self) } CmdStanModel$set("public", name = "compile", value = compile) diff --git a/R/utils.R b/R/utils.R index 5873f7688..7eb6651b5 100644 --- a/R/utils.R +++ b/R/utils.R @@ -728,10 +728,17 @@ get_cmdstan_flags <- function(flag_name) { paste(flags, collapse = " ") } -rcpp_source_stan <- function(code, env, verbose = FALSE) { +with_cmdstan_flags <- function(expr) { cxxflags <- get_cmdstan_flags("CXXFLAGS") cmdstanr_includes <- system.file("include", package = "cmdstanr", mustWork = TRUE) cmdstanr_includes <- paste0(" -I\"", cmdstanr_includes,"\"") + + r_includes <- paste( + paste0("-I", shQuote(system.file("include", package = "Rcpp", mustWork = TRUE))), + paste0("-I", shQuote(system.file("include", package = "RcppEigen", mustWork = TRUE))), + paste0("-I", shQuote(R.home(component = "include"))) + ) + libs <- c("LDLIBS", "LIBSUNDIALS", "TBB_TARGETS", "LDFLAGS_TBB") libs <- paste(sapply(libs, get_cmdstan_flags), collapse = " ") if (.Platform$OS.type == "windows") { @@ -739,40 +746,79 @@ rcpp_source_stan <- function(code, env, verbose = FALSE) { } lib_paths <- c("/stan/lib/stan_math/lib/tbb/", "/stan/lib/stan_math/lib/sundials_6.1.1/lib/") - withr::with_path(paste0(cmdstan_path(), lib_paths), + withr::with_path( + c( + paste0(cmdstan_path(), lib_paths), + toolchain_PATH_env_var() + ), withr::with_makevars( - c( - USE_CXX14 = 1, - PKG_CPPFLAGS = ifelse(cmdstan_version() <= "2.30.1", "-DCMDSTAN_JSON", ""), - PKG_CXXFLAGS = paste0(cxxflags, cmdstanr_includes, collapse = " "), - PKG_LIBS = libs - ), - Rcpp::sourceCpp(code = code, env = env, verbose = verbose) + c( + USE_CXX14 = 1, + PKG_CPPFLAGS = ifelse(cmdstan_version() <= "2.30.1", "-DCMDSTAN_JSON", ""), + PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, "-DRCPP_USE_FINALIZE_ON_EXIT", collapse = " "), + PKG_LIBS = libs + ), + expr ) ) - invisible(NULL) } -compile_model_methods <- function(verbose = FALSE) { - source_file <- system.file("include", "model_methods.cpp", - package = "cmdstanr", mustWork = TRUE) +rcpp_source_stan <- function(code, env, verbose = FALSE) { + with_cmdstan_flags(Rcpp::sourceCpp(code = code, env = env, verbose = verbose)) + invisible(NULL) +} +initialize_method_functions <- function(env, PACKAGE) { + env$model_ptr <- function(...) { .Call("model_ptr_", ..., PACKAGE = PACKAGE) } + env$log_prob <- function(...) { .Call("log_prob_", ..., PACKAGE = PACKAGE) } + env$grad_log_prob <- function(...) { .Call("grad_log_prob_", ..., PACKAGE = PACKAGE) } + env$hessian <- function(...) { .Call("hessian_", ..., PACKAGE = PACKAGE) } + env$get_num_upars <- function(...) { .Call("get_num_upars_", ..., PACKAGE = PACKAGE) } + env$get_param_metadata <- function(...) { .Call("get_param_metadata_", ..., PACKAGE = PACKAGE) } + env$unconstrain_variables <- function(...) { .Call("unconstrain_variables_", ..., PACKAGE = PACKAGE) } + env$constrain_variables <- function(...) { .Call("constrain_variables_", ..., PACKAGE = PACKAGE) } } -expose_model_methods <- function(env, verbose = FALSE, hessian = FALSE) { - code <- c(env$hpp_code_, - readLines(system.file("include", "model_methods.cpp", - package = "cmdstanr", mustWork = TRUE))) +expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) { + precomp_methods_file <- file.path(cmdstan_path(), "model_methods.o") + if (file.exists(precomp_methods_file) && force_recompile) { + unlink(precomp_methods_file) + model_methods_cpp <- system.file("include", "model_methods.cpp", + package = "cmdstanr", mustWork = TRUE) + source_file <- paste0(strip_ext(precomp_methods_file), ".cpp") + file.copy(model_methods_cpp, source_file, overwrite = TRUE) + } + + model_obj_file <- env$obj_file_ + if (!file.exists(model_obj_file)) { + if (rlang::is_interactive()) { + message("Model object file not found, recompiling model...") + } + temp_hpp_file <- tempfile() + writeLines(env$hpp_code_, con = paste0(temp_hpp_file, ".cpp")) + model_obj_file <- paste0(temp_hpp_file, ".o") + } - if (hessian) { - code <- c("#include ", - code, - readLines(system.file("include", "hessian.cpp", - package = "cmdstanr", mustWork = TRUE))) + if (!file.exists(precomp_methods_file) && rlang::is_interactive()) { + message("Compiling and caching additional model methods...") } + if (rlang::is_interactive()) { + message("Linking precompiled model methods to model object file...") + } + + methods_dll <- tempfile(fileext = .Platform$dynlib.ext) + with_cmdstan_flags( + processx::run( + command = file.path(R.home(component = "bin"), "R"), + args = c("CMD", "SHLIB", model_obj_file, precomp_methods_file, "-o", methods_dll), + echo = verbose || is_verbose_mode(), + echo_cmd = is_verbose_mode(), + error_on_status = FALSE + ) + ) - code <- paste(code, collapse = "\n") - rcpp_source_stan(code, env, verbose) + env$methods_dll_info <- dyn.load(methods_dll, local = TRUE, now = TRUE) + initialize_method_functions(env, strip_ext(basename(methods_dll))) invisible(NULL) } diff --git a/man/fit-method-init_model_methods.Rd b/man/fit-method-init_model_methods.Rd index 0fd0c0752..c0b0ac0b4 100644 --- a/man/fit-method-init_model_methods.Rd +++ b/man/fit-method-init_model_methods.Rd @@ -6,7 +6,12 @@ \title{Compile additional methods for accessing the model log-probability function and parameter constraining and unconstraining.} \usage{ -init_model_methods(seed = 0, verbose = FALSE, hessian = FALSE) +init_model_methods( + seed = 0, + verbose = FALSE, + hessian = FALSE, + force_recompile = FALSE +) } \arguments{ \item{seed}{(integer) The random seed to use when initializing the model.} diff --git a/man/model-method-compile.Rd b/man/model-method-compile.Rd index d295eedcc..1f0aff66f 100644 --- a/man/model-method-compile.Rd +++ b/man/model-method-compile.Rd @@ -15,10 +15,10 @@ compile( stanc_options = list(), force_recompile = getOption("cmdstanr_force_recompile", default = FALSE), compile_model_methods = FALSE, - compile_hessian_method = FALSE, compile_standalone = FALSE, dry_run = FALSE, - threads = FALSE + threads = FALSE, + compile_hessian_method = FALSE ) } \arguments{ @@ -64,9 +64,6 @@ via a global \code{cmdstanr_force_recompile} option.} (\code{log_prob()}, \code{grad_log_prob()}, \code{constrain_variables()}, \code{unconstrain_variables()}).} -\item{compile_hessian_method}{(logical) Should the (experimental) \code{hessian()} method be -be compiled with the model methods?} - \item{compile_standalone}{(logical) Should functions in the Stan model be compiled for use in R? If \code{TRUE} the functions will be available via the \code{functions} field in the compiled model object. This can also be done after @@ -78,6 +75,9 @@ but skip the actual C++ compilation. Used to speedup tests.} \item{threads}{Deprecated and will be removed in a future release. Please turn on threading via \code{cpp_options = list(stan_threads = TRUE)} instead.} + +\item{compile_hessian_method}{(logical) Deprecated and will be removed in a future release. +The hessian method is now compiled by default.} } \value{ The \verb{$compile()} method is called for its side effect of creating the diff --git a/model.o b/model.o new file mode 100644 index 000000000..50c8be35f --- /dev/null +++ b/model.o @@ -0,0 +1 @@ +Ï \ No newline at end of file diff --git a/tests/testthat/test-model-methods.R b/tests/testthat/test-model-methods.R index c3607f7b7..80d4534f3 100644 --- a/tests/testthat/test-model-methods.R +++ b/tests/testthat/test-model-methods.R @@ -34,13 +34,13 @@ test_that("Methods error if not compiled", { ) }) -test_that("User warned about higher-order autodiff with hessian", { +test_that("User warned hessian argument deprecated", { skip_if(os_is_wsl()) - expect_message( + expect_warning( fit$init_model_methods(hessian = TRUE, verbose = TRUE), - "The hessian method relies on higher-order autodiff which is still experimental. Please report any compilation errors that you encounter", + "The hessian argument is deprecated and will be removed in a future release.", fixed = TRUE - ) + ) }) test_that("Methods return correct values", { @@ -151,12 +151,23 @@ test_that("Methods error with already-compiled model", { ) }) +test_that("User warned compilation arguments deprecated", { + skip_if(os_is_wsl()) + expect_warning( + cmdstan_model(testing_stan_file("bernoulli"), + force_recompile = TRUE, + compile_model_methods = TRUE, + compile_hessian_method = TRUE), + "'compile_hessian_method' is deprecated. The hessian method is now compiled by default.", + fixed = TRUE + ) +}) + test_that("Methods can be compiled with model", { skip_if(os_is_wsl()) mod <- cmdstan_model(testing_stan_file("bernoulli"), force_recompile = TRUE, - compile_model_methods = TRUE, - compile_hessian_method = TRUE) + compile_model_methods = TRUE) fit <- mod$sample(data = data_list, chains = 1) lp <- fit$log_prob(unconstrained_variables=c(0.6)) @@ -196,7 +207,8 @@ test_that("unconstrain_variables correctly handles zero-length containers", { } " mod <- cmdstan_model(write_stan_file(model_code), - compile_model_methods = TRUE) + compile_model_methods = TRUE, + force_recompile = TRUE) fit <- mod$sample(data = list(N = 0), chains = 1) unconstrained <- fit$unconstrain_variables(variables = list(x = 5)) expect_equal(unconstrained, 5) @@ -219,8 +231,8 @@ test_that("unconstrain_draws returns correct values", { } " mod <- cmdstan_model(write_stan_file(model_code), - compile_model_methods = TRUE, - force_recompile = TRUE) + force_recompile = TRUE, + compile_model_methods = TRUE) fit <- mod$sample(data = list(N = 0), chains = 1) x_draws <- fit$draws(format = "draws_df")$x @@ -251,8 +263,8 @@ test_that("unconstrain_draws returns correct values", { } " mod <- cmdstan_model(write_stan_file(model_code), - compile_model_methods = TRUE, - force_recompile = TRUE) + force_recompile = TRUE, + compile_model_methods = TRUE) fit <- mod$sample(data = list(N = 0), chains = 1) x_draws <- fit$draws(format = "draws_df")$x @@ -273,7 +285,8 @@ test_that("Model methods can be initialised for models with no data", { skip_if(os_is_wsl()) stan_file <- write_stan_file("parameters { real x; } model { x ~ std_normal(); }") - mod <- cmdstan_model(stan_file, compile_model_methods = TRUE, force_recompile = TRUE) + mod <- cmdstan_model(stan_file, force_recompile = TRUE, + compile_model_methods = TRUE) expect_no_error(fit <- mod$sample()) expect_equal(fit$log_prob(5), -12.5) }) @@ -295,12 +308,12 @@ test_that("Variable skeleton returns correct dimensions for matrices", { model { x_real ~ std_normal(); }") - mod <- cmdstan_model(stan_file, compile_model_methods = TRUE, - force_recompile = TRUE) + mod <- cmdstan_model(stan_file, force_recompile = TRUE, + compile_model_methods = TRUE) N <- 4 K <- 3 fit <- mod$sample(data = list(N = N, K = K), chains = 1, - iter_warmup = 1, iter_sampling = 1) + iter_warmup = 5, iter_sampling = 5) target_skeleton <- list( x_real = array(0, dim = 1), @@ -312,3 +325,14 @@ test_that("Variable skeleton returns correct dimensions for matrices", { expect_equal(fit$variable_skeleton(), target_skeleton) }) + +test_that("Model object file can be recompiled if not found", { + mod <- cmdstan_model(testing_stan_file("bernoulli_log_lik"), + force_recompile = TRUE) + model_obj_file <- mod$.__enclos_env__$private$model_methods_env_$obj_file_ + unlink(model_obj_file) + expect_false(file.exists(model_obj_file)) + data_list <- testing_data("bernoulli") + fit <- mod$sample(data = data_list, chains = 1, refresh = 0) + expect_no_error(fit$init_model_methods()) +}) From 218f6eb0a190026bf63b7315fab51a35fbe394e6 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 10 Jan 2024 23:11:14 +0200 Subject: [PATCH 04/20] Revert arg order change --- R/model.R | 4 ++-- man/model-method-compile.Rd | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/R/model.R b/R/model.R index aa35548f4..c74a8184c 100644 --- a/R/model.R +++ b/R/model.R @@ -465,11 +465,11 @@ compile <- function(quiet = TRUE, stanc_options = list(), force_recompile = getOption("cmdstanr_force_recompile", default = FALSE), compile_model_methods = FALSE, + compile_hessian_method = FALSE, compile_standalone = FALSE, dry_run = FALSE, #deprecated - threads = FALSE, - compile_hessian_method = FALSE) { + threads = FALSE) { if (length(self$stan_file()) == 0) { stop("'$compile()' cannot be used because the 'CmdStanModel' was not created with a Stan file.", call. = FALSE) diff --git a/man/model-method-compile.Rd b/man/model-method-compile.Rd index 1f0aff66f..72443a3f2 100644 --- a/man/model-method-compile.Rd +++ b/man/model-method-compile.Rd @@ -15,10 +15,10 @@ compile( stanc_options = list(), force_recompile = getOption("cmdstanr_force_recompile", default = FALSE), compile_model_methods = FALSE, + compile_hessian_method = FALSE, compile_standalone = FALSE, dry_run = FALSE, - threads = FALSE, - compile_hessian_method = FALSE + threads = FALSE ) } \arguments{ @@ -64,6 +64,9 @@ via a global \code{cmdstanr_force_recompile} option.} (\code{log_prob()}, \code{grad_log_prob()}, \code{constrain_variables()}, \code{unconstrain_variables()}).} +\item{compile_hessian_method}{(logical) Deprecated and will be removed in a future release. +The hessian method is now compiled by default.} + \item{compile_standalone}{(logical) Should functions in the Stan model be compiled for use in R? If \code{TRUE} the functions will be available via the \code{functions} field in the compiled model object. This can also be done after @@ -75,9 +78,6 @@ but skip the actual C++ compilation. Used to speedup tests.} \item{threads}{Deprecated and will be removed in a future release. Please turn on threading via \code{cpp_options = list(stan_threads = TRUE)} instead.} - -\item{compile_hessian_method}{(logical) Deprecated and will be removed in a future release. -The hessian method is now compiled by default.} } \value{ The \verb{$compile()} method is called for its side effect of creating the From 5a2ad0d36b21aca24869cdec15b721988a96d57b Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 10 Jan 2024 23:35:06 +0200 Subject: [PATCH 05/20] Cleaning up stray changes --- R/model.R | 3 +- R/utils.R | 23 +++--- methods_tmp/bernoulli.o | Bin 287304 -> 0 bytes methods_tmp/model_methods.cpp | 122 ---------------------------- model.o | 1 - tests/testthat/test-model-methods.R | 17 ++-- 6 files changed, 22 insertions(+), 144 deletions(-) delete mode 100644 methods_tmp/bernoulli.o delete mode 100644 methods_tmp/model_methods.cpp delete mode 100644 model.o diff --git a/R/model.R b/R/model.R index c74a8184c..4e377abfa 100644 --- a/R/model.R +++ b/R/model.R @@ -731,10 +731,11 @@ compile <- function(quiet = TRUE, private$precompile_stanc_options_ <- NULL private$precompile_include_paths_ <- NULL + if (!dry_run) { if (compile_model_methods) { expose_model_methods(private$model_methods_env_, verbose = !quiet) } - + } invisible(self) } CmdStanModel$set("public", name = "compile", value = compile) diff --git a/R/utils.R b/R/utils.R index 7eb6651b5..edcf618b6 100644 --- a/R/utils.R +++ b/R/utils.R @@ -755,7 +755,7 @@ with_cmdstan_flags <- function(expr) { c( USE_CXX14 = 1, PKG_CPPFLAGS = ifelse(cmdstan_version() <= "2.30.1", "-DCMDSTAN_JSON", ""), - PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, "-DRCPP_USE_FINALIZE_ON_EXIT", collapse = " "), + PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, collapse = " "), PKG_LIBS = libs ), expr @@ -768,15 +768,15 @@ rcpp_source_stan <- function(code, env, verbose = FALSE) { invisible(NULL) } -initialize_method_functions <- function(env, PACKAGE) { - env$model_ptr <- function(...) { .Call("model_ptr_", ..., PACKAGE = PACKAGE) } - env$log_prob <- function(...) { .Call("log_prob_", ..., PACKAGE = PACKAGE) } - env$grad_log_prob <- function(...) { .Call("grad_log_prob_", ..., PACKAGE = PACKAGE) } - env$hessian <- function(...) { .Call("hessian_", ..., PACKAGE = PACKAGE) } - env$get_num_upars <- function(...) { .Call("get_num_upars_", ..., PACKAGE = PACKAGE) } - env$get_param_metadata <- function(...) { .Call("get_param_metadata_", ..., PACKAGE = PACKAGE) } - env$unconstrain_variables <- function(...) { .Call("unconstrain_variables_", ..., PACKAGE = PACKAGE) } - env$constrain_variables <- function(...) { .Call("constrain_variables_", ..., PACKAGE = PACKAGE) } +initialize_method_functions <- function(env, so_name) { + env$model_ptr <- function(...) { .Call("model_ptr_", ..., so_name) } + env$log_prob <- function(...) { .Call("log_prob_", ..., so_name) } + env$grad_log_prob <- function(...) { .Call("grad_log_prob_", ..., so_name) } + env$hessian <- function(...) { .Call("hessian_", ..., so_name) } + env$get_num_upars <- function(...) { .Call("get_num_upars_", ..., so_name) } + env$get_param_metadata <- function(...) { .Call("get_param_metadata_", ..., so_name) } + env$unconstrain_variables <- function(...) { .Call("unconstrain_variables_", ..., so_name) } + env$constrain_variables <- function(...) { .Call("constrain_variables_", ..., so_name) } } expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) { @@ -810,7 +810,8 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) with_cmdstan_flags( processx::run( command = file.path(R.home(component = "bin"), "R"), - args = c("CMD", "SHLIB", model_obj_file, precomp_methods_file, "-o", methods_dll), + args = c("CMD", "SHLIB", model_obj_file, precomp_methods_file, + "-o", methods_dll), echo = verbose || is_verbose_mode(), echo_cmd = is_verbose_mode(), error_on_status = FALSE diff --git a/methods_tmp/bernoulli.o b/methods_tmp/bernoulli.o deleted file mode 100644 index e80ce9ec39d77530dc57bc5233c910fca4b73635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287304 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 -#include -#include -#include -#include -#ifdef CMDSTAN_JSON -#include -#else -#include -#include -#endif - -stan::model::model_base& -new_model(stan::io::var_context& data_context, unsigned int seed, - std::ostream* msg_stream); - -std::shared_ptr var_context(std::string file_path) { - if (file_path == "") { - stan::io::empty_var_context empty_context; - return std::make_shared(empty_context); - } - - std::fstream stream(file_path.c_str(), std::fstream::in); -#ifdef CMDSTAN_JSON -using json_data_t = cmdstan::json::json_data; -#else -using json_data_t = stan::json::json_data; -#endif - json_data_t data_context(stream); - return std::make_shared(data_context); -} - -// [[Rcpp::export]] -Rcpp::List model_ptr(std::string data_path, boost::uint32_t seed) { - Rcpp::XPtr ptr( - &new_model(*var_context(data_path), seed, &Rcpp::Rcout) - ); - Rcpp::XPtr base_rng(new boost::ecuyer1988(seed)); - return Rcpp::List::create( - Rcpp::Named("model_ptr") = ptr, - Rcpp::Named("base_rng") = base_rng - ); -} - -// [[Rcpp::export]] -double log_prob(SEXP ext_model_ptr, std::vector upars, - bool jac_adjust) { - Rcpp::XPtr ptr(ext_model_ptr); - std::vector params_i; - if (jac_adjust) { - return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); - } else { - return stan::model::log_prob_propto(*ptr.get(), upars, params_i, &Rcpp::Rcout); - } -} - -// [[Rcpp::export]] -Rcpp::NumericVector grad_log_prob(SEXP ext_model_ptr, std::vector upars, - bool jac_adjust) { - Rcpp::XPtr ptr(ext_model_ptr); - std::vector gradients; - std::vector params_i; - - double lp; - if (jac_adjust) { - lp = stan::model::log_prob_grad( - *ptr.get(), upars, params_i, gradients); - } else { - lp = stan::model::log_prob_grad( - *ptr.get(), upars, params_i, gradients); - } - Rcpp::NumericVector grad_rtn = Rcpp::wrap(gradients); - grad_rtn.attr("log_prob") = lp; - return grad_rtn; -} - -// [[Rcpp::export]] -size_t get_num_upars(SEXP ext_model_ptr) { - Rcpp::XPtr ptr(ext_model_ptr); - return ptr->num_params_r(); -} - -// [[Rcpp::export]] -Rcpp::List get_param_metadata(SEXP ext_model_ptr) { - Rcpp::XPtr ptr(ext_model_ptr); - std::vector param_names; - std::vector > param_dims; - ptr->get_param_names(param_names); - ptr->get_dims(param_dims); - - Rcpp::List param_metadata = Rcpp::List::create( - Rcpp::Named(param_names[0]) = param_dims[0] - ); - for (size_t i = 1; i < param_names.size(); i++) { - param_metadata.push_back(param_dims[i], param_names[i]); - } - - return param_metadata; -} - -// [[Rcpp::export]] -std::vector unconstrain_variables(SEXP ext_model_ptr, std::string init_path) { - Rcpp::XPtr ptr(ext_model_ptr); - std::vector params_i; - std::vector vars; - ptr->transform_inits(*var_context(init_path), params_i, vars, &Rcpp::Rcout); - return vars; -} - -// [[Rcpp::export]] -std::vector constrain_variables(SEXP ext_model_ptr, SEXP base_rng, - std::vector upars, - bool return_trans_pars, - bool return_gen_quants) { - Rcpp::XPtr ptr(ext_model_ptr); - Rcpp::XPtr rng(base_rng); - std::vector params_i; - std::vector vars; - - ptr->write_array(*rng.get(), upars, params_i, vars, return_trans_pars, return_gen_quants); - return vars; -} diff --git a/model.o b/model.o deleted file mode 100644 index 50c8be35f..000000000 --- a/model.o +++ /dev/null @@ -1 +0,0 @@ -Ï \ No newline at end of file diff --git a/tests/testthat/test-model-methods.R b/tests/testthat/test-model-methods.R index 80d4534f3..cd302f182 100644 --- a/tests/testthat/test-model-methods.R +++ b/tests/testthat/test-model-methods.R @@ -231,8 +231,8 @@ test_that("unconstrain_draws returns correct values", { } " mod <- cmdstan_model(write_stan_file(model_code), - force_recompile = TRUE, - compile_model_methods = TRUE) + compile_model_methods = TRUE, + force_recompile = TRUE) fit <- mod$sample(data = list(N = 0), chains = 1) x_draws <- fit$draws(format = "draws_df")$x @@ -263,8 +263,8 @@ test_that("unconstrain_draws returns correct values", { } " mod <- cmdstan_model(write_stan_file(model_code), - force_recompile = TRUE, - compile_model_methods = TRUE) + compile_model_methods = TRUE, + force_recompile = TRUE) fit <- mod$sample(data = list(N = 0), chains = 1) x_draws <- fit$draws(format = "draws_df")$x @@ -285,8 +285,7 @@ test_that("Model methods can be initialised for models with no data", { skip_if(os_is_wsl()) stan_file <- write_stan_file("parameters { real x; } model { x ~ std_normal(); }") - mod <- cmdstan_model(stan_file, force_recompile = TRUE, - compile_model_methods = TRUE) + mod <- cmdstan_model(stan_file, compile_model_methods = TRUE, force_recompile = TRUE) expect_no_error(fit <- mod$sample()) expect_equal(fit$log_prob(5), -12.5) }) @@ -308,12 +307,12 @@ test_that("Variable skeleton returns correct dimensions for matrices", { model { x_real ~ std_normal(); }") - mod <- cmdstan_model(stan_file, force_recompile = TRUE, - compile_model_methods = TRUE) + mod <- cmdstan_model(stan_file, compile_model_methods = TRUE, + force_recompile = TRUE) N <- 4 K <- 3 fit <- mod$sample(data = list(N = N, K = K), chains = 1, - iter_warmup = 5, iter_sampling = 5) + iter_warmup = 1, iter_sampling = 1) target_skeleton <- list( x_real = array(0, dim = 1), From 36c6fc49d5bff033139daa112cfaf58e701ba30a Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 10 Jan 2024 23:40:42 +0200 Subject: [PATCH 06/20] Doc ordering --- R/model.R | 4 ++-- R/utils.R | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/model.R b/R/model.R index 4e377abfa..41fc7d19f 100644 --- a/R/model.R +++ b/R/model.R @@ -405,6 +405,8 @@ CmdStanModel <- R6::R6Class( #' @param compile_model_methods (logical) Compile additional model methods #' (`log_prob()`, `grad_log_prob()`, `constrain_variables()`, #' `unconstrain_variables()`). +#' @param compile_hessian_method (logical) Deprecated and will be removed in a future release. +#' The hessian method is now compiled by default. #' @param compile_standalone (logical) Should functions in the Stan model be #' compiled for use in R? If `TRUE` the functions will be available via the #' `functions` field in the compiled model object. This can also be done after @@ -415,8 +417,6 @@ CmdStanModel <- R6::R6Class( #' #' @param threads Deprecated and will be removed in a future release. Please #' turn on threading via `cpp_options = list(stan_threads = TRUE)` instead. -#' @param compile_hessian_method (logical) Deprecated and will be removed in a future release. -#' The hessian method is now compiled by default. #' #' @return The `$compile()` method is called for its side effect of creating the #' executable and adding its path to the [`CmdStanModel`] object, but it also diff --git a/R/utils.R b/R/utils.R index edcf618b6..14456888f 100644 --- a/R/utils.R +++ b/R/utils.R @@ -783,11 +783,11 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) precomp_methods_file <- file.path(cmdstan_path(), "model_methods.o") if (file.exists(precomp_methods_file) && force_recompile) { unlink(precomp_methods_file) - model_methods_cpp <- system.file("include", "model_methods.cpp", - package = "cmdstanr", mustWork = TRUE) - source_file <- paste0(strip_ext(precomp_methods_file), ".cpp") - file.copy(model_methods_cpp, source_file, overwrite = TRUE) } + model_methods_cpp <- system.file("include", "model_methods.cpp", + package = "cmdstanr", mustWork = TRUE) + source_file <- paste0(strip_ext(precomp_methods_file), ".cpp") + file.copy(model_methods_cpp, source_file, overwrite = FALSE) model_obj_file <- env$obj_file_ if (!file.exists(model_obj_file)) { From 2e82aa82a4306f4c8943bc6f6507de6477cde531 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 12:50:28 +0200 Subject: [PATCH 07/20] Check errors --- R/fit.R | 1 + R/utils.R | 24 ++++++++++++++++-------- man/fit-method-init_model_methods.Rd | 2 ++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/R/fit.R b/R/fit.R index 3bf3efc8b..50ff905a1 100644 --- a/R/fit.R +++ b/R/fit.R @@ -322,6 +322,7 @@ CmdStanFit$set("public", name = "init", value = init) #' @param seed (integer) The random seed to use when initializing the model. #' @param verbose (logical) Whether to show verbose logging during compilation. #' @param hessian (logical) Whether to expose the (experimental) hessian method. +#' @param force_recompile (logical) Whether to recompile cached model methods. #' #' @examples #' \dontrun{ diff --git a/R/utils.R b/R/utils.R index 14456888f..a1d4963a2 100644 --- a/R/utils.R +++ b/R/utils.R @@ -769,14 +769,22 @@ rcpp_source_stan <- function(code, env, verbose = FALSE) { } initialize_method_functions <- function(env, so_name) { - env$model_ptr <- function(...) { .Call("model_ptr_", ..., so_name) } - env$log_prob <- function(...) { .Call("log_prob_", ..., so_name) } - env$grad_log_prob <- function(...) { .Call("grad_log_prob_", ..., so_name) } - env$hessian <- function(...) { .Call("hessian_", ..., so_name) } - env$get_num_upars <- function(...) { .Call("get_num_upars_", ..., so_name) } - env$get_param_metadata <- function(...) { .Call("get_param_metadata_", ..., so_name) } - env$unconstrain_variables <- function(...) { .Call("unconstrain_variables_", ..., so_name) } - env$constrain_variables <- function(...) { .Call("constrain_variables_", ..., so_name) } + env$model_ptr <- + function(...) { .Call("model_ptr_", ..., PACKAGE = so_name) } + env$log_prob <- + function(...) { .Call("log_prob_", ..., PACKAGE = so_name) } + env$grad_log_prob <- + function(...) { .Call("grad_log_prob_", ..., PACKAGE = so_name) } + env$hessian <- + function(...) { .Call("hessian_", ..., PACKAGE = so_name) } + env$get_num_upars <- + function(...) { .Call("get_num_upars_", ..., PACKAGE = so_name) } + env$get_param_metadata <- + function(...) { .Call("get_param_metadata_", ..., PACKAGE = so_name) } + env$unconstrain_variables <- + function(...) { .Call("unconstrain_variables_", ..., PACKAGE = so_name) } + env$constrain_variables <- + function(...) { .Call("constrain_variables_", ..., PACKAGE = so_name) } } expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) { diff --git a/man/fit-method-init_model_methods.Rd b/man/fit-method-init_model_methods.Rd index c0b0ac0b4..49d3b5467 100644 --- a/man/fit-method-init_model_methods.Rd +++ b/man/fit-method-init_model_methods.Rd @@ -19,6 +19,8 @@ init_model_methods( \item{verbose}{(logical) Whether to show verbose logging during compilation.} \item{hessian}{(logical) Whether to expose the (experimental) hessian method.} + +\item{force_recompile}{(logical) Whether to recompile cached model methods.} } \description{ The \verb{$init_model_methods()} method compiles and initializes the From 646618f5c69e6bf6bff59a33128bc4700a2f3975 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 12:51:56 +0200 Subject: [PATCH 08/20] NNull fix --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index a1d4963a2..47181e30d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -798,7 +798,7 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) file.copy(model_methods_cpp, source_file, overwrite = FALSE) model_obj_file <- env$obj_file_ - if (!file.exists(model_obj_file)) { + if (is.null(model_obj_file) || !file.exists(model_obj_file)) { if (rlang::is_interactive()) { message("Model object file not found, recompiling model...") } From cc9cde2ee9bbdf9dd1e1978fdf973d8877c90a25 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 13:51:50 +0200 Subject: [PATCH 09/20] Missed param_name methods --- R/utils.R | 4 ++++ inst/include/model_methods.cpp | 24 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/R/utils.R b/R/utils.R index 47181e30d..74c21fd6e 100644 --- a/R/utils.R +++ b/R/utils.R @@ -785,6 +785,10 @@ initialize_method_functions <- function(env, so_name) { function(...) { .Call("unconstrain_variables_", ..., PACKAGE = so_name) } env$constrain_variables <- function(...) { .Call("constrain_variables_", ..., PACKAGE = so_name) } + env$unconstrained_param_names <- + function(...) { .Call("unconstrained_param_names_", ..., PACKAGE = so_name) } + env$constrained_param_names <- + function(...) { .Call("constrained_param_names_", ..., PACKAGE = so_name) } } expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) { diff --git a/inst/include/model_methods.cpp b/inst/include/model_methods.cpp index 28605b5a2..4b4befea9 100644 --- a/inst/include/model_methods.cpp +++ b/inst/include/model_methods.cpp @@ -162,20 +162,28 @@ RcppExport SEXP constrain_variables_(SEXP ext_model_ptr, SEXP base_rng, END_RCPP } -// [[Rcpp::export]] -std::vector unconstrained_param_names(SEXP ext_model_ptr, bool return_trans_pars, bool return_gen_quants) { +RcppExport SEXP unconstrained_param_names_(SEXP ext_model_ptr, + SEXP return_trans_pars_, + SEXP return_gen_quants_) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); + bool return_trans_pars = Rcpp::as(return_trans_pars_); + bool return_gen_quants = Rcpp::as(return_gen_quants_); std::vector rtn_names; ptr->unconstrained_param_names(rtn_names, return_trans_pars, return_gen_quants); - return rtn_names; + return Rcpp::wrap(rtn_names); + END_RCPP } -// [[Rcpp::export]] -std::vector constrained_param_names(SEXP ext_model_ptr, - bool return_trans_pars, - bool return_gen_quants) { +RcppExport SEXP constrained_param_names_(SEXP ext_model_ptr, + SEXP return_trans_pars_, + SEXP return_gen_quants_) { + BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); + bool return_trans_pars = Rcpp::as(return_trans_pars_); + bool return_gen_quants = Rcpp::as(return_gen_quants_); std::vector rtn_names; ptr->constrained_param_names(rtn_names, return_trans_pars, return_gen_quants); - return rtn_names; + return Rcpp::wrap(rtn_names); + END_RCPP } From 284b6d50b3f17b2a910a03c280017e34c942f662 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 14:57:00 +0200 Subject: [PATCH 10/20] Make sure obj_file location not null --- R/fit.R | 3 +-- R/model.R | 5 +---- R/utils.R | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/R/fit.R b/R/fit.R index 50ff905a1..3580c6026 100644 --- a/R/fit.R +++ b/R/fit.R @@ -342,8 +342,7 @@ init_model_methods <- function(seed = 0, verbose = FALSE, hessian = FALSE, force require_suggested_package("Rcpp") require_suggested_package("RcppEigen") if (length(private$model_methods_env_$hpp_code_) == 0 && - (is.null(private$model_methods_env_$obj_file_) || - !file.exists(private$model_methods_env_$obj_file_))) { + !file.exists(private$model_methods_env_$obj_file_)) { stop("Model methods cannot be used with a pre-compiled Stan executable, ", "the model must be compiled again", call. = FALSE) } diff --git a/R/model.R b/R/model.R index 41fc7d19f..e82e5b12c 100644 --- a/R/model.R +++ b/R/model.R @@ -712,10 +712,7 @@ compile <- function(quiet = TRUE, file.remove(exe) } file.copy(tmp_exe, exe, overwrite = TRUE) - model_obj_file <- paste0(temp_file_no_ext, ".o") - if (file.exists(model_obj_file)) { - private$model_methods_env_$obj_file_ <- model_obj_file - } + private$model_methods_env_$obj_file_ <- paste0(temp_file_no_ext, ".o") if (os_is_wsl()) { res <- processx::run( command = "wsl", diff --git a/R/utils.R b/R/utils.R index 74c21fd6e..061bdaa59 100644 --- a/R/utils.R +++ b/R/utils.R @@ -802,7 +802,7 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) file.copy(model_methods_cpp, source_file, overwrite = FALSE) model_obj_file <- env$obj_file_ - if (is.null(model_obj_file) || !file.exists(model_obj_file)) { + if (!file.exists(model_obj_file)) { if (rlang::is_interactive()) { message("Model object file not found, recompiling model...") } From 03750ccc004f0b39ff012da3c96c57661e8890eb Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 19:34:29 +0200 Subject: [PATCH 11/20] ANother null check --- R/fit.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/fit.R b/R/fit.R index 3580c6026..f1bf4786c 100644 --- a/R/fit.R +++ b/R/fit.R @@ -341,8 +341,9 @@ init_model_methods <- function(seed = 0, verbose = FALSE, hessian = FALSE, force } require_suggested_package("Rcpp") require_suggested_package("RcppEigen") - if (length(private$model_methods_env_$hpp_code_) == 0 && - !file.exists(private$model_methods_env_$obj_file_)) { + if (length(private$model_methods_env_$hpp_code_) == 0 && ( + is.null(private$model_methods_env_$obj_file_) || + !file.exists(private$model_methods_env_$obj_file_))) { stop("Model methods cannot be used with a pre-compiled Stan executable, ", "the model must be compiled again", call. = FALSE) } From 99db640f302b889becf0bbc245f1c104c0332110 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 11 Jan 2024 22:31:05 +0200 Subject: [PATCH 12/20] Fix path on windows --- R/utils.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/utils.R b/R/utils.R index 061bdaa59..036e8c292 100644 --- a/R/utils.R +++ b/R/utils.R @@ -822,8 +822,8 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) with_cmdstan_flags( processx::run( command = file.path(R.home(component = "bin"), "R"), - args = c("CMD", "SHLIB", model_obj_file, precomp_methods_file, - "-o", methods_dll), + args = c("CMD", "SHLIB", repair_path(model_obj_file), repair_path(precomp_methods_file), + "-o", repair_path(methods_dll)), echo = verbose || is_verbose_mode(), echo_cmd = is_verbose_mode(), error_on_status = FALSE From 10d42cd8a43ed4c5344e7e4cf657abb9051f7ca8 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 12 Jan 2024 14:44:03 +0200 Subject: [PATCH 13/20] Fix windows DLL load error --- R/utils.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/utils.R b/R/utils.R index 036e8c292..f58173392 100644 --- a/R/utils.R +++ b/R/utils.R @@ -742,7 +742,7 @@ with_cmdstan_flags <- function(expr) { libs <- c("LDLIBS", "LIBSUNDIALS", "TBB_TARGETS", "LDFLAGS_TBB") libs <- paste(sapply(libs, get_cmdstan_flags), collapse = " ") if (.Platform$OS.type == "windows") { - libs <- paste(libs, "-fopenmp") + libs <- paste(libs, "-fopenmp -lstdc++") } lib_paths <- c("/stan/lib/stan_math/lib/tbb/", "/stan/lib/stan_math/lib/sundials_6.1.1/lib/") @@ -830,7 +830,7 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) ) ) - env$methods_dll_info <- dyn.load(methods_dll, local = TRUE, now = TRUE) + env$methods_dll_info <- with_cmdstan_flags(dyn.load(methods_dll, local = TRUE, now = TRUE)) initialize_method_functions(env, strip_ext(basename(methods_dll))) invisible(NULL) } From 5d2619029dedc521297eac6603439c09273a63da Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 12 Jan 2024 16:42:11 +0200 Subject: [PATCH 14/20] Missed WSL skip --- tests/testthat/test-model-methods.R | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/testthat/test-model-methods.R b/tests/testthat/test-model-methods.R index f6c40e113..7a088fbce 100644 --- a/tests/testthat/test-model-methods.R +++ b/tests/testthat/test-model-methods.R @@ -326,6 +326,7 @@ test_that("Variable skeleton returns correct dimensions for matrices", { }) test_that("Model object file can be recompiled if not found", { + skip_if(os_is_wsl()) mod <- cmdstan_model(testing_stan_file("bernoulli_log_lik"), force_recompile = TRUE) model_obj_file <- mod$.__enclos_env__$private$model_methods_env_$obj_file_ From 269f90ae3f0050f66d22cdd37979d1d6693a56aa Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sun, 21 Jan 2024 16:15:47 +0200 Subject: [PATCH 15/20] Fixes for master --- R/utils.R | 1 - inst/include/model_methods.cpp | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/R/utils.R b/R/utils.R index 44b503870..dd9087e66 100644 --- a/R/utils.R +++ b/R/utils.R @@ -735,7 +735,6 @@ with_cmdstan_flags <- function(expr) { r_includes <- paste( paste0("-I", shQuote(system.file("include", package = "Rcpp", mustWork = TRUE))), - paste0("-I", shQuote(system.file("include", package = "RcppEigen", mustWork = TRUE))), paste0("-I", shQuote(R.home(component = "include"))) ) diff --git a/inst/include/model_methods.cpp b/inst/include/model_methods.cpp index 233eab15c..0f4c97195 100644 --- a/inst/include/model_methods.cpp +++ b/inst/include/model_methods.cpp @@ -8,7 +8,7 @@ #include #include #endif - +#include #include stan::model::model_base& @@ -50,7 +50,7 @@ RcppExport SEXP log_prob_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) { BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); double rtn; - Eigen::VectorXd upars = Rcpp::as>(upars_); + Eigen::VectorXd upars = Rcpp::as(upars_); if (Rcpp::as(jacobian_)) { rtn = stan::model::log_prob_propto(*ptr.get(), upars, &Rcpp::Rcout); } else { @@ -83,7 +83,7 @@ RcppExport SEXP grad_log_prob_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) RcppExport SEXP hessian_(SEXP ext_model_ptr, SEXP upars_, SEXP jacobian_) { BEGIN_RCPP Rcpp::XPtr ptr(ext_model_ptr); - Eigen::Map upars = Rcpp::as>(upars_); + Eigen::VectorXd upars = Rcpp::as(upars_); auto hessian_functor = [&](auto&& x) { if (Rcpp::as(jacobian_)) { From 733e052f763e8d592486557fcbd15638a00ac10e Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 23 Jan 2024 23:31:52 +0200 Subject: [PATCH 16/20] Alternate windows approach --- R/utils.R | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/R/utils.R b/R/utils.R index 881d9549c..6ef64e2f6 100644 --- a/R/utils.R +++ b/R/utils.R @@ -740,25 +740,30 @@ with_cmdstan_flags <- function(expr) { libs <- c("LDLIBS", "LIBSUNDIALS", "TBB_TARGETS", "LDFLAGS_TBB") libs <- paste(sapply(libs, get_cmdstan_flags), collapse = " ") - if (.Platform$OS.type == "windows") { + if (os_is_windows()) { libs <- paste(libs, "-fopenmp -lstdc++") } lib_paths <- c("/stan/lib/stan_math/lib/tbb/", "/stan/lib/stan_math/lib/sundials_6.1.1/lib/") + new_makevars <- c( + PKG_CPPFLAGS = ifelse(cmdstan_version() <= "2.30.1", "-DCMDSTAN_JSON", ""), + PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, collapse = " "), + PKG_LIBS = libs + ) + if (os_is_windows()) { + new_makevars <- c( + new_makevars, + SHLIB_LD = paste0(rtools4x_toolchain_path(),"/gcc"), + LOCAL_CPPFLAGS = paste0("-L'",rtools4x_toolchain_path(),"/../include'"), + LOCAL_LIBS = paste0("-L'",rtools4x_toolchain_path(),"/../lib'") + ) + } withr::with_path( c( paste0(cmdstan_path(), lib_paths), toolchain_PATH_env_var() ), - withr::with_makevars( - c( - USE_CXX14 = 1, - PKG_CPPFLAGS = ifelse(cmdstan_version() <= "2.30.1", "-DCMDSTAN_JSON", ""), - PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, collapse = " "), - PKG_LIBS = libs - ), - expr - ) + withr::with_makevars(new_makevars, expr) ) } @@ -818,11 +823,16 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) } methods_dll <- tempfile(fileext = .Platform$dynlib.ext) + envvar <- c("current") + if (os_is_windows()) { + envvar <- c(envvar, "BINPREF" = paste0(rtools4x_toolchain_path(), "/")) + } with_cmdstan_flags( processx::run( command = file.path(R.home(component = "bin"), "R"), args = c("CMD", "SHLIB", repair_path(model_obj_file), repair_path(precomp_methods_file), "-o", repair_path(methods_dll)), + env = envvar, echo = verbose || is_verbose_mode(), echo_cmd = is_verbose_mode(), error_on_status = FALSE From ac2e4e73cf68c14ccd66ef2b63be5a908409a193 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 24 Jan 2024 08:36:24 +0200 Subject: [PATCH 17/20] Envvar --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 6ef64e2f6..492964235 100644 --- a/R/utils.R +++ b/R/utils.R @@ -823,7 +823,7 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) } methods_dll <- tempfile(fileext = .Platform$dynlib.ext) - envvar <- c("current") + envvar <- c("current", "CXXFLAGS"="-fPIC") if (os_is_windows()) { envvar <- c(envvar, "BINPREF" = paste0(rtools4x_toolchain_path(), "/")) } From 5d28948934dc9219d6bdf3bba40056d6692e3255 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 24 Jan 2024 08:41:02 +0200 Subject: [PATCH 18/20] Wrong windows include --- R/utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils.R b/R/utils.R index 492964235..dcdc3d3e2 100644 --- a/R/utils.R +++ b/R/utils.R @@ -754,7 +754,7 @@ with_cmdstan_flags <- function(expr) { new_makevars <- c( new_makevars, SHLIB_LD = paste0(rtools4x_toolchain_path(),"/gcc"), - LOCAL_CPPFLAGS = paste0("-L'",rtools4x_toolchain_path(),"/../include'"), + LOCAL_CPPFLAGS = paste0("-I'",rtools4x_toolchain_path(),"/../include'"), LOCAL_LIBS = paste0("-L'",rtools4x_toolchain_path(),"/../lib'") ) } From c06751837906dcf7e394ff460f3f7734073aa397 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 24 Jan 2024 09:42:43 +0200 Subject: [PATCH 19/20] Only add flags for model methods --- R/utils.R | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/R/utils.R b/R/utils.R index dcdc3d3e2..fcf82d521 100644 --- a/R/utils.R +++ b/R/utils.R @@ -728,10 +728,10 @@ get_cmdstan_flags <- function(flag_name) { paste(flags, collapse = " ") } -with_cmdstan_flags <- function(expr) { +with_cmdstan_flags <- function(expr, model_methods = FALSE) { cxxflags <- get_cmdstan_flags("CXXFLAGS") cmdstanr_includes <- system.file("include", package = "cmdstanr", mustWork = TRUE) - cmdstanr_includes <- paste0(" -I\"", cmdstanr_includes,"\"") + cmdstanr_includes <- paste0("-I", shQuote(cmdstanr_includes)) r_includes <- paste( paste0("-I", shQuote(system.file("include", package = "Rcpp", mustWork = TRUE))), @@ -741,7 +741,7 @@ with_cmdstan_flags <- function(expr) { libs <- c("LDLIBS", "LIBSUNDIALS", "TBB_TARGETS", "LDFLAGS_TBB") libs <- paste(sapply(libs, get_cmdstan_flags), collapse = " ") if (os_is_windows()) { - libs <- paste(libs, "-fopenmp -lstdc++") + libs <- paste(libs, "-fopenmp") } lib_paths <- c("/stan/lib/stan_math/lib/tbb/", "/stan/lib/stan_math/lib/sundials_6.1.1/lib/") @@ -750,12 +750,13 @@ with_cmdstan_flags <- function(expr) { PKG_CXXFLAGS = paste(cxxflags, cmdstanr_includes, r_includes, collapse = " "), PKG_LIBS = libs ) - if (os_is_windows()) { + if (os_is_windows() && model_methods) { new_makevars <- c( new_makevars, SHLIB_LD = paste0(rtools4x_toolchain_path(),"/gcc"), LOCAL_CPPFLAGS = paste0("-I'",rtools4x_toolchain_path(),"/../include'"), - LOCAL_LIBS = paste0("-L'",rtools4x_toolchain_path(),"/../lib'") + LOCAL_LIBS = paste0("-L'",rtools4x_toolchain_path(),"/../lib' -lstdc++"), + BINPREF = paste0(rtools4x_toolchain_path(), "/") ) } withr::with_path( @@ -823,20 +824,16 @@ expose_model_methods <- function(env, force_recompile = FALSE, verbose = FALSE) } methods_dll <- tempfile(fileext = .Platform$dynlib.ext) - envvar <- c("current", "CXXFLAGS"="-fPIC") - if (os_is_windows()) { - envvar <- c(envvar, "BINPREF" = paste0(rtools4x_toolchain_path(), "/")) - } with_cmdstan_flags( processx::run( command = file.path(R.home(component = "bin"), "R"), args = c("CMD", "SHLIB", repair_path(model_obj_file), repair_path(precomp_methods_file), "-o", repair_path(methods_dll)), - env = envvar, echo = verbose || is_verbose_mode(), echo_cmd = is_verbose_mode(), error_on_status = FALSE - ) + ), + model_methods = TRUE ) env$methods_dll_info <- with_cmdstan_flags(dyn.load(methods_dll, local = TRUE, now = TRUE)) From c23f522130dd1895be03e56f1da21f14de907767 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 24 Jan 2024 12:17:32 +0200 Subject: [PATCH 20/20] fPIC flag --- R/model.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/model.R b/R/model.R index da746b4a2..d9acc20cb 100644 --- a/R/model.R +++ b/R/model.R @@ -662,6 +662,7 @@ compile <- function(quiet = TRUE, cpp_options_to_compile_flags(c(cpp_options, list("KEEP_OBJECT"="true"))), stancflags_val), wd = cmdstan_path(), + env = c("current", "CXXFLAGS" = "-fPIC"), echo = !quiet || is_verbose_mode(), echo_cmd = is_verbose_mode(), spinner = quiet && rlang::is_interactive() && !identical(Sys.getenv("IN_PKGDOWN"), "true"),