|
from typing import Dict, Any, List |
|
|
|
from ..graph import Evaluator, Model |
|
from ..integration_api import receive_trial_parameters |
|
from ..utils import ContextStack, import_, get_importable_name |
|
from .base import BaseExecutionEngine |
|
|
|
|
|
class PythonGraphData: |
|
def __init__(self, class_name: str, init_parameters: Dict[str, Any], |
|
mutation: Dict[str, Any], evaluator: Evaluator) -> None: |
|
self.class_name = class_name |
|
self.init_parameters = init_parameters |
|
self.mutation = mutation |
|
self.evaluator = evaluator |
|
|
|
def dump(self) -> dict: |
|
return { |
|
'class_name': self.class_name, |
|
'init_parameters': self.init_parameters, |
|
'mutation': self.mutation, |
|
'evaluator': self.evaluator |
|
} |
|
|
|
@staticmethod |
|
def load(data) -> 'PythonGraphData': |
|
return PythonGraphData(data['class_name'], data['init_parameters'], data['mutation'], data['evaluator']) |
|
|
|
|
|
class PurePythonExecutionEngine(BaseExecutionEngine): |
|
@classmethod |
|
def pack_model_data(cls, model: Model) -> Any: |
|
mutation = get_mutation_dict(model) |
|
graph_data = PythonGraphData(get_importable_name(model.python_class, relocate_module=True), |
|
model.python_init_params, mutation, model.evaluator) |
|
return graph_data |
|
|
|
@classmethod |
|
def trial_execute_graph(cls) -> None: |
|
graph_data = PythonGraphData.load(receive_trial_parameters()) |
|
|
|
class _model(import_(graph_data.class_name)): |
|
def __init__(self): |
|
super().__init__(**graph_data.init_parameters) |
|
|
|
with ContextStack('fixed', graph_data.mutation): |
|
graph_data.evaluator._execute(_model) |
|
|
|
|
|
def _unpack_if_only_one(ele: List[Any]): |
|
if len(ele) == 1: |
|
return ele[0] |
|
return ele |
|
|
|
|
|
def get_mutation_dict(model: Model): |
|
return {mut.mutator.label: _unpack_if_only_one(mut.samples) for mut in model.history} |
|
|