# Julia Interface
% NB: If you are reading this file in docs/languages, you are reading a generated output!
% This should be apparent due to the html tags everywhere.
% If you are reading this in julia/docs/src, you are reading the true source!
% Please only make edits in the later file, since the first is DELETED each re-build.
---
## Installation
### From Source
This section assumes you have followed the [Getting Started guide](../getting-started.rst) to install TinyStan's pre-requisites and downloaded a copy of the TinyStan source code.
To install the Julia interface, you can either install it directly from Github by running the following inside a Julia REPL
```julia
] add https://github.com/WardBrian/tinystan.git:clients/julia
```
Or, since you have already downloaded the repository, you can run
```julia
] dev clients/julia/
```
from the TinyStan folder.
The first time you compile a model, the TinyStan source code for your current version will be downloaded to a hidden directory in the users `HOME` directory.
To use the TinyStan source you've manually downloaded instead of one the package will download for you, you must use [`set_tinystan_path()`](TinyStan.set_tinystan_path!) or the `$TINYSTAN` environment variable.
Note that the Julia package depends on Julia 1.6+ and the `Inflate` package.
## Example Program
An example program is provided alongside the Julia interface code in `example.jl`:
Show example.jl
```{literalinclude} ../../clients/julia/example.jl
:language: julia
```
## API Reference
### Model interface
#
**`TinyStan.Model`** — *Type*.
```julia
Model(model::String; stanc_args::Vector{String} = String[], make_args::Vector{String} = String[], warn::Bool = true)
```
Load a Stan model for inference, compiling it if necessary.
If model is a path to a file ending in `.stan`, this will first compile the model. Compilation occurs if no shared object file exists for the supplied Stan file or if a shared object file exists and the Stan file has changed since last compilation. This is equivalent to calling [`compile_model`](julia.md#TinyStan.compile_model) and then the constructor. If `warn` is false, the warning about re-loading the same shared objects is suppressed.
source
#
**`TinyStan.sample`** — *Function*.
```julia
sample(model::Model, data::String=""; num_chains::Int=4, inits::Union{nothing,AbstractString,AbstractArray{AbstractString}}=nothing, seed::Union{Nothing,UInt32}=nothing, id::Int=1, init_radius=2.0, num_warmup::Int=1000, num_samples::Int=1000, metric::HMCMetric=DIAGONAL, init_inv_metric::Union{Nothing,Array{Float64}}=nothing, save_metric::Bool=false, adapt::Bool=true, delta::Float64=0.8, gamma::Float64=0.05, kappa::Float64=0.75, t0::Int=10, init_buffer::Int=75, term_buffer::Int=50, window::Int=25, save_warmup::Bool=false, stepsize::Float64=1.0, stepsize_jitter::Float64=0.0, max_depth::Int=10, refresh::Int=0, num_threads::Int=-1)
```
Run Stan's No-U-Turn Sampler (NUTS) to sample from the posterior. An in-depth explanation of the parameters can be found in the [Stan documentation](https://mc-stan.org/docs/reference-manual/mcmc.html).
Returns a tuple of the parameter names, the draws, and the metric if `save_metric` is true.
source
#
**`TinyStan.HMCMetric`** — *Type*.
Choices for the structure of the mass matrix used in the HMC sampler.
Either `UNIT`, `DENSE`, or `DIAGONAL`.
source
#
**`TinyStan.pathfinder`** — *Function*.
```julia
pathfinder(model::Model, data::String=""; num_paths::Int=4, inits::Union{nothing,AbstractString,AbstractArray{AbstractString}}=nothing, seed::Union{Nothing,UInt32}=nothing, id::Int=1, init_radius=2.0, num_draws::Int=1000, max_history_size::Int=5, init_alpha::Float64=0.001, tol_obj::Float64=1e-12, tol_rel_obj::Float64=1e4, tol_grad::Float64=1e-8, tol_rel_grad::Float64=1e7, tol_param::Float64=1e-8, num_iterations::Int=1000, num_elbo_draws::Int=25, num_multi_draws::Int=1000, calculate_lp::Bool=true, psis_resample::Bool=true, refresh::Int=0, num_threads::Int=-1)
```
Run the Pathfinder algorithm to approximate the posterior. See [Stan's documentation](https://mc-stan.org/docs/reference-manual/pathfinder.html) for more information on the algorithm.
Returns a tuple of the parameter names and the draws.
source
#
**`TinyStan.optimize`** — *Function*.
```julia
optimize(model::Model, data::String=""; init::Union{Nothing,AbstractString}=nothing, seed::Union{UInt32,Nothing}=nothing, id::Int=1, init_radius::Float64=2.0, algorithm::OptimizationAlgorithm=LBFGS, jacobian::Bool=false, num_iterations::Int=2000, max_history_size::Int=5, init_alpha::Float64=0.001, tol_obj::Float64=1e-12, tol_rel_obj::Float64=1e4, tol_grad::Float64=1e-8, tol_rel_grad::Float64=1e7, tol_param::Float64=1e-8, refresh::Int=0, num_threads::Int=-1)
```
Optimize the model parameters using the specified algorithm.
This will find either the maximum a posteriori (MAP) estimate or the maximum likelihood estimate (MLE) of the model parameters, depending on the value of the `jacobian` parameter. Additional parameters can be found in the [Stan documentation](https://mc-stan.org/docs/reference-manual/optimization.html).
Returns a tuple of the parameter names and the optimized values.
source
#
**`TinyStan.OptimizationAlgorithm`** — *Type*.
Choices for the optimization algorithm to use.
Either `NEWTON`, `BFGS`, or `LBFGS`.
source
#
**`TinyStan.laplace_sample`** — *Function*.
```julia
laplace_sample(model::Model, mode::Union{AbstractString,Array{Float64}}, data::AbstractString=""; num_draws::Int=1000, jacobian::Bool=true, calculate_lp::Bool=true, save_hessian::Bool=false, seed::Union{UInt32,Nothing}=nothing, refresh::Int=0, num_threads::Int=-1)
```
Sample from the Laplace approximation of the posterior centered at the provided mode. The mode can be either a JSON string or an array of floats, often obtained from the [`optimize`](julia.md#TinyStan.optimize) function.
Returns a tuple of the parameter names and the draws.
source
### Compilation utilities
#
**`TinyStan.compile_model`** — *Function*.
```julia
compile_model(stan_file; stanc_args=[], make_args=[])
```
Run TinyStan’s Makefile on a `.stan` file, creating the `.so` used by StanModel and return a path to the compiled library. Arguments to `stanc3` can be passed as a vector, for example `["--O1"]` enables level 1 compiler optimizations. Additional arguments to `make` can be passed as a vector, for example `["STAN_THREADS=true"]` enables the model's threading capabilities. If the same flags are defined in `make/local`, the versions passed here will take precedent.
This function checks that the path to TinyStan is valid and will error if it is not. This can be set with [`set_tinystan_path!()`](julia.md#TinyStan.set_tinystan_path!).
source
#
**`TinyStan.get_tinystan_path`** — *Function*.
```julia
get_tinystan_path() -> String
```
Return the path the the TinyStan directory.
If the environment variable `TINYSTAN` is set, this will be returned. Otherwise, this function downloads a matching version of TinyStan under a folder called `.tinystan` in the user's home directory.
See [`set_tinystan_path!()`](julia.md#TinyStan.set_tinystan_path!) to set the path from within Julia.
source
#
**`TinyStan.set_tinystan_path!`** — *Function*.
```julia
set_tinystan_path!(path)
```
Set the path TinyStan.
source