Project Status | Documentation | Build Status |
---|---|---|
After many years I have decided to step away from my work with Stan and Julia. My plan is to be around until the end of 2024 for support if someone decides to step in and take over further development and maintenance work.
At the end of 2024 I'll archive the different packages and projects included in the Github organisations StanJulia, StatisticalRethingJulia and RegressionAndOtherStoriesJulia if no one is interested (and time-wise able!) to take on this work.
I have thoroughly enjoyed working on both Julia and Stan and see both projects mature during the last 15 or so years. And I will always be grateful for the many folks who have helped me on numerous occasions. Both the Julia and the Stan community are awesome to work with! Thanks a lot!
A collection of example Stan Language programs demonstrating all methods available in Stan's cmdstan executable (as an external program) from Julia.
For most applications one of the "single method" packages, e.g. StanSample.jl, StanDiagnose.jl, etc., is a better choice for day to day use.
To execute the most important method in Stan ("sample"), use StanSample.jl.
Additional Pluto notebook examples can be found here.
Stan.jl has always taken the approach as the recently released CmdStanR and CmdStanPy options to use Stan's cmdstan executable.
In Stan.jl v7 all of cmdstan's methods were moved to separate packages, i.e. StanSample.jl, StanOptimize.jl, StanVariational.jl and StanDiagnose.jl, including an option to run generate_quantities
as part of StanSample.jl. Stan.jl v10.8 also supports Stan's pathfinder
method, see StanPathfinder.jl.
Stan.jl v10 uses StanSample.jl v7, StanOptimize.jl v4, StanQuap.jl v4, StanDiagnose.jl v4 and StanVariational v4 and supports multithreading on C++ level. Stan.jl v10 also uses JSON.jl to generate data and init input files for cmdstan.
Stan.jl v10 supports InferenceObjects.jl and PosteriorDB.jl. See the notebook examples here.
To use the :dimarray or :dimarrays option in read_samples())
, see the example notebook dimarray.jl
.
The StanJulia ecosystem includes 2 additional packages, StanQuap.jl (to compute MAP estimates) and DiffEqBayesStan.jl.
Stan's cmdstan executable needs to be installed separatedly. Please see cmdstan installation. If you plan to use C++ level threads, please read the make/local-example
instructions and below section and this file.
Stan.jl v10 is intended to use Stan's cmdstan
v2.35.0+ and StanSample.jl v6.
StanSample.jl v6+ enables the use of c++ multithreading in the cmdstan
binary. To activate multithreading in cmdstan
this needs to be specified during the build process of cmdstan
. I typically create a path_to_cmdstan_directory/make/local
file (before running make -j9 build
) containing STAN_THREADS=true
. For an example, see the .github/CI.yml
script
This means StanSample supports 2 mechanisms for in parallel drawing samples for chains, i.e. on C++ level (using C++ threads) and on Julia level (by spawing a Julia process for each chain).
The use_cpp_chains
keyword argument for stan_sample()
determines if chains are executed on C++ level or on Julia level. By default, use_cpp_chains=false
.
By default in ether case num_chains=4
. See ??stan_sample
. Internally, num_chains
will be copied to either num_cpp_chains
or num_julia_chains'.
Note: Currently I do not suggest to use both C++ level chains and Julia level chains. Based on use_cpp_chains
the stan_sample()
method will set either num_cpp_chains=num_chains; num_julia_chains=1
or num_julia_chains=num_chains;num_cpp_chain=1
(the default of use_cpp_chains
is false).
Set the check_num_chains
keyword argument in the call to stan_sample()
to false
to prevent above default behavior. See the example in the Examples/RedCardsStudy
directory for more details and an example.
Threads on C++ level can be used in multiple ways, e.g. to run separate chains and to speed up certain Stan Language operations.
StanSample.jl's SampleModel sets the C++ num_threads
to 4 but for compatibility with previous versions of StanJulia this is by default (use_cpp_chains=false
) not included in the generated command line, e.g. see sm.cmds
where sm
is your SampleModel.
An example of the possible performance trade-offs between use_cpp_threads
, num_cpp_chains
and num_julia_chains
can be found in the this directory.
Note 1: The conda way of installing also works on other platforms. See also.
Note 2: I believe if you have used CmdstanR (or CmdstanPy) to install cmdstan you can use that cmdstan version in Julia.
Make sure you have conda installed on your system and available from the command line (you can use the conda version that comes with Conda.jl or install your own).
Activate the conda environment into which you want to install cmdstan (e.g. run conda activate stan-env
from the command line) or create a new environment (conda create --name stan-env
) and then activate it.
Install cmdstan into the active conda environment by running conda install -c conda-forge cmdstan
.
You can check that cmdstan, g++, and mingw32-make are installed properly by running conda list cmdstan, g++ --version
and mingw32-make --version
, respectively, from the activated conda environment.
Start a Julia session from the conda environment in which cmdstan has been installed (this is necessary for the cmdstan installation and the tools to be found).
Add the StanSample.jl package by running ] add StanSample from the REPL.
Set the CMDSTAN environment variable so that Julia can find the cmdstan installation, e.g. from the Julia REPL do: ENV["CMDSTAN"] = "C:/Users/Jakob/.julia/conda/3/envs/stan-env/Library/bin/cmdstan" This needs to be set before you load the StanSample package by e.g. using it. You can add this line to your startup.jl file so that you don't have to run it again in every fresh Julia session.
Examples/Bernoulli/bernoulli2.jl
.test_bridgestan.jl
and
bridgestan_stansample_example.jl
) in above mentioned Github repo.inferencedata()
now uses the Dict based inferencedata3()
in StanSample.jlinferencedata()
inferencedata()
and inferencedata2()
)Examples/RedCardsStudy
directorynum_chains
to define either number of chains on C++ or Julia level based on use_cpp_chains
keyword argument to stan_sample()
.num_threads
, 4 num_cpp_chains
).This is a breaking update!