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: Decrements part (a subrange of pstack), if possible, returning
  True iff the part was successfully decremented.
  
  If you think of the v values in the part as a multi-digit
  integer (least significant digit on the right) this is
  basically decrementing that integer, but with the extra
  constraint that the leftmost digit cannot be decremented to 0.
  
  Parameters
  ==========
  
  part
     The part, represented as a list of PartComponent objects,
     which is to be decremented.
docstr_tok: ["Decrements","part","(","a","subrange","of","pstack",")",",","if","possible",",","returning","True","iff","the","part","was","successfully","decremented",".","If","you","think","of","the","v","values","in","the","part","as","a","multi-digit","integer","(","least","significant","digit","on","the","right",")","this","is","basically","decrementing","that","integer",",","but","with","the","extra","constraint","that","the","leftmost","digit","can","not","be","decremented","to","0",".","Parameters","==========","part","The","part",",","represented","as","a","list","of","PartComponent","objects",",","which","is","to","be","decremented","."]
code: def decrement_part(self, part):
      """Decrements part (a subrange of pstack), if possible, returning
      True iff the part was successfully decremented.
  
      If you think of the v values in the part as a multi-digit
      integer (least significant digit on the right) this is
      basically decrementing that integer, but with the extra
      constraint that the leftmost digit cannot be decremented to 0.
  
      Parameters
      ==========
  
      part
         The part, represented as a list of PartComponent objects,
         which is to be decremented.
  
      """
      plen = len(part)
      for j in range(plen - 1, -1, -1):
          if j == 0 and part[j].v > 1 or j > 0 and part[j].v > 0:
              # found val to decrement
              part[j].v -= 1
              # Reset trailing parts back to maximum
              for k in range(j + 1, plen):
                  part[k].v = part[k].u
              return True
      return False
  
label_desc: Use image node_id 4 for calling the MultisetPartitionTraverser obj's underlying member method code with example usage: obj.decrement_part(part) and returns: False, True