From a4f94b381cc0542a13b90edd7dc59f9158e51a6d Mon Sep 17 00:00:00 2001 From: Holger Roth Date: Thu, 11 Aug 2022 18:31:23 -0400 Subject: [PATCH 1/5] add dummy filter Signed-off-by: Holger Roth --- monai/fl/client/monai_algo.py | 2 +- monai/fl/utils/dummy_filter.py | 24 +++++++++++++++++++++++ monai/fl/utils/filter.py | 23 ++++++++++++++++++++++ tests/testing_data/config_fl_filters.json | 9 +++++++-- 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 monai/fl/utils/dummy_filter.py create mode 100644 monai/fl/utils/filter.py diff --git a/monai/fl/client/monai_algo.py b/monai/fl/client/monai_algo.py index d377dc654b..dc9bb12019 100644 --- a/monai/fl/client/monai_algo.py +++ b/monai/fl/client/monai_algo.py @@ -169,7 +169,7 @@ def initialize(self, extra=None): self.eval_parser.read_config(config_eval_files) check_bundle_config(self.eval_parser) if len(config_filter_files) > 0: - self.filter_parser.read_config(config_eval_files) + self.filter_parser.read_config(config_filter_files) # override some config items self.train_parser[RequiredBundleKeys.BUNDLE_ROOT] = self.bundle_root diff --git a/monai/fl/utils/dummy_filter.py b/monai/fl/utils/dummy_filter.py new file mode 100644 index 0000000000..1a8f2f51f6 --- /dev/null +++ b/monai/fl/utils/dummy_filter.py @@ -0,0 +1,24 @@ +# coding: utf8 +from monai.fl.utils.exchange_object import ExchangeObject +from monai.fl.utils.filter import Filter + + +class DummyFilter(Filter): + """ + Dummy filter to content of ExchangeObject. + """ + + def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: + """ + Dummy filter doesn't filter anything but only prints data summary. + + Arguments: + data: ExchangeObject containing some data. + + Returns: + ExchangeObject: filtered data. + """ + + print(f"Dummy filtering ExchangeObject: {data.summary()}") + + return data diff --git a/monai/fl/utils/filter.py b/monai/fl/utils/filter.py new file mode 100644 index 0000000000..98f7881362 --- /dev/null +++ b/monai/fl/utils/filter.py @@ -0,0 +1,23 @@ +# coding: utf8 +import abc + +from monai.fl.utils.exchange_object import ExchangeObject + + +class Filter(abc.ABC): + """ + Used to apply filter to content of ExchangeObject. + """ + + def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: + """ + Run the filtering. + + Arguments: + data: ExchangeObject containing some data. + + Returns: + ExchangeObject: filtered data. + """ + + raise NotImplementedError diff --git a/tests/testing_data/config_fl_filters.json b/tests/testing_data/config_fl_filters.json index e3011ed02c..a77528dc07 100644 --- a/tests/testing_data/config_fl_filters.json +++ b/tests/testing_data/config_fl_filters.json @@ -1,4 +1,9 @@ { - "pre_filters": [], - "post_weight_filters": [] + "pre_filters": [{ + "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + }], + "post_weight_filters": [{ + "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + }], + "post_evaluate_filters": [] } From acbf94f80eae18a7e74ac9f936d2f027b855bd6d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 22:34:37 +0000 Subject: [PATCH 2/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- monai/fl/utils/dummy_filter.py | 1 - monai/fl/utils/filter.py | 1 - tests/testing_data/config_fl_filters.json | 18 +++++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/monai/fl/utils/dummy_filter.py b/monai/fl/utils/dummy_filter.py index 1a8f2f51f6..8111c2ad83 100644 --- a/monai/fl/utils/dummy_filter.py +++ b/monai/fl/utils/dummy_filter.py @@ -1,4 +1,3 @@ -# coding: utf8 from monai.fl.utils.exchange_object import ExchangeObject from monai.fl.utils.filter import Filter diff --git a/monai/fl/utils/filter.py b/monai/fl/utils/filter.py index 98f7881362..c7d965f5ed 100644 --- a/monai/fl/utils/filter.py +++ b/monai/fl/utils/filter.py @@ -1,4 +1,3 @@ -# coding: utf8 import abc from monai.fl.utils.exchange_object import ExchangeObject diff --git a/tests/testing_data/config_fl_filters.json b/tests/testing_data/config_fl_filters.json index a77528dc07..252cbcc7a5 100644 --- a/tests/testing_data/config_fl_filters.json +++ b/tests/testing_data/config_fl_filters.json @@ -1,9 +1,13 @@ { - "pre_filters": [{ - "_target_": "monai.fl.utils.dummy_filter.DummyFilter" - }], - "post_weight_filters": [{ - "_target_": "monai.fl.utils.dummy_filter.DummyFilter" - }], - "post_evaluate_filters": [] + "pre_filters": [ + { + "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + } + ], + "post_weight_filters": [ + { + "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + } + ], + "post_evaluate_filters": [] } From 2acabf4b5d822b448265a8ebcde8d8896c77c947 Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Fri, 12 Aug 2022 11:30:02 +0100 Subject: [PATCH 3/5] adds docstring Signed-off-by: Wenqi Li --- monai/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/monai/README.md b/monai/README.md index 2c30531bf3..64af824b1d 100644 --- a/monai/README.md +++ b/monai/README.md @@ -12,6 +12,8 @@ * **engines**: engine-derived classes for extending Ignite behaviour. +* **fl**: federated learning components to allow pipeline integration with any federated learning framework. + * **handlers**: defines handlers for implementing functionality at various stages in the training process. * **inferers**: defines model inference methods. From 61f63e730aed87be1c6c8de44110d1908708b4b0 Mon Sep 17 00:00:00 2001 From: Holger Roth Date: Fri, 12 Aug 2022 11:43:52 -0400 Subject: [PATCH 4/5] rename filter example Signed-off-by: Holger Roth --- monai/fl/utils/dummy_filter.py | 23 ------------ monai/fl/utils/filter.py | 22 ------------ monai/fl/utils/filters.py | 43 +++++++++++++++++++++++ tests/testing_data/config_fl_filters.json | 4 +-- 4 files changed, 45 insertions(+), 47 deletions(-) delete mode 100644 monai/fl/utils/dummy_filter.py delete mode 100644 monai/fl/utils/filter.py create mode 100644 monai/fl/utils/filters.py diff --git a/monai/fl/utils/dummy_filter.py b/monai/fl/utils/dummy_filter.py deleted file mode 100644 index 8111c2ad83..0000000000 --- a/monai/fl/utils/dummy_filter.py +++ /dev/null @@ -1,23 +0,0 @@ -from monai.fl.utils.exchange_object import ExchangeObject -from monai.fl.utils.filter import Filter - - -class DummyFilter(Filter): - """ - Dummy filter to content of ExchangeObject. - """ - - def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: - """ - Dummy filter doesn't filter anything but only prints data summary. - - Arguments: - data: ExchangeObject containing some data. - - Returns: - ExchangeObject: filtered data. - """ - - print(f"Dummy filtering ExchangeObject: {data.summary()}") - - return data diff --git a/monai/fl/utils/filter.py b/monai/fl/utils/filter.py deleted file mode 100644 index c7d965f5ed..0000000000 --- a/monai/fl/utils/filter.py +++ /dev/null @@ -1,22 +0,0 @@ -import abc - -from monai.fl.utils.exchange_object import ExchangeObject - - -class Filter(abc.ABC): - """ - Used to apply filter to content of ExchangeObject. - """ - - def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: - """ - Run the filtering. - - Arguments: - data: ExchangeObject containing some data. - - Returns: - ExchangeObject: filtered data. - """ - - raise NotImplementedError diff --git a/monai/fl/utils/filters.py b/monai/fl/utils/filters.py new file mode 100644 index 0000000000..38afd6b088 --- /dev/null +++ b/monai/fl/utils/filters.py @@ -0,0 +1,43 @@ +import abc + +from monai.fl.utils.exchange_object import ExchangeObject + + +class Filter(abc.ABC): + """ + Used to apply filter to content of ExchangeObject. + """ + + def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: + """ + Run the filtering. + + Arguments: + data: ExchangeObject containing some data. + + Returns: + ExchangeObject: filtered data. + """ + + raise NotImplementedError + + +class SummaryFilter(Filter): + """ + Summary filter to content of ExchangeObject. + """ + + def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject: + """ + Example filter that doesn't filter anything but only prints data summary. + + Arguments: + data: ExchangeObject containing some data. + + Returns: + ExchangeObject: filtered data. + """ + + print(f"Summary of ExchangeObject: {data.summary()}") + + return data diff --git a/tests/testing_data/config_fl_filters.json b/tests/testing_data/config_fl_filters.json index 252cbcc7a5..5ccafa334c 100644 --- a/tests/testing_data/config_fl_filters.json +++ b/tests/testing_data/config_fl_filters.json @@ -1,12 +1,12 @@ { "pre_filters": [ { - "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + "_target_": "monai.fl.utils.filters.SummaryFilter" } ], "post_weight_filters": [ { - "_target_": "monai.fl.utils.dummy_filter.DummyFilter" + "_target_": "monai.fl.utils.filters.SummaryFilter" } ], "post_evaluate_filters": [] From 2519d945936cff0c6ed16c7867a79c6b69379cf6 Mon Sep 17 00:00:00 2001 From: Holger Roth Date: Fri, 12 Aug 2022 13:09:26 -0400 Subject: [PATCH 5/5] add license header Signed-off-by: Holger Roth --- monai/fl/utils/filters.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/monai/fl/utils/filters.py b/monai/fl/utils/filters.py index 38afd6b088..edda72c312 100644 --- a/monai/fl/utils/filters.py +++ b/monai/fl/utils/filters.py @@ -1,3 +1,14 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import abc from monai.fl.utils.exchange_object import ExchangeObject