docstr: Pass a message from this node to the
  recipient node during propagation.
  
  NB: It may turnout at this point that
  after initializing the potential
  Truth table on the JT we could quite
  simply construct a factor graph
  from the JT and use the factor
  graph sum product propagation.
  In theory this should be the same
  and since the semantics are already
  worked out it would be easier.
docstr_tok: ["Pass","a","message","from","this","node","to","the","recipient","node","during","propagation",".","NB",":","It","may","turnout","at","this","point","that","after","initializing","the","potential","Truth","table","on","the","JT","we","could","quite","simply","construct","a","factor","graph","from","the","JT","and","use","the","factor","graph","sum","product","propagation",".","In","theory","this","should","be","the","same","and","since","the","semantics","are","already","worked","out","it","would","be","easier","."]
code: def pass_message(self, target):
      """Pass a message from this node to the
      recipient node during propagation.
  
      NB: It may turnout at this point that
      after initializing the potential
      Truth table on the JT we could quite
      simply construct a factor graph
      from the JT and use the factor
      graph sum product propagation.
      In theory this should be the same
      and since the semantics are already
      worked out it would be easier."""
  
      # Find the sepset node between the
      # source and target nodes.
      sepset_node = list(
          set(self.neighbours).intersection(target.neighbours)
      )[0]
  
      logging.debug(
          "Pass message from: %s to: %s", self.name, target.name
      )
      # Step 1: projection
      logging.debug(
          "Project into the Sepset node: %s", str(sepset_node)
      )
      self.project(sepset_node)
  
      logging.debug(
          " Send the summed marginals to the target: %s ",
          str(sepset_node),
      )
  
      # Step 2 absorbtion
      self.absorb(sepset_node, target)
  
imports: import copy
  import heapq
  import logging
  from collections import defaultdict
  from io import StringIO
  from itertools import combinations, product
  from random import choice, random
  from .exceptions import VariableNotInGraphError, VariableValueNotInDomainError
  from .graph import Node, UndirectedGraph, UndirectedNode, connect
  from .utils import get_args, get_original_factors
label_desc: Use image node_id 4 for calling the JoinTreeCliqueNode obj's underlying member method code with example usage: obj.pass_message(target) without return types