class_docstr: Defines a configuration class from which QMix can be built.
  
  Example:
      >>> from ray.rllib.examples.env.two_step_game import TwoStepGame
      >>> from rllib_qmix.qmix import QMixConfig
      >>> config = QMixConfig()  # doctest: +SKIP
      >>> config = config.training(gamma=0.9, lr=0.01, kl_coeff=0.3)  # doctest: +SKIP
      >>> config = config.resources(num_gpus=0)  # doctest: +SKIP
      >>> config = config.rollouts(num_rollout_workers=4)  # doctest: +SKIP
      >>> print(config.to_dict())  # doctest: +SKIP
      >>> # Build an Algorithm object from the config and run 1 training iteration.
      >>> algo = config.build(env=TwoStepGame)  # doctest: +SKIP
      >>> algo.train()  # doctest: +SKIP
  
  Example:
      >>> from ray.rllib.examples.env.two_step_game import TwoStepGame
      >>> from rllib_qmix.qmix import QMixConfig
      >>> from ray import air
      >>> from ray import tune
      >>> config = QMixConfig()
      >>> # Print out some default values.
      >>> print(config.optim_alpha)  # doctest: +SKIP
      >>> # Update the config object.
      >>> config.training(  # doctest: +SKIP
      ...     lr=tune.grid_search([0.001, 0.0001]), optim_alpha=0.97
      ... )
      >>> # Set the config object's env.
      >>> config.environment(env=TwoStepGame)  # doctest: +SKIP
      >>> # Use to_dict() to get the old-style python config dict
      >>> # when running with tune.
      >>> tune.Tuner(  # doctest: +SKIP
      ...     "QMix",
      ...     run_config=air.RunConfig(stop={"episode_reward_mean": 200}),
      ...     param_space=config.to_dict(),
      ... ).fit()
docstr: Sets the training related configuration.
  
  Args:
      mixer: Mixing network. Either "qmix", "vdn", or None.
      mixing_embed_dim: Size of the mixing network embedding.
      double_q: Whether to use Double_Q learning.
      target_network_update_freq: Update the target network every
          `target_network_update_freq` sample steps.
      replay_buffer_config:
      optim_alpha: RMSProp alpha.
      optim_eps: RMSProp epsilon.
      grad_clip: If not None, clip gradients during optimization at
          this value.
      grad_norm_clipping: Depcrecated in favor of grad_clip
  
  Returns:
      This updated AlgorithmConfig object.
docstr_tok: ["Sets","the","training","related","configuration",".","Args",":","mixer",":","Mixing","network",".","Either","``","qmix","''",",","``","vdn","''",",","or","None",".","mixing_embed_dim",":","Size","of","the","mixing","network","embedding",".","double_q",":","Whether","to","use","Double_Q","learning",".","target_network_update_freq",":","Update","the","target","network","every","`","target_network_update_freq","`","sample","steps",".","replay_buffer_config",":","optim_alpha",":","RMSProp","alpha",".","optim_eps",":","RMSProp","epsilon",".","grad_clip",":","If","not","None",",","clip","gradients","during","optimization","at","this","value",".","grad_norm_clipping",":","Depcrecated","in","favor","of","grad_clip","Returns",":","This","updated","AlgorithmConfig","object","."]
code: def training(
      self,
      *,
      mixer: Optional[str] = NotProvided,
      mixing_embed_dim: Optional[int] = NotProvided,
      double_q: Optional[bool] = NotProvided,
      target_network_update_freq: Optional[int] = NotProvided,
      replay_buffer_config: Optional[dict] = NotProvided,
      optim_alpha: Optional[float] = NotProvided,
      optim_eps: Optional[float] = NotProvided,
      grad_clip: Optional[float] = NotProvided,
      # Deprecated args.
      grad_norm_clipping=DEPRECATED_VALUE,
      **kwargs,
  ) -> "QMixConfig":
      """Sets the training related configuration.
  
      Args:
          mixer: Mixing network. Either "qmix", "vdn", or None.
          mixing_embed_dim: Size of the mixing network embedding.
          double_q: Whether to use Double_Q learning.
          target_network_update_freq: Update the target network every
              `target_network_update_freq` sample steps.
          replay_buffer_config:
          optim_alpha: RMSProp alpha.
          optim_eps: RMSProp epsilon.
          grad_clip: If not None, clip gradients during optimization at
              this value.
          grad_norm_clipping: Depcrecated in favor of grad_clip
  
      Returns:
          This updated AlgorithmConfig object.
      """
      # Pass kwargs onto super's `training()` method.
      super().training(**kwargs)
  
      if grad_norm_clipping != DEPRECATED_VALUE:
          deprecation_warning(
              old="grad_norm_clipping",
              new="grad_clip",
              help="Parameter `grad_norm_clipping` has been "
              "deprecated in favor of grad_clip in QMix. "
              "This is now the same parameter as in other "
              "algorithms. `grad_clip` will be overwritten by "
              "`grad_norm_clipping={}`".format(grad_norm_clipping),
              error=True,
          )
          grad_clip = grad_norm_clipping
  
      if mixer is not NotProvided:
          self.mixer = mixer
      if mixing_embed_dim is not NotProvided:
          self.mixing_embed_dim = mixing_embed_dim
      if double_q is not NotProvided:
          self.double_q = double_q
      if target_network_update_freq is not NotProvided:
          self.target_network_update_freq = target_network_update_freq
      if replay_buffer_config is not NotProvided:
          self.replay_buffer_config = replay_buffer_config
      if optim_alpha is not NotProvided:
          self.optim_alpha = optim_alpha
      if optim_eps is not NotProvided:
          self.optim_eps = optim_eps
      if grad_clip is not NotProvided:
          self.grad_clip = grad_clip
  
      return self
  
imports: from typing import Optional, Type
  from rllib_qmix.qmix.qmix_policy import QMixTorchPolicy
  from ray.rllib.algorithms.algorithm_config import AlgorithmConfig, NotProvided
  from ray.rllib.algorithms.simple_q.simple_q import SimpleQ, SimpleQConfig
  from ray.rllib.execution.rollout_ops import synchronous_parallel_sample
  from ray.rllib.execution.train_ops import multi_gpu_train_one_step, train_one_step
  from ray.rllib.policy.policy import Policy
  from ray.rllib.utils.annotations import override
  from ray.rllib.utils.deprecation import DEPRECATED_VALUE, deprecation_warning
  from ray.rllib.utils.metrics import LAST_TARGET_UPDATE_TS, NUM_AGENT_STEPS_SAMPLED, NUM_ENV_STEPS_SAMPLED, NUM_TARGET_UPDATES, SAMPLE_TIMER, SYNCH_WORKER_WEIGHTS_TIMER
  from ray.rllib.utils.replay_buffers.utils import sample_min_n_steps_from_buffer, update_priorities_in_replay_buffer
  from ray.rllib.utils.typing import ResultDict
label_desc: Use image node_id 2 for calling the QMixConfig obj's underlying member method code with example usage: obj.training() and returns: self