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

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