@@ -47,6 +47,13 @@ class Slice(ArrayStep):
47
47
48
48
name = "slice"
49
49
default_blocked = False
50
+ generates_stats = True
51
+ stats_dtypes = [
52
+ {
53
+ "nstep_out" : int ,
54
+ "nstep_in" : int ,
55
+ }
56
+ ]
50
57
51
58
def __init__ (self , vars = None , w = 1.0 , tune = True , model = None , iter_limit = np .inf , ** kwargs ):
52
59
self .model = modelcontext (model )
@@ -67,6 +74,8 @@ def astep(self, q0, logp):
67
74
q0_val = q0 .data
68
75
self .w = np .resize (self .w , len (q0_val )) # this is a repmat
69
76
77
+ nstep_out = nstep_in = 0
78
+
70
79
q = np .copy (q0_val )
71
80
ql = np .copy (q0_val ) # l for left boundary
72
81
qr = np .copy (q0_val ) # r for right boudary
@@ -92,12 +101,15 @@ def astep(self, q0, logp):
92
101
cnt += 1
93
102
if cnt > self .iter_limit :
94
103
raise RuntimeError (LOOP_ERR_MSG % self .iter_limit )
104
+ nstep_out += cnt
105
+
95
106
cnt = 0
96
107
while y <= logp (qr_ra ):
97
108
qr [i ] += wi
98
109
cnt += 1
99
110
if cnt > self .iter_limit :
100
111
raise RuntimeError (LOOP_ERR_MSG % self .iter_limit )
112
+ nstep_out += cnt
101
113
102
114
cnt = 0
103
115
q [i ] = nr .uniform (ql [i ], qr [i ])
@@ -111,6 +123,7 @@ def astep(self, q0, logp):
111
123
cnt += 1
112
124
if cnt > self .iter_limit :
113
125
raise RuntimeError (LOOP_ERR_MSG % self .iter_limit )
126
+ nstep_in += cnt
114
127
115
128
if self .tune :
116
129
# I was under impression from MacKays lectures that slice width can be tuned without
@@ -125,7 +138,12 @@ def astep(self, q0, logp):
125
138
if self .tune :
126
139
self .n_tunes += 1
127
140
128
- return q
141
+ stats = {
142
+ "nstep_out" : nstep_out ,
143
+ "nstep_in" : nstep_in ,
144
+ }
145
+
146
+ return q , (stats ,)
129
147
130
148
@staticmethod
131
149
def competence (var , has_grad ):
0 commit comments