code: def on_node(self, memo, node):
      # -- Retrieve computed arguments of apply node
      args = _args = [memo[v] for v in node.pos_args]
      kwargs = _kwargs = dict(
          [(k, memo[v]) for (k, v) in node.named_args]
      )
  
      if self.memo_gc:
          # -- Ensure no computed argument has been (accidentally) freed for
          #    garbage-collection.
          for aa in args + list(kwargs.values()):
              assert aa is not pyll.base.GarbageCollected
  
      if self.deepcopy_inputs:
          # -- I think this is supposed to be skipped if node.pure == True
          #    because that attribute is supposed to mark the node as having
          #    no side-effects that affect expression-evaluation.
          #
          #    HOWEVER That has not been tested in a while, and it's hard to
          #    verify (with e.g. unit tests) that a node marked "pure" isn't
          #    lying. So we hereby ignore the `pure` attribute and copy
          #    everything to be on the safe side.
          args = copy.deepcopy(_args)
          kwargs = copy.deepcopy(_kwargs)
  
      return pyll.scope._impls[node.name](*args, **kwargs)
  
file_path: auptimizer/src/aup/Proposer/hyperopt/algobase.py
imports: from __future__ import print_function
  from builtins import object
  import copy
  from collections import deque
  import numpy
  from .None import pyll
  from .base import miscs_update_idxs_vals
label_desc: Use image node_id 5 for calling the ExprEvaluator obj's underlying member method code with example usage: obj.on_node(memo, node) and returns: pyll