Source code for idmtools.registry.experiment_specification

"""
ExperimentPluginSpecification provided definition for the experiment plugin specification, hooks, and plugin manager.

Copyright 2021, Bill & Melinda Gates Foundation. All rights reserved.
"""
# Define our model specific specifications
import typing
from abc import ABC
from logging import getLogger

import pluggy

from idmtools.registry import PluginSpecification
from idmtools.registry.plugin_specification import PLUGIN_REFERENCE_NAME
from idmtools.registry.utils import load_plugin_map

example_configuration_spec = pluggy.HookspecMarker(PLUGIN_REFERENCE_NAME)
get_model_spec = pluggy.HookspecMarker(PLUGIN_REFERENCE_NAME)
get_model_type_spec = pluggy.HookspecMarker(PLUGIN_REFERENCE_NAME)
example_configuration_impl = pluggy.HookimplMarker(PLUGIN_REFERENCE_NAME)
get_model_impl = pluggy.HookimplMarker(PLUGIN_REFERENCE_NAME)
get_model_type_impl = pluggy.HookimplMarker(PLUGIN_REFERENCE_NAME)
logger = getLogger(__name__)


[docs]class ExperimentPluginSpecification(PluginSpecification, ABC): """ ExperimentPluginSpecification defines the specification for Experiment plugins. """
[docs] @classmethod def get_name(cls, strip_all: bool = True) -> str: """ Get name of plugin. By default we remove the PlatformSpecification portion. Args: strip_all: When true, ExperimentPluginSpecification and ExperimentPluginSpec is stripped from name. When false only Specification and Spec is Stripped Returns: Name of plugin """ if strip_all: ret = cls.__name__.replace('ExperimentPluginSpecification', '').replace('Specification', '')\ .replace("ExperimentPluginSpec", '').replace('Spec', '') else: ret = cls.__name__.replace('Specification', '').replace('Spec', '') return ret
[docs] @get_model_spec def get(self, configuration: dict) -> 'Experiment': # noqa: F821 """ Return a new model using the passed in configuration. Args: configuration: The INI configuration file to use. Returns: The new model. """ raise NotImplementedError("Plugin did not implement get")
[docs] @get_model_type_spec def get_type(self) -> typing.Type['Experiment']: # noqa: F821 """ Get Experiment type. Returns: Experiment type. """ pass
[docs]class ExperimentPlugins: """ ExperimentPlugins acts as registry for Experiment plugins. """
[docs] def __init__(self, strip_all: bool = True) -> None: """ Initialize the Experiment Registry. When strip all is false, the full plugin name will be used for names in map. Args: strip_all: Whether to strip common parts of name from plugins in plugin map """ self._plugins = typing.cast(typing.Dict[str, ExperimentPluginSpecification], load_plugin_map('idmtools_experiment', ExperimentPluginSpecification, strip_all))
[docs] def get_plugins(self) -> typing.Set[ExperimentPluginSpecification]: """ Get plugins. Returns: Experiment plugins. """ return set(self._plugins.values())
[docs] def get_plugin_map(self) -> typing.Dict[str, ExperimentPluginSpecification]: """ Get experiment plugin map. Returns: Experiment plugin map. """ return self._plugins