hover.core.representation
-
hover.core.representation.reductionLinker data structures which tie (potentially multiple) dimensionality reducers to arrays.
The point is to make it clear which reduction is in reference to which array.
Icing on the cake: unify the syntax across different kinds of reducers.
DimensionalityReducer (Loggable)Source code in
hover/core/representation/reduction.pyclass DimensionalityReducer(Loggable): def __init__(self, array): """ ???+ note "Link self to the shared input array for reduction methods." | Param | Type | Description | | :------ | :----------- | :---------------------------- | | `array` | `np.ndarray` | the input array to fit on | """ self.reference_array = array @staticmethod def create_reducer(method=None, *args, **kwargs): """ ???+ note "Handle kwarg translation and dynamic imports." | Param | Type | Description | | :--------- | :----- | :----------------------- | | `method` | `str` | `"umap"` or `"ivis"` | | `*args` | | forwarded to the reducer | | `**kwargs` | | translated and forwarded | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] if method == "umap": import umap reducer_cls = umap.UMAP elif method == "ivis": import ivis reducer_cls = ivis.Ivis else: raise ValueError("Expected 'umap' or 'ivis' as reduction method") translated_kwargs = kwargs.copy() for _key, _value in kwargs.items(): _trans_dict = KWARG_TRANSLATOR.get(_key, {}) if method in _trans_dict: _trans_key = _trans_dict[method] translated_kwargs.pop(_key) translated_kwargs[_trans_key] = _value reducer = reducer_cls(*args, **translated_kwargs) return reducer def fit_transform(self, method=None, *args, **kwargs): """ ???+ note "Fit and transform an array and store the reducer." | Param | Type | Description | | :--------- | :----- | :----------------------- | | `method` | `str` | `"umap"` or `"ivis"` | | `*args` | | forwarded to the reducer | | `**kwargs` | | forwarded to the reducer | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] reducer = DimensionalityReducer.create_reducer(method=method, *args, **kwargs) embedding = reducer.fit_transform(self.reference_array) setattr(self, method, reducer) return embedding def transform(self, array, method=None): """ ???+ note "Transform an array with a already-fitted reducer." | Param | Type | Description | | :--------- | :----------- | :----------------------- | | `array` | `np.ndarray` | the array to transform | | `method` | `str` | `"umap"` or `"ivis"` | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] assert isinstance(array, np.ndarray), f"Expected np.ndarray, got {type(array)}" # edge case: array is too small if array.shape[0] < 1: return np.array([]) reducer = getattr(self, method) return reducer.transform(array)__init__(self, array)specialLink self to the shared input array for reduction methods.
Param Type Description arraynp.ndarraythe input array to fit on Source code in
hover/core/representation/reduction.pydef __init__(self, array): """ ???+ note "Link self to the shared input array for reduction methods." | Param | Type | Description | | :------ | :----------- | :---------------------------- | | `array` | `np.ndarray` | the input array to fit on | """ self.reference_array = arraycreate_reducer(method=None, *args, **kwargs)staticmethodHandle kwarg translation and dynamic imports.
Param Type Description methodstr"umap"or"ivis"*argsforwarded to the reducer **kwargstranslated and forwarded Source code in
hover/core/representation/reduction.py@staticmethod def create_reducer(method=None, *args, **kwargs): """ ???+ note "Handle kwarg translation and dynamic imports." | Param | Type | Description | | :--------- | :----- | :----------------------- | | `method` | `str` | `"umap"` or `"ivis"` | | `*args` | | forwarded to the reducer | | `**kwargs` | | translated and forwarded | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] if method == "umap": import umap reducer_cls = umap.UMAP elif method == "ivis": import ivis reducer_cls = ivis.Ivis else: raise ValueError("Expected 'umap' or 'ivis' as reduction method") translated_kwargs = kwargs.copy() for _key, _value in kwargs.items(): _trans_dict = KWARG_TRANSLATOR.get(_key, {}) if method in _trans_dict: _trans_key = _trans_dict[method] translated_kwargs.pop(_key) translated_kwargs[_trans_key] = _value reducer = reducer_cls(*args, **translated_kwargs) return reducerfit_transform(self, method=None, *args, **kwargs)Fit and transform an array and store the reducer.
Param Type Description methodstr"umap"or"ivis"*argsforwarded to the reducer **kwargsforwarded to the reducer Source code in
hover/core/representation/reduction.pydef fit_transform(self, method=None, *args, **kwargs): """ ???+ note "Fit and transform an array and store the reducer." | Param | Type | Description | | :--------- | :----- | :----------------------- | | `method` | `str` | `"umap"` or `"ivis"` | | `*args` | | forwarded to the reducer | | `**kwargs` | | forwarded to the reducer | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] reducer = DimensionalityReducer.create_reducer(method=method, *args, **kwargs) embedding = reducer.fit_transform(self.reference_array) setattr(self, method, reducer) return embeddingtransform(self, array, method=None)Transform an array with a already-fitted reducer.
Param Type Description arraynp.ndarraythe array to transform methodstr"umap"or"ivis"Source code in
hover/core/representation/reduction.pydef transform(self, array, method=None): """ ???+ note "Transform an array with a already-fitted reducer." | Param | Type | Description | | :--------- | :----------- | :----------------------- | | `array` | `np.ndarray` | the array to transform | | `method` | `str` | `"umap"` or `"ivis"` | """ if method is None: method = hover.config["data.embedding"]["default_reduction_method"] assert isinstance(array, np.ndarray), f"Expected np.ndarray, got {type(array)}" # edge case: array is too small if array.shape[0] < 1: return np.array([]) reducer = getattr(self, method) return reducer.transform(array)