docs: def _get_node_estimations(self, node_attr, node_id):
          """
          Returns the data nodes estimations and `wait_inputs` flag.
  
          :param node_attr:
              Dictionary of node attributes.
          :type node_attr: dict
  
          :param node_id:
              Data node's id.
          :type node_id: str
  
          :returns:
  
              - node estimations with minimum distance from the starting node, and
              - `wait_inputs` flag
          :rtype: (dict[str, T], bool)
          """
  
          # Get data node estimations.
          estimations = self._wf_pred[node_id]
  
          wait_in = node_attr['wait_inputs']  # Namespace shortcut.
  
          # Check if node has multiple estimations and it is not waiting inputs.
          if len(estimations) > 1 and not self._wait_in.get(node_id, wait_in):
              # Namespace shortcuts.
              dist, edg_length, adj = self.dist, self._edge_length, self.dmap.adj
  
              est = []  # Estimations' heap.
  
              for k, v in estimations.items():  # Calculate length.
                  if k is not START:
                      d = dist[k] + edg_length(adj[k][node_id], node_attr)
                      heapq.heappush(est, (d, k, v))
  
              # The estimation with minimum distance from the starting node.
              estimations = {est[0][1]: est[0][2]}
  
              # Remove unused workflow edges.
              self.workflow.remove_edges_from([(v[1], node_id) for v in est[1:]])
  
          return estimations, wait_in