After some changes, #14847 was merged. This means that now SymPy supports 4 different kinds of pre-defined joint distributions, as listed in the PR description. A ‘TODO’ that’s best left for later right now is adding the support the method that single probability distributions support, `variance( )`

, `expectation( )`

and `probability( )`

. While I am not sure about all the challenges that might arise while implementing these, implementing `probability`

might be a bit trickier than others due to the fact that it will require SymPy to solve inequalities in multiple variables, which is not yet supported.

Regarding compound distributions, it’s turning out to be more complicated than I expected. To start with, I am not very sure about how the result should look like. Simply leaving a compound distribution random variable in the state given by the user could be one way, but it might not be mathematically correct. For example, if a user types in the following on a python console:

```
#<import statements>
Y1 = Poisson('Y1', 2)
Y2 = Poisson('Y2', Y1)
```

Since Y2 is not a poisson random variable with a constant mean, it would be incorrect if `Y2.pspace.distribution`

returns a `PoissonDistribution`

object. Changing it to `JointDistribution`

at the time of its creation, however, is an issue because I cannot yet figure out how to reflect a given condition imposed on the latent distribution(`Y1`

in the given example).
Here’s an example of what is returned with the current changes in PR #14855

```
N1 = Normal('N1', 0, 1)
N2 = Normal('N2', N1, 2)
N = Symbol('N2')
assert simplify(N2.pspace.pdf) == sqrt(10)*exp(-N**2/10)/(10*sqrt(pi))
```