backend_diagnostics() reports the numbers used to judge whether a fit
can be trusted, in the same shape for both backends (#40): R-hat and bulk and
tail ESS per parameter (computed by 'posterior'), and divergent transitions,
max treedepth hits, and E-BFMI per chain (using rstan's and cmdstanr's own
definitions). It applies no thresholds and signals no warnings; deciding what
counts as a failed fit is left to the host package. Needs 'posterior'.NA, with the backend formula
clarified in the documentation.diagnostic_summary()
(cmdstanr >= 0.5.0) and rstan's get_bfmi(), with narrow adapters for per-chain
rstan counts and undefined energy. Backend availability is checked before
reading a fit, and the posterior dependency is checked before pars.backend_extract() now states its return shape as a contract rather than
leaving it to the backend (#34). pars defaults to NULL, which extracts
every parameter, and a new format argument picks the representation:
"list" (the default) is rstan::extract()-compatible, "draws" returns a
posterior draws array with the chain structure intact, and "matrix"
returns a plain draws x variables matrix -- the shape
backend_generate_quantities() takes as draws_mat. Each format has the same
shape whichever backend produced the fit, so downstream code no longer has to
branch on the backend. Existing calls are unaffected: format defaults to the
shape backend_extract() already returned.rstan::extract() returns a 1-D array of length S for a
scalar in every call form. Code that reshapes off dim() (aperm() errors
outright on a dimensionless vector) therefore behaved differently depending on
which backend produced the fit. The cmdstanr path now matches rstan. A
vector[1] is still kept as an S x 1 matrix on both backends, as rstan does.stan_options(threading = TRUE) turns on scheduler-aware threading (ported
from hestia): flexstanr splits the cores the process is allowed to use --
detected with parallelly::availableCores(), respecting HPC schedulers and
cgroup quotas -- between chain-parallelism and within-chain (reduce_sum)
threads, using all available cores by default (cap with max_cores), and
reports what it chose. fit_model() applies the split per
backend, compiling the cmdstanr model with threading enabled when needed. The
new exported test_threaded() lets a host package's fit function warn when
its model cannot use the offered threads. See the new "Parallel and threaded
fitting" vignette.Imports to Suggests, so flexstanr installs and loads without either
package; selecting a backend whose package is not installed fails with an
actionable error, and an attach-time message points the way when neither is
present. Install whichever backend you use (#30).use_flexstanr() now generates the host package's re-export file (with a
do-not-edit banner) in addition to editing its DESCRIPTION, and its
signature mirrors usethis::use_package() (min_version, remote). It wires
in flexstanr only; pick and declare a backend (rstan or cmdstanr) yourself.Initial release: a portable Stan-backend layer that a Stan-based R package can fit its models through, using either rstan (default) or, optionally, cmdstanr.
stan_options() collects and validates sampler options for the chosen
backend, forwarding them verbatim and guarding against mixing one backend's
argument vocabulary into the other.fit_model() dispatches a fit to the backend recorded on the options and
resolves the calling package's compiled model automatically.backend_draws_array(), backend_extract(),
backend_generate_quantities(), and backend_has_draws().use_flexstanr() wires flexstanr into a host package's DESCRIPTION.requireNamespace()
guards; rstan is the default and only hard Stan dependency.