class_docstr: `Reducer` that computes a running covariance.
  
  By default, `CovarianceReducer` computes covariance directly over the
  latent state, ignoring kernel results; however, it can also compute
  a running covariance on samples evaluated on some arbitrary structure of
  `transform_fn`s. A `trasform_fn` is defined as any function that accepts
  the chain state and kernel results, and ouptuts a `Tensor` or nested
  structure of `Tensor`s to compute the covariance over. To be explicit,
  if we denote a `transform_fn` as f(x, y), then `CovarianceReducer` will
  compute Cov(f(x, y)). If some structure of `transform_fn`s are given,
  the final statistic (as returned by the `finalize` method) will mimic
  the results of that structure.
  
  As with all reducers, CovarianceReducer does not hold state information;
  rather, it stores supplied metadata. Intermediate calculations are held in
  a state object, which is returned via `initialize` and `one_step` method
  calls.
  
  `CovarianceReducer` is meant to fit into the larger Streaming MCMC
  framework. `RunningCovariance` in `tfp.experimental.stats` is better suited
  for more generic streaming covariance needs.
  
  There are two ways to stream over MCMC samples. The first is to manually
  wrap `CovarianceReducer` in a `tfp.experimental.mcmc.WithReductions`
  `TransitionKernel`. Doing so enables a wide variety of possible compositions.
  For example, to perform covariance calculation on samples that survive
  thinning and burn-in, `WithReductions` should wrap around an appropriate
  `SampleDiscardingKernel`.
  
  If the sole objective is to estimate covariance, it may be more convenient to
  use a pre-defined driver like `tfp.experimental.mcmc.sample_fold`.
  `sample_fold` will automatically create the Transition Kernel onion, apply
  `kernel` samples to update reducer states, and `finalize` calculations.
  
  ```
  python
  
  kernel = ...
  reducer = tfp.experimental.mcmc.CovarianceReducer()
  covariance_estimate, _, _ = tfp.experimental.mcmc.sample_fold(
      num_steps=...,
      current_state=...,
      previous_kernel_results=...,
      kernel=kernel,
      reducers=reducer,
  )
  covariance_estimate  # estimate of covariance (not `CovarianceReducerState`)
  ```
docstr: Finalizes covariance calculation from the `final_reducer_state`.
  
  Args:
    final_reducer_state: `CovarianceReducerState`s that represent the
      final running covariance state.
  
  Returns:
    covariance: an estimate of the covariance with identical structure to
      the results of `self.transform_fn`.
docstr_tok: ["Finalizes","covariance","calculation","from","the","`","final_reducer_state","`",".","Args",":","final_reducer_state",":","`","CovarianceReducerState","`","s","that","represent","the","final","running","covariance","state",".","Returns",":","covariance",":","an","estimate","of","the","covariance","with","identical","structure","to","the","results","of","`","self.transform_fn","`","."]
code: def finalize(self, final_reducer_state):
      """Finalizes covariance calculation from the `final_reducer_state`.
  
      Args:
        final_reducer_state: `CovarianceReducerState`s that represent the
          final running covariance state.
  
      Returns:
        covariance: an estimate of the covariance with identical structure to
          the results of `self.transform_fn`.
      """
      with tf.name_scope(
          mcmc_util.make_name(
              self.name, "covariance_reducer", "finalize"
          )
      ):
  
          def finalize(cov):
              return cov.covariance(ddof=self.ddof)
  
          return nest.map_structure(
              finalize, final_reducer_state.cov_state
          )
  
imports: import collections
  import tensorflow.compat.v2
  from tensorflow_probability.python.experimental.mcmc import reducer
  from tensorflow_probability.python.experimental.stats import sample_stats
  from tensorflow_probability.python.internal import nest_util
  from tensorflow_probability.python.mcmc.internal import util
  from tensorflow.python.util import nest
label_desc: Use image node_id 4 for calling the CovarianceReducer obj's underlying member method code with example usage: obj.finalize(final_reducer_state) and returns: nest, cov