monai-weekly 1.7.dev2637__tar.gz → 1.7.dev2639__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/PKG-INFO +5 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/__init__.py +1 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_version.py +3 -3
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nnunet/nnunetv2_runner.py +55 -6
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/utils.py +44 -7
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/workflows.py +211 -23
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/__init__.py +10 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/image_reader.py +152 -2
- monai_weekly-1.7.dev2639/monai/data/nvimgcodec_pydicom_plugin.py +80 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/tensorboard_handlers.py +11 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/inferers/inferer.py +149 -36
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/io/array.py +29 -3
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/io/dictionary.py +3 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utils.py +2 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/__init__.py +1 -0
- monai_weekly-1.7.dev2639/monai/utils/compare_sources.py +107 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/misc.py +11 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/safeeval.py +17 -2
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/PKG-INFO +5 -1
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/SOURCES.txt +2 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/requires.txt +7 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/pyproject.toml +10 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/LICENSE +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/MANIFEST.in +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/README.md +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/gmm/gmm.cpp +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/gmm/gmm.h +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/gmm/gmm_cpu.cpp +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/gmm/gmm_cuda.cu +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/gmm/gmm_cuda_linalg.cuh +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/_extensions/loader.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/__main__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/auto_runner.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/bundle_gen.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/data_analyzer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/ensemble_builder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/hpo_gen.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/auto3dseg/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/datasets.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepedit/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepedit/interaction.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepedit/transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepgrow/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepgrow/dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepgrow/interaction.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/deepgrow/transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/metrics/coco.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/metrics/matching.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/networks/retinanet_detector.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/networks/retinanet_network.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/transforms/box_ops.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/ATSS_matcher.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/anchor_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/box_coder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/box_selector.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/detector_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/hard_negative_sampler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/detection/utils/predict_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/maisi/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/maisi/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/maisi/networks/controlnet_maisi.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/mmars/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/mmars/mmars.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/mmars/model_desc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nnunet/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nnunet/__main__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nnunet/nnunet_bundle.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nnunet/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nuclick/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/nuclick/transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/inferers/inferer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/losses/hovernet_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/metrics/lesion_froc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/post/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/stain/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/stain/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/transforms/stain/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/pathology/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/complex_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/fastmri_reader.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/mri_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/blocks/varnetblock.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/nets/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/nets/coil_sensitivity_model.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/nets/complex_unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/nets/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/networks/nets/varnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/reconstruction/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/tcia/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/tcia/label_desc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/tcia/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/vista3d/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/vista3d/inferer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/vista3d/sampler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/apps/vista3d/transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/algo_gen.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/analyzer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/operations.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/auto3dseg/seg_summarizer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/__main__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/config_item.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/config_parser.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/properties.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/reference_resolver.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/scripts.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/bundle/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/__main__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/check_env.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/deviceconfig.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/print_dependencies.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/config/type_definitions.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/box_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/csv_saver.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/dataloader.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/dataset_summary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/decathlon_datalist.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/fft_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/folder_layout.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/grid_dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/image_dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/image_writer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/iterable_dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/itk_torch_bridge.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/meta_obj.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/meta_tensor.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/samplers.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/synthetic.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/test_time_augmentation.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/thread_buffer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/torchscript_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/ultrasound_confidence_map.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/video_dataset.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/wsi_datasets.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/data/wsi_reader.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/engines/evaluator.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/engines/trainer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/engines/workflow.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/client/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/client/client_algo.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/client/monai_algo.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/utils/constants.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/utils/exchange_object.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/fl/utils/filters.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/average_precision.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/calibration.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/checkpoint_loader.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/checkpoint_saver.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/classification_saver.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/clearml_handlers.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/confusion_matrix.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/decollate_batch.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/earlystop_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/garbage_collector.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/ignite_metric.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/logfile_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/lr_schedule_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/mean_dice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/mean_iou.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/metric_logger.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/metrics_reloaded_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/metrics_saver.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/mlflow_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/nvtx_handlers.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/parameter_scheduler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/postprocessing.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/probability_maps.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/regression_metrics.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/roc_auc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/smartcache_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/stats_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/trt_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/handlers/validation_handler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/inferers/merger.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/inferers/splitter.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/inferers/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/adversarial_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/aucm_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/barlow_twins.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/boundary_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/cldice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/contrastive.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/deform.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/dice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/ds_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/focal_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/giou_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/hausdorff_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/image_dissimilarity.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/mcc_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/multi_scale.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/nacl_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/perceptual.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/spatial_mask.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/spectral_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/ssim_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/sure_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/tversky.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/unified_focal_loss.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/losses/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/absolute_volume_difference.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/active_learning_metrics.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/average_precision.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/calibration.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/confusion_matrix.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/cumulative_average.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/embedding_collapse.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/f_beta_score.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/fid.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/froc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/generalized_dice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/loss_metric.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/meandice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/meaniou.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/metric.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/mmd.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/regression.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/rocauc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/surface_dice.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/metrics/wrapper.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/acti_norm.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/activation.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/activation_checkpointing.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/aspp.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/attention_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/backbone_fpn_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/cablock.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/convolutions.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/crf.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/crossattention.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/denseblock.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/dints_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/downsample.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/dynunet_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/encoder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/fcn.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/feature_pyramid_network.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/fft_utils_t.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/hyena.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/localnet_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/mednext_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/mlp.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/patchembedding.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/pos_embed_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/regunet_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/rel_pos_embedding.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/segresnet_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/selfattention.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/spade_norm.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/spatialattention.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/squeeze_and_excitation.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/text_embedding.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/transformerblock.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/unetr_block.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/upsample.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/blocks/warp.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/conjugate_gradient.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/convutils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/drop_path.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/factories.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/filtering.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/gmm.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/simplelayers.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/spatial_transforms.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/vector_quantizer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/layers/weight_init.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/ahnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/attentionunet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/autoencoder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/basic_unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/basic_unetplusplus.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/cell_sam_wrapper.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/classifier.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/controlnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/daf3d.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/densenet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/dints.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/dynunet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/efficientnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/flexible_unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/fullyconnectednet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/generator.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/highresnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/hovernet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/hyena_nd_unetr.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/masked_autoencoder_vit.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/mednext.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/milmodel.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/navit.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/netadapter.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/patchgan_discriminator.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/quicknat.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/regressor.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/regunet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/resnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/restormer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/segresnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/segresnet_ds.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/senet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/spade_autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/spade_diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/spade_network.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/swin_unetr.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/torchvision_fc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/transchex.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/transformer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/unet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/unetr.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/varautoencoder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/vista3d.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/vit.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/vitautoenc.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/vnet.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/voxelmorph.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/nets/vqvae.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/ddim.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/ddpm.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/pndm.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/rectified_flow.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/schedulers/scheduler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/trt_compiler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/networks/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/optimizers/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/optimizers/lr_finder.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/optimizers/lr_scheduler.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/optimizers/novograd.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/optimizers/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/py.typed +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/adaptors.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/compose.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/croppad/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/croppad/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/croppad/batch.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/croppad/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/croppad/functional.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/intensity/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/intensity/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/intensity/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/inverse.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/inverse_batch_transform.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/io/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/lazy/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/lazy/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/lazy/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/lazy/functional.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/lazy/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/meta_utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/meta_utility/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/nvtx.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/post/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/regularization/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/regularization/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/regularization/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/signal/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/signal/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/signal/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/smooth_field/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/smooth_field/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/smooth_field/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/spatial/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/spatial/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/spatial/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/spatial/functional.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/traits.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/transform.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utility/array.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utility/dictionary.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utils_create_transform_ims.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utils_morphological_ops.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/transforms/utils_pytorch_numpy_unification.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/component_store.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/decorators.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/deprecate_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/dist.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/enums.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/jupyter_utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/module.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/nvtx.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/ordering.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/profiling.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/state_cacher.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/tf32.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/utils/type_conversion.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/__init__.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/class_activation_maps.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/gradient_based.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/img2tensorboard.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/occlusion_sensitivity.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/utils.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai/visualize/visualizer.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/dependency_links.txt +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/not-zip-safe +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/monai_weekly.egg-info/top_level.txt +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/setup.cfg +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/setup.py +0 -0
- {monai_weekly-1.7.dev2637 → monai_weekly-1.7.dev2639}/versioneer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: monai-weekly
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.dev2639
|
|
4
4
|
Summary: AI Toolkit for Healthcare Imaging
|
|
5
5
|
Author-email: MONAI Consortium <monai.contact@gmail.com>
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -122,6 +122,10 @@ Provides-Extra: nni
|
|
|
122
122
|
Requires-Dist: nni; (platform_system == "Linux" and "arm" not in platform_machine and "aarch" not in platform_machine) and extra == "nni"
|
|
123
123
|
Requires-Dist: filelock<3.12.0; extra == "nni"
|
|
124
124
|
Requires-Dist: typeguard<3; extra == "nni"
|
|
125
|
+
Provides-Extra: nvimgcodec
|
|
126
|
+
Requires-Dist: pydicom; extra == "nvimgcodec"
|
|
127
|
+
Requires-Dist: cupy-cuda13x[ctk]!=14.1.0; platform_system == "Linux" and extra == "nvimgcodec"
|
|
128
|
+
Requires-Dist: nvidia-nvimgcodec-cu13[all]>=0.8.0; platform_system == "Linux" and extra == "nvimgcodec"
|
|
125
129
|
Provides-Extra: onnx
|
|
126
130
|
Requires-Dist: onnx>=1.13.0; extra == "onnx"
|
|
127
131
|
Requires-Dist: onnxruntime; python_version <= "3.10" and extra == "onnx"
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-09-
|
|
11
|
+
"date": "2026-09-27T02:18:34+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.7.
|
|
14
|
+
"full-revisionid": "5cfc144e2f41cc448085b59758dd2ab1d335f3d1",
|
|
15
|
+
"version": "1.7.dev2639"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -25,8 +25,8 @@ import monai
|
|
|
25
25
|
from monai.apps.nnunet.utils import NNUNETMode as M
|
|
26
26
|
from monai.apps.nnunet.utils import analyze_data, create_new_data_copy, create_new_dataset_json
|
|
27
27
|
from monai.bundle import ConfigParser
|
|
28
|
-
from monai.utils import ensure_tuple, optional_import
|
|
29
|
-
from monai.utils.misc import run_cmd
|
|
28
|
+
from monai.utils import ensure_tuple, optional_import, require_pkg
|
|
29
|
+
from monai.utils.misc import MONAIEnvVars, run_cmd
|
|
30
30
|
|
|
31
31
|
load_pickle, _ = optional_import("batchgenerators.utilities.file_and_folder_operations", name="load_pickle")
|
|
32
32
|
join, _ = optional_import("batchgenerators.utilities.file_and_folder_operations", name="join")
|
|
@@ -40,6 +40,39 @@ __all__ = ["nnUNetV2Runner"]
|
|
|
40
40
|
DATASET_ID_FORMAT = r"Dataset[0-9]{3}|[0-9]+" # regex format for a valid nnUnet dataset name
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
def _confine_to_dir(candidate: str, allowed_dir: str, description: str) -> str:
|
|
44
|
+
"""
|
|
45
|
+
Resolve ``candidate`` and require that it stays inside ``allowed_dir``.
|
|
46
|
+
|
|
47
|
+
``inference_information.json`` is produced by nnU-Net inside the results directory, but its
|
|
48
|
+
contents are plain JSON: whoever can write that file chooses the paths this runner then loads.
|
|
49
|
+
Confining the path means a tampered ``inference_information.json`` cannot redirect a load to an
|
|
50
|
+
attacker-planted file elsewhere on the filesystem.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
candidate: the path read from the configuration file.
|
|
54
|
+
allowed_dir: the directory the path must resolve inside.
|
|
55
|
+
description: name of the field, used in the error message.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
The resolved absolute path.
|
|
59
|
+
|
|
60
|
+
Raises:
|
|
61
|
+
ValueError: if the resolved path escapes ``allowed_dir``.
|
|
62
|
+
"""
|
|
63
|
+
resolved = os.path.realpath(candidate)
|
|
64
|
+
allowed_root = os.path.realpath(allowed_dir)
|
|
65
|
+
if os.path.commonpath([resolved, allowed_root]) != allowed_root:
|
|
66
|
+
raise ValueError(
|
|
67
|
+
f"Refusing to load {description} from '{candidate}': it resolves to '{resolved}', outside the "
|
|
68
|
+
f"expected directory '{allowed_root}'. This path is read from `inference_information.json`; a "
|
|
69
|
+
"value pointing outside the results directory indicates that file has been tampered with "
|
|
70
|
+
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-8f32-8649-rv87)."
|
|
71
|
+
)
|
|
72
|
+
return resolved
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@require_pkg(pkg_name="nnunetv2")
|
|
43
76
|
class nnUNetV2Runner: # noqa: N801
|
|
44
77
|
"""
|
|
45
78
|
``nnUNetV2Runner`` provides an interface in MONAI to use `nnU-Net` V2 library to analyze, train, and evaluate
|
|
@@ -1004,22 +1037,38 @@ class nnUNetV2Runner: # noqa: N801
|
|
|
1004
1037
|
|
|
1005
1038
|
# apply postprocessing
|
|
1006
1039
|
if run_postprocessing:
|
|
1007
|
-
|
|
1040
|
+
results_root = os.path.join(self.nnunet_results, self.dataset_name)
|
|
1041
|
+
postprocessing_file = _confine_to_dir(
|
|
1042
|
+
self.best_configuration["best_model_or_ensemble"]["postprocessing_file"],
|
|
1043
|
+
results_root,
|
|
1044
|
+
"postprocessing_file",
|
|
1045
|
+
)
|
|
1046
|
+
plans_file = _confine_to_dir(
|
|
1047
|
+
self.best_configuration["best_model_or_ensemble"]["some_plans_file"], results_root, "some_plans_file"
|
|
1048
|
+
)
|
|
1008
1049
|
warnings.warn(
|
|
1009
1050
|
f"unpickling postprocessing_file {postprocessing_file}: this path is read from "
|
|
1010
1051
|
"inference_information.json and is loaded with Python pickle without any allow list, "
|
|
1011
|
-
"which gives whoever controls that file arbitrary code execution.
|
|
1012
|
-
"
|
|
1052
|
+
"which gives whoever controls that file arbitrary code execution. The path is confined to "
|
|
1053
|
+
"the dataset's results directory, but anyone able to write inside that directory can still "
|
|
1054
|
+
"supply a malicious pickle. Only proceed if the results directory is from a source you trust "
|
|
1013
1055
|
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-8f32-8649-rv87).",
|
|
1014
1056
|
stacklevel=2,
|
|
1015
1057
|
)
|
|
1058
|
+
if not MONAIEnvVars.allow_pickle():
|
|
1059
|
+
warnings.warn(
|
|
1060
|
+
"Loading nnU-Net postprocessing via Python pickle will require the environment variable "
|
|
1061
|
+
"MONAI_ALLOW_PICKLE=1 from MONAI 1.7. Set it now to keep this call working after the change.",
|
|
1062
|
+
FutureWarning,
|
|
1063
|
+
stacklevel=2,
|
|
1064
|
+
)
|
|
1016
1065
|
pp_fns, pp_fn_kwargs = load_pickle(postprocessing_file)
|
|
1017
1066
|
apply_postprocessing_to_folder(
|
|
1018
1067
|
folder_for_pp,
|
|
1019
1068
|
join(target_dir_base, "ensemble_predictions_postprocessed"),
|
|
1020
1069
|
pp_fns,
|
|
1021
1070
|
pp_fn_kwargs,
|
|
1022
|
-
plans_file_or_dict=
|
|
1071
|
+
plans_file_or_dict=plans_file,
|
|
1023
1072
|
)
|
|
1024
1073
|
|
|
1025
1074
|
def run(
|
|
@@ -20,6 +20,7 @@ import sys
|
|
|
20
20
|
import warnings
|
|
21
21
|
from copy import deepcopy
|
|
22
22
|
from numbers import Number
|
|
23
|
+
from pydoc import locate
|
|
23
24
|
from typing import Any, cast
|
|
24
25
|
|
|
25
26
|
import numpy as np
|
|
@@ -62,6 +63,42 @@ def _require_pickle_allowed() -> None:
|
|
|
62
63
|
raise RuntimeError(_PICKLE_DISABLED_MSG)
|
|
63
64
|
|
|
64
65
|
|
|
66
|
+
def _reject_non_algo_target(target: Any, filename: str) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Require that ``target`` names an ``Algo`` subclass before it is instantiated.
|
|
69
|
+
|
|
70
|
+
``algo_from_json`` resolves ``_target_`` through ``ConfigParser``, which imports the dotted path
|
|
71
|
+
and calls it. ``algo_object.json`` has exactly one legitimate target type -- an ``Algo``
|
|
72
|
+
subclass -- so resolving the name and checking it here rejects payloads such as
|
|
73
|
+
``subprocess.call`` or ``os.system`` before they are ever invoked.
|
|
74
|
+
|
|
75
|
+
Importing the named module still runs that module's top-level code, so this narrows the sink
|
|
76
|
+
rather than closing it: an untrusted ``algo_object.json`` combined with an attacker-controlled
|
|
77
|
+
template directory remains dangerous.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
target: the ``_target_`` value read from the file.
|
|
81
|
+
filename: the file the value came from, used in the error message.
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
ValueError: if ``target`` is not a string, or does not resolve to a concrete ``Algo`` subclass.
|
|
85
|
+
ModuleNotFoundError: if the module cannot be imported, so callers can try the next
|
|
86
|
+
template path.
|
|
87
|
+
"""
|
|
88
|
+
if not isinstance(target, str):
|
|
89
|
+
raise ValueError(f"Invalid `_target_` in {filename}: expected a string, got {type(target).__name__}.")
|
|
90
|
+
resolved = locate(target)
|
|
91
|
+
if resolved is None:
|
|
92
|
+
raise ModuleNotFoundError(f"Cannot resolve `_target_` {target!r} from {filename}.")
|
|
93
|
+
if not (isinstance(resolved, type) and resolved is not Algo and issubclass(resolved, Algo)):
|
|
94
|
+
raise ValueError(
|
|
95
|
+
f"Refusing to instantiate `_target_` {target!r} from {filename}: it resolves to "
|
|
96
|
+
f"{resolved!r}, which is not a subclass of `monai.auto3dseg.Algo`. Only Algo subclasses "
|
|
97
|
+
"may be named in a configuration "
|
|
98
|
+
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-2wx3-8x3w-r8qv)."
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
65
102
|
measure_np, has_measure = optional_import("skimage.measure", "0.14.2", min_version)
|
|
66
103
|
cp, has_cp = optional_import("cupy")
|
|
67
104
|
|
|
@@ -493,16 +530,16 @@ def algo_from_json(filename: str, template_path: PathLike | None = None, **kwarg
|
|
|
493
530
|
if state_template_path:
|
|
494
531
|
algo_config["template_path"] = state_template_path
|
|
495
532
|
|
|
496
|
-
|
|
497
|
-
f"Loading {filename}: the file's `_target_` value is resolved to an imported callable and "
|
|
498
|
-
"invoked, and template directories from the file may be added to `sys.path`; only load "
|
|
499
|
-
"algo_object.json files from a source you trust "
|
|
500
|
-
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-2wx3-8x3w-r8qv).",
|
|
501
|
-
stacklevel=2,
|
|
502
|
-
)
|
|
533
|
+
_reject_non_algo_target(target, filename)
|
|
503
534
|
|
|
504
535
|
parser = ConfigParser(algo_config)
|
|
505
536
|
algo = parser.get_parsed_content()
|
|
537
|
+
if not isinstance(algo, Algo):
|
|
538
|
+
raise ValueError(
|
|
539
|
+
f"refusing to return the object built from '{target}' in {filename}: it is a "
|
|
540
|
+
f"{type(algo).__name__}, not an Algo instance "
|
|
541
|
+
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-2wx3-8x3w-r8qv)."
|
|
542
|
+
)
|
|
506
543
|
used_template_path = path
|
|
507
544
|
break
|
|
508
545
|
except ModuleNotFoundError as e:
|
|
@@ -11,11 +11,15 @@
|
|
|
11
11
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
|
+
import ast
|
|
15
|
+
import configparser
|
|
16
|
+
import io
|
|
14
17
|
import json
|
|
18
|
+
import logging
|
|
19
|
+
import logging.handlers # ensures `logging.handlers` is importable for the `class=` allowlist check
|
|
15
20
|
import os
|
|
16
21
|
import sys
|
|
17
22
|
import time
|
|
18
|
-
import warnings
|
|
19
23
|
from abc import ABC, abstractmethod
|
|
20
24
|
from collections.abc import Sequence
|
|
21
25
|
from copy import copy
|
|
@@ -34,22 +38,205 @@ __all__ = ["BundleWorkflow", "ConfigWorkflow"]
|
|
|
34
38
|
|
|
35
39
|
logger = get_logger(module_name=__name__)
|
|
36
40
|
|
|
41
|
+
# `class=` values accepted in a bundle's logging INI. `fileConfig` eval()s this field, so the
|
|
42
|
+
# allowlist is by module: stdlib logging handlers/formatters cover every legitimate bundle.
|
|
43
|
+
_ALLOWED_LOGGING_CLASS_MODULES = {"logging", "logging.handlers"}
|
|
37
44
|
|
|
38
|
-
|
|
45
|
+
|
|
46
|
+
def _reject_executable_logging_config(logging_file: str) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Reject a logging INI whose ``class=``/``args=`` fields would execute arbitrary code.
|
|
49
|
+
|
|
50
|
+
`logging.config.fileConfig` resolves each handler/formatter ``class=`` through ``eval()`` in a
|
|
51
|
+
namespace containing the ``logging`` module, and evaluates ``args=``/``kwargs=`` the same way.
|
|
52
|
+
A bundle ships ``configs/logging.conf`` and it is applied before any of the bundle's own config
|
|
53
|
+
is parsed, so an untrusted bundle gets code execution from the logging file alone.
|
|
54
|
+
|
|
55
|
+
Legitimate bundles only ever name stdlib logging classes, so ``class=`` is restricted to the
|
|
56
|
+
``logging`` / ``logging.handlers`` namespaces and ``args=``/``kwargs=`` must be literals.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
logging_file: path to the INI file that is about to be passed to `fileConfig`.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
The validated file content, so the caller can apply exactly this text without re-reading
|
|
63
|
+
the path (a second read could see swapped-in content and bypass this check).
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
ValueError: if a field would run code that this allowlist does not cover.
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
with open(logging_file, encoding="utf-8") as f:
|
|
70
|
+
content = f.read()
|
|
71
|
+
except OSError as e:
|
|
72
|
+
raise ValueError(f"cannot read logging config file {logging_file}: {e}") from e
|
|
73
|
+
|
|
74
|
+
parser = configparser.RawConfigParser()
|
|
75
|
+
try:
|
|
76
|
+
parser.read_string(content)
|
|
77
|
+
except configparser.Error as e:
|
|
78
|
+
raise ValueError(f"cannot parse logging config file {logging_file}: {e}") from e
|
|
79
|
+
|
|
80
|
+
for section in parser.sections():
|
|
81
|
+
for field in ("class", "args", "kwargs"):
|
|
82
|
+
if not parser.has_option(section, field):
|
|
83
|
+
continue
|
|
84
|
+
value = parser.get(section, field, raw=True).strip()
|
|
85
|
+
if not value:
|
|
86
|
+
continue
|
|
87
|
+
if field == "class":
|
|
88
|
+
# `fileConfig` eval()s this expression, so a bare string prefix is not a safe boundary:
|
|
89
|
+
# a call or subscript without a period (e.g. `__builtins__.eval`) would slip past it.
|
|
90
|
+
# Parse and allow only a bare name or an attribute chain whose root is allowlisted.
|
|
91
|
+
_reject_non_logging_class(value, logging_file, section)
|
|
92
|
+
else:
|
|
93
|
+
# `args`/`kwargs` are eval()ed in a namespace holding `logging`, `os` and `sys`.
|
|
94
|
+
# Literals alone are too strict -- `args=(sys.stdout,)` is the standard
|
|
95
|
+
# StreamHandler form -- so allow literals plus a fixed set of safe stream names,
|
|
96
|
+
# and reject calls, attribute traversal and comprehensions.
|
|
97
|
+
_reject_non_literal_expression(value, logging_file, section, field)
|
|
98
|
+
return content
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
_ALLOWED_LOGGING_ARG_NAMES = {"sys.stdout", "sys.stderr"}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _is_allowed_logging_class(module: str, attribute: str) -> bool:
|
|
105
|
+
"""
|
|
106
|
+
Return whether ``module.attribute`` names a logging handler or formatter class.
|
|
107
|
+
|
|
108
|
+
The check resolves the attribute on the already-imported allowlisted module and requires the
|
|
109
|
+
object to be a ``logging.Handler`` or ``logging.Formatter`` subclass. Deriving the answer from
|
|
110
|
+
the module keeps the allowlist in step with the standard library instead of hard-coding a name
|
|
111
|
+
list, and it rejects callables such as ``eval`` that are not logging classes at all.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
module: dotted module name; must be one of ``_ALLOWED_LOGGING_CLASS_MODULES``.
|
|
115
|
+
attribute: attribute looked up on that module.
|
|
116
|
+
"""
|
|
117
|
+
if module not in _ALLOWED_LOGGING_CLASS_MODULES:
|
|
118
|
+
return False
|
|
119
|
+
resolved = getattr(sys.modules.get(module), attribute, None)
|
|
120
|
+
return isinstance(resolved, type) and issubclass(resolved, (logging.Handler, logging.Formatter))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _reject_non_logging_class(value: str, logging_file: str, section: str) -> None:
|
|
39
124
|
"""
|
|
40
|
-
|
|
125
|
+
Require ``value`` to be a bare name or an attribute chain rooted in an allowlisted module.
|
|
41
126
|
|
|
42
|
-
|
|
43
|
-
|
|
127
|
+
`fileConfig` passes ``class=`` to ``eval()``, so the whole expression -- not just a string
|
|
128
|
+
prefix -- must be inert. A bare identifier is resolved against the ``logging`` module; a
|
|
129
|
+
dotted path is resolved against the ``eval`` namespace. Calls, subscripts, operators and every
|
|
130
|
+
other expression node are rejected.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
value: the raw ``class=`` value from the INI.
|
|
134
|
+
logging_file: path of the file, used in the error message.
|
|
135
|
+
section: INI section name, used in the error message.
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
ValueError: if the expression is not a name or an attribute chain rooted in an allowlisted module.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
def _fail(reason: str) -> None:
|
|
142
|
+
raise ValueError(
|
|
143
|
+
f"refusing to apply logging config {logging_file}: section [{section}] sets "
|
|
144
|
+
f"class={value!r}, which {reason} and would execute code through "
|
|
145
|
+
f"`logging.config.fileConfig`'s `eval()`. Only classes from "
|
|
146
|
+
f"{sorted(_ALLOWED_LOGGING_CLASS_MODULES)} are allowed "
|
|
147
|
+
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3)."
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
tree = ast.parse(value, mode="eval")
|
|
152
|
+
except SyntaxError as e:
|
|
153
|
+
_fail(f"is not a parsable expression ({e.msg})")
|
|
154
|
+
|
|
155
|
+
node = tree.body # type: ignore[union-attr]
|
|
156
|
+
# A bare name is resolved against the `logging` module in fileConfig's eval namespace, so it
|
|
157
|
+
# must name a real logging handler/formatter there -- `class=eval` is a bare name too, and
|
|
158
|
+
# would hand an attacker-controlled `args=` literal straight to `eval()`.
|
|
159
|
+
if isinstance(node, ast.Name):
|
|
160
|
+
if not _is_allowed_logging_class("logging", node.id):
|
|
161
|
+
_fail(f"does not name a handler or formatter in {sorted(_ALLOWED_LOGGING_CLASS_MODULES)}")
|
|
162
|
+
return
|
|
163
|
+
# An attribute chain must be rooted in an allowlisted module and end at a handler/formatter.
|
|
164
|
+
# `ast.unparse` renders the chain directly; a root that isn't a bare name (e.g. `a().b`) still
|
|
165
|
+
# can't equal a literal allowlist entry once rendered, so no separate root check is needed.
|
|
166
|
+
if isinstance(node, ast.Attribute):
|
|
167
|
+
dotted = ast.unparse(node)
|
|
168
|
+
module, _, attribute = dotted.rpartition(".")
|
|
169
|
+
if module not in _ALLOWED_LOGGING_CLASS_MODULES:
|
|
170
|
+
_fail(f"references {dotted!r}, which is not in {sorted(_ALLOWED_LOGGING_CLASS_MODULES)}")
|
|
171
|
+
if not _is_allowed_logging_class(module, attribute):
|
|
172
|
+
_fail(f"references {dotted!r}, which is not a handler or formatter class")
|
|
173
|
+
return
|
|
174
|
+
_fail("is not a name or an attribute chain")
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _reject_non_literal_expression(value: str, logging_file: str, section: str, field: str) -> None:
|
|
178
|
+
"""
|
|
179
|
+
Require ``value`` to be a literal expression, optionally naming a safe stream.
|
|
180
|
+
|
|
181
|
+
`fileConfig` evaluates ``args=``/``kwargs=`` with ``eval()``. Constants, tuples, lists, dicts
|
|
182
|
+
and sets are inert; the only non-literal forms a real logging INI needs are ``sys.stdout`` and
|
|
183
|
+
``sys.stderr``. Everything else -- calls, subscripts, arbitrary attribute chains, comprehensions
|
|
184
|
+
-- can execute code and is rejected.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
value: the raw field value from the INI.
|
|
188
|
+
logging_file: path of the file, used in the error message.
|
|
189
|
+
section: INI section name, used in the error message.
|
|
190
|
+
field: field name, used in the error message.
|
|
191
|
+
|
|
192
|
+
Raises:
|
|
193
|
+
ValueError: if the expression is not in the allowed subset.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
def _fail(reason: str) -> None:
|
|
197
|
+
raise ValueError(
|
|
198
|
+
f"refusing to apply logging config {logging_file}: section [{section}] sets "
|
|
199
|
+
f"{field}={value!r}, which {reason} and would execute code through "
|
|
200
|
+
"`logging.config.fileConfig`'s `eval()` "
|
|
201
|
+
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3)."
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
tree = ast.parse(value, mode="eval")
|
|
206
|
+
except SyntaxError as e:
|
|
207
|
+
_fail(f"is not a parsable expression ({e.msg})")
|
|
208
|
+
|
|
209
|
+
for node in ast.walk(tree.body): # type: ignore[union-attr]
|
|
210
|
+
if isinstance(node, (ast.Constant, ast.Tuple, ast.List, ast.Dict, ast.Set, ast.Load)):
|
|
211
|
+
continue
|
|
212
|
+
if isinstance(node, (ast.Attribute, ast.Name)):
|
|
213
|
+
# `ast.unparse` renders the attribute/name chain (e.g. ``sys.stdout``) without
|
|
214
|
+
# re-walking it by hand; a chain rooted in anything but a bare name (e.g. `a().b`) is
|
|
215
|
+
# still rejected below, since it cannot equal a literal entry in the allowlist.
|
|
216
|
+
name = ast.unparse(node)
|
|
217
|
+
# Sub-nodes of an allowed chain (e.g. the `sys` of `sys.stdout`) are reached by the
|
|
218
|
+
# walk too; accept any prefix of a permitted name.
|
|
219
|
+
if name not in _ALLOWED_LOGGING_ARG_NAMES and not any(
|
|
220
|
+
allowed.startswith(f"{name}.") for allowed in _ALLOWED_LOGGING_ARG_NAMES
|
|
221
|
+
):
|
|
222
|
+
_fail(f"references {name!r}, which is not in {sorted(_ALLOWED_LOGGING_ARG_NAMES)}")
|
|
223
|
+
continue
|
|
224
|
+
_fail(f"contains a {type(node).__name__} node")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _apply_logging_file(logging_file: str) -> None:
|
|
228
|
+
"""
|
|
229
|
+
Validate ``logging_file`` and apply it, using exactly the content that was validated.
|
|
230
|
+
|
|
231
|
+
The single read performed by the validator is what `fileConfig` applies: re-opening the path
|
|
232
|
+
in between would let a swapped-in file bypass the allowlist and reach `fileConfig`'s `eval()`
|
|
233
|
+
calls.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
logging_file: path to the logging INI file.
|
|
44
237
|
"""
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"`args=` fields of the INI's handler and formatter sections to Python `eval()`, so this file "
|
|
48
|
-
"runs as code. A bundle ships its own `configs/logging.conf` and it is applied by default, "
|
|
49
|
-
"before any of the bundle's config is parsed. Only proceed if this file is from a source you "
|
|
50
|
-
"trust (see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3).",
|
|
51
|
-
stacklevel=3,
|
|
52
|
-
)
|
|
238
|
+
content = _reject_executable_logging_config(logging_file)
|
|
239
|
+
fileConfig(io.StringIO(content), disable_existing_loggers=False)
|
|
53
240
|
|
|
54
241
|
|
|
55
242
|
class BundleWorkflow(ABC):
|
|
@@ -74,8 +261,9 @@ class BundleWorkflow(ABC):
|
|
|
74
261
|
logging_file: config file for `logging` module in the program. for more details:
|
|
75
262
|
https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig.
|
|
76
263
|
Security note: `fileConfig` passes the INI's `class=` and `args=` fields to Python
|
|
77
|
-
`eval()`, so this file runs as code
|
|
78
|
-
|
|
264
|
+
`eval()`, so this file runs as code. `class=` is restricted to the `logging` and
|
|
265
|
+
`logging.handlers` namespaces and `args=`/`kwargs=` to literals plus `sys.stdout` /
|
|
266
|
+
`sys.stderr`; anything else raises `ValueError`
|
|
79
267
|
(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3).
|
|
80
268
|
|
|
81
269
|
"""
|
|
@@ -94,8 +282,7 @@ class BundleWorkflow(ABC):
|
|
|
94
282
|
if not os.path.isfile(logging_file):
|
|
95
283
|
raise FileNotFoundError(f"Cannot find the logging config file: {logging_file}.")
|
|
96
284
|
logger.info(f"Setting logging properties based on config: {logging_file}.")
|
|
97
|
-
|
|
98
|
-
fileConfig(logging_file, disable_existing_loggers=False)
|
|
285
|
+
_apply_logging_file(logging_file)
|
|
99
286
|
|
|
100
287
|
if meta_file is not None:
|
|
101
288
|
if isinstance(meta_file, str) and not os.path.isfile(meta_file):
|
|
@@ -297,8 +484,9 @@ class PythonicWorkflow(BundleWorkflow):
|
|
|
297
484
|
logging_file: config file for `logging` module in the program. for more details:
|
|
298
485
|
https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig.
|
|
299
486
|
Security note: `fileConfig` passes the INI's `class=` and `args=` fields to Python
|
|
300
|
-
`eval()`, so this file runs as code
|
|
301
|
-
|
|
487
|
+
`eval()`, so this file runs as code. `class=` is restricted to the `logging` and
|
|
488
|
+
`logging.handlers` namespaces and `args=`/`kwargs=` to literals plus `sys.stdout` /
|
|
489
|
+
`sys.stderr`; anything else raises `ValueError`
|
|
302
490
|
(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3).
|
|
303
491
|
|
|
304
492
|
"""
|
|
@@ -403,8 +591,9 @@ class ConfigWorkflow(BundleWorkflow):
|
|
|
403
591
|
If None, default to "configs/logging.conf", which is commonly used for bundles in MONAI model zoo.
|
|
404
592
|
If False, the logging logic for the bundle will not be modified.
|
|
405
593
|
Security note: `fileConfig` passes the INI's `class=` and `args=` fields to Python
|
|
406
|
-
`eval()`, so this file runs as code
|
|
407
|
-
|
|
594
|
+
`eval()`, so this file runs as code. `class=` is restricted to the `logging` and
|
|
595
|
+
`logging.handlers` namespaces and `args=`/`kwargs=` to literals plus `sys.stdout` /
|
|
596
|
+
`sys.stderr`; anything else raises `ValueError`
|
|
408
597
|
(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-wvpx-5qmp-46g3).
|
|
409
598
|
init_id: ID name of the expected config expression to initialize before running, default to "initialize".
|
|
410
599
|
allow a config to have no `initialize` logic and the ID.
|
|
@@ -475,8 +664,7 @@ class ConfigWorkflow(BundleWorkflow):
|
|
|
475
664
|
else:
|
|
476
665
|
raise FileNotFoundError(f"Cannot find the logging config file: {logging_file}.")
|
|
477
666
|
else:
|
|
478
|
-
|
|
479
|
-
fileConfig(str(logging_file), disable_existing_loggers=False)
|
|
667
|
+
_apply_logging_file(str(logging_file))
|
|
480
668
|
logger.info(f"Setting logging properties based on config: {logging_file}.")
|
|
481
669
|
|
|
482
670
|
self.parser = ConfigParser()
|
|
@@ -50,7 +50,16 @@ from .decathlon_datalist import (
|
|
|
50
50
|
from .folder_layout import FolderLayout, FolderLayoutBase
|
|
51
51
|
from .grid_dataset import GridPatchDataset, PatchDataset, PatchIter, PatchIterd
|
|
52
52
|
from .image_dataset import ImageDataset
|
|
53
|
-
from .image_reader import
|
|
53
|
+
from .image_reader import (
|
|
54
|
+
ImageReader,
|
|
55
|
+
ITKReader,
|
|
56
|
+
NibabelReader,
|
|
57
|
+
NrrdReader,
|
|
58
|
+
NumpyReader,
|
|
59
|
+
NvImgCodecPydicomReader,
|
|
60
|
+
PILReader,
|
|
61
|
+
PydicomReader,
|
|
62
|
+
)
|
|
54
63
|
from .image_writer import (
|
|
55
64
|
SUPPORTED_WRITERS,
|
|
56
65
|
ImageWriter,
|