class_docstr: A non-identifiable model with a quartic measurement model.
  
  This distribution is defined in [1] as the posterior induced by the following
  model:
  
  ```none
  for i in range(ndims):
    theta[i] ~ Normal(loc=0, scale=1)
  F(theta) = theta[1]**2 + 3 * theta[0]**2 * (theta[0]**2 - 1)
  y ~ Normal(loc=F(theta), scale=noise_scale)
  ```
  
  with an observed `y = 1`. Note that if `ndims` is > 2, the additional
  dimensions are distributed as a standard normal.
  
  This distribution is notable for having density on a narrow manifold which
  requires small step sizes when using HMC. It also happens to be multi-modal (4
  modes), but the modes are not well separated and should not pose challenge to
  most inference methods.
  
  #### References
  
  1. Au, K. X., Graham, M. M., & Thiery, A. H. (2020). Manifold lifting: scaling
     MCMC to the vanishing noise regime. (2), 1-18. Retrieved from
     http://arxiv.org/abs/2003.03950
code: def _log_likelihood(self, value):
      theta_0_sq = value[..., 0] ** 2
      theta_1_sq = value[..., 1] ** 2
      y_hat = theta_1_sq + 3 * theta_0_sq * (theta_0_sq - 1.0)
      y = 1.0
      observation_dist = tfd.Normal(y_hat, self._noise_scale)
      return observation_dist.log_prob(y)
  
file_path: probability/spinoffs/inference_gym/inference_gym/targets/non_identifiable_quartic.py
imports: import numpy
  import tensorflow.compat.v2
  import tensorflow_probability
  from inference_gym.targets import bayesian_model
  from inference_gym.targets import model
label_desc: Use image node_id 3 for calling the NonIdentifiableQuarticMeasurementModel obj's underlying member method code with example usage: obj._log_likelihood(value) and returns: observation_dist