vignettes/cmdstanr-internals.Rmd
cmdstanr-internals.Rmd
This vignette is intended to be read after the Getting started with CmdStanR vignette. Please read that first for important background. In this document we provide additional details about compiling models, passing in data, and how CmdStan output is saved and read back into R.
We will only use the $sample()
method in examples, but all model fitting methods work in a similar way under the hood.
library(cmdstanr)
The cmdstan_model()
function creates a new CmdStanModel
object. The CmdStanModel
object stores the path to a Stan program as well as the path to a compiled executable:
stan_file <- file.path(cmdstan_path(), "examples", "bernoulli", "bernoulli.stan") mod <- cmdstan_model(stan_file)
Compiling Stan program...
mod$print()
data {
int<lower=0> N;
int<lower=0,upper=1> y[N];
}
parameters {
real<lower=0,upper=1> theta;
}
model {
theta ~ beta(1,1); // uniform prior on interval 0,1
y ~ bernoulli(theta);
}
mod$stan_file()
[1] "/Users/jgabry/.cmdstanr/cmdstan-2.25.0/examples/bernoulli/bernoulli.stan"
mod$exe_file()
[1] "/Users/jgabry/.cmdstanr/cmdstan-2.25.0/examples/bernoulli/bernoulli"
Subsequently, if you create a CmdStanModel
object from the same Stan file then compilation will be skipped (assuming the file hasn’t changed):
mod <- cmdstan_model(stan_file)
Model executable is up to date!
Internally, cmdstan_model()
first creates the CmdStanModel
object from just the Stan file and then calls its $compile()
method. Optional arguments to the $compile()
method can be passed via ...
, for example:
mod <- cmdstan_model( stan_file, force_recompile = TRUE, include_paths = "paths/to/directories/with/included/files", cpp_options = list(stan_threads = TRUE, STANC2 = TRUE) )
It is also possible to delay compilation when creating the CmdStanModel
object by specifying compile=FALSE
. You can later call the $compile()
method directly:
unlink(mod$exe_file()) mod <- cmdstan_model(stan_file, compile = FALSE) mod$exe_file() # not yet created
character(0)
mod$compile()
Compiling Stan program...
mod$exe_file()
[1] "/Users/jgabry/.cmdstanr/cmdstan-2.25.0/examples/bernoulli/bernoulli"
If you are using CmdStan version 2.24 or later and CmdStanR version 0.2.1 or later, you can run a pedantic check for your model. CmdStanR will always check that your Stan program does not contain any invalid syntax but with pedantic mode enabled the check will also warn you about other potential issues in your model, for example:
~
symbols).Pedantic mode is available when compiling the model or when using the separate $check_syntax()
method of a CmdStanModel
object. Internally this corresponds to setting the stanc
(Stan transpiler) option warn-pedantic
. Here we demonstrate pedantic mode with a Stan program that is syntactically correct but is missing a lower bound and a prior for a parameter.
stan_file_pedantic <- write_stan_file(" data { int N; int y[N]; } parameters { // should have <lower=0> but omitting to demonstrate pedantic mode real lambda; } model { y ~ poisson(lambda); } ")
To turn on pedantic mode at compile time you can set pedantic=TRUE
in the call to cmdstan_model()
(or when calling the $compile()
method directly if using the delayed compilation approach described above).
mod_pedantic <- cmdstan_model(stan_file_pedantic, pedantic = TRUE) Compiling Stan program... Warning: The parameter lambda has no priors. Warning at '/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da50fdf88f.stan', line 11, column 14 to column 20: A poisson distribution is given parameter lambda as a rate parameter (argument 1), but lambda was not constrained to be strictly positive.
To turn on pedantic mode separately from compilation use the pedantic
argument to the $check_syntax()
method.
mod_pedantic$check_syntax(pedantic = TRUE) Warning: The parameter lambda has no priors. Warning at '/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/file34da6f12ccb5.stan', line 11, column 14 to column 20: A poisson distribution is given parameter lambda as a rate parameter (argument 1), but lambda was not constrained to be strictly positive. Stan program is syntactically correct
Using pedantic=TRUE
via the $check_syntax()
method also has the advantage that it can be used even if the model hasn’t been compiled yet. This can be helpful because the pedantic and syntax checks themselves are much faster than compilation.
file.remove(mod_pedantic$exe_file()) # delete compiled executable [1] TRUE rm(mod_pedantic) mod_pedantic <- cmdstan_model(stan_file_pedantic, compile = FALSE) mod_pedantic$check_syntax(pedantic = TRUE) Warning: The parameter lambda has no priors. Warning at '/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/file34da6f12ccb5.stan', line 11, column 14 to column 20: A poisson distribution is given parameter lambda as a rate parameter (argument 1), but lambda was not constrained to be strictly positive. Stan program is syntactically correct
By default, the executable is created in the same directory as the file containing the Stan program. You can also specify a different location with the dir
argument:
mod <- cmdstan_model(stan_file, dir = "path/to/directory/for/executable")
There are three data formats that CmdStanR allows when fitting a model:
Like the RStan interface, CmdStanR accepts a named list of R objects where the names correspond to variables declared in the data
block of the Stan program. In the Bernoulli model the data is N
, the number of data points, and y
an integer array of observations.
mod$print()
data {
int<lower=0> N;
int<lower=0,upper=1> y[N];
}
parameters {
real<lower=0,upper=1> theta;
}
model {
theta ~ beta(1,1); // uniform prior on interval 0,1
y ~ bernoulli(theta);
}
# data block has 'N' and 'y' data_list <- list(N = 10, y = c(0,1,0,0,0,0,0,0,0,1)) fit <- mod$sample(data = data_list)
Because CmdStan doesn’t accept lists of R objects, CmdStanR will first write the data to a temporary JSON file using write_stan_json()
. This happens internally, but it is also possible to call write_stan_json()
directly:
data_list <- list(N = 10, y = c(0,1,0,0,0,0,0,0,0,1)) json_file <- tempfile(fileext = ".json") write_stan_json(data_list, json_file) cat(readLines(json_file), sep = "\n")
{
"N": 10,
"y": [0, 1, 0, 0, 0, 0, 0, 0, 0, 1]
}
If you already have your data in a JSON file you can just pass that file directly to CmdStanR instead of using a list of R objects. For example, we could pass in the JSON file we created above using write_stan_json()
:
fit <- mod$sample(data = json_file)
Finally, it is also possible to use the R dump file format. This is not recommended because CmdStan can process JSON faster than R dump, but CmdStanR allows it because CmdStan will accept files created by rstan::stan_rdump()
:
When fitting a model, the default behavior is to write the output from CmdStan to CSV files in a temporary directory:
fit$output_files()
[1] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-1-34baed.csv"
[2] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-2-34baed.csv"
[3] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-3-34baed.csv"
[4] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-4-34baed.csv"
These files will be lost if you end your R session or if you remove the fit
object and force (or wait for) garbage collection.
files <- fit$output_files() file.exists(files)
[1] TRUE TRUE TRUE TRUE
used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
Ncells 830780 44.4 1339817 71.6 NA 1339817 71.6
Vcells 1540850 11.8 8388608 64.0 16384 2443368 18.7
file.exists(files)
[1] FALSE FALSE FALSE FALSE
To save these files to a non-temporary location there are two options. You can either specify the output_dir
argument to mod$sample()
or use fit$save_output_files()
after fitting the model:
# see ?save_output_files for info on optional arguments fit$save_output_files(dir = "path/to/directory")
fit <- mod$sample( data = data_list, output_dir = "path/to/directory" )
With the exception of some diagnostic information, the CSV files are not read into R until their contents are requested by calling a method that requires them (e.g., fit$draws()
, fit$summary()
, etc.). If we examine the structure of the fit
object, notice how the Private
slot draws_
is NULL
, indicating that the CSV files haven’t yet been read into R:
str(fit)
Classes 'CmdStanMCMC', 'CmdStanFit', 'R6' <CmdStanMCMC>
Inherits from: <CmdStanFit>
Public:
clone: function (deep = FALSE)
cmdstan_diagnose: function ()
cmdstan_summary: function (flags = NULL)
data_file: function ()
draws: function (variables = NULL, inc_warmup = FALSE)
init: function ()
initialize: function (runset)
inv_metric: function (matrix = TRUE)
latent_dynamics_files: function (include_failed = FALSE)
loo: function (variables = "log_lik", r_eff = TRUE, ...)
lp: function ()
metadata: function ()
num_chains: function ()
num_procs: function ()
output: function (id = NULL)
output_files: function (include_failed = FALSE)
print: function (variables = NULL, ..., digits = 2, max_rows = 10)
return_codes: function ()
runset: CmdStanRun, R6
sampler_diagnostics: function (inc_warmup = FALSE)
save_data_file: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
save_latent_dynamics_files: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
save_object: function (file, ...)
save_output_files: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
summary: function (variables = NULL, ...)
time: function ()
Private:
draws_: NULL
init_: NULL
inv_metric_: NULL
metadata_: list
read_csv_: function (variables = NULL, sampler_diagnostics = NULL)
sampler_diagnostics_: NULL
warmup_draws_: NULL
warmup_sampler_diagnostics_: NULL
After we call a method that requires the draws then if we reexamine the structure of the object we will see that the draws_
slot in Private
is no longer empty:
Classes 'CmdStanMCMC', 'CmdStanFit', 'R6' <CmdStanMCMC>
Inherits from: <CmdStanFit>
Public:
clone: function (deep = FALSE)
cmdstan_diagnose: function ()
cmdstan_summary: function (flags = NULL)
data_file: function ()
draws: function (variables = NULL, inc_warmup = FALSE)
init: function ()
initialize: function (runset)
inv_metric: function (matrix = TRUE)
latent_dynamics_files: function (include_failed = FALSE)
loo: function (variables = "log_lik", r_eff = TRUE, ...)
lp: function ()
metadata: function ()
num_chains: function ()
num_procs: function ()
output: function (id = NULL)
output_files: function (include_failed = FALSE)
print: function (variables = NULL, ..., digits = 2, max_rows = 10)
return_codes: function ()
runset: CmdStanRun, R6
sampler_diagnostics: function (inc_warmup = FALSE)
save_data_file: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
save_latent_dynamics_files: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
save_object: function (file, ...)
save_output_files: function (dir = ".", basename = NULL, timestamp = TRUE, random = TRUE)
summary: function (variables = NULL, ...)
time: function ()
Private:
draws_: -7.52422 -9.11823 -8.53862 -6.81816 -6.9535 -8.32874 -7. ...
init_: NULL
inv_metric_: list
metadata_: list
read_csv_: function (variables = NULL, sampler_diagnostics = NULL)
sampler_diagnostics_: NULL
warmup_draws_: NULL
warmup_sampler_diagnostics_: NULL
For models with many parameters, transformed parameters, or generated quantities, if only some are requested (e.g., by specifying the variables
argument to fit$draws()
) then CmdStanR will only read in the requested variables (unless they have already been read in).
Internally, the read_cmdstan_csv()
function is used to read the CmdStan CSV files into R. This function is exposed to users, so you can also call it directly:
# see ?read_cmdstan_csv for info on optional arguments controlling # what information is read in csv_contents <- read_cmdstan_csv(fit$output_files()) str(csv_contents)
List of 7
$ metadata :List of 33
..$ stan_version_major : num 2
..$ stan_version_minor : num 25
..$ stan_version_patch : num 0
..$ method : chr "sample"
..$ save_warmup : num 0
..$ thin : num 1
..$ gamma : num 0.05
..$ kappa : num 0.75
..$ t0 : num 10
..$ init_buffer : num 75
..$ term_buffer : num 50
..$ window : num 25
..$ algorithm : chr "hmc"
..$ engine : chr "nuts"
..$ metric : chr "diag_e"
..$ stepsize_jitter : num 0
..$ id : num [1:4] 1 2 3 4
..$ init : num [1:4] 2 2 2 2
..$ seed : num [1:4] 1.23e+09 1.35e+09 6.17e+08 1.43e+09
..$ refresh : num 100
..$ sig_figs : num -1
..$ sampler_diagnostics : chr [1:6] "accept_stat__" "stepsize__" "treedepth__" "n_leapfrog__" ...
..$ model_params : chr [1:2] "lp__" "theta"
..$ step_size_adaptation: num [1:4] 1.09 0.841 0.927 0.874
..$ model_name : chr "bernoulli_model"
..$ adapt_engaged : num 1
..$ adapt_delta : num 0.8
..$ max_treedepth : num 10
..$ step_size : num [1:4] 1 1 1 1
..$ iter_warmup : num 1000
..$ iter_sampling : num 1000
..$ stan_variable_dims :List of 2
.. ..$ lp__ : num 1
.. ..$ theta: num 1
..$ stan_variables : chr [1:2] "lp__" "theta"
$ inv_metric :List of 4
..$ 1: num 0.411
..$ 2: num 0.582
..$ 3: num 0.437
..$ 4: num 0.483
$ step_size :List of 4
..$ 1: num 1.09
..$ 2: num 0.841
..$ 3: num 0.927
..$ 4: num 0.874
$ warmup_draws : NULL
$ post_warmup_draws : 'draws_array' num [1:1000, 1:4, 1:2] -7.52 -9.12 -8.54 -6.82 -6.95 ...
..- attr(*, "dimnames")=List of 3
.. ..$ iteration: chr [1:1000] "1" "2" "3" "4" ...
.. ..$ chain : chr [1:4] "1" "2" "3" "4"
.. ..$ variable : chr [1:2] "lp__" "theta"
$ warmup_sampler_diagnostics : NULL
$ post_warmup_sampler_diagnostics: 'draws_array' num [1:1000, 1:4, 1:6] 0.925 0.823 1 1 0.969 ...
..- attr(*, "dimnames")=List of 3
.. ..$ iteration: chr [1:1000] "1" "2" "3" "4" ...
.. ..$ chain : chr [1:4] "1" "2" "3" "4"
.. ..$ variable : chr [1:6] "accept_stat__" "stepsize__" "treedepth__" "n_leapfrog__" ...
If save_latent_dynamics
is set to TRUE
when running the $sample()
method then additional CSV files are created (one per chain) that provide access to quantities used under the hood by Stan’s implementation of dynamic Hamiltonian Monte Carlo.
CmdStanR does not yet provide a special method for processing these files but they can be read into R using R’s standard CSV reading functions:
fit <- mod$sample(data = data_list, save_latent_dynamics = TRUE)
fit$latent_dynamics_files()
[1] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-diagnostic-202012171340-1-33b8ec.csv"
[2] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-diagnostic-202012171340-2-33b8ec.csv"
[3] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-diagnostic-202012171340-3-33b8ec.csv"
[4] "/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-diagnostic-202012171340-4-33b8ec.csv"
# read one of the files in x <- utils::read.csv(fit$latent_dynamics_files()[1], comment.char = "#") head(x)
lp__ accept_stat__ stepsize__ treedepth__ n_leapfrog__ divergent__
1 -7.86236 0.603036 0.987064 2 3 0
2 -7.12202 1.000000 0.987064 1 1 0
3 -7.12202 0.330321 0.987064 1 1 0
4 -6.77903 1.000000 0.987064 1 3 0
5 -7.40531 0.811543 0.987064 1 3 0
6 -6.95963 0.986487 0.987064 1 3 0
energy__ theta p_theta g_theta
1 9.22511 -0.165477 2.36755 2.504700
2 7.65762 -0.545627 -1.48427 1.402550
3 9.20892 -0.545627 -2.92983 1.402550
4 7.02219 -0.934776 -1.00008 0.383482
5 7.83726 -1.922470 -1.33294 -1.468960
6 7.32140 -1.549900 -1.21986 -0.898786
The column lp__
is also provided via fit$draws()
, and the columns accept_stat__
, stepsize__
, treedepth__
, n_leapfrog__
, divergent__
, and energy__
are also provided by fit$sampler_diagnostics()
, but there are several columns unique to the latent dynamics file:
theta p_theta g_theta
1 -0.165477 2.36755 2.504700
2 -0.545627 -1.48427 1.402550
3 -0.545627 -2.92983 1.402550
4 -0.934776 -1.00008 0.383482
5 -1.922470 -1.33294 -1.468960
6 -1.549900 -1.21986 -0.898786
Our model has a single parameter theta
and the three columns above correspond to theta
in the unconstrained space (theta
on the constrained space is accessed via fit$draws()
), the auxiliary momentum p_theta
, and the gradient g_theta
. In general, each of these three columns will exist for every parameter in the model.
As described above, the contents of the CSV files are only read into R when they are needed. This means that in order to save a fitted model object containing all of the posterior draws and sampler diagnostics you should either make sure to call fit$draws()
and fit$sampler_diagnostics()
before saving the object fit
, or use the special $save_object()
method provided by CmdStanR, which will ensure that everything has been read into R before saving the object using saveRDS()
:
temp_rds_file <- tempfile(fileext = ".RDS") # temporary file just for demonstration fit$save_object(file = temp_rds_file)
We can check that this worked by removing fit
and loading it back in from the save file:
used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
Ncells 846633 45.3 1339817 71.6 NA 1339817 71.6
Vcells 1640837 12.6 8388608 64.0 16384 3011182 23.0
# A tibble: 2 x 10
variable mean median sd mad q5 q95 rhat ess_bulk ess_tail
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 lp__ -7.28 -6.99 0.758 0.333 -8.85 -6.75 1.00 1753. 1889.
2 theta 0.251 0.238 0.121 0.123 0.0784 0.473 1.00 1381. 1459.
CmdStanR can of course be used for developing other packages that require compiling and running Stan models as well as using new or custom Stan features available through CmdStan.
When developing or testing new features it might be useful to have more information on how CmdStan is called internally and to see more information printed when compiling or running models. This can be enabled for an entire R session by setting the option "cmdstanr_verbose"
to TRUE
.
options("cmdstanr_verbose"=TRUE) mod <- cmdstan_model(stan_file, force_recompile = TRUE)
Compiling Stan program...
Running make \
/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7 \
"STANCFLAGS += --name='bernoulli_model'"
--- Translating Stan model to C++ code ---
bin/stanc --name='bernoulli_model' --o=/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.hpp /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.stan
--- Compiling, linking C++ code ---
clang++ -std=c++1y -Wno-unknown-warning-option -Wno-tautological-compare -Wno-sign-compare -D_REENTRANT -Wno-ignored-attributes -I stan/lib/stan_math/lib/tbb_2019_U8/include -O3 -I src -I stan/src -I lib/rapidjson_1.1.0/ -I stan/lib/stan_math/ -I stan/lib/stan_math/lib/eigen_3.3.7 -I stan/lib/stan_math/lib/boost_1.72.0 -I stan/lib/stan_math/lib/sundials_5.2.0/include -DBOOST_DISABLE_ASSERTS -c -include-pch stan/src/stan/model/model_header.hpp.gch -x c++ -o /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.o /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.hpp
clang++ -std=c++1y -Wno-unknown-warning-option -Wno-tautological-compare -Wno-sign-compare -D_REENTRANT -Wno-ignored-attributes -I stan/lib/stan_math/lib/tbb_2019_U8/include -O3 -I src -I stan/src -I lib/rapidjson_1.1.0/ -I stan/lib/stan_math/ -I stan/lib/stan_math/lib/eigen_3.3.7 -I stan/lib/stan_math/lib/boost_1.72.0 -I stan/lib/stan_math/lib/sundials_5.2.0/include -DBOOST_DISABLE_ASSERTS -Wl,-L,"/Users/jgabry/.cmdstanr/cmdstan-2.25.0/stan/lib/stan_math/lib/tbb" -Wl,-rpath,"/Users/jgabry/.cmdstanr/cmdstan-2.25.0/stan/lib/stan_math/lib/tbb" /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.o src/cmdstan/main.o stan/lib/stan_math/lib/sundials_5.2.0/lib/libsundials_nvecserial.a stan/lib/stan_math/lib/sundials_5.2.0/lib/libsundials_cvodes.a stan/lib/stan_math/lib/sundials_5.2.0/lib/libsundials_idas.a stan/lib/stan_math/lib/sundials_5.2.0/lib/libsundials_kinsol.a stan/lib/stan_math/lib/tbb/libtbb.dylib stan/lib/stan_math/lib/tbb/libtbbmalloc.dylib stan/lib/stan_math/lib/tbb/libtbbmalloc_proxy.dylib -o /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7
rm -f /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/model-34da6df292c7.o
fit <- mod$sample( data = data_list, chains = 1, iter_warmup = 100, iter_sampling = 100 )
Running MCMC with 1 chain...
Running ./bernoulli 'id=1' random 'seed=1610984816' data \
'file=/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/standata-34da50827f35.json' \
output \
'file=/var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-1-88a07d.csv' \
'method=sample' 'num_samples=100' 'num_warmup=100' 'save_warmup=0' \
'algorithm=hmc' 'engine=nuts' adapt 'engaged=1'
Chain 1 method = sample (Default)
Chain 1 sample
Chain 1 num_samples = 100
Chain 1 num_warmup = 100
Chain 1 save_warmup = 0 (Default)
Chain 1 thin = 1 (Default)
Chain 1 adapt
Chain 1 engaged = 1 (Default)
Chain 1 gamma = 0.050000000000000003 (Default)
Chain 1 delta = 0.80000000000000004 (Default)
Chain 1 kappa = 0.75 (Default)
Chain 1 t0 = 10 (Default)
Chain 1 init_buffer = 75 (Default)
Chain 1 term_buffer = 50 (Default)
Chain 1 window = 25 (Default)
Chain 1 algorithm = hmc (Default)
Chain 1 hmc
Chain 1 engine = nuts (Default)
Chain 1 nuts
Chain 1 max_depth = 10 (Default)
Chain 1 metric = diag_e (Default)
Chain 1 metric_file = (Default)
Chain 1 stepsize = 1 (Default)
Chain 1 stepsize_jitter = 0 (Default)
Chain 1 id = 1
Chain 1 data
Chain 1 file = /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/standata-34da50827f35.json
Chain 1 init = 2 (Default)
Chain 1 random
Chain 1 seed = 1610984816
Chain 1 output
Chain 1 file = /var/folders/h6/14xy_35x4wd2tz542dn0qhtc0000gn/T/RtmpHQoi2h/bernoulli-202012171340-1-88a07d.csv
Chain 1 diagnostic_file = (Default)
Chain 1 refresh = 100 (Default)
Chain 1 sig_figs = -1 (Default)
Chain 1 Gradient evaluation took 9e-06 seconds
Chain 1 1000 transitions using 10 leapfrog steps per transition would take 0.09 seconds.
Chain 1 Adjust your expectations accordingly!
Chain 1 WARNING: There aren't enough warmup iterations to fit the
Chain 1 three stages of adaptation as currently configured.
Chain 1 Reducing each adaptation stage to 15%/75%/10% of
Chain 1 the given number of warmup iterations:
Chain 1 init_buffer = 15
Chain 1 adapt_window = 75
Chain 1 term_buffer = 10
Chain 1 Iteration: 1 / 200 [ 0%] (Warmup)
Chain 1 Iteration: 100 / 200 [ 50%] (Warmup)
Chain 1 Iteration: 101 / 200 [ 50%] (Sampling)
Chain 1 Iteration: 200 / 200 [100%] (Sampling)
Chain 1 Elapsed Time: 0 seconds (Warm-up)
Chain 1 0.001 seconds (Sampling)
Chain 1 0.001 seconds (Total)
Chain 1 finished in 0.0 seconds.