Skip to content

AdvancedHMC.jl

Documentation for AdvancedHMC.jl ↗

FlexiChains.to_nt_and_stats is overloaded for AdvancedHMC.Transition, so you can sample with AdvancedHMC into a FlexiChain{Symbol}. This is a slightly simplified version of the example in the AdvancedHMC README (here we use an analytical gradient rather than automatic differentiation):

julia
using AdvancedHMC, AbstractMCMC
using LogDensityProblems
using FlexiChains: FlexiChain

# Set up AD-aware log-density function
struct LogTargetDensity
    dim::Int
end
LogDensityProblems.logdensity(::LogTargetDensity, θ) = -sum(abs2, θ) / 2
LogDensityProblems.logdensity_and_gradient(::LogTargetDensity, θ) = (-sum(abs2, θ) / 2, -θ)
LogDensityProblems.dimension(p::LogTargetDensity) = p.dim
function LogDensityProblems.capabilities(::Type{LogTargetDensity})
    return LogDensityProblems.LogDensityOrder{1}()
end

chn = AbstractMCMC.sample(
    LogTargetDensity(10),
    AdvancedHMC.NUTS(0.8),
    20;
    n_adapts=10,
    chain_type=FlexiChain{Symbol},
)
╭─FlexiChain (20 iterations, 1 chain) ─────────────────────────────────────────
 ↓ iter  = 1:20
 → chain = 1:1

 Parameters (1) ── Symbol
  DimensionalData.DimVector{Float64, Tupl…  params (10,)

 Extras (12)
  Int64    n_steps, tree_depth                                                
  Bool     is_accept, numerical_error, is_adapt                               
  Float64  acceptance_rate, log_density, hamiltonian_energy,                  
           hamiltonian_energy_error, max_hamiltonian_energy_error, step_size, 
           nom_step_size                                                      
╰──────────────────────────────────────────────────────────────────────────────╯