Skip to content
Snippets Groups Projects
base_mco_factory.py 3.82 KiB
Newer Older
from traits.api import ABCHasStrictTraits, String, provides, Instance, Type
from envisage.plugin import Plugin
from force_bdss.mco.base_mco import BaseMCO
from force_bdss.mco.base_mco_communicator import BaseMCOCommunicator
from force_bdss.mco.base_mco_model import BaseMCOModel
from .i_mco_factory import IMCOFactory
log = logging.getLogger(__name__)

@provides(IMCOFactory)
class BaseMCOFactory(ABCHasStrictTraits):
    """Base class for the MultiCriteria Optimizer factory.
Stefano Borini's avatar
Stefano Borini committed
    """
    # NOTE: any changes to the interface of this class must be replicated
    # in the IMultiCriteriaOptimizerFactory interface class.
    #: A unique ID produced with the factory_id() routine.
    #: A user friendly name of the factory. Spaces allowed.
    #: The optimizer class to instantiate. Define this to your MCO class.
    optimizer_class = Type(BaseMCO)

    #: The model associated to the MCO. Define this to your MCO model class.
    model_class = Type(BaseMCOModel)

    #: The communicator associated to the MCO. Define this to your MCO comm.
    communicator_class = Type(BaseMCOCommunicator)
    #: A reference to the Plugin that holds this factory.
    plugin = Instance(Plugin)

    def __init__(self, plugin, *args, **kwargs):
        self.plugin = plugin
        super(BaseMCOFactory, self).__init__(*args, **kwargs)

    def create_optimizer(self):
Stefano Borini's avatar
Stefano Borini committed
        """Factory method.
        Creates the optimizer with the given application
        and model and returns it to the caller.

        Returns
        -------
Stefano Borini's avatar
Stefano Borini committed
            The optimizer
        """
        if self.optimizer_class is None:
            msg = ("optimizer_class cannot be None in {}. Either define "
                   "optimizer_class or reimplement create_optimizer on "
                   "your factory class.".format(self.__class__.__name__))
            log.error(msg)
            raise RuntimeError(msg)

        return self.optimizer_class(self)

    def create_model(self, model_data=None):
Stefano Borini's avatar
Stefano Borini committed
        """Factory method.
        Creates the model object (or network of model objects) of the MCO.
        The model can provide a traits UI View according to traitsui
        specifications, so that a UI can be provided automatically.

        Parameters
        ----------
        model_data: dict or None
            A dictionary of data that can be interpreted appropriately to
            recreate the model. If None, an empty (with defaults) model will
            be created and returned.

        Returns
        -------
        BaseMCOModel
            The MCOModel
        """
        if model_data is None:
            model_data = {}

        if self.model_class is None:
            msg = ("model_class cannot be None in {}. Either define "
                   "model_class or reimplement create_model on your "
                   "factory class.".format(self.__class__.__name__))
            log.error(msg)
            raise RuntimeError(msg)

        return self.model_class(self, **model_data)
    def create_communicator(self):
Stefano Borini's avatar
Stefano Borini committed
        """Factory method. Returns the communicator class that allows
        exchange between the MCO and the evaluator code.

Stefano Borini's avatar
Stefano Borini committed
        Returns
        -------
        BaseMCOCommunicator
            An instance of the communicator
Stefano Borini's avatar
Stefano Borini committed
        """
        if self.communicator_class is None:
            msg = ("communicator_class cannot be None in {}. Either define "
                   "communicator_class or reimplement create_communicator on "
                   "your factory class.".format(self.__class__.__name__))
            log.error(msg)
            raise RuntimeError(msg)

        return self.communicator_class(self)

    def parameter_factories(self):
        """Returns the parameter factories supported by this MCO

        Returns
        -------
        List of BaseMCOParameterFactory
        """