@@ -200,6 +200,14 @@ def __init__(self, tau=None, init=Flat.dist(), sigma=None, mu=0.,
200
200
self .init = init
201
201
self .mean = tt .as_tensor_variable (0. )
202
202
203
+ def _mu_and_sigma (self , mu , sigma ):
204
+ """Helper to get mu and sigma if they are high dimensional."""
205
+ if sigma .ndim > 0 :
206
+ sigma = sigma [1 :]
207
+ if mu .ndim > 0 :
208
+ mu = mu [1 :]
209
+ return mu , sigma
210
+
203
211
def logp (self , x ):
204
212
"""
205
213
Calculate log-probability of Gaussian Random Walk distribution at specified value.
@@ -216,15 +224,7 @@ def logp(self, x):
216
224
if x .ndim > 0 :
217
225
x_im1 = x [:- 1 ]
218
226
x_i = x [1 :]
219
- if self .sigma .ndim > 0 :
220
- sigma = self .sigma [:- 1 ]
221
- else :
222
- sigma = self .sigma
223
- if self .mu .ndim > 0 :
224
- mu = self .mu [:- 1 ]
225
- else :
226
- mu = self .mu
227
-
227
+ mu , sigma = self ._mu_and_sigma (self .mu , self .sigma )
228
228
innov_like = Normal .dist (mu = x_im1 + mu , sigma = sigma ).logp (x_i )
229
229
return self .init .logp (x [0 ]) + tt .sum (innov_like )
230
230
return self .init .logp (x )
@@ -252,7 +252,9 @@ def random(self, point=None, size=None):
252
252
def _random (self , sigma , mu , size ):
253
253
"""Implement a Gaussian random walk as a cumulative sum of normals."""
254
254
rv = stats .norm (mu , sigma )
255
- return rv .rvs (size ).cumsum (axis = 0 )
255
+ data = rv .rvs (size ).cumsum (axis = 0 )
256
+ data = data - data [0 ] # TODO: this should be a draw from `init`, if available
257
+ return data
256
258
257
259
def _repr_latex_ (self , name = None , dist = None ):
258
260
if dist is None :
0 commit comments