class_docstr: Module that outputs a Gaussian Mixture Distribution.
docstr: Run the networks through inputs.
  
  Args:
    inputs: hidden activations of the policy network body.
    low_noise_policy: whether to set vanishingly small scales for each
      component. If this flag is set to True, the policy is effectively run
      without Gaussian noise.
  
  Returns:
    Mixture Gaussian distribution.
docstr_tok: ["Run","the","networks","through","inputs",".","Args",":","inputs",":","hidden","activations","of","the","policy","network","body",".","low_noise_policy",":","whether","to","set","vanishingly","small","scales","for","each","component",".","If","this","flag","is","set","to","True",",","the","policy","is","effectively","run","without","Gaussian","noise",".","Returns",":","Mixture","Gaussian","distribution","."]
code: def __call__(
      self, inputs: tf.Tensor, low_noise_policy: bool = False
  ) -> tfd.Distribution:
      """Run the networks through inputs.
  
      Args:
        inputs: hidden activations of the policy network body.
        low_noise_policy: whether to set vanishingly small scales for each
          component. If this flag is set to True, the policy is effectively run
          without Gaussian noise.
  
      Returns:
        Mixture Gaussian distribution.
      """
  
      # Compute logits, locs, and scales if necessary.
      logits = self._logit_layer(inputs)
      locs = self._loc_layer(inputs)
  
      # When a low_noise_policy is requested, set the scales to its minimum value.
      if low_noise_policy:
          scales = tf.fill(locs.shape, _MIN_SCALE)
      else:
          scales = self._scale_layer(inputs)
          scales = (
              self._scale_factor * tf.nn.softplus(scales) + _MIN_SCALE
          )
  
      if self._multivariate:
          shape = [-1, self._num_components, self._num_dimensions]
          # Reshape the mixture's location and scale parameters appropriately.
          locs = tf.reshape(locs, shape)
          scales = tf.reshape(scales, shape)
          # In this case, no need to reshape logits as they are in the correct shape
          # already, namely [batch_size, num_components].
          components_distribution = tfd.MultivariateNormalDiag(
              loc=locs, scale_diag=scales
          )
      else:
          shape = [-1, self._num_dimensions, self._num_components]
          # Reshape the mixture's location and scale parameters appropriately.
          locs = tf.reshape(locs, shape)
          scales = tf.reshape(scales, shape)
          components_distribution = tfd.Normal(loc=locs, scale=scales)
          logits = tf.reshape(logits, shape)
  
      # Create the mixture distribution.
      distribution = tfd.MixtureSameFamily(
          mixture_distribution=tfd.Categorical(logits=logits),
          components_distribution=components_distribution,
      )
  
      if not self._multivariate:
          distribution = tfd.Independent(distribution)
  
      return distribution
  
imports: import types
  from typing import Optional, Union
  from absl import logging
  from acme.tf.networks import distributions
  import numpy
  import sonnet
  import tensorflow
  import tensorflow_probability
label_desc: Use image node_id 2 for calling the GaussianMixture obj's underlying member method code with example usage: obj.__call__(inputs, low_noise_policy) and returns: distribution