class_docstr: An agent that mixes a set of agents and updates the weights with Exp3.
  
  For a reference on EXP3, see `Bandit Algorithms` by Tor Lattimore and Csaba
  Szepesvari (https://tor-lattimore.com/downloads/book/book.pdf).
  
  The update uses a slighlty modified version of EXP3 to make sure that the
  weights do not go to one seemingly good agent in the very beginning. To smooth
  the weights, two extra measures are taken:
  
  1. A forgetting factor makes sure that the aggregated reward estimates do not
  grow indefinitely.
  2. The `inverse temperature` has a maximum parameter that prevents it from
  growing indefinitely.
  
  It is generally a good idea to set
  
  ```
  forgetting_factor = 1 - (1 / max_inverse_temperature)
  ```
  
  so that the two smoothing factors work together nicely.
  
  For every data sample, the agent updates the sub-agent that was used to make
  the action choice in that sample. For this update to happen, the mixture agent
  needs to have the information on which sub-agent is "responsible" for the
  action. This information is in a policy info field `mixture_choice_info`.
code: def _summarize_probabilities(self, probabilities):
      for k in range(self._num_agents):
          tf.compat.v2.summary.scalar(
              name="policy_{}_prob".format(k),
              data=probabilities[k],
              step=self.train_step_counter,
          )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from typing import List, Optional, Text
  import gin
  import tensorflow
  import tensorflow_probability
  from tf_agents.agents import tf_agent
  from tf_agents.bandits.agents import mixture_agent
  from tf_agents.bandits.policies import mixture_policy
  from tf_agents.utils import nest_utils
label_desc: Use image node_id 3 for calling the Exp3MixtureAgent obj's underlying member method code with example usage: obj._summarize_probabilities(probabilities) without return types