class_docstr: Creates a banana-shaped distribution.
  
  This distribution was first described in [1]. The distribution is constructed
  by transforming a 2-D normal distribution with scale [10, 1] by shifting the
  second dimension by `curvature * (x0**2 - 100)` where `x0` is the value of
  the first dimension. If N > 2 dimensions are requested, the remaining
  dimensions are distributed as a standard normal.
  
  ```none
  x[0] ~ Normal(loc=0, scale=10)
  x[1] ~ Normal(loc=curvature * (x[0]**2 - 100), scale=1)
  for i in range(2, ndims):
    x[i] ~ Normal(loc=0, scale=1)
  ```
  
  This distribution is notable for having relatively narrow tails, while being
  derived from a simple, volume-preserving transformation of a normal
  distribution. Despite this simplicity, some inference algorithms have trouble
  sampling from this distribution.
  
  #### References
  
  1. Haario, H., Saksman, E., & Tamminen, J. (1999). Adaptive proposal
     distribution for random walk Metropolis algorithm. Computational
     Statistics, 14(3), 375-396.
code: def _unnormalized_log_prob(self, value):
      return self._banana.log_prob(value)
  
file_path: probability/spinoffs/inference_gym/inference_gym/targets/banana.py
imports: import numpy
  import tensorflow.compat.v2
  import tensorflow_probability
  from tensorflow_probability.python.internal import prefer_static
  from inference_gym.targets import model
label_desc: Use image node_id 2 for calling the Banana obj's underlying member method code with example usage: obj._unnormalized_log_prob(value) and returns: self