class_docstr: Normalized delta distribution binding multiple variables.
  
  There are three syntaxes supported for constructing Deltas::
  
      Delta(((name1, (point1, log_density1)),
             (name2, (point2, log_density2)),
             (name3, (point3, log_density3))))
  
  or for a single name::
  
      Delta(name, point, log_density)
  
  or for default ``log_density == 0``::
  
      Delta(name, point)
  
  :param tuple terms: A tuple of tuples of the form
      ``(name, (point, log_density))``.
class_docstr_tok: ["Normalized","delta","distribution","binding","multiple","variables",".","There","are","three","syntaxes","supported","for","constructing","Deltas",":",":","Delta","(","(","(","name1",",","(","point1",",","log_density1",")",")",",","(","name2",",","(","point2",",","log_density2",")",")",",","(","name3",",","(","point3",",","log_density3",")",")",")",")","or","for","a","single","name",":",":","Delta","(","name",",","point",",","log_density",")","or","for","default","``","log_density","==","0","``",":",":","Delta","(","name",",","point",")",":","param","tuple","terms",":","A","tuple","of","tuples","of","the","form","``","(","name",",","(","point",",","log_density",")",")","``","."]
code: def eager_reduce(self, op, reduced_vars):
      assert reduced_vars.issubset(self.inputs)
      if op in (ops.max, ops.logaddexp):
          if reduced_vars - self.fresh and self.fresh - reduced_vars:
              result = self
              if not reduced_vars.isdisjoint(self.fresh):
                  result = result.eager_reduce(
                      op, reduced_vars & self.fresh
                  )
                  if result is not self:
                      if not reduced_vars.issubset(self.fresh):
                          result = result.eager_reduce(
                              op, reduced_vars - self.fresh
                          )
                          if result is not self:
                              return result
              return None
  
          result_terms = [
              (name, (point, log_density))
              for name, (point, log_density) in self.terms
              if name not in reduced_vars
          ]
  
          result_terms, scale = [], Number(0)
          for name, (point, log_density) in self.terms:
              if name in reduced_vars:
                  # XXX obscenely wasteful - need a lazy Zero term
                  if point.inputs:
                      scale += (point == point).all().log()
                  if log_density.inputs:
                      scale += log_density * 0.0
              else:
                  result_terms.append((name, (point, log_density)))
  
          result = (
              Delta(tuple(result_terms)) + scale
              if result_terms
              else scale
          )
          return result.reduce(op, reduced_vars - self.fresh)
  
      if op is ops.add:
          raise NotImplementedError(
              "TODO Implement ops.add to simulate .to_event()."
          )
  
      return None
  
imports: from collections import OrderedDict
  from functools import reduce
  from funsor.domains import Domain, Real
  from funsor.instrument import debug_logged
  from funsor.ops import AddOp, SubOp, TransformOp
  from funsor.registry import KeyedRegistry
  from funsor.terms import Align, Binary, Funsor, FunsorMeta, Independent, Lambda, Number, Unary, Variable, eager, to_funsor
  from funsor.util import get_default_dtype
  from .None import ops
label_desc: Use image node_id 4 for calling the Delta obj's underlying member method code with example usage: obj.eager_reduce(op, reduced_vars) and returns: None, result, None, result