class_docstr: A trace-based implementation of Tensor Monte Carlo [1]
  by way of Tensor Variable Elimination [2] that supports:
  - local parallel sampling over any sample site in the model or guide
  - exhaustive enumeration over any sample site in the model or guide
  
  To take multiple samples, mark the site with
  ``infer={'enumerate': 'parallel', 'num_samples': N}``.
  To configure all sites in a model or guide at once,
  use :func:`~pyro.infer.enum.config_enumerate` .
  To enumerate or sample a sample site in the ``model``,
  mark the site 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` .
  
  References
  
  [1] `Tensor Monte Carlo: Particle Methods for the GPU Era`,
      Laurence Aitchison (2018)
  
  [2] `Tensor Variable Elimination for Plated Factor Graphs`,
      Fritz Obermeyer, Eli Bingham, Martin Jankowiak, Justin Chiu, Neeraj Pradhan,
      Alexander Rush, Noah Goodman (2019)
docstr: Returns a single trace from the guide, and the model that is run
  against it.
docstr_tok: ["Returns","a","single","trace","from","the","guide",",","and","the","model","that","is","run","against","it","."]
code: def _get_trace(self, model, guide, args, kwargs):
      """
      Returns a single trace from the guide, and the model that is run
      against it.
      """
      model_trace, guide_trace = get_importance_trace(
          "flat", self.max_plate_nesting, model, guide, args, kwargs
      )
  
      if is_validation_enabled():
          check_traceenum_requirements(model_trace, guide_trace)
  
          has_enumerated_sites = any(
              site["infer"].get("enumerate")
              for trace in (guide_trace, model_trace)
              for name, site in trace.nodes.items()
              if site["type"] == "sample"
          )
  
          if (
              self.strict_enumeration_warning
              and not has_enumerated_sites
          ):
              warnings.warn(
                  "Found no sample sites configured for enumeration. "
                  "If you want to enumerate sites, you need to @config_enumerate or set "
                  'infer={"enumerate": "sequential"} or infer={"enumerate": "parallel"}? '
                  "If you do not want to enumerate, consider using Trace_ELBO instead."
              )
  
      model_trace.compute_score_parts()
      guide_trace.pack_tensors()
      model_trace.pack_tensors(guide_trace.plate_to_symbol)
      return model_trace, guide_trace
  
imports: import queue
  import warnings
  import torch
  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 compute_site_dice_factor, is_validation_enabled, torch_item
  from pyro.ops import packed
  from pyro.ops.contract import einsum
  from pyro.poutine.enum_messenger import EnumMessenger
  from pyro.util import check_traceenum_requirements, warn_if_nan
label_desc: Use image node_id 1 for calling the TraceTMC_ELBO obj's underlying member method code with example usage: obj._get_trace(model, guide, args, kwargs) and returns: model_trace,  guide_trace