# AePPL and convolutions

What to do when the sum has no closed-form posterior?

import aeppl import aesara.tensor as at srng = at.random.RandomStream(0) x_rv = srng.normal(0, 1) y_rv = srng.lognormal(0, 1) z = x_rv + y_rv logprob, (x_vv, z_vv) = aeppl.joint_logprob(x_rv, z)

In this case we should be able to compute the density by binding \(x_{vv}\) to the density of \(x_rv\), and binding \(z_{vv} - x_{vv}\) to the density of \(y_{rv}\).

Now slightly more complicated. Is this defined without \(x_{rv}\) or \(y_{rv}\) being stochastic? (I don't think so). And if it is not, then how do we proceed about tying the values taken by \(x_{rv}\) and \(y_{rv}\) together?

import aeppl import aesara.tensor as at srng = at.random.RandomStream(0) mu_rv = srng.normal(0, 1) sigma_rv = srng.halfcauchy(1) x_rv = srng.normal(mu_rv, 1) y_rv = srng.lognormal(0, sigma_rv) z = x_rv + y_rv logprob, (mu_vv, sigma_vv, z_vv) = aeppl.joint_logprob(x_rv, z)

Finally the following example:

import aeppl import aesara.tensor as at srng = at.random.RandomStream(0) a = srng.normal(0, 1) b = srng.normal(0, 1) c = srng.normal(0, 1) d = srng.normal(0, 1) X_rv = at.uniform(a, b) Y_rv = at.uniform(c, d) Z_rv = X_rv + Y_rv logprob, value_variables = aeppl.joint_logprob(a, b, c, d, Z_rv)

In this case \(Z\)'s density has a closed-form expression; \(Z_{rv}\) has a trapezoidal distribution. So we should be able to replace this sum with this distribution directly.

A list of cases where the convolution of two or more random variables has a closed-form solutions, or rather is a known measure, is available on Wikipedia.