nodes: 0, module; 1, function_definition; 2, function_name:_see_node; 3, parameters; 4, block; 5, identifier:self; 6, identifier:node_id; 7, identifier:fringe; 8, identifier:dist; 9, default_parameter; 10, expression_statement; 11, comment:# Namespace shortcuts.; 12, expression_statement; 13, expression_statement; 14, comment:# Wait inputs flag.; 15, expression_statement; 16, comment:# Update view distance.; 17, comment:# Check if inputs are satisfied.; 18, if_statement; 19, return_statement; 20, identifier:w_wait_in; 21, integer:0; 22, comment:"""
          See a node, updating seen and fringe.
  
          :param node_id:
              Node id to see.
          :type node_id: str
  
          :param fringe:
              Heapq of closest available nodes.
          :type fringe: list[(float | int, bool, (str, Dispatcher)]
  
          :param dist:
              Distance from the starting node.
          :type dist: float, int
  
          :param w_wait_in:
              Additional weight for sorting correctly the nodes in the fringe.
          :type w_wait_in: int, float
  
          :return:
              True if the node is visible, otherwise False.
          :rtype: bool
          """; 23, assignment; 24, assignment; 25, call; 26, call; 27, block; 28, elif_clause; 29, elif_clause; 30, False; 31, pattern_list; 32, expression_list; 33, identifier:wait_in; 34, subscript; 35, attribute; 36, argument_list; 37, attribute; 38, argument_list; 39, pass_statement; 40, comment:# Pass the node; 41, comparison_operator:node_id in dists; 42, comment:# The node w already estimated.; 43, block; 44, boolean_operator; 45, comment:# Check min dist.; 46, block; 47, identifier:seen; 48, identifier:dists; 49, attribute; 50, attribute; 51, subscript; 52, string; 53, identifier:self; 54, identifier:_update_meeting; 55, identifier:node_id; 56, identifier:dist; 57, identifier:self; 58, identifier:check_wait_in; 59, identifier:wait_in; 60, identifier:node_id; 61, identifier:node_id; 62, identifier:dists; 63, if_statement; 64, comparison_operator:node_id not in seen; 65, comparison_operator:dist < seen[node_id]; 66, expression_statement; 67, comment:# Update dist.; 68, expression_statement; 69, comment:# Node index.; 70, comment:# Virtual distance.; 71, expression_statement; 72, comment:# Add to heapq.; 73, expression_statement; 74, return_statement; 75, comment:# The node is visible.; 76, identifier:self; 77, identifier:seen; 78, identifier:self; 79, identifier:dist; 80, attribute; 81, identifier:node_id; 82, string_content:wait_inputs; 83, comparison_operator:dist < dists[node_id]; 84, comment:# Error for negative paths.; 85, block; 86, identifier:node_id; 87, identifier:seen; 88, identifier:dist; 89, subscript; 90, assignment; 91, assignment; 92, assignment; 93, call; 94, True; 95, identifier:self; 96, identifier:nodes; 97, identifier:dist; 98, subscript; 99, raise_statement; 100, identifier:seen; 101, identifier:node_id; 102, subscript; 103, identifier:dist; 104, identifier:index; 105, subscript; 106, identifier:vd; 107, tuple; 108, attribute; 109, argument_list; 110, identifier:dists; 111, identifier:node_id; 112, call; 113, identifier:seen; 114, identifier:node_id; 115, subscript; 116, string; 117, binary_operator:w_wait_in + int(wait_in); 118, identifier:node_id; 119, binary_operator:self.index + index; 120, identifier:heapq; 121, identifier:heappush; 122, identifier:fringe; 123, tuple; 124, identifier:DispatcherError; 125, argument_list; 126, attribute; 127, identifier:node_id; 128, string_content:index; 129, identifier:w_wait_in; 130, call; 131, attribute; 132, identifier:index; 133, identifier:dist; 134, identifier:vd; 135, tuple; 136, concatenated_string; 137, keyword_argument; 138, identifier:self; 139, identifier:nodes; 140, identifier:int; 141, argument_list; 142, identifier:self; 143, identifier:index; 144, identifier:node_id; 145, identifier:self; 146, string; 147, string; 148, identifier:sol; 149, identifier:self; 150, identifier:wait_in; 151, string_content:Contradictory paths found:; 152, string_content:negative weights?
code: def _see_node(self, node_id, fringe, dist, w_wait_in=0):
          """
          See a node, updating seen and fringe.
  
          :param node_id:
              Node id to see.
          :type node_id: str
  
          :param fringe:
              Heapq of closest available nodes.
          :type fringe: list[(float | int, bool, (str, Dispatcher)]
  
          :param dist:
              Distance from the starting node.
          :type dist: float, int
  
          :param w_wait_in:
              Additional weight for sorting correctly the nodes in the fringe.
          :type w_wait_in: int, float
  
          :return:
              True if the node is visible, otherwise False.
          :rtype: bool
          """
  
          # Namespace shortcuts.
          seen, dists = self.seen, self.dist
  
          wait_in = self.nodes[node_id]['wait_inputs']  # Wait inputs flag.
  
          self._update_meeting(node_id, dist)  # Update view distance.
  
          # Check if inputs are satisfied.
          if self.check_wait_in(wait_in, node_id):
              pass  # Pass the node
  
          elif node_id in dists:  # The node w already estimated.
              if dist < dists[node_id]:  # Error for negative paths.
                  raise DispatcherError('Contradictory paths found: '
                                        'negative weights?', sol=self)
          elif node_id not in seen or dist < seen[node_id]:  # Check min dist.
              seen[node_id] = dist  # Update dist.
  
              index = self.nodes[node_id]['index']  # Node index.
  
              # Virtual distance.
              vd = (w_wait_in + int(wait_in), node_id, self.index + index)
  
              # Add to heapq.
              heapq.heappush(fringe, (dist, vd, (node_id, self)))
  
              return True  # The node is visible.
          return False