4
4
from ..theanof import gradient
5
5
from . import distribution
6
6
from ..math import logit , invlogit
7
+ from .distribution import draw_values
7
8
import numpy as np
8
9
9
10
__all__ = ['transform' , 'stick_breaking' , 'logodds' , 'interval' ,
@@ -22,6 +23,9 @@ class Transform(object):
22
23
def forward (self , x ):
23
24
raise NotImplementedError
24
25
26
+ def forward_val (self , x , point ):
27
+ raise NotImplementedError
28
+
25
29
def backward (self , z ):
26
30
raise NotImplementedError
27
31
@@ -55,6 +59,7 @@ def __init__(self, dist, transform, *args, **kwargs):
55
59
arguments to Distribution"""
56
60
forward = transform .forward
57
61
testval = forward (dist .default ())
62
+ forward_val = transform .forward_val
58
63
59
64
self .dist = dist
60
65
self .transform_used = transform
@@ -85,6 +90,9 @@ def backward(self, x):
85
90
86
91
def forward (self , x ):
87
92
return tt .log (x )
93
+
94
+ def forward_val (self , x , point = None ):
95
+ return self .forward (x )
88
96
89
97
def jacobian_det (self , x ):
90
98
return x
@@ -103,6 +111,9 @@ def backward(self, x):
103
111
104
112
def forward (self , x ):
105
113
return logit (x )
114
+
115
+ def forward_val (self , x , point = None ):
116
+ return self .forward (x )
106
117
107
118
logodds = LogOdds ()
108
119
@@ -125,6 +136,11 @@ def forward(self, x):
125
136
a , b = self .a , self .b
126
137
return tt .log (x - a ) - tt .log (b - x )
127
138
139
+ def forward_val (self , x , point = None ):
140
+ a , b = draw_values ([self .a , self .b ],
141
+ point = point )
142
+ return tt .log (x - a ) - tt .log (b - x )
143
+
128
144
def jacobian_det (self , x ):
129
145
s = tt .nnet .softplus (- x )
130
146
return tt .log (self .b - self .a ) - 2 * s - x
@@ -147,8 +163,12 @@ def backward(self, x):
147
163
148
164
def forward (self , x ):
149
165
a = self .a
150
- r = tt .log (x - a )
151
- return r
166
+ return tt .log (x - a )
167
+
168
+ def forward_val (self , x , point = None ):
169
+ a = draw_values ([self .a ],
170
+ point = point )[0 ]
171
+ return tt .log (x - a )
152
172
153
173
def jacobian_det (self , x ):
154
174
return x
@@ -171,8 +191,12 @@ def backward(self, x):
171
191
172
192
def forward (self , x ):
173
193
b = self .b
174
- r = tt .log (b - x )
175
- return r
194
+ return tt .log (b - x )
195
+
196
+ def forward_val (self , x , point = None ):
197
+ b = draw_values ([self .b ],
198
+ point = point )[0 ]
199
+ return tt .log (b - x )
176
200
177
201
def jacobian_det (self , x ):
178
202
return x
@@ -191,6 +215,9 @@ def backward(self, y):
191
215
def forward (self , x ):
192
216
return x [:- 1 ]
193
217
218
+ def forward_val (self , x , point = None ):
219
+ return self .forward (x )
220
+
194
221
def jacobian_det (self , x ):
195
222
return 0
196
223
@@ -224,6 +251,9 @@ def forward(self, x_):
224
251
y = logit (z ) - eq_share
225
252
return y .T
226
253
254
+ def forward_val (self , x , point = None ):
255
+ return self .forward (x )
256
+
227
257
def backward (self , y_ ):
228
258
y = y_ .T
229
259
Km1 = y .shape [0 ]
@@ -262,6 +292,9 @@ def backward(self, y):
262
292
def forward (self , x ):
263
293
return tt .as_tensor_variable (x )
264
294
295
+ def forward_val (self , x , point = None ):
296
+ return self .forward (x )
297
+
265
298
def jacobian_det (self , x ):
266
299
return 0
267
300
@@ -280,5 +313,8 @@ def backward(self, x):
280
313
def forward (self , y ):
281
314
return tt .advanced_set_subtensor1 (y , tt .log (y [self .diag_idxs ]), self .diag_idxs )
282
315
316
+ def forward_val (self , x , point = None ):
317
+ return self .forward (x )
318
+
283
319
def jacobian_det (self , y ):
284
320
return tt .sum (y [self .diag_idxs ])
0 commit comments