class_docstr: Skellam distribution.
  
  The Skellam distribution is parameterized by two rate parameters,
  `rate1` and `rate2`. Its samples are defined as:
  
  ```
  x ~ Poisson(rate1)
  y ~ Poisson(rate2)
  z = x - y
  z ~ Skellam(rate1, rate2)
  ```
  where the samples `x` and `y` are assumed to be independent.
  
  #### Mathematical Details
  
  The probability mass function (pmf) is,
  
  ```none
  pmf(k; l1, l2) = (l1 / l2) ** (k / 2) * I_k(2 * sqrt(l1 * l2)) / Z
  Z = exp(l1 + l2).
  ```
  
  where `rate1 = l1`, `rate2 = l2`,  `Z` is the normalizing constant
  and `I_k` is the modified bessel function of the first kind.
code: def _log_prob(self, x):
      # The log-probability at negative points is always -inf.
      # Catch such x's and set the output value accordingly.
      lr1, r1, lr2, r2 = self._all_rate_parameters()
  
      safe_x = (
          tf.floor(x) if self.force_probs_to_zero_outside_support else x
      )
      y = tf.math.multiply_no_nan(0.5 * (lr1 - lr2), safe_x)
      numpy_dtype = dtype_util.as_numpy_dtype(y.dtype)
  
      # When both rates are zero, the above computation gives a NaN, whereas
      # it should give zero.
      y = tf.where(
          tf.math.equal(r1, 0.0) & tf.math.equal(r2, 0.0),
          numpy_dtype(0.0),
          y,
      )
      y = (
          y
          + bessel.log_bessel_ive(safe_x, 2.0 * tf.math.sqrt(r1 * r2))
          - tf.math.square(tf.math.sqrt(r1) - tf.math.sqrt(r2))
      )
      y = tf.where(tf.math.equal(x, safe_x), y, numpy_dtype(-np.inf))
      if self.force_probs_to_zero_outside_support:
          # Ensure the gradient wrt `rate` is zero at non-integer points.
          y = tf.where(
              (y < 0.0) & tf.math.is_inf(y), numpy_dtype(-np.inf), y
          )
      return y
  
imports: import numpy
  import tensorflow.compat.v2
  from tensorflow_probability.python.bijectors import softplus
  from tensorflow_probability.python.distributions import distribution
  from tensorflow_probability.python.distributions import poisson
  from tensorflow_probability.python.internal import assert_util
  from tensorflow_probability.python.internal import distribution_util
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import parameter_properties
  from tensorflow_probability.python.internal import prefer_static
  from tensorflow_probability.python.internal import reparameterization
  from tensorflow_probability.python.internal import samplers
  from tensorflow_probability.python.internal import tensor_util
  from tensorflow_probability.python.math import bessel
label_desc: Use image node_id 10 for calling the Skellam obj's underlying member method code with example usage: obj._log_prob(x) and returns: y