1
- # InferenceAlgorithm interface
1
+ # AbstractSampler interface for Turing
2
2
3
- abstract type Hamiltonian <: InferenceAlgorithm end
3
+ abstract type Hamiltonian <: AbstractMCMC.AbstractSampler end
4
4
5
- DynamicPPL. initialsampler (:: Sampler{<: Hamiltonian} ) = SampleFromUniform ()
5
+ DynamicPPL. initialsampler (:: Hamiltonian ) = DynamicPPL . SampleFromUniform ()
6
6
requires_unconstrained_space (:: Hamiltonian ) = true
7
7
# TODO (penelopeysm): This is really quite dangerous code because it implicitly
8
8
# assumes that any concrete type that subtypes `Hamiltonian` has an adtype
152
152
function AbstractMCMC. step (
153
153
rng:: AbstractRNG ,
154
154
ldf:: LogDensityFunction ,
155
- spl:: Sampler{<: Hamiltonian} ;
155
+ spl:: Hamiltonian ;
156
156
initial_params= nothing ,
157
157
nadapts= 0 ,
158
158
kwargs... ,
@@ -165,7 +165,7 @@ function AbstractMCMC.step(
165
165
has_initial_params = initial_params != = nothing
166
166
167
167
# Create a Hamiltonian.
168
- metricT = getmetricT (spl. alg )
168
+ metricT = getmetricT (spl)
169
169
metric = metricT (length (theta))
170
170
lp_func = Base. Fix1 (LogDensityProblems. logdensity, ldf)
171
171
lp_grad_func = Base. Fix1 (LogDensityProblems. logdensity_and_gradient, ldf)
@@ -184,23 +184,23 @@ function AbstractMCMC.step(
184
184
log_density_old = getlogp (vi)
185
185
186
186
# Find good eps if not provided one
187
- if iszero (spl. alg . ϵ)
187
+ if iszero (spl. ϵ)
188
188
ϵ = AHMC. find_good_stepsize (rng, hamiltonian, theta)
189
189
@info " Found initial step size" ϵ
190
190
else
191
- ϵ = spl. alg . ϵ
191
+ ϵ = spl. ϵ
192
192
end
193
193
194
194
# Generate a kernel.
195
- kernel = make_ahmc_kernel (spl. alg , ϵ)
195
+ kernel = make_ahmc_kernel (spl, ϵ)
196
196
197
197
# Create initial transition and state.
198
198
# Already perform one step since otherwise we don't get any statistics.
199
199
t = AHMC. transition (rng, hamiltonian, kernel, z)
200
200
201
201
# Adaptation
202
- adaptor = AHMCAdaptor (spl. alg , hamiltonian. metric; ϵ= ϵ)
203
- if spl. alg isa AdaptiveHamiltonian
202
+ adaptor = AHMCAdaptor (spl, hamiltonian. metric; ϵ= ϵ)
203
+ if spl isa AdaptiveHamiltonian
204
204
hamiltonian, kernel, _ = AHMC. adapt! (
205
205
hamiltonian, kernel, adaptor, 1 , nadapts, t. z. θ, t. stat. acceptance_rate
206
206
)
224
224
function AbstractMCMC. step (
225
225
rng:: Random.AbstractRNG ,
226
226
ldf:: LogDensityFunction ,
227
- spl:: Sampler{<: Hamiltonian} ,
227
+ spl:: Hamiltonian ,
228
228
state:: HMCState ;
229
229
nadapts= 0 ,
230
230
kwargs... ,
@@ -236,7 +236,7 @@ function AbstractMCMC.step(
236
236
237
237
# Adaptation
238
238
i = state. i + 1
239
- if spl. alg isa AdaptiveHamiltonian
239
+ if spl isa AdaptiveHamiltonian
240
240
hamiltonian, kernel, _ = AHMC. adapt! (
241
241
hamiltonian,
242
242
state. kernel,
@@ -276,7 +276,7 @@ function get_hamiltonian(model, spl, vi, state, n)
276
276
# using leafcontext(model.context) so could we just remove the argument
277
277
# entirely?)
278
278
DynamicPPL. SamplingContext (spl, DynamicPPL. leafcontext (model. context));
279
- adtype= spl. alg . adtype,
279
+ adtype= spl. adtype,
280
280
)
281
281
lp_func = Base. Fix1 (LogDensityProblems. logdensity, ldf)
282
282
lp_grad_func = Base. Fix1 (LogDensityProblems. logdensity_and_gradient, ldf)
@@ -441,17 +441,17 @@ getmetricT(::NUTS{<:Any,metricT}) where {metricT} = metricT
441
441
# #### HMC core functions
442
442
# ####
443
443
444
- getstepsize (sampler:: Sampler{<: Hamiltonian} , state) = sampler. alg . ϵ
445
- getstepsize (sampler:: Sampler{<: AdaptiveHamiltonian} , state) = AHMC. getϵ (state. adaptor)
444
+ getstepsize (sampler:: Hamiltonian , state) = sampler. ϵ
445
+ getstepsize (sampler:: AdaptiveHamiltonian , state) = AHMC. getϵ (state. adaptor)
446
446
function getstepsize (
447
- sampler:: Sampler{<: AdaptiveHamiltonian} ,
447
+ sampler:: AdaptiveHamiltonian ,
448
448
state:: HMCState{TV,TKernel,THam,PhType,AHMC.Adaptation.NoAdaptation} ,
449
449
) where {TV,TKernel,THam,PhType}
450
450
return state. kernel. τ. integrator. ϵ
451
451
end
452
452
453
- gen_metric (dim:: Int , spl:: Sampler{<: Hamiltonian} , state) = AHMC. UnitEuclideanMetric (dim)
454
- function gen_metric (dim:: Int , spl:: Sampler{<: AdaptiveHamiltonian} , state)
453
+ gen_metric (dim:: Int , spl:: Hamiltonian , state) = AHMC. UnitEuclideanMetric (dim)
454
+ function gen_metric (dim:: Int , spl:: AdaptiveHamiltonian , state)
455
455
return AHMC. renew (state. hamiltonian. metric, AHMC. getM⁻¹ (state. adaptor. pc))
456
456
end
457
457
@@ -476,13 +476,11 @@ end
476
476
# ###
477
477
# ### Compiler interface, i.e. tilde operators.
478
478
# ###
479
- function DynamicPPL. assume (
480
- rng, :: Sampler{<:Hamiltonian} , dist:: Distribution , vn:: VarName , vi
481
- )
479
+ function DynamicPPL. assume (rng, :: Hamiltonian , dist:: Distribution , vn:: VarName , vi)
482
480
return DynamicPPL. assume (dist, vn, vi)
483
481
end
484
482
485
- function DynamicPPL. observe (:: Sampler{<: Hamiltonian} , d:: Distribution , value, vi)
483
+ function DynamicPPL. observe (:: Hamiltonian , d:: Distribution , value, vi)
486
484
return DynamicPPL. observe (d, value, vi)
487
485
end
488
486
0 commit comments