"""Base classes for all estimators across paralytics.xai subpackage."""
from abc import ABCMeta, abstractmethod
__all__ = [
    'ExplainerMixin'
]
[docs]class ExplainerMixin(metaclass=ABCMeta):
    """Mixin class for all AI explainers in paralytics.xai subpackage."""
    _estimator_type = "explainer"
[docs]    @abstractmethod
    def fit(self, X, y):
        """Fit to data.""" 
[docs]    @abstractmethod
    def explain(self):
        """Explain the black box returning object that visualizes properties.
        Notes
        -----
        It should ultimately return the plot showing previously obtained
        properties in the fitting phase. Sometimes it is insufficient or
        impossible, hence it is acceptable to return a concise value or the
        description itself.
        """ 
[docs]    def fit_explain(self, X, y=None, **fit_params):
        """Fit to data, then explain properties."""
        if y is None:
            return self.fit(X, **fit_params).explain(X)
        else:
            return self.fit(X, y, **fit_params).explain(X, y)