class_docstr: Container class to combine different :class:`MultiOptimizer` instances for
  different parameters.
  
  :param list parts: A list of ``(names, optim)`` pairs, where each
      ``names`` is a list of parameter names, and each ``optim`` is a
      :class:`MultiOptimizer` or :class:`~pyro.optim.optim.PyroOptim` object
      to be used for the named parameters. Together the ``names`` should
      partition up all desired parameters to optimize.
  :raises ValueError: if any name is optimized by multiple optimizers.
code: def __init__(self, parts: List) -> None:
      optim_dict: Dict = {}
      self.parts = []
      for names_part, optim in parts:
          if isinstance(optim, PyroOptim):
              optim = PyroMultiOptimizer(optim)
          for name in names_part:
              if name in optim_dict:
                  raise ValueError(
                      "Attempted to optimize parameter '{}' by two different optimizers: "
                      "{} vs {}".format(name, optim_dict[name], optim)
                  )
              optim_dict[name] = optim
          self.parts.append((names_part, optim))
  
imports: from typing import Dict, List
  import torch
  from pyro.ops.newton import newton_step
  from pyro.optim.optim import PyroOptim
label_desc: Use image node_id 1 to create a new MixedMultiOptimizer object from inherited base classes: MultiOptimizer with example: obj = MixedMultiOptimizer(parts)