## Multi-level state abstract type HierarchicalState <: AbstractState end #= # by default, the multilevel state wraps a tuple of states struct MultilevelState{T <: Tuple} <: HierarchicalState levels :: T end MultilevelState(levels...; kwargs...) = MultilevelState(levels) course(::MultilevelState) = MultilevelState(s.levels[1:end-1]) fine(s::MultilevelState) = s.levels[end] combine(s::MultilevelState, fine_state) = MultilevelState(s.levels..., fine_state) level(s::MultilevelState) = length(s.levels) # Multi-level log density abstract type HierarchicalLogDensity{S <: HierarchicalState} <: AbstractLogDensity{S} end struct MultilevelLogDensity{F, S} <: HierarchicalLogDensity{S} logdensities :: F end logdensity(d::HierarchicalLogDensity, state::HierarchicalState; level=length(state)) = logdensity(d, state) =# #level(s::MultilevelState) = length(s.states) #Base.eltype(states::MultilevelState) = eltype(states.states) ## construct from single level states #MultilevelState(states::State ... ) = MultilevelState(getindex.([states ... ], :state)) ## recursive construction #course(states::MultilevelState) = MultilevelState(states[1:end-1]) #fine(states::MultilevelState) = states[end] #combine(states::MultilevelState, state) = MultilevelState(vcat(states.states ... , state)) #= ## Multi-level log density abstract type HierarchicalLogDensity{S} <: AbstractLogDensity{S} end struct MultilevelLogDensity{F, S} <: HierarchicalLogDensity{S} logdensities :: F end logdensity(d::MultilevelLogDensity, state::MultilevelState) = logdensity(d.logdensities, state.states #logdensity(d::HierarchicalLogDensity, state::HierarchicalState, level::Int) function logdensity(d::MultilevelLogDensity, state::HierarchicalState, level::Int) logdensity(d.logdensities[level], state.states[level] end #MultilevelLogDensity(logdensities::AbstractVector{<:AbstractLogDensity}) = MultilevelLogDensity(logdensities =# #abstract type AbstractMultilevelLogDensity <: LogDensity{S} end #abstract type AbstractMultilevelLogDensity <: LogDensity{S} end #struct MultilevelLogDensity <: AbstractMultilevelLogDensity #end