@@ -73,14 +73,13 @@ class Metropolis(ArrayStepShared):
73
73
default_blocked = False
74
74
75
75
def __init__ (self , vars = None , S = None , proposal_dist = NormalProposal , scaling = 1. ,
76
- tune = True , tune_interval = 100 , model = None , gibbs = None , ** kwargs ):
76
+ tune = True , tune_interval = 100 , model = None , ** kwargs ):
77
77
78
78
model = modelcontext (model )
79
79
80
80
if vars is None :
81
81
vars = model .vars
82
82
vars = inputvars (vars )
83
- self .dim = sum (v .dsize for v in vars )
84
83
85
84
if S is None :
86
85
S = np .ones (self .dim )
@@ -90,8 +89,6 @@ def __init__(self, vars=None, S=None, proposal_dist=NormalProposal, scaling=1.,
90
89
self .tune_interval = tune_interval
91
90
self .steps_until_tune = tune_interval
92
91
self .accepted = 0
93
- self .gibbs = gibbs
94
- self .index = 0
95
92
96
93
# Determine type of variables
97
94
self .discrete = np .array ([v .dtype in discrete_types for v in vars ])
@@ -112,16 +109,6 @@ def astep(self, q0):
112
109
self .steps_until_tune = self .tune_interval
113
110
self .accepted = 0
114
111
115
- if self .gibbs == 'sequential' :
116
- self .index = (self .index + 1 ) % self .dim
117
- elif self .gibbs == 'random' :
118
- self .index = np .random .randint (0 , self .dim )
119
- else :
120
- self .index = slice (None ) # select all
121
-
122
- mask = np .zeros (self .dim , dtype = np .bool8 )
123
- mask [self .index ] = True
124
-
125
112
delta = (self .proposal_dist () * self .scaling )
126
113
127
114
if self .any_discrete :
@@ -135,8 +122,6 @@ def astep(self, q0):
135
122
else :
136
123
q = q0 + delta
137
124
138
- q = q [mask ]
139
-
140
125
q_new = metrop_select (self .delta_logp (q , q0 ), q , q0 )
141
126
142
127
if q_new is q :
@@ -215,27 +200,15 @@ def __init__(self, vars, scaling=1., tune=True, tune_interval=100, gibbs='random
215
200
super (BinaryMetropolis , self ).__init__ (vars , [model .fastlogp ])
216
201
217
202
def astep (self , q0 , logp ):
203
+ # Convert adaptive_scale_factor to a jump probability
204
+ p_jump = 1. - .5 ** self .scaling
218
205
219
- if (self .gibbs == 'sequential' ) or (self .gibbs == 'random' ):
220
- order = list (range (self .dim ))
221
- if self .gibbs == 'random' :
222
- np .random .shuffle (order )
223
-
224
- q = copy (q0 )
225
- for idx in order :
226
- q [idx ] = True - q [idx ]
227
- q = metrop_select (logp (q ) - logp (q0 ), q , q0 )
228
- q_new = q
229
- else :
230
- # Convert adaptive_scale_factor to a jump probability
231
- p_jump = 1. - .5 ** self .scaling
232
-
233
- rand_array = random (q0 .shape )
234
- q = copy (q0 )
235
- # Locations where switches occur, according to p_jump
236
- switch_locs = (rand_array < p_jump )
237
- q [switch_locs ] = True - q [switch_locs ]
238
- q_new = metrop_select (logp (q ) - logp (q0 ), q , q0 )
206
+ rand_array = random (q0 .shape )
207
+ q = copy (q0 )
208
+ # Locations where switches occur, according to p_jump
209
+ switch_locs = (rand_array < p_jump )
210
+ q [switch_locs ] = True - q [switch_locs ]
211
+ q_new = metrop_select (logp (q ) - logp (q0 ), q , q0 )
239
212
240
213
return q_new
241
214
@@ -274,12 +247,13 @@ def astep(self, q0, logp):
274
247
275
248
q_prop = copy (q0 )
276
249
q_cur = copy (q0 )
250
+
277
251
for idx in order :
278
252
q_prop [idx ] = True - q_prop [idx ]
279
253
q_cur = metrop_select (logp (q_prop ) - logp (q_cur ), q_prop , q_cur )
280
254
q_prop = copy (q_cur )
281
255
282
- return q_prop
256
+ return q_cur
283
257
284
258
@staticmethod
285
259
def competence (var ):
0 commit comments