@@ -99,9 +99,7 @@ function propose(
99
99
spl:: MetropolisHastings{<:NamedTuple} ,
100
100
model:: DensityModel
101
101
)
102
- proposal = map (spl. proposal) do p
103
- propose (rng, p, model)
104
- end
102
+ proposal = _propose (rng, spl. proposal, model)
105
103
return Transition (model, proposal)
106
104
end
107
105
@@ -111,12 +109,35 @@ function propose(
111
109
model:: DensityModel ,
112
110
params_prev:: Transition
113
111
)
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)
117
113
return Transition (model, proposal)
118
114
end
119
115
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
+
120
141
# Evaluate the likelihood of t conditional on t_cond.
121
142
function q (
122
143
spl:: MetropolisHastings{<:AbstractArray} ,
0 commit comments