Hello,

Building from my previous post #5950, I am trying to calculate the log probability of samples from an SVI autoguide using the `log_density`

utility function. However, in my current use case, I only have samples from the constrained space. With an autoguide, `log_density`

requires both the `unconstrained_samples`

and `constrained_samples`

to compute the log probability. Therefore, I need to convert `constrained_samples`

→ `unconstrained_samples`

if I want to perform the calculation.

How can I make the conversion `constrained_samples`

→ `unconstrained_samples`

? I.e., I’m trying to construct the inverse of `guide._unpack_and_constrain`

.

**Update:** I’ve made the conversions manually for each latent variable using the approach suggested in #2857.2. This is done by using the `biject_to`

function and the supports of the constrained latent distributions.

However, I am finding small differences between the `_auto_latent`

produced using `Predictive(guide, ...)`

and the `unconstrained_samples`

obtained by applying the bijection on `constrained_samples`

, also obtained with `Predictive(guide, ...)`

. Though these differences are small, `log_density`

assumes a particular bijection, so the small differences cause us to exit the support of `log_density`

and obtain `-Inf`

.

Is there a better way to either calculate the `log_density`

with only constrained samples or a way to get the unconstrained samples in a way that matches `Predictive(guide, ...`

)?

I think `log_density`

works for constrained samples. I’m not sure why you require unconstrained samples in your pipeline.

Hi @fehiepsi. I tried computing `log_density`

without specifying values for `_auto_latent`

. I still get `-Inf`

, probably because `_auto_latent`

values are generated when seeding the guide and those seeded values are used in the computation if no `_auto_latent`

samples are inputted manually. Note, the `log_density`

calculation works when I input the `_auto_latent`

variables produced with `Predictive(guide, ...)`

.

I don’t require the unconstrained samples. All I want is the `log_density`

of the constrained samples `z`

from the guide `q(z)`

. The reason why I need the unconstrained samples is because I haven’t been able to compute the `log_density`

without their values.

Would it help if I provide an example?

Thanks!

I see. How about using _ravel_dict? First, you convert constrained to unconstrained samples, then, using `_ravel_dict`

to obtain `_auto_latent`

samples. Finally, you can using log_density with that `_auto_latent`

.

@fehiepsi, I found an alternative to this approach. I was considering a toy example where my latent variables are constrained. However, for my actual problem, the subset of latent variables that I am interested in are actually unconstrained. Since my guide is an `AutoMultivariateNormal`

, I don’t have to worry about the transformation and can compute the log probability using the `MultivariateNormal`

distribution. This calculation was successful.

Regarding the `-Inf`

that I was getting for the `log_density`

, this was actually due to the fact that I defined my guide and samples using `float32`

numbers, but switched to `float64`

later in the pipeline. After making this fix, I am still getting `-Inf`

for the constrained samples that I am using to calculate the log probability. I also tried `_ravel_dict`

and found no improvement.

Thanks for the help!