def __set_loaders_and_savers(self): """ Get lists of loader and saver positions within the plugin list and set the number of loaders. :returns: loader index list and saver index list :rtype: list(int(loader)), list(int(saver)) """ from savu.plugins.loaders.base_loader import BaseLoader from savu.plugins.savers.base_saver import BaseSaver loader_idx = [] saver_idx = [] self.n_plugins = len(self.plugin_list) for i in range(self.n_plugins): bases = inspect.getmro(pu.load_class(self.plugin_list[i]['id'])) loader_list = [b for b in bases if b == BaseLoader] saver_list = [b for b in bases if b == BaseSaver] if loader_list: loader_idx.append(i) if saver_list: saver_idx.append(i) self.loader_idx = loader_idx self.saver_idx = saver_idx self.n_loaders = len(loader_idx) self.n_savers = len(saver_idx)
def _set_parameters(self, args, kwargs, cls, cls_path, extras): mod = '.'.join(cls_path.split('.')[:-1]) cls = cls_path.split('.')[-1] func = pu.load_class(mod, cls).__init__ argspec = inspect.getargspec(func) if len(argspec[0]) - 1 != len(args) + len(kwargs.keys()): raise Exception('Incorrect number of input arguments mapped.') data_lists = [ True if isinstance(a, list) and isinstance(a[0], int) else False for a in args ] # If there are multiple data objects this is incompatible with # checkpointing. ddict = {} if args.count('self') > 2 or data_lists.count(True): ddict = None else: ddict['args'] = args ddict['kwargs'] = kwargs ddict['cls'] = cls_path ddict['extras'] = extras return ddict
def _set_data_type(self, dObj, group, nxs_filename): link = group.get(group.attrs['signal'], getlink=True) if isinstance(link, h5py._hl.group.HardLink) and \ self.exp.meta_data.get('test_state') is True: link.filename = nxs_filename link.path = group.name + '/data' fname = os.path.join(os.path.dirname(nxs_filename), link.filename) dObj.backing_file = h5py.File(fname, 'r') dObj.data = dObj.backing_file[link.path] if 'data_type' not in group: return entry = group['data_type'] args = self._get_data(entry, 'args') args = [args[''.join(['args', str(i)])] for i in range(len(args))] args = [a if a != 'self' else dObj for a in args] kwargs = self._get_data(entry, 'kwargs') extras = self._get_data(entry, 'extras') cls = str(self._get_data(entry, 'cls')) cls_split = cls.split('.') cls_inst = \ pu.load_class('.'.join(cls_split[:-1]), cls_name=cls_split[-1]) dObj.data = cls_inst(*args, **kwargs) dObj.data._base_post_clone_updates(dObj.data, extras)
def __set_loaders_and_savers(self): """ Get lists of loader and saver positions within the plugin list and set the number of loaders. :returns: loader index list and saver index list :rtype: list(int(loader)), list(int(saver)) """ from savu.plugins.loaders.base_loader import BaseLoader from savu.plugins.savers.base_saver import BaseSaver loader_idx = [] saver_idx = [] self.n_plugins = len(self.plugin_list) for i in range(self.n_plugins): pid = self.plugin_list[i]['id'] bases = inspect.getmro(pu.load_class(pid)) loader_list = [b for b in bases if b == BaseLoader] saver_list = [b for b in bases if b == BaseSaver] if loader_list: loader_idx.append(i) if saver_list: saver_idx.append(i) self.loader_idx = loader_idx self.saver_idx = saver_idx self.n_loaders = len(loader_idx) self.n_savers = len(saver_idx)
def test_get_plugins_path_and_load(self): savu_path = os.path.split(savu.__path__[0])[0] plugin_path = os.path.join(savu_path, "plugin_examples") os.environ["SAVU_PLUGINS_PATH"] = plugin_path pu.get_plugins_paths() plugin = pu.load_class("example_median_filter")() self.assertEqual(plugin.name, "ExampleMedianFilter") os.environ["SAVU_PLUGINS_PATH"] = ""
def _contains_gpu_processes(self): """ Returns True if gpu processes exist in the process list. """ from savu.plugins.driver.gpu_plugin import GpuPlugin for i in range(self.n_plugins): bases = inspect.getmro(pu.load_class(self.plugin_list[i]['id'])) if GpuPlugin in bases: return True return False
def create_next_instance(self, newObj): dtype_dict = self.get_map_args() if dtype_dict is None: return None args, kwargs, cls, extras = self._get_parameters(dtype_dict) args = [newObj if isinstance(a, str) and a == 'self' else a for a in args] cls_split = cls.split('.') mod = '.'.join(cls_split[:-1]) name = cls_split[-1] cls_inst = pu.load_class(mod, cls_name=name) newObj.data = cls_inst(*args, **kwargs) self._base_post_clone_updates(newObj.data, extras)
def _contains_gpu_processes(self): """ Returns True if gpu processes exist in the process list. """ try: from savu.plugins.driver.gpu_plugin import GpuPlugin for i in range(self.n_plugins): bases = inspect.getmro(pu.load_class(self.plugin_list[i]['id'])) if GpuPlugin in bases: return True except ImportError as ex: if "pynvml" in ex.message: logging.error('Error while importing GPU dependencies: %s', ex.message) else: raise return False
def set_plugin_list(options, pnames, *args): args = args[0] if args else None plugin_names = pnames if isinstance(pnames, list) else [pnames] options['plugin_list'] = [] ID = [options['loader']] data = [{}, {}] if not args else [args[0], args[-1]] for i in range(len(plugin_names)): ID.insert(i + 1, plugin_names[i]) plugin = pu.load_class(plugin_names[i])() data_dict = set_data_dict(['tomo'], get_output_datasets(plugin)) data_dict = args[i + 1] if args else data_dict data.insert(i + 1, data_dict) for i in range(len(ID)): name = \ ''.join(x.capitalize() for x in (ID[i].split('.')[-1]).split('_')) options['plugin_list'].append(set_plugin_entry(name, ID[i], data[i], i))
def _add_missing_savers(self, exp): """ Add savers for missing datasets. """ data_names = exp.index['in_data'].keys() saved_data = [] for i in self._get_savers_index(): saved_data.append(self.plugin_list[i]['data']['in_datasets']) saved_data = set([s for sub_list in saved_data for s in sub_list]) for name in [data for data in data_names if data not in saved_data]: pos = exp.meta_data.get('nPlugin') + 1 exp.meta_data.set('nPlugin', pos) process = {} plugin = pu.load_class('savu.plugins.savers.hdf5_saver')() plugin.parameters['in_datasets'] = [name] process['name'] = plugin.name process['id'] = plugin.__module__ process['pos'] = str(pos + 1) process['data'] = plugin.parameters process['active'] = True process['desc'] = plugin.parameters_desc self._add(pos + 1, process)
def _set_parameters(self, args, kwargs, cls, cls_path, extras): mod = '.'.join(cls_path.split('.')[:-1]) cls = cls_path.split('.')[-1] func = pu.load_class(mod, cls).__init__ argspec = inspect.getargspec(func) if len(argspec[0])-1 != len(args) + len(kwargs.keys()): raise Exception('Incorrect number of input arguments mapped.') data_lists = [True if isinstance(a, list) and isinstance(a[0], int) else False for a in args] # If there are multiple data objects this is incompatible with # checkpointing. ddict = {} if args.count('self') > 2 or data_lists.count(True): ddict = None else: ddict['args'] = args ddict['kwargs'] = kwargs ddict['cls'] = cls_path ddict['extras'] = extras return ddict
def testGetPlugin(self): mod = "savu.plugins.plugin" plugin = pu.load_class(mod)() self.assertEqual(plugin.__class__, test_plugin.Plugin, "Failed to load the correct class") self.assertRaises(NotImplementedError, plugin.process_frames, None)
def test_get_plugin_external_path(self): savu_path = os.path.split(savu.__path__[0])[0] mod = os.path.join(savu_path, "plugin_examples", "example_median_filter.py") plugin = pu.load_class(mod)() self.assertEqual(plugin.name, "ExampleMedianFilter")
def testfind_args(self): mod = "savu.plugins.filters.denoising.denoise_bregman_filter" plugin = pu.load_class(mod)() params = doc.find_args(plugin) self.assertEqual(len(params['param']), 4)
def plugin_setup(self): ppath = 'savu.plugins.reconstructions.astra_recons.astra_recon_cpu' plugin = pu.load_class(ppath)() return plugin
def test_load_plugin(self): cu.populate_plugins() plugin_path = pu.dawn_plugins[dawn_plugins.keys()[0]]['path2plugin'] inst = pu.load_class(plugin_path)() sl = inst.__dict__['slice_list'] exp = inst.__dict__['exp']