class_docstr: A DQN Agent.
  
  Implements the DQN algorithm from
  
  "Human level control through deep reinforcement learning"
    Mnih et al., 2015
    https://deepmind.com/research/dqn/
  
  This agent also implements n-step updates. See "Rainbow: Combining
  Improvements in Deep Reinforcement Learning" by Hessel et al., 2017, for a
  discussion on its benefits: https://arxiv.org/abs/1710.02298
class_docstr_tok: ["A","DQN","Agent",".","Implements","the","DQN","algorithm","from","''","Human","level","control","through","deep","reinforcement","learning","''","Mnih","et","al.",",","2015","https",":","\/\/deepmind.com\/research\/dqn\/","This","agent","also","implements","n-step","updates",".","See","``","Rainbow",":","Combining","Improvements","in","Deep","Reinforcement","Learning","''","by","Hessel","et","al.",",","2017",",","for","a","discussion","on","its","benefits",":","https",":","\/\/arxiv.org\/abs\/1710.02298"]
code: def _setup_policy(
      self,
      time_step_spec,
      action_spec,
      boltzmann_temperature,
      emit_log_probability,
  ):
      policy = q_policy.QPolicy(
          time_step_spec,
          action_spec,
          q_network=self._q_network,
          emit_log_probability=emit_log_probability,
          observation_and_action_constraint_splitter=(
              self._observation_and_action_constraint_splitter
          ),
      )
  
      if boltzmann_temperature is not None:
          collect_policy = boltzmann_policy.BoltzmannPolicy(
              policy, temperature=self._boltzmann_temperature
          )
      else:
          collect_policy = epsilon_greedy_policy.EpsilonGreedyPolicy(
              policy, epsilon=self._epsilon_greedy
          )
      policy = greedy_policy.GreedyPolicy(policy)
  
      # Create self._target_greedy_policy in order to compute target Q-values.
      target_policy = q_policy.QPolicy(
          time_step_spec,
          action_spec,
          q_network=self._target_q_network,
          observation_and_action_constraint_splitter=(
              self._observation_and_action_constraint_splitter
          ),
      )
      self._target_greedy_policy = greedy_policy.GreedyPolicy(
          target_policy
      )
  
      return policy, collect_policy
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import collections
  from typing import Optional, Text, cast
  import gin
  import tensorflow
  from tf_agents.agents import data_converter
  from tf_agents.agents import tf_agent
  from tf_agents.networks import network
  from tf_agents.networks import utils
  from tf_agents.policies import boltzmann_policy
  from tf_agents.policies import epsilon_greedy_policy
  from tf_agents.policies import greedy_policy
  from tf_agents.policies import q_policy
  from tf_agents.specs import tensor_spec
  from tf_agents.trajectories import time_step
  from tf_agents.typing import types
  from tf_agents.utils import common
  from tf_agents.utils import eager_utils
  from tf_agents.utils import nest_utils
label_desc: Use image node_id 4 for calling the DqnAgent obj's underlying member method code with example usage: obj._setup_policy(time_step_spec, action_spec, boltzmann_temperature, emit_log_probability) and returns: policy,  collect_policy