diff --git a/hyppopy/solver.py b/hyppopy/solver.py index c1532ad..cae16e1 100644 --- a/hyppopy/solver.py +++ b/hyppopy/solver.py @@ -1,32 +1,70 @@ +# -*- coding: utf-8 -*- +# +# DKFZ +# +# +# Copyright (c) German Cancer Research Center, +# Division of Medical and Biological Informatics. +# All rights reserved. +# +# This software is distributed WITHOUT ANY WARRANTY; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. +# +# See LICENSE.txt or http://www.mitk.org for details. +# +# Author: Sven Wanner (s.wanner@dkfz.de) + +import logging +LOG = logging.getLogger('hyppopy') + + class Solver(object): _name = None _solver = None _parameter = None def __init__(self, name=None): self.set_name(name) def __str__(self): txt = f"\nSolver Instance {self._name}:" if self._solver is None: txt += f"\n - Status solver: None" else: txt += f"\n - Status solver: ok" if self._parameter is None: txt += f"\n - Status parameter: None" else: txt += f"\n - Status parameter: ok" return txt def is_ready(self): return self._solver is not None and self._parameter is not None def set_name(self, name): + LOG.debug(f"set_name({name})") self._name = name - def set_parameter(self, obj): - self._parameter = obj + @property + def solver(self): + return self._solver + + @solver.setter + def solver(self, value): + if not type(value).__name__.endswith("Solver"): + LOG.error("Input Error, value is not of type Solver") + raise IOError("Input Error, value is not of type Solver") + self._solver = value + + @property + def parameter(self): + return self._parameter - def set_solver(self, obj): - self._solver = obj + @parameter.setter + def parameter(self, value): + if not type(value).__name__.endswith("ParameterSpace"): + LOG.error("Input Error, value is not of type ParameterSpace") + raise IOError("Input Error, value is not of type ParameterSpace") + self._parameter = value diff --git a/hyppopy/solver_factory.py b/hyppopy/solver_factory.py index 2e426a3..38c8d25 100644 --- a/hyppopy/solver_factory.py +++ b/hyppopy/solver_factory.py @@ -1,99 +1,99 @@ # -*- coding: utf-8 -*- # # DKFZ # # # Copyright (c) German Cancer Research Center, # Division of Medical and Biological Informatics. # All rights reserved. # # This software is distributed WITHOUT ANY WARRANTY; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. # # See LICENSE.txt or http://www.mitk.org for details. # # Author: Sven Wanner (s.wanner@dkfz.de) from yapsy.PluginManager import PluginManager from .settings import PLUGIN_DEFAULT_DIR from .solver import Solver import logging LOG = logging.getLogger('hyppopy') class SolverFactory(object): _instance = None _plugin_dirs = [] _plugins = {} def __init__(self): if SolverFactory._instance is not None: pass else: LOG.debug("__init__()") SolverFactory._instance = self self.reset() self.load_plugins() @staticmethod def instance(): """ Singleton instance access :return: [SolverFactory] instance """ LOG.debug("instance()") if SolverFactory._instance is None: SolverFactory() return SolverFactory._instance def get_solver_names(self): return list(self._plugins.keys()) def get_solver(self, name, **kwargs): if name not in self._plugins.keys(): LOG.error(f"Solver plugin {name} not available") raise KeyError(f"Solver plugin {name} not available") return self._plugins[name] def add_plugin_dir(self, dir): """ Add plugin directory """ LOG.debug(f"add_plugin_dir({dir})") self._plugin_dirs.append(dir) def reset(self): """ Reset solver factory """ LOG.debug("reset()") self._plugins = {} self._plugin_dirs = [] self.add_plugin_dir(PLUGIN_DEFAULT_DIR) def load_plugins(self): """ Load plugin modules from plugin paths """ LOG.debug("load_plugins()") LOG.debug(f"setPluginPlaces(" + " ".join(map(str, self._plugin_dirs))) manager = PluginManager() manager.setPluginPlaces(self._plugin_dirs) manager.collectPlugins() for plugin in manager.getAllPlugins(): name, type = plugin.plugin_object.__class__.__name__.split("_") if name not in self._plugins.keys(): self._plugins[name] = Solver(name) if type == "Solver": - self._plugins[name].set_solver(plugin.plugin_object.__class__()) + self._plugins[name].solver = plugin.plugin_object.__class__() LOG.info(f"Plugin: {name} Solver loaded") elif type == "ParameterSpace": - self._plugins[name].set_parameter(plugin.plugin_object.__class__()) + self._plugins[name].parameter = plugin.plugin_object.__class__() LOG.info(f"Plugin: {name} ParameterSpace loaded") else: LOG.error(f"Failed loading plugin {name}! Please check if naming conventions are kept!") raise IOError(f"Failed loading plugin {name}! Please check if naming conventions are kept!")