class_docstr: A Model is a network (more precisely, a directed acyclic graph) of Steps,
  and it is defined from the input/output specification of the pipeline.
  Models have fit and predict routines that, together with graph-based engine,
  allow the automatic (feed-forward) computation of each of the pipeline steps
  when fed with data.
  
  Parameters
  ----------
  inputs
      Inputs to the model.
  
  outputs
      Outputs of the model.
  
  targets
      Targets of the model.
  
  name
      Name of the model (optional). If no name is passed, a name will be
      automatically generated.
code: def _compute_node(self, node, Xs, cache):
      # TODO: Raise warning if computed output is already in cache.
      # This happens when recomputing a step that had a subset of its outputs already passed in the inputs.
      # TODO: Some regressors have extra options in their predict method, and they return a tuple of arrays.
      # https://scikit-learn.org/stable/glossary.html#term-predict
      output_data = node.compute_func(unlistify(Xs))
      output_data = listify(output_data)
      self._update_cache(cache, output_data, node)
  
imports: from collections import defaultdict
  from typing import Union, List, Dict, Set, Iterable, Optional
  from baikal._core.data_placeholder import is_data_placeholder_list, DataPlaceholder
  from baikal._core.digraph import DiGraph
  from baikal._core.step import Step, InputStep, Node
  from baikal._core.typing import ArrayLike
  from baikal._core.utils import listify, safezip2, SimpleCache, unlistify
label_desc: Use image node_id 12 for calling the Model obj's underlying member method code with example usage: obj._compute_node(node, Xs, cache) without return types