class_docstr: Runner for evaluating using a fixed number of episodes rather than steps.
  
  Also restricts data collection to a strict cap,
  following conventions in data-efficient RL research.
class_docstr_tok: ["Runner","for","evaluating","using","a","fixed","number","of","episodes","rather","than","steps",".","Also","restricts","data","collection","to","a","strict","cap",",","following","conventions","in","data-efficient","RL","research","."]
docstr: Runs a full experiment, spread over multiple iterations.
docstr_tok: ["Runs","a","full","experiment",",","spread","over","multiple","iterations","."]
code: def run_experiment(self):
      """Runs a full experiment, spread over multiple iterations."""
      logging.info("Beginning training...")
      if self._num_iterations <= self._start_iteration:
          logging.warning(
              "num_iterations (%d) < start_iteration(%d)",
              self._num_iterations,
              self._start_iteration,
          )
          return
  
      for iteration in range(
          self._start_iteration, self._num_iterations
      ):
          statistics = self._run_one_iteration(iteration)
          self._log_experiment(iteration, statistics)
          self._checkpoint_experiment(iteration)
      self._summary_writer.flush()
  
imports: import functools
  import os
  import sys
  import time
  from absl import logging
  from dopamine.discrete_domains import atari_lib
  from dopamine.discrete_domains import iteration_statistics
  from dopamine.discrete_domains import run_experiment
  from dopamine.labs.atari_100k import normalization_utils
  from dopamine.metrics import collector_dispatcher
  from dopamine.metrics import statistics_instance
  import gin
  import jax
  import numpy
  import tensorflow
label_desc: Use image node_id 10 for calling the DataEfficientAtariRunner obj's underlying member method code with example usage: obj.run_experiment() without return types