class_docstr: A trace implementation of ELBO-based SVI that supports
  - exhaustive enumeration over discrete sample sites, and
  - local parallel sampling over any sample site in the guide.
  
  To enumerate over a sample site in the ``guide``, mark the site with either
  ``infer={'enumerate': 'sequential'}`` or
  ``infer={'enumerate': 'parallel'}``. To configure all guide sites at once,
  use :func:`~pyro.infer.enum.config_enumerate`. To enumerate over a sample
  site in the ``model``, mark the site ``infer={'enumerate': 'parallel'}``
  and ensure the site does not appear in the ``guide``.
  
  This assumes restricted dependency structure on the model and guide:
  variables outside of an :class:`~pyro.plate` can never depend on
  variables inside that :class:`~pyro.plate`.
class_docstr_tok: ["A","trace","implementation","of","ELBO-based","SVI","that","supports","-","exhaustive","enumeration","over","discrete","sample","sites",",","and","-","local","parallel","sampling","over","any","sample","site","in","the","guide",".","To","enumerate","over","a","sample","site","in","the","``","guide","``",",","mark","the","site","with","either","``","infer=","{","'enumerate","'",":","'sequential","'","}","``","or","``","infer=","{","'enumerate","'",":","'parallel","'","}","``",".","To","configure","all","guide","sites","at","once",",","use",":","func",":","`","~pyro.infer.enum.config_enumerate","`",".","To","enumerate","over","a","sample","site","in","the","``","model","``",",","mark","the","site","``","infer=","{","'enumerate","'",":","'parallel","'","}","``","and","ensure","the","site","does","not","appear","in","the","``","guide","``",".","This","assumes","restricted","dependency","structure","on","the","model","and","guide",":","variables","outside","of","an",":","class",":","`","~pyro.plate","`","can","never","depend","on","variables","inside","that",":","class",":","`","~pyro.plate","`","."]
docstr: Computes marginal distributions at each model-enumerated sample site.
  
  :returns: a dict mapping site name to marginal ``Distribution`` object
  :rtype: OrderedDict
docstr_tok: ["Computes","marginal","distributions","at","each","model-enumerated","sample","site",".",":","returns",":","a","dict","mapping","site","name","to","marginal","``","Distribution","``","object",":","rtype",":","OrderedDict"]
code: def compute_marginals(self, model, guide, *args, **kwargs):
      """
      Computes marginal distributions at each model-enumerated sample site.
  
      :returns: a dict mapping site name to marginal ``Distribution`` object
      :rtype: OrderedDict
      """
      if self.num_particles != 1:
          raise NotImplementedError(
              "TraceEnum_ELBO.compute_marginals() is not "
              "compatible with multiple particles."
          )
      model_trace, guide_trace = next(
          self._get_traces(model, guide, args, kwargs)
      )
      for site in guide_trace.nodes.values():
          if site["type"] == "sample":
              if (
                  "_enumerate_dim" in site["infer"]
                  or "_enum_total" in site["infer"]
              ):
                  raise NotImplementedError(
                      "TraceEnum_ELBO.compute_marginals() is not "
                      "compatible with guide enumeration."
                  )
      return _compute_marginals(model_trace, guide_trace)
  
imports: import queue
  import warnings
  import weakref
  from collections import OrderedDict
  import torch
  from opt_einsum import shared_intermediates
  import pyro
  import pyro.distributions
  import pyro.ops.jit
  import pyro.poutine
  from pyro.distributions.util import is_identically_zero
  from pyro.infer.elbo import ELBO
  from pyro.infer.enum import get_importance_trace, iter_discrete_escape, iter_discrete_extend
  from pyro.infer.util import Dice, is_validation_enabled
  from pyro.ops import packed
  from pyro.ops.contract import contract_tensor_tree, contract_to_tensor
  from pyro.ops.rings import SampleRing
  from pyro.poutine.enum_messenger import EnumMessenger
  from pyro.util import check_traceenum_requirements, ignore_jit_warnings, warn_if_nan
label_desc: Use image node_id 6 for calling the TraceEnum_ELBO obj's underlying member method code with example usage: obj.compute_marginals(model, guide) and returns: _compute_marginals