class_docstr: Dirichlet-Multinomial compound distribution.
  
  The Dirichlet-Multinomial distribution is parameterized by a (batch of)
  length-`K` `concentration` vectors (`K > 1`) and a `total_count` number of
  trials, i.e., the number of trials per draw from the DirichletMultinomial. It
  is defined over a (batch of) length-`K` vector `counts` such that
  `tf.reduce_sum(counts, -1) = total_count`. The Dirichlet-Multinomial is
  identically the Beta-Binomial distribution when `K = 2`.
  
  #### Mathematical Details
  
  The Dirichlet-Multinomial is a distribution over `K`-class counts, i.e., a
  length-`K` vector of non-negative integer `counts = n = [n_0, ..., n_{K-1}]`.
  
  The probability mass function (pmf) is,
  
  ```none
  pmf(n; alpha, N) = Beta(alpha + n) / (prod_j n_j!) / Z
  Z = Beta(alpha) / N!
  ```
  
  where:
  
  * `concentration = alpha = [alpha_0, ..., alpha_{K-1}]`, `alpha_j > 0`,
  * `total_count = N`, `N` a positive integer,
  * `N!` is `N` factorial, and,
  * `Beta(x) = prod_j Gamma(x_j) / Gamma(sum_j x_j)` is the
    [multivariate beta function](
    https://en.wikipedia.org/wiki/Beta_function#Multivariate_beta_function),
    and,
  * `Gamma` is the [gamma function](
    https://en.wikipedia.org/wiki/Gamma_function).
  
  Dirichlet-Multinomial is a [compound distribution](
  https://en.wikipedia.org/wiki/Compound_probability_distribution), i.e., its
  samples are generated as follows.
  
    1. Choose class probabilities:
       `probs = [p_0,...,p_{K-1}] ~ Dir(concentration)`
    2. Draw integers:
       `counts = [n_0,...,n_{K-1}] ~ Multinomial(total_count, probs)`
  
  The last `concentration` dimension parametrizes a single Dirichlet-Multinomial
  distribution. When calling distribution functions (e.g., `dist.prob(counts)`),
  `concentration`, `total_count` and `counts` are broadcast to the same shape.
  The last dimension of `counts` corresponds single Dirichlet-Multinomial
  distributions.
  
  Distribution parameters are automatically broadcast in all functions; see
  examples for details.
  
  #### Pitfalls
  
  The number of classes, `K`, must not exceed:
  - the largest integer representable by `self.dtype`, i.e.,
    `2**(mantissa_bits+1)` (IEE754),
  - the maximum `Tensor` index, i.e., `2**31-1`.
  
  In other words,
  
  ```python
  K <= min(2**31-1, {
    tf.float16: 2**11,
    tf.float32: 2**24,
    tf.float64: 2**53 }[param.dtype])
  ```
  
  Note: This condition is validated only when `self.validate_args = True`.
  
  #### Examples
  
  ```python
  alpha = [1., 2., 3.]
  n = 2.
  dist = DirichletMultinomial(n, alpha)
  ```
  
  Creates a 3-class distribution, with the 3rd class is most likely to be
  drawn.
  The distribution functions can be evaluated on counts.
  
  ```python
  # counts same shape as alpha.
  counts = [0., 0., 2.]
  dist.prob(counts)  # Shape []
  
  # alpha will be broadcast to [[1., 2., 3.], [1., 2., 3.]] to match counts.
  counts = [[1., 1., 0.], [1., 0., 1.]]
  dist.prob(counts)  # Shape [2]
  
  # alpha will be broadcast to shape [5, 7, 3] to match counts.
  counts = [[...]]  # Shape [5, 7, 3]
  dist.prob(counts)  # Shape [5, 7]
  ```
  
  Creates a 2-batch of 3-class distributions.
  
  ```python
  alpha = [[1., 2., 3.], [4., 5., 6.]]  # Shape [2, 3]
  n = [3., 3.]
  dist = DirichletMultinomial(n, alpha)
  
  # counts will be broadcast to [[2., 1., 0.], [2., 1., 0.]] to match alpha.
  counts = [2., 1., 0.]
  dist.prob(counts)  # Shape [2]
  ```
docstr: Initialize a batch of DirichletMultinomial distributions.
  
  Args:
    total_count:  Non-negative floating point tensor, whose dtype is the same
      as `concentration`. The shape is broadcastable to `[N1,..., Nm]` with
      `m >= 0`. Defines this as a batch of `N1 x ... x Nm` different
      Dirichlet multinomial distributions. Its components should be equal to
      integer values.
    concentration: Positive floating point tensor, whose dtype is the
      same as `n` with shape broadcastable to `[N1,..., Nm, K]` `m >= 0`.
      Defines this as a batch of `N1 x ... x Nm` different `K` class Dirichlet
      multinomial distributions.
    validate_args: Python `bool`, default `False`. When `True` distribution
      parameters are checked for validity despite possibly degrading runtime
      performance. When `False` invalid inputs may silently render incorrect
      outputs.
    allow_nan_stats: Python `bool`, default `True`. When `True`, statistics
      (e.g., mean, mode, variance) use the value "`NaN`" to indicate the
      result is undefined. When `False`, an exception is raised if one or
      more of the statistic's batch members are undefined.
    name: Python `str` name prefixed to Ops created by this class.
docstr_tok: ["Initialize","a","batch","of","DirichletMultinomial","distributions",".","Args",":","total_count",":","Non-negative","floating","point","tensor",",","whose","dtype","is","the","same","as","`","concentration","`",".","The","shape","is","broadcastable","to","`","[","N1",",","...",",","Nm","]","`","with","`","m",">","=","0","`",".","Defines","this","as","a","batch","of","`","N1","x","...","x","Nm","`","different","Dirichlet","multinomial","distributions",".","Its","components","should","be","equal","to","integer","values",".","concentration",":","Positive","floating","point","tensor",",","whose","dtype","is","the","same","as","`","n","`","with","shape","broadcastable","to","`","[","N1",",","...",",","Nm",",","K","]","`","`","m",">","=","0","`",".","Defines","this","as","a","batch","of","`","N1","x","...","x","Nm","`","different","`","K","`","class","Dirichlet","multinomial","distributions",".","validate_args",":","Python","`","bool","`",",","default","`","False","`",".","When","`","True","`","distribution","parameters","are","checked","for","validity","despite","possibly","degrading","runtime","performance",".","When","`","False","`","invalid","inputs","may","silently","render","incorrect","outputs",".","allow_nan_stats",":","Python","`","bool","`",",","default","`","True","`",".","When","`","True","`",",","statistics","(","e.g.",",","mean",",","mode",",","variance",")","use","the","value","``","`","NaN","`","``","to","indicate","the","result","is","undefined",".","When","`","False","`",",","an","exception","is","raised","if","one","or","more","of","the","statistic","'s","batch","members","are","undefined",".","name",":","Python","`","str","`","name","prefixed","to","Ops","created","by","this","class","."]
code: def __init__(
      self,
      total_count,
      concentration,
      validate_args=False,
      allow_nan_stats=True,
      name="DirichletMultinomial",
  ):
      """Initialize a batch of DirichletMultinomial distributions.
  
      Args:
        total_count:  Non-negative floating point tensor, whose dtype is the same
          as `concentration`. The shape is broadcastable to `[N1,..., Nm]` with
          `m >= 0`. Defines this as a batch of `N1 x ... x Nm` different
          Dirichlet multinomial distributions. Its components should be equal to
          integer values.
        concentration: Positive floating point tensor, whose dtype is the
          same as `n` with shape broadcastable to `[N1,..., Nm, K]` `m >= 0`.
          Defines this as a batch of `N1 x ... x Nm` different `K` class Dirichlet
          multinomial distributions.
        validate_args: Python `bool`, default `False`. When `True` distribution
          parameters are checked for validity despite possibly degrading runtime
          performance. When `False` invalid inputs may silently render incorrect
          outputs.
        allow_nan_stats: Python `bool`, default `True`. When `True`, statistics
          (e.g., mean, mode, variance) use the value "`NaN`" to indicate the
          result is undefined. When `False`, an exception is raised if one or
          more of the statistic's batch members are undefined.
        name: Python `str` name prefixed to Ops created by this class.
      """
      parameters = dict(locals())
      with ops.name_scope(
          name, values=[total_count, concentration]
      ) as name:
          # Broadcasting works because:
          # * The broadcasting convention is to prepend dimensions of size [1], and
          #   we use the last dimension for the distribution, whereas
          #   the batch dimensions are the leading dimensions, which forces the
          #   distribution dimension to be defined explicitly (i.e. it cannot be
          #   created automatically by prepending). This forces enough explicitness.
          # * All calls involving `counts` eventually require a broadcast between
          #  `counts` and concentration.
          self._total_count = ops.convert_to_tensor(
              total_count, name="total_count"
          )
          if validate_args:
              self._total_count = distribution_util.embed_check_nonnegative_integer_form(
                  self._total_count
              )
          self._concentration = self._maybe_assert_valid_concentration(
              ops.convert_to_tensor(
                  concentration, name="concentration"
              ),
              validate_args,
          )
          self._total_concentration = math_ops.reduce_sum(
              self._concentration, -1
          )
      super(DirichletMultinomial, self).__init__(
          dtype=self._concentration.dtype,
          validate_args=validate_args,
          allow_nan_stats=allow_nan_stats,
          reparameterization_type=distribution.NOT_REPARAMETERIZED,
          parameters=parameters,
          graph_parents=[self._total_count, self._concentration],
          name=name,
      )
  
imports: from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import ops
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import check_ops
  from tensorflow.python.ops import control_flow_ops
  from tensorflow.python.ops import math_ops
  from tensorflow.python.ops import random_ops
  from tensorflow.python.ops import special_math_ops
  from tensorflow.python.ops.distributions import distribution
  from tensorflow.python.ops.distributions import util
  from tensorflow.python.util import deprecation
  from tensorflow.python.util.tf_export import tf_export
label_desc: Use image node_id 1 to create a new DirichletMultinomial object from inherited base classes: distribution with example: obj = DirichletMultinomial(total_count, concentration, validate_args, allow_nan_stats, name)