class_docstr: Coordinator of n (possibly remote) Learner workers.
  
  Each Learner worker has a copy of the RLModule, the loss function(s), and
  one or more optimizers.
docstr: Apply additional non-gradient based updates to the Learners.
  
  For example, this could be used to do a polyak averaging update
  of a target network in off policy algorithms like SAC or DQN.
  
  By default this is a pass through that calls `Learner.additional_update`
  
  Args:
      reduce_fn: See `update()` documentation for more details.
      **kwargs: Keyword arguments to pass to each Learner.
  
  Returns:
      A list of dictionaries of results from the updates from each worker.
docstr_tok: ["Apply","additional","non-gradient","based","updates","to","the","Learners",".","For","example",",","this","could","be","used","to","do","a","polyak","averaging","update","of","a","target","network","in","off","policy","algorithms","like","SAC","or","DQN",".","By","default","this","is","a","pass","through","that","calls","`","Learner.additional_update","`","Args",":","reduce_fn",":","See","`","update","(",")","`","documentation","for","more","details",".","*","*","kwargs",":","Keyword","arguments","to","pass","to","each","Learner",".","Returns",":","A","list","of","dictionaries","of","results","from","the","updates","from","each","worker","."]
code: def additional_update(
      self,
      *,
      reduce_fn: Callable[
          [ResultDict], ResultDict
      ] = _reduce_mean_results,
      **kwargs,
  ) -> Union[Dict[str, Any], List[Dict[str, Any]]]:
      """Apply additional non-gradient based updates to the Learners.
  
      For example, this could be used to do a polyak averaging update
      of a target network in off policy algorithms like SAC or DQN.
  
      By default this is a pass through that calls `Learner.additional_update`
  
      Args:
          reduce_fn: See `update()` documentation for more details.
          **kwargs: Keyword arguments to pass to each Learner.
  
      Returns:
          A list of dictionaries of results from the updates from each worker.
      """
  
      if self.is_local:
          return self._learner.additional_update(**kwargs)
      else:
          results = self._worker_manager.foreach_actor(
              [
                  lambda w: w.additional_update(**kwargs)
                  for _ in self._workers
              ]
          )
          results = self._get_results(results)
          if reduce_fn is None:
              return results
          # TODO(sven): Move reduce_fn to the training_step
          return reduce_fn(results)
  
imports: from collections import defaultdict, Counter
  from functools import partial
  import pathlib
  from typing import Any, Callable, Dict, List, Optional, Set, Type, Union
  import uuid
  import ray
  from ray.rllib.algorithms.algorithm_config import AlgorithmConfig
  from ray.rllib.core.learner.learner import Learner
  from ray.rllib.core.learner.reduce_result_dict_fn import _reduce_mean_results
  from ray.rllib.core.rl_module.rl_module import SingleAgentRLModuleSpec, RLMODULE_STATE_DIR_NAME
  from ray.rllib.policy.sample_batch import MultiAgentBatch
  from ray.rllib.utils.actor_manager import FaultTolerantActorManager
  from ray.rllib.utils.deprecation import Deprecated, deprecation_warning
  from ray.rllib.utils.minibatch_utils import ShardBatchIterator, ShardEpisodesIterator
  from ray.rllib.utils.numpy import convert_to_numpy
  from ray.rllib.utils.typing import EpisodeType, ModuleID, ResultDict, RLModuleSpec, ShouldModuleBeUpdatedFn
  from ray.train._internal.backend_executor import BackendExecutor
  from ray.tune.utils.file_transfer import sync_dir_between_nodes
  from ray.util.annotations import PublicAPI
label_desc: Use image node_id 10 for calling the LearnerGroup obj's underlying member method code with example usage: obj.additional_update() and returns: self, reduce_fn, results