def run(self, fetch_list, feed_dict=None, sess=None):
    """Runs the graph with the provided feeds and fetches.

    This function wraps sess.Run(), but takes care of state saving and
    restoring by feeding in states and storing the new state values.
    Args:
      fetch_list: A list of requested output tensors.
      feed_dict: A dictionary of feeds - see Session.Run(). Optional.
      sess: The Tensorflow session to run. Can be None.
    Returns:
      The requested tensors as numpy arrays.
    Raises:
      ValueError: If the default graph during object construction was
      different from the current default graph.
    """
    if tf.get_default_graph() != self._graph:
      raise ValueError('The current default graph is different from the graph'
                       ' used at construction time of RecurrentRunner.')
    if feed_dict is None:
      all_feeds_dict = {}
    else:
      all_feeds_dict = dict(feed_dict)
    all_feeds_dict.update(self._state_feeds)
    all_fetches_list = list(fetch_list)
    all_fetches_list += self._state_fetches

    sess = sess or tf.get_default_session()

    # Run the compute graph.
    fetches = sess.run(all_fetches_list, all_feeds_dict)
    # Update the feeds for the next time step.
    states = fetches[len(fetch_list):]
    for i, s in enumerate(states):
      self._state_feeds[self._state_feed_names[i]] = s

    return fetches[:len(fetch_list)]
Runs the graph with the provided feeds and fetches.

    This function wraps sess.Run(), but takes care of state saving and
    restoring by feeding in states and storing the new state values.
    Args:
      fetch_list: A list of requested output tensors.
      feed_dict: A dictionary of feeds - see Session.Run(). Optional.
      sess: The Tensorflow session to run. Can be None.
    Returns:
      The requested tensors as numpy arrays.
    Raises:
      ValueError: If the default graph during object construction was
      different from the current default graph.