code: def jensen_shannon(logu, self_normalized=False, name=None):
      """The Jensen-Shannon Csiszar-function in log-space.
  
      A Csiszar-function is a member of,
  
      ```none
      F = { f:R_+ to R : f convex }.
      ```
  
      When `self_normalized = True`, the Jensen-Shannon Csiszar-function is:
  
      ```none
      f(u) = u log(u) - (1 + u) log(1 + u) + (u + 1) log(2)
      ```
  
      When `self_normalized = False` the `(u + 1) log(2)` term is omitted.
  
      Observe that as an f-Divergence, this Csiszar-function implies:
  
      ```none
      D_f[p, q] = KL[p, m] + KL[q, m]
      m(x) = 0.5 p(x) + 0.5 q(x)
      ```
  
      In a sense, this divergence is the "reverse" of the Arithmetic-Geometric
      f-Divergence.
  
      This Csiszar-function induces a symmetric f-Divergence, i.e.,
      `D_f[p, q] = D_f[q, p]`.
  
      Warning: this function makes non-log-space calculations and may therefore be
      numerically unstable for `|logu| >> 0`.
  
      For more information, see:
        Lin, J. "Divergence measures based on the Shannon entropy." IEEE Trans.
        Inf. Th., 37, 145-151, 1991.
  
      Args:
        logu: `float`-like `Tensor` representing `log(u)` from above.
        self_normalized: Python `bool` indicating whether `f'(u=1)=0`. When
          `f'(u=1)=0` the implied Csiszar f-Divergence remains non-negative even
          when `p, q` are unnormalized measures.
        name: Python `str` name prefixed to Ops created by this function.
  
      Returns:
        jensen_shannon_of_u: `float`-like `Tensor` of the Csiszar-function
          evaluated at `u = exp(logu)`.
      """
  
      with tf.name_scope(name or "jensen_shannon"):
          logu = tf.convert_to_tensor(logu, name="logu")
          y = tf.nn.softplus(logu)
          if self_normalized:
              y -= np.log(2.0)
          # TODO(jvdillon): Maybe leverage the fact that:
          # (x-sp(x))*exp(x) approx= expm1(-1.1x + 0.5) for x>12?
          # Basically, take advantage of x approx= softplus(x) for x>>0.
          return (logu - y) * tf.exp(logu) - y
  
imports: import enum
  import functools
  import warnings
  import numpy
  import tensorflow.compat.v2
  from tensorflow_probability.python import monte_carlo
  from tensorflow_probability.python.internal import dtype_util
  from tensorflow_probability.python.internal import nest_util
  from tensorflow_probability.python.internal import prefer_static
  from tensorflow_probability.python.internal import samplers
  from tensorflow_probability.python.internal.reparameterization import FULLY_REPARAMETERIZED
  from tensorflow_probability.python.stats.leave_one_out import log_soomean_exp
  from tensorflow.python.util import deprecation
label_desc: Use image node_id 5 for calling a global function with example usage: jensen_shannon(logu, _normalized, name) and returns: unknown