key = jax.random.PRNGKey(1)
n = 100_000
print(f'{"d":>3} {"estimate / Z":>13} {"predicted rel. std. error":>26} '
f'{"effective samples":>18}')
for d in (1, 2, 4, 8, 16, 32):
key, subkey = jax.random.split(key)
x = jax.random.normal(subkey, (n, d)) # proposal q = N(0, I)
log_w = x.sum(1) - d / 2 # log (w / Z)
log_sum = jax.nn.logsumexp(log_w, 0)
estimate = jnp.exp(log_sum - math.log(n))
ess = jnp.exp(2 * log_sum - jax.nn.logsumexp(2 * log_w, 0))
print(f'{d:>3} {estimate:>13.3f} {math.sqrt((math.exp(d) - 1) / n):>26.3g} '
f'{ess:>18.1f}')