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. 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/filters.py b/monai/fl/utils/filters.py new file mode 100644 index 0000000000..edda72c312 --- /dev/null +++ b/monai/fl/utils/filters.py @@ -0,0 +1,54 @@ +# 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 + + +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 e3011ed02c..5ccafa334c 100644 --- a/tests/testing_data/config_fl_filters.json +++ b/tests/testing_data/config_fl_filters.json @@ -1,4 +1,13 @@ { - "pre_filters": [], - "post_weight_filters": [] + "pre_filters": [ + { + "_target_": "monai.fl.utils.filters.SummaryFilter" + } + ], + "post_weight_filters": [ + { + "_target_": "monai.fl.utils.filters.SummaryFilter" + } + ], + "post_evaluate_filters": [] }