class_docstr: Finish-to-start evalution order of thunks.
  
  This supports lazy evaluation of subtrees and partial
  computations of graphs when only some inputs have changed.
  
  At a pseudo-code level, the basic idea is the following:
  
  def recursively_evaluate(var):
      if var is up to date:
          return
      if var.owner.inputs are up to date:
          update var
          return
      for input in var.owner.unputs:
          recursively_evaluate(var)
  
  for output in outputs:
      recursively_evaluate(output)
  
  The actual logic is more complex to support intermediate
  garbage collection, lazily-evaluated nodes, and better speed.
class_docstr_tok: ["Finish-to-start","evalution","order","of","thunks",".","This","supports","lazy","evaluation","of","subtrees","and","partial","computations","of","graphs","when","only","some","inputs","have","changed",".","At","a","pseudo-code","level",",","the","basic","idea","is","the","following",":","def","recursively_evaluate","(","var",")",":","if","var","is","up","to","date",":","return","if","var.owner.inputs","are","up","to","date",":","update","var","return","for","input","in","var.owner.unputs",":","recursively_evaluate","(","var",")","for","output","in","outputs",":","recursively_evaluate","(","output",")","The","actual","logic","is","more","complex","to","support","intermediate","garbage","collection",",","lazily-evaluated","nodes",",","and","better","speed","."]
docstr: Run the thunk corresponding to Apply instance `node`.
  
  Calls self.callback if it is defined.
docstr_tok: ["Run","the","thunk","corresponding","to","Apply","instance","`","node","`",".","Calls","self.callback","if","it","is","defined","."]
code: def run_thunk_of_node(self, node):
      """
      Run the thunk corresponding to Apply instance `node`.
  
      Calls self.callback if it is defined.
  
      """
      idx = self.node_idx[node]
      t0 = time.time()
      rval = self.thunks[idx]()
      self.node_executed_order.append(node)
  
      # Some thunks on some computers run faster than the granularity
      # of the time.time clock.
      # Profile output looks buggy if a node has run but takes 0 time.
      # (and profile code might hide real bugs if it rounds up 0)
      dt = max(time.time() - t0, 1e-10)
      if self.callback is not None:
          self.callback(
              node=node,
              thunk=self.thunks[idx],
              storage_map=self.storage_map,
              compute_map=self.compute_map,
          )
      return rval, dt
  
imports: from __future__ import absolute_import, print_function, division
  from .None import link
  from collections import defaultdict
  import logging
  import sys
  import time
  import warnings
  import platform
  from theano.configparser import config, _config_var_list
  import theano.gof.cmodule
  from six import iteritems, itervalues
  from six.moves import xrange
label_desc: Use image node_id 2 for calling the Stack obj's underlying member method code with example usage: obj.run_thunk_of_node(node) and returns: rval,  dt