class_docstr: Has methods to ``enumerate`` and ``count`` the partitions of a multiset.
  
  This implements a refactored and extended version of Knuth's algorithm
  7.1.2.5M [AOCP]_."
  
  The enumeration methods of this class are generators and return
  data structures which can be interpreted by the same visitor
  functions used for the output of ``multiset_partitions_taocp``.
  
  Examples
  ========
  
  >>> from sympy.utilities.enumerative import MultisetPartitionTraverser
  >>> m = MultisetPartitionTraverser()
  >>> m.count_partitions([4,4,4,2])
  127750
  >>> m.count_partitions([3,3,3])
  686
  
  See Also
  ========
  
  multiset_partitions_taocp
  sympy.utilities.iterables.multiset_partitions
  
  References
  ==========
  
  .. [AOCP] Algorithm 7.1.2.5M in Volume 4A, Combinatoral Algorithms,
         Part 1, of The Art of Computer Programming, by Donald Knuth.
  
  .. [Factorisatio] On a Problem of Oppenheim concerning
         "Factorisatio Numerorum" E. R. Canfield, Paul Erdos, Carl
         Pomerance, JOURNAL OF NUMBER THEORY, Vol. 17, No. 1. August
         1983.  See section 7 for a description of an algorithm
         similar to Knuth's.
  
  .. [Yorgey] Generating Multiset Partitions, Brent Yorgey, The
         Monad.Reader, Issue 8, September 2007.
code: def __init__(self):
      self.debug = False
      # TRACING variables.  These are useful for gathering
      # statistics on the algorithm itself, but have no particular
      # benefit to a user of the code.
      self.k1 = 0
      self.k2 = 0
      self.p1 = 0
      self.pstack = None
      self.f = None
      self.lpart = 0
      self.discarded = 0
      # dp_stack is list of lists of (part_key, start_count) pairs
      self.dp_stack = []
  
      # dp_map is map part_key-> count, where count represents the
      # number of multiset which are descendants of a part with this
      # key, **or any of its decrements**
  
      # Thus, when we find a part in the map, we add its count
      # value to the running total, cut off the enumeration, and
      # backtrack
  
      if not hasattr(self, "dp_map"):
          self.dp_map = {}
  
label_desc: Use image node_id 1 to create a new MultisetPartitionTraverser object  with example: obj = MultisetPartitionTraverser()