Is there a get_log_normalizer function for MCMC?

I really appreciate that there’s a get_log_normalizer implemented in pyro.infer.Importance.

I was wondering if there’s a nice way to get the log normalizer (or say, the model evidence) when I use MCMC.

In the following MWE, mcmc.get_samples() only returns sampled values, not the log weights of traces. Is there a recommended way to recover those log weights of sampled values?

import pyro
import torch
import math
import pyro.distributions as dist
import pyro.poutine as poutine
from pyro.infer import MCMC, NUTS, Importance

num_samples = 10

def model():
    p = pyro.sample(f"beta", dist.Beta(1, 1))
    pyro.sample(f"obs", dist.Bernoulli(p), obs=torch.ones(1))

if __name__ == '__main__':

    importance = Importance(model, guide=None, num_samples=num_samples)
    posterior = importance.run()
    me = posterior.get_log_normalizer()

    print(me)
    print(math.exp(me))
    # tensor(-0.6645)
    # 0.5145261908404379

    nuts_kernel = NUTS(model)
    mcmc = MCMC(nuts_kernel, num_samples=num_samples)
    mcmc.run()
    samples = mcmc.get_samples()
    traces = [
        poutine.trace(poutine.condition(model, {"beta": val})).get_trace()
        for val in samples["beta"]
    ]
    log_weights = [t.log_prob_sum() for t in traces]

    me = torch.logsumexp(torch.tensor(log_weights), dim=-1) - torch.log(torch.tensor(len(log_weights)))
    print(me)
    print(math.exp(me))

According to GitHub issue 1930 and Github issue 1727, it seems that the functionality that I need was depredated, is there a recommended way to effective do something like mcmc.log_weights, mcmc.exec_traces or EmpiricalMarginal(trace_posterior=mcmc)?

Thanks for helping.