Source code for pharmpy.workflows.execute

from __future__ import annotations

import os
from pathlib import Path
from typing import TypeVar

from pharmpy.model import Model

from .dispatchers import Dispatcher
from .results import ModelfitResults, Results
from .workflow import Workflow, WorkflowBuilder, insert_context

T = TypeVar('T')


[docs] def execute_workflow( workflow: Workflow[T], dispatcher=None, context=None, path=None, resume=False ) -> T: """Execute workflow Parameters ---------- workflow : Workflow Workflow to execute dispatcher : Dispatcher Dispatcher to use context : Context Context to use. None for the default context. path : Path Path to use for context if applicable. resume : bool Whether to allow resuming previous workflow execution. Returns ------- Results Results object created by workflow """ # FIXME: Return type is not always Results if dispatcher is None: dispatcher = Dispatcher.select_dispatcher(dispatcher) if context is None: from pharmpy.workflows import default_context if path is None: path = Path.cwd() else: path = Path(path) context = default_context(workflow.name, ref=path) # For all input models set new database and read in results original_input_models = [] input_models = [] wb = WorkflowBuilder(workflow) for task in workflow.tasks: new_inp = [] for inp in task.task_input: if isinstance(inp, Model): original_input_models.append(inp) new_inp.append(inp) input_models.append(inp) else: new_inp.append(inp) new_task = task.replace(task_input=tuple(new_inp)) wb.replace_task(task, new_task) insert_context(wb, context) workflow = Workflow(wb) res: T = dispatcher.run(workflow, context) if isinstance(res, Results) and not isinstance(res, ModelfitResults): context.store_results(res) from pharmpy.tools.reporting import report_available if report_available(res): from pharmpy.tools.reporting import create_report if os.name == 'nt': # Workaround for issue with dask versions >= 2023.7.0 on Windows import asyncio asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) create_report(res, context.path) return res