From dfc428d8ba9a1c615c7aeef8b497245f78eea97b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Defferrard?= Date: Thu, 13 Dec 2018 15:46:46 +0100 Subject: [PATCH] new API: filter banks behave like containers and matrices (experimental) not documented and tested yet as we want to see how it works in practice before recommending its usage --- pygsp/filters/filter.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pygsp/filters/filter.py b/pygsp/filters/filter.py index ca52ae8f..5c59a522 100644 --- a/pygsp/filters/filter.py +++ b/pygsp/filters/filter.py @@ -5,6 +5,7 @@ from pygsp import utils # prevent circular import in Python < 3.5 from . import approximations +from ..graphs import Graph _logger = utils.build_logger(__name__) @@ -63,6 +64,7 @@ def __init__(self, G, kernels): # Only used by subclasses to instantiate a single filterbank. self.n_features_in, self.n_features_out = (1, len(kernels)) + self.shape = (self.n_features_out, self.n_features_in) self.n_filters = self.n_features_in * self.n_features_out self.Nf = self.n_filters # TODO: kept for backward compatibility only. @@ -78,6 +80,28 @@ def __repr__(self): s += '{}={}, '.format(key, value) return '{}({})'.format(self.__class__.__name__, s[:-2]) + def __len__(self): + # Numpy returns shape[0]. + return self.n_filters + + def __getitem__(self, key): + return Filter(self.G, self._kernels[key]) + + def __add__(self, other): + """Concatenation of filterbanks.""" + if not isinstance(other, Filter): + return NotImplemented + return Filter(self.G, self._kernels + other._kernels) + + def __call__(self, x): + if isinstance(x, Graph): + return Filter(x, self._kernels) + else: + return self.evaluate(x) + + def __matmul__(self, other): + return self.filter(other) + def evaluate(self, x): r"""Evaluate the kernels at given frequencies.