class_docstr: Backward-sample implementation of product.
  
  This is agnostic to sampler implementation, and hence can be used both by
  :class:`MapRing` (temperature 0 sampling) and :class:`SampleRing`
  (temperature 1 sampling).
class_docstr_tok: ["Backward-sample","implementation","of","product",".","This","is","agnostic","to","sampler","implementation",",","and","hence","can","be","used","both","by",":","class",":","`","MapRing","`","(","temperature","0","sampling",")","and",":","class",":","`","SampleRing","`","(","temperature","1","sampling",")","."]
code: def process(self, message):
      if message is not None:
          sample_dims = message._pyro_sample_dims
          message = self.ring.broadcast(message, self.ordinal)
          if message._pyro_dims.index(SAMPLE_SYMBOL) != 0:
              dims = SAMPLE_SYMBOL + message._pyro_dims.replace(
                  SAMPLE_SYMBOL, ""
              )
              message = message.permute(
                  tuple(map(message._pyro_dims.find, dims))
              )
              message._pyro_dims = dims
              assert message.dim() == len(message._pyro_dims)
          message._pyro_sample_dims = sample_dims
          assert message.size(0) == len(message._pyro_sample_dims)
      yield self.term._pyro_backward, message
  
imports: import weakref
  from abc import ABCMeta, abstractmethod
  import torch
  from pyro.ops.einsum import contract
  from pyro.ops.einsum.adjoint import SAMPLE_SYMBOL, Backward
  from pyro.util import ignore_jit_warnings
label_desc: Use image node_id 2 for calling the _SampleProductBackward obj's underlying member method code with example usage: obj.process(message) without return types