docs: def _execute_tasks(self, *, input_args, out_degs, monitor):
          """Executes tasks comprising the workflow in the predetermined order.
  
          :param input_args: External input arguments to the workflow.
          :type input_args: Dict
          :param out_degs: Dictionary mapping vertices (task IDs) to their out-degrees. (The out-degree equals the number
          of tasks that depend on this task.)
          :type out_degs: Dict
          :return: An immutable mapping containing results of terminal tasks
          :rtype: WorkflowResults
          """
          done_tasks = set()
  
          intermediate_results = {}
  
          for dep in self.ordered_dependencies:
              result = self._execute_task(dependency=dep,
                                          input_args=input_args,
                                          intermediate_results=intermediate_results,
                                          monitor=monitor)
  
              intermediate_results[dep] = result
  
              self._relax_dependencies(dependency=dep,
                                       out_degrees=out_degs,
                                       intermediate_results=intermediate_results)
  
          return done_tasks, intermediate_results