code: def _init_evals_bps(self, evals, breakpoints):
  		# If an eval or bp is the tf.Placeholder output of a tdb.PythonOp, replace it with its respective PythonOp node
  		evals2=[op_store.get_op(t) if op_store.is_htop_out(t) else t for t in evals]
  		breakpoints2=[op_store.get_op(t) if op_store.is_htop_out(t) else t for t in breakpoints]
  		# compute execution order
  		self._exe_order=op_store.compute_exe_order(evals2) # list of nodes
  		# compute evaluation set
  		
  		self._evalset=set([e.name for e in evals2])
  		for e in self._exe_order:
  			if isinstance(e,HTOp):
  				self._evalset.add(e.name)
  				for t in e.inputs:
  					if not op_store.is_htop_out(t):
  						self._evalset.add(t.name)
  
  		# compute breakpoint set
  		self._bpset=set([bp.name for bp in breakpoints2])
docs: HTOps may depend on tf.Tensors that are not in eval. We need to have all inputs to HTOps ready
  		upon evaluation. 
  
  		1. all evals that were originally specified are added
  		2. each HTOp in the execution closure needs to be in eval (they won't be eval'ed automatically by Session.run)
  		3. if an input to an HTOp is a tf.Tensor (not a HT placeholder tensor), it needs to be in eval as well (it's not
  			tensorflow so we'll have to manually evaluate it). Remember, we don't track Placeholders because we instead 
  			run the HTOps that generate their values.