Source code for skfdiff.core.backends.base_backend

#!/usr/bin/env python
# coding=utf-8

import warnings
from abc import ABC

import attr

import cloudpickle

from ..grid_builder import GridBuilder
from ..system import PDESys

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", module="fuzz")
    from fuzzywuzzy import process

available_backends = {}


[docs]def get_backend(name): """get a backend by its name Arguments: name {str} -- backend name Raises: NotImplementedError -- raised if the backend is not available. Returns: Backend -- the requested backend """ try: return available_backends[name] except KeyError: err_msg = "%s backend is not registered." % name with warnings.catch_warnings(): warnings.filterwarnings("ignore") (suggest, score), = process.extract( name, available_backends.keys(), limit=1 ) if score > 70: err_msg += ( "\n%s is available and seems to be close. " "It may be what you are looking for !" % suggest ) err_msg += "\nFull list of available backends:\n\t- %s" % ( "\n\t- ".join(available_backends.keys()) ) raise NotImplementedError(err_msg)
[docs]def register_backend(CustomBackend): global available_backends if Backend not in CustomBackend.__mro__: raise AttributeError( "The provider backend should inherit from the Backend base class." ) available_backends[CustomBackend.name] = CustomBackend return CustomBackend
[docs]@attr.s class Backend(ABC): system = attr.ib(type=PDESys) grid_builder = attr.ib(type=GridBuilder) custom_functions = attr.ib(type=list, factory=dict) def __getstate__(self): return {key: cloudpickle.dumps(value) for key, value in self.__dict__.items()} def __setstate__(self, state): self.__dict__.update( {key: cloudpickle.loads(value) for key, value in state.items()} )