Skip to content

Commit 9d09ed8

Browse files
authored
Merge pull request #24 from devmotion/generated
Switch back to generated functions
2 parents 5690c9d + 9371a4e commit 9d09ed8

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

src/mh-core.jl

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,7 @@ function propose(
9999
spl::MetropolisHastings{<:NamedTuple},
100100
model::DensityModel
101101
)
102-
proposal = map(spl.proposal) do p
103-
propose(rng, p, model)
104-
end
102+
proposal = _propose(rng, spl.proposal, model)
105103
return Transition(model, proposal)
106104
end
107105

@@ -111,12 +109,35 @@ function propose(
111109
model::DensityModel,
112110
params_prev::Transition
113111
)
114-
proposal = map(spl.proposal, params_prev.params) do p, params
115-
propose(rng, p, model, params)
116-
end
112+
proposal = _propose(rng, spl.proposal, model, params_prev.params)
117113
return Transition(model, proposal)
118114
end
119115

116+
@generated function _propose(
117+
rng::Random.AbstractRNG,
118+
proposal::NamedTuple{names},
119+
model::DensityModel
120+
) where {names}
121+
isempty(names) && return :(NamedTuple())
122+
expr = Expr(:tuple)
123+
expr.args = Any[:($name = propose(rng, proposal.$name, model)) for name in names]
124+
return expr
125+
end
126+
127+
@generated function _propose(
128+
rng::Random.AbstractRNG,
129+
proposal::NamedTuple{names},
130+
model::DensityModel,
131+
params_prev::NamedTuple
132+
) where {names}
133+
isempty(names) && return :(NamedTuple())
134+
expr = Expr(:tuple)
135+
expr.args = Any[
136+
:($name = propose(rng, proposal.$name, model, params_prev.$name)) for name in names
137+
]
138+
return expr
139+
end
140+
120141
# Evaluate the likelihood of t conditional on t_cond.
121142
function q(
122143
spl::MetropolisHastings{<:AbstractArray},

0 commit comments

Comments
 (0)