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.
docstr: Returns True if a new part has been created, and
  adjusts pstack, f and lpart as needed.
  
  Notes
  =====
  
  Spreads unallocated multiplicity from the current top part
  into a new part created above the current on the stack.  This
  new part is constrained to be less than or equal to the old in
  terms of the part ordering.
  
  This call does nothing (and returns False) if the current top
  part has no unallocated multiplicity.
docstr_tok: ["Returns","True","if","a","new","part","has","been","created",",","and","adjusts","pstack",",","f","and","lpart","as","needed",".","Notes","=====","Spreads","unallocated","multiplicity","from","the","current","top","part","into","a","new","part","created","above","the","current","on","the","stack",".","This","new","part","is","constrained","to","be","less","than","or","equal","to","the","old","in","terms","of","the","part","ordering",".","This","call","does","nothing","(","and","returns","False",")","if","the","current","top","part","has","no","unallocated","multiplicity","."]
code: def spread_part_multiplicity(self):
      """Returns True if a new part has been created, and
      adjusts pstack, f and lpart as needed.
  
      Notes
      =====
  
      Spreads unallocated multiplicity from the current top part
      into a new part created above the current on the stack.  This
      new part is constrained to be less than or equal to the old in
      terms of the part ordering.
  
      This call does nothing (and returns False) if the current top
      part has no unallocated multiplicity.
  
      """
      j = self.f[self.lpart]  # base of current top part
      k = self.f[
          self.lpart + 1
      ]  # ub of current; potential base of next
      base = k  # save for later comparison
  
      changed = False  # Set to true when the new part (so far) is
      # strictly less than (as opposed to less than
      # or equal) to the old.
      for j in range(self.f[self.lpart], self.f[self.lpart + 1]):
          self.pstack[k].u = self.pstack[j].u - self.pstack[j].v
          if self.pstack[k].u == 0:
              changed = True
          else:
              self.pstack[k].c = self.pstack[j].c
              if changed:  # Put all available multiplicity in this part
                  self.pstack[k].v = self.pstack[k].u
              else:  # Still maintaining ordering constraint
                  if self.pstack[k].u < self.pstack[j].v:
                      self.pstack[k].v = self.pstack[k].u
                      changed = True
                  else:
                      self.pstack[k].v = self.pstack[j].v
              k = k + 1
      if k > base:
          # Adjust for the new part on stack
          self.lpart = self.lpart + 1
          self.f[self.lpart + 1] = k
          return True
      return False
  
label_desc: Use image node_id 8 for calling the MultisetPartitionTraverser obj's underlying member method code with example usage: obj.spread_part_multiplicity() and returns: False, True