class_docstr: Convert a pyll expression representing a single trial into a pyll
  expression representing multiple trials.
  
  The resulting multi-trial expression is not meant to be evaluated
  directly. It is meant to serve as the input to a suggest algo.
  
  idxs_memo - node in expr graph -> all elements we might need for it
  take_memo - node in expr graph -> all exprs retrieving computed elements
code: def __init__(self, expr, expr_idxs, build=True):
      self.expr = expr
      self.expr_idxs = expr_idxs
      self.dfs_nodes = dfs(expr)
      self.params = {}
      for ii, node in enumerate(self.dfs_nodes):
          if node.name == "hyperopt_param":
              label = node.arg["label"].obj
              self.params[label] = node.arg["obj"]
      # -- recursive construction
      #    This makes one term in each idxs, vals memo for every
      #    directed path through the switches in the graph.
  
      self.idxs_memo = {}  # node -> union, all idxs computed
      self.take_memo = (
          {}
      )  # node -> list of idxs_take retrieving node vals
      self.v_expr = self.build_idxs_vals(expr, expr_idxs)
  
      # TODO: graph-optimization pass to remove cruft:
      #  - unions of 1
      #  - unions of full sets with their subsets
      #  - idxs_take that can be merged
  
      self.assert_integrity_idxs_take()
  
imports: import sys
  import numpy
  from .pyll import Apply
  from .pyll import as_apply
  from .pyll import dfs
  from .pyll import toposort
  from .pyll import scope
  from .pyll import stochastic
label_desc: Use image node_id 1 to create a new VectorizeHelper object  with example: obj = VectorizeHelper(expr, expr_idxs, build)