|
28 | 28 | import scipy.linalg
|
29 | 29 | import scipy.stats
|
30 | 30 |
|
31 |
| -from pytensor.compile.builders import OpFromGraph |
32 | 31 | from pytensor.graph.basic import Apply, Variable
|
33 | 32 | from pytensor.graph.op import Op
|
34 | 33 | from pytensor.scalar import UnaryScalarOp, upgrade_to_float_no_complex
|
35 | 34 | from pytensor.tensor import gammaln
|
36 | 35 | from pytensor.tensor.elemwise import Elemwise
|
37 |
| -from pytensor.tensor.slinalg import Cholesky, SolveTriangular |
38 | 36 |
|
39 | 37 | from pymc.distributions.shape_utils import to_tuple
|
40 | 38 | from pymc.logprob.utils import CheckParameterValue
|
41 | 39 | from pymc.pytensorf import floatX
|
42 | 40 |
|
43 |
| -solve_lower = SolveTriangular(lower=True) |
44 |
| -solve_upper = SolveTriangular(lower=False) |
45 |
| - |
46 | 41 | f = floatX
|
47 | 42 | c = -0.5 * np.log(2.0 * np.pi)
|
48 | 43 | _beta_clip_values = {
|
@@ -242,69 +237,6 @@ def log_normal(x, mean, **kwargs):
|
242 | 237 | return f(c) - pt.log(pt.abs(std)) - (x - mean) ** 2 / (2.0 * std**2)
|
243 | 238 |
|
244 | 239 |
|
245 |
| -def MvNormalLogp(): |
246 |
| - """Compute the log pdf of a multivariate normal distribution. |
247 |
| -
|
248 |
| - This should be used in MvNormal.logp once Theano#5908 is released. |
249 |
| -
|
250 |
| - Parameters |
251 |
| - ---------- |
252 |
| - cov: pt.matrix |
253 |
| - The covariance matrix. |
254 |
| - delta: pt.matrix |
255 |
| - Array of deviations from the mean. |
256 |
| - """ |
257 |
| - cov = pt.matrix("cov") |
258 |
| - cov.tag.test_value = floatX(np.eye(3)) |
259 |
| - delta = pt.matrix("delta") |
260 |
| - delta.tag.test_value = floatX(np.zeros((2, 3))) |
261 |
| - |
262 |
| - cholesky = Cholesky(lower=True, on_error="nan") |
263 |
| - |
264 |
| - n, k = delta.shape |
265 |
| - n, k = f(n), f(k) |
266 |
| - chol_cov = cholesky(cov) |
267 |
| - diag = pt.diag(chol_cov) |
268 |
| - ok = pt.all(diag > 0) |
269 |
| - |
270 |
| - chol_cov = pt.switch(ok, chol_cov, pt.fill(chol_cov, 1)) |
271 |
| - delta_trans = solve_lower(chol_cov, delta.T).T |
272 |
| - |
273 |
| - result = n * k * pt.log(f(2) * np.pi) |
274 |
| - result += f(2) * n * pt.sum(pt.log(diag)) |
275 |
| - result += (delta_trans ** f(2)).sum() |
276 |
| - result = f(-0.5) * result |
277 |
| - logp = pt.switch(ok, result, -np.inf) |
278 |
| - |
279 |
| - def dlogp(inputs, gradients): |
280 |
| - (g_logp,) = gradients |
281 |
| - cov, delta = inputs |
282 |
| - |
283 |
| - g_logp.tag.test_value = floatX(1.0) |
284 |
| - n, k = delta.shape |
285 |
| - |
286 |
| - chol_cov = cholesky(cov) |
287 |
| - diag = pt.diag(chol_cov) |
288 |
| - ok = pt.all(diag > 0) |
289 |
| - |
290 |
| - chol_cov = pt.switch(ok, chol_cov, pt.fill(chol_cov, 1)) |
291 |
| - delta_trans = solve_lower(chol_cov, delta.T).T |
292 |
| - |
293 |
| - inner = n * pt.eye(k) - pt.dot(delta_trans.T, delta_trans) |
294 |
| - g_cov = solve_upper(chol_cov.T, inner) |
295 |
| - g_cov = solve_upper(chol_cov.T, g_cov.T) |
296 |
| - |
297 |
| - tau_delta = solve_upper(chol_cov.T, delta_trans.T) |
298 |
| - g_delta = tau_delta.T |
299 |
| - |
300 |
| - g_cov = pt.switch(ok, g_cov, -np.nan) |
301 |
| - g_delta = pt.switch(ok, g_delta, -np.nan) |
302 |
| - |
303 |
| - return [-0.5 * g_cov * g_logp, -g_delta * g_logp] |
304 |
| - |
305 |
| - return OpFromGraph([cov, delta], [logp], grad_overrides=dlogp, inline=True) |
306 |
| - |
307 |
| - |
308 | 240 | class SplineWrapper(Op):
|
309 | 241 | """
|
310 | 242 | Creates an PyTensor operation from scipy.interpolate.UnivariateSpline
|
|
0 commit comments