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.
  
  Parameters
  ==========
  
  part
      part to be decremented (topmost part on the stack)
  
  ub
      the maximum number of parts allowed in a partition
      returned by the calling traversal.
  
  lb
      The partitions produced by the calling enumeration must
      have more parts than this value.
  
  Notes
  =====
  
  Combines the constraints of _small and _large decrement
  methods.  If returns success, part has been decremented at
  least once, but perhaps by quite a bit more if needed to meet
  the lb constraint.
docstr_tok: ["Decrements","part","(","a","subrange","of","pstack",")",",","if","possible",",","returning","True","iff","the","part","was","successfully","decremented",".","Parameters","==========","part","part","to","be","decremented","(","topmost","part","on","the","stack",")","ub","the","maximum","number","of","parts","allowed","in","a","partition","returned","by","the","calling","traversal",".","lb","The","partitions","produced","by","the","calling","enumeration","must","have","more","parts","than","this","value",".","Notes","=====","Combines","the","constraints","of","_small","and","_large","decrement","methods",".","If","returns","success",",","part","has","been","decremented","at","least","once",",","but","perhaps","by","quite","a","bit","more","if","needed","to","meet","the","lb","constraint","."]
code: def decrement_part_range(self, part, lb, ub):
      """Decrements part (a subrange of pstack), if possible, returning
      True iff the part was successfully decremented.
  
      Parameters
      ==========
  
      part
          part to be decremented (topmost part on the stack)
  
      ub
          the maximum number of parts allowed in a partition
          returned by the calling traversal.
  
      lb
          The partitions produced by the calling enumeration must
          have more parts than this value.
  
      Notes
      =====
  
      Combines the constraints of _small and _large decrement
      methods.  If returns success, part has been decremented at
      least once, but perhaps by quite a bit more if needed to meet
      the lb constraint.
      """
  
      # Constraint in the range case is just enforcing both the
      # constraints from _small and _large cases.  Note the 0 as the
      # second argument to the _large call -- this is the signal to
      # decrement only as needed to for constraint enforcement.  The
      # short circuiting and left-to-right order of the 'and'
      # operator is important for this to work correctly.
      return self.decrement_part_small(
          part, ub
      ) and self.decrement_part_large(part, 0, lb)
  
label_desc: Use image node_id 7 for calling the MultisetPartitionTraverser obj's underlying member method code with example usage: obj.decrement_part_range(part, lb, ub) and returns: unknown