monai-weekly 1.7.dev2643__tar.gz → 1.7.dev2645__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.dev2643 → monai_weekly-1.7.dev2645}/PKG-INFO +1 -1
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/__init__.py +1 -1
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_version.py +3 -3
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/auto_runner.py +2 -2
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/bundle_gen.py +60 -2
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/hpo_gen.py +81 -1
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nnunet/__init__.py +1 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nnunet/nnunet_bundle.py +87 -3
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/utils.py +13 -12
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/meandice.py +16 -2
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/__init__.py +1 -0
- monai_weekly-1.7.dev2645/monai/networks/layers/layer_norm_nd.py +58 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/__init__.py +19 -0
- monai_weekly-1.7.dev2645/monai/networks/nets/convnext.py +354 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/dynunet.py +24 -3
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/quicknat.py +5 -5
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/intensity/array.py +9 -8
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/spatial/functional.py +43 -2
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/PKG-INFO +1 -1
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/SOURCES.txt +2 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/LICENSE +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/MANIFEST.in +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/README.md +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/gmm/gmm.cpp +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/gmm/gmm.h +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/gmm/gmm_cpu.cpp +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/gmm/gmm_cuda.cu +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/gmm/gmm_cuda_linalg.cuh +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/_extensions/loader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/__main__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/data_analyzer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/ensemble_builder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/auto3dseg/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/datasets.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepedit/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepedit/interaction.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepedit/transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepgrow/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepgrow/dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepgrow/interaction.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/deepgrow/transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/metrics/coco.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/metrics/matching.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/networks/retinanet_detector.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/networks/retinanet_network.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/transforms/box_ops.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/ATSS_matcher.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/anchor_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/box_coder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/box_selector.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/detector_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/hard_negative_sampler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/detection/utils/predict_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/maisi/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/maisi/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/maisi/networks/controlnet_maisi.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/generation/maisi/networks/diffusion_model_unet_maisi.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/mmars/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/mmars/mmars.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/mmars/model_desc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nnunet/__main__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nnunet/nnunetv2_runner.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nnunet/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nuclick/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/nuclick/transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/inferers/inferer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/losses/hovernet_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/metrics/lesion_froc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/post/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/stain/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/stain/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/transforms/stain/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/pathology/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/complex_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/fastmri_reader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/mri_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/blocks/varnetblock.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/nets/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/nets/coil_sensitivity_model.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/nets/complex_unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/nets/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/networks/nets/varnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/transforms/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/reconstruction/transforms/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/tcia/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/tcia/label_desc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/tcia/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/vista3d/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/vista3d/inferer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/vista3d/sampler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/apps/vista3d/transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/algo_gen.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/analyzer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/operations.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/auto3dseg/seg_summarizer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/__main__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/config_item.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/config_parser.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/properties.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/reference_resolver.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/scripts.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/bundle/workflows.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/__main__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/check_env.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/deviceconfig.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/print_dependencies.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/config/type_definitions.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/box_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/csv_saver.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/dataloader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/dataset_summary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/decathlon_datalist.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/fft_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/folder_layout.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/grid_dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/image_dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/image_reader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/image_writer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/iterable_dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/itk_torch_bridge.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/meta_obj.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/meta_tensor.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/nvimgcodec_pydicom_plugin.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/samplers.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/synthetic.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/test_time_augmentation.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/thread_buffer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/torchscript_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/ultrasound_confidence_map.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/video_dataset.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/wsi_datasets.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/data/wsi_reader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/engines/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/engines/evaluator.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/engines/trainer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/engines/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/engines/workflow.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/client/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/client/client_algo.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/client/monai_algo.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/utils/constants.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/utils/exchange_object.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/fl/utils/filters.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/average_precision.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/calibration.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/checkpoint_loader.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/checkpoint_saver.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/classification_saver.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/clearml_handlers.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/confusion_matrix.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/decollate_batch.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/earlystop_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/garbage_collector.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/ignite_metric.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/logfile_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/lr_schedule_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/mean_dice.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/mean_iou.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/metric_logger.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/metrics_reloaded_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/metrics_saver.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/mlflow_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/nvtx_handlers.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/parameter_scheduler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/postprocessing.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/probability_maps.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/regression_metrics.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/roc_auc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/smartcache_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/stats_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/tensorboard_handlers.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/trt_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/handlers/validation_handler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/inferers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/inferers/inferer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/inferers/merger.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/inferers/splitter.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/inferers/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/adversarial_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/aucm_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/barlow_twins.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/boundary_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/calibration.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/cldice.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/contrastive.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/deform.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/dice.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/ds_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/focal_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/giou_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/hausdorff_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/image_dissimilarity.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/mcc_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/multi_scale.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/nacl_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/perceptual.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/spatial_mask.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/spectral_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/ssim_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/sure_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/tversky.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/unified_focal_loss.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/losses/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/absolute_volume_difference.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/active_learning_metrics.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/average_precision.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/calibration.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/confusion_matrix.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/cumulative_average.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/embedding_collapse.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/f_beta_score.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/fid.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/froc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/generalized_dice.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/hausdorff_distance.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/loss_metric.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/meaniou.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/metric.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/mmd.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/panoptic_quality.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/regression.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/rocauc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/surface_dice.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/surface_distance.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/metrics/wrapper.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/acti_norm.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/activation.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/activation_checkpointing.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/aspp.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/attention_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/backbone_fpn_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/cablock.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/convolutions.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/crf.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/crossattention.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/denseblock.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/dints_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/downsample.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/dynunet_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/encoder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/fcn.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/feature_pyramid_network.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/fft_utils_t.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/hyena.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/localnet_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/mednext_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/mlp.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/patchembedding.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/pos_embed_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/regunet_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/rel_pos_embedding.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/segresnet_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/selfattention.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/spade_norm.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/spatialattention.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/squeeze_and_excitation.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/text_embedding.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/transformerblock.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/unetr_block.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/upsample.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/blocks/warp.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/conjugate_gradient.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/convutils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/drop_path.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/factories.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/filtering.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/gmm.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/simplelayers.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/spatial_transforms.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/vector_quantizer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/layers/weight_init.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/ahnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/attentionunet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/autoencoder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/basic_unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/basic_unetplusplus.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/cell_sam_wrapper.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/classifier.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/controlnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/daf3d.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/densenet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/dints.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/efficientnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/flexible_unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/fullyconnectednet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/generator.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/highresnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/hovernet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/hyena_nd_unetr.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/masked_autoencoder_vit.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/mednext.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/milmodel.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/navit.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/netadapter.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/patchgan_discriminator.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/regressor.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/regunet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/resnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/restormer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/segresnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/segresnet_ds.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/senet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/spade_autoencoderkl.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/spade_diffusion_model_unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/spade_network.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/swin_unetr.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/torchvision_fc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/transchex.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/transformer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/unet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/unetr.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/varautoencoder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/vista3d.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/vit.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/vitautoenc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/vnet.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/voxelmorph.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/nets/vqvae.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/ddim.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/ddpm.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/pndm.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/rectified_flow.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/schedulers/scheduler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/trt_compiler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/networks/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/optimizers/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/optimizers/lr_finder.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/optimizers/lr_scheduler.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/optimizers/novograd.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/optimizers/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/py.typed +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/adaptors.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/compose.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/croppad/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/croppad/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/croppad/batch.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/croppad/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/croppad/functional.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/intensity/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/intensity/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/inverse.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/inverse_batch_transform.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/io/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/io/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/io/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/lazy/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/lazy/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/lazy/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/lazy/functional.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/lazy/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/meta_utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/meta_utility/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/nvtx.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/post/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/post/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/post/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/regularization/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/regularization/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/regularization/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/signal/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/signal/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/signal/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/smooth_field/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/smooth_field/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/smooth_field/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/spatial/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/spatial/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/spatial/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/traits.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/transform.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utility/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utility/array.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utility/dictionary.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utils_create_transform_ims.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utils_morphological_ops.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/transforms/utils_pytorch_numpy_unification.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/compare_sources.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/component_store.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/decorators.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/deprecate_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/dist.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/enums.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/jupyter_utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/misc.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/module.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/nvtx.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/ordering.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/profiling.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/safeeval.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/state_cacher.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/tf32.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/utils/type_conversion.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/__init__.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/class_activation_maps.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/gradient_based.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/img2tensorboard.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/occlusion_sensitivity.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/utils.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai/visualize/visualizer.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/dependency_links.txt +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/not-zip-safe +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/requires.txt +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/monai_weekly.egg-info/top_level.txt +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/pyproject.toml +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/setup.cfg +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/setup.py +0 -0
- {monai_weekly-1.7.dev2643 → monai_weekly-1.7.dev2645}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2026-
|
|
11
|
+
"date": "2026-11-08T02:09:15+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.7.
|
|
14
|
+
"full-revisionid": "ed1d0c3cb86b2cfe223a7c845bec698dedbfa614",
|
|
15
|
+
"version": "1.7.dev2645"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ import torch
|
|
|
23
23
|
from monai.apps.auto3dseg.bundle_gen import BundleGen
|
|
24
24
|
from monai.apps.auto3dseg.data_analyzer import DataAnalyzer
|
|
25
25
|
from monai.apps.auto3dseg.ensemble_builder import EnsembleRunner
|
|
26
|
-
from monai.apps.auto3dseg.hpo_gen import NNIGen
|
|
26
|
+
from monai.apps.auto3dseg.hpo_gen import NNIGen, _nni_trial_command
|
|
27
27
|
from monai.apps.auto3dseg.utils import export_bundle_algo_history, import_bundle_algo_history
|
|
28
28
|
from monai.apps.utils import get_logger
|
|
29
29
|
from monai.auto3dseg.utils import algo_to_json
|
|
@@ -797,7 +797,7 @@ class AutoRunner:
|
|
|
797
797
|
nni_config[key] = self.hpo_params[key]
|
|
798
798
|
nni_config.update({"experimentName": name})
|
|
799
799
|
nni_config.update({"search_space": self.search_space})
|
|
800
|
-
trial_cmd =
|
|
800
|
+
trial_cmd = _nni_trial_command(obj_filename, self.work_dir)
|
|
801
801
|
nni_config.update({"trialCommand": trial_cmd})
|
|
802
802
|
nni_config_filename = os.path.abspath(os.path.join(self.work_dir, f"{name}_nni_config.yaml"))
|
|
803
803
|
ConfigParser.export_config_file(nni_config, nni_config_filename, fmt="yaml", default_flow_style=None)
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
14
|
import importlib
|
|
15
|
+
import ntpath
|
|
15
16
|
import os
|
|
16
17
|
import re
|
|
17
18
|
import shutil
|
|
@@ -50,6 +51,52 @@ ALGO_HASH = MONAIEnvVars.algo_hash()
|
|
|
50
51
|
__all__ = ["BundleAlgo", "BundleGen"]
|
|
51
52
|
|
|
52
53
|
|
|
54
|
+
def _check_single_path_component(value: Any, what: str) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Require ``value`` to be one non-empty directory name with no path separators, drive or NUL character.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
value: the name to check.
|
|
60
|
+
what: a description of the value, used in the error message.
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
ValueError: if ``value`` is not a plain directory name.
|
|
64
|
+
"""
|
|
65
|
+
name = str(value)
|
|
66
|
+
separators = {os.sep, "/"} | ({os.altsep} if os.altsep else set())
|
|
67
|
+
if (
|
|
68
|
+
not name
|
|
69
|
+
or name in (".", "..")
|
|
70
|
+
or "\x00" in name
|
|
71
|
+
or any(sep in name for sep in separators)
|
|
72
|
+
or os.path.isabs(name)
|
|
73
|
+
or ntpath.splitdrive(name)[0]
|
|
74
|
+
):
|
|
75
|
+
raise ValueError(f"Invalid {what} {value!r}: expected a single directory name without path separators.")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _confined_join(root: str, name: str) -> str:
|
|
79
|
+
"""
|
|
80
|
+
Join ``name`` to ``root`` and check that the resolved result stays inside ``root``.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
root: the parent directory.
|
|
84
|
+
name: the child directory name.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
the joined path.
|
|
88
|
+
|
|
89
|
+
Raises:
|
|
90
|
+
ValueError: if the resolved path is not inside ``root``.
|
|
91
|
+
"""
|
|
92
|
+
path = os.path.join(root, name)
|
|
93
|
+
real_root = os.path.realpath(root)
|
|
94
|
+
real_path = os.path.realpath(path)
|
|
95
|
+
if real_path == real_root or os.path.commonpath([real_root, real_path]) != real_root:
|
|
96
|
+
raise ValueError(f"Invalid path: {path!r} is not inside {root!r}.")
|
|
97
|
+
return path
|
|
98
|
+
|
|
99
|
+
|
|
53
100
|
class BundleAlgo(Algo):
|
|
54
101
|
"""
|
|
55
102
|
An algorithm represented by a set of bundle configurations and scripts.
|
|
@@ -176,18 +223,29 @@ class BundleAlgo(Algo):
|
|
|
176
223
|
Args:
|
|
177
224
|
output_path: Path to export the 'scripts' and 'configs' directories.
|
|
178
225
|
algo_name: the identifier of the algorithm (usually contains the name and extra info like fold ID).
|
|
226
|
+
It must be a single directory name: path separators, ``.`` and ``..`` are rejected.
|
|
179
227
|
kwargs: other parameters, including: "copy_dirs=True/False" means whether to copy the template as output
|
|
180
228
|
instead of inplace operation, "fill_template=True/False" means whether to fill the placeholders
|
|
181
229
|
in the template. other parameters are for `fill_template_config` function.
|
|
182
230
|
|
|
231
|
+
|
|
232
|
+
Raises:
|
|
233
|
+
ValueError: if ``algo_name`` or the Algo ``name`` is not a single directory name, or the destination
|
|
234
|
+
does not resolve inside ``output_path``.
|
|
183
235
|
"""
|
|
184
236
|
if kwargs.pop("copy_dirs", True):
|
|
185
|
-
|
|
237
|
+
_check_single_path_component(algo_name, "algo_name")
|
|
238
|
+
if self.name: # an empty name copies the whole template_path
|
|
239
|
+
_check_single_path_component(self.name, "the Algo name")
|
|
240
|
+
source = os.path.join(str(self.template_path), self.name)
|
|
241
|
+
if not os.path.isdir(source):
|
|
242
|
+
raise ValueError(f"Algo template folder {source!r} does not exist.")
|
|
243
|
+
self.output_path = _confined_join(output_path, algo_name)
|
|
186
244
|
os.makedirs(self.output_path, exist_ok=True)
|
|
187
245
|
if os.path.isdir(self.output_path):
|
|
188
246
|
shutil.rmtree(self.output_path)
|
|
189
247
|
# copy algorithm_templates/<Algo> to the working directory output_path
|
|
190
|
-
shutil.copytree(
|
|
248
|
+
shutil.copytree(source, self.output_path)
|
|
191
249
|
else:
|
|
192
250
|
self.output_path = str(self.template_path)
|
|
193
251
|
if kwargs.pop("fill_template", True):
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
14
|
import os
|
|
15
|
+
import shlex
|
|
16
|
+
import sys
|
|
15
17
|
from abc import abstractmethod
|
|
16
18
|
from copy import deepcopy
|
|
17
19
|
from typing import Any, cast
|
|
@@ -32,6 +34,84 @@ logger = get_logger(module_name=__name__)
|
|
|
32
34
|
__all__ = ["HPOGen", "NNIGen", "OptunaGen"]
|
|
33
35
|
|
|
34
36
|
|
|
37
|
+
# cmd.exe expands or ends a quoted argument at these characters even inside double quotes
|
|
38
|
+
_CMD_UNSAFE_CHARS = frozenset('"%!\r\n\x00')
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _quote_trial_arg(arg: Any, windows: bool | None = None) -> str:
|
|
42
|
+
"""
|
|
43
|
+
Quote one argument of an NNI ``trialCommand`` as a literal for the shell NNI uses.
|
|
44
|
+
|
|
45
|
+
NNI's local training service runs ``trialCommand`` with bash on Linux and macOS and with ``cmd.exe`` on
|
|
46
|
+
Windows. For ``cmd.exe`` the argument is wrapped in double quotes, which make ``&``, ``|``, ``<``, ``>``,
|
|
47
|
+
``^`` and parentheses literal, and backslashes before the closing quote are doubled so the program receives
|
|
48
|
+
the argument unchanged. Characters that ``cmd.exe`` interprets even inside double quotes are rejected.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
arg: the argument value.
|
|
52
|
+
windows: quote for ``cmd.exe`` instead of a POSIX shell. Defaults to ``sys.platform == "win32"``.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
the quoted argument.
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
ValueError: on Windows, if the argument contains ``"``, ``%``, ``!`` or a line break or NUL character.
|
|
59
|
+
"""
|
|
60
|
+
text = str(arg)
|
|
61
|
+
if sys.platform == "win32" if windows is None else windows:
|
|
62
|
+
unsafe = sorted(_CMD_UNSAFE_CHARS.intersection(text))
|
|
63
|
+
if unsafe:
|
|
64
|
+
raise ValueError(f"Cannot pass {text!r} to an NNI trial on Windows: it contains {unsafe}.")
|
|
65
|
+
trailing = len(text) - len(text.rstrip("\\"))
|
|
66
|
+
return '"' + text + "\\" * trailing + '"'
|
|
67
|
+
return shlex.quote(text)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _nni_trial_command(obj_filename: Any, work_dir: Any, windows: bool | None = None) -> str:
|
|
71
|
+
"""
|
|
72
|
+
Build the NNI ``trialCommand`` that runs one algo trial.
|
|
73
|
+
|
|
74
|
+
The fixed part of the command is plain text; the two paths are quoted with ``_quote_trial_arg`` so they
|
|
75
|
+
are passed to ``NNIGen run_algo`` unchanged. On a POSIX shell any path is accepted; ``cmd.exe`` cannot
|
|
76
|
+
carry a few characters even inside double quotes, see ``_quote_trial_arg``.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
obj_filename: the serialized algo object file.
|
|
80
|
+
work_dir: the Auto3DSeg working directory.
|
|
81
|
+
windows: quote for ``cmd.exe`` instead of a POSIX shell. Defaults to ``sys.platform == "win32"``.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
the command string to store as ``trialCommand``.
|
|
85
|
+
|
|
86
|
+
Raises:
|
|
87
|
+
ValueError: on Windows, if ``obj_filename`` or ``work_dir`` contains ``"``, ``%``, ``!``, a line
|
|
88
|
+
break or a NUL character.
|
|
89
|
+
"""
|
|
90
|
+
paths = " ".join(_quote_trial_arg(p, windows) for p in (obj_filename, work_dir))
|
|
91
|
+
return f"python -m monai.apps.auto3dseg NNIGen run_algo {paths}"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _quote_or_raw(arg: Any, windows: bool | None = None) -> str:
|
|
95
|
+
"""
|
|
96
|
+
Quote one argument of the printed trialCommand instruction, falling back to the unquoted text.
|
|
97
|
+
|
|
98
|
+
``print_bundle_algo_instruction`` only reports how to write the command, so a path its shell cannot
|
|
99
|
+
quote must not stop the instructions from printing: warn and print the path as it is.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
arg: the argument value.
|
|
103
|
+
windows: quote for ``cmd.exe`` instead of a POSIX shell. Defaults to ``sys.platform == "win32"``.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
the quoted argument, or ``str(arg)`` if the shell cannot quote it.
|
|
107
|
+
"""
|
|
108
|
+
try:
|
|
109
|
+
return _quote_trial_arg(arg, windows)
|
|
110
|
+
except ValueError as error:
|
|
111
|
+
logger.warning(f"Leaving {str(arg)!r} unquoted in the printed trialCommand: {error}")
|
|
112
|
+
return str(arg)
|
|
113
|
+
|
|
114
|
+
|
|
35
115
|
class HPOGen(AlgoGen):
|
|
36
116
|
"""
|
|
37
117
|
The base class for hyperparameter optimization (HPO) interfaces to generate algos in the Auto3Dseg pipeline.
|
|
@@ -143,7 +223,7 @@ class NNIGen(HPOGen):
|
|
|
143
223
|
logger.info("=" * 140)
|
|
144
224
|
logger.info("If NNI will run in your local env: ")
|
|
145
225
|
logger.info("1. Add the following line to the trialCommand in your NNI config: ")
|
|
146
|
-
logger.info(f"{hint} {self.obj_filename} {{result_dir}}")
|
|
226
|
+
logger.info(f"{hint} {_quote_or_raw(self.obj_filename)} {{result_dir}}")
|
|
147
227
|
logger.info("-" * 140)
|
|
148
228
|
logger.info("If NNI will run in a remote env: ")
|
|
149
229
|
logger.info(
|
|
@@ -12,7 +12,9 @@ from __future__ import annotations
|
|
|
12
12
|
|
|
13
13
|
import os
|
|
14
14
|
import shutil
|
|
15
|
+
from collections.abc import Sequence
|
|
15
16
|
from pathlib import Path
|
|
17
|
+
from pydoc import locate
|
|
16
18
|
from typing import Any
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
@@ -32,8 +34,60 @@ __all__ = [
|
|
|
32
34
|
"convert_nnunet_to_monai_bundle",
|
|
33
35
|
"convert_monai_bundle_to_nnunet",
|
|
34
36
|
"ModelnnUNetWrapper",
|
|
37
|
+
"DEFAULT_NNUNET_NETWORK_MODULES",
|
|
35
38
|
]
|
|
36
39
|
|
|
40
|
+
#: Modules that nnUNet plans may reference for the network class and its imported keyword arguments.
|
|
41
|
+
DEFAULT_NNUNET_NETWORK_MODULES: tuple[str, ...] = ("dynamic_network_architectures", "torch.nn")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _in_allowed_modules(dotted_name: str, allowed_modules: Sequence[str]) -> bool:
|
|
45
|
+
return any(dotted_name == m or dotted_name.startswith(m + ".") for m in allowed_modules)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _check_nnunet_network_spec(
|
|
49
|
+
class_name: Any, init_kwargs: Any, kwargs_requiring_import: Any, allowed_modules: Sequence[str] | None = None
|
|
50
|
+
) -> None:
|
|
51
|
+
"""
|
|
52
|
+
Check the network specification read from an nnUNet ``plans.json`` before nnUNet resolves and builds it.
|
|
53
|
+
|
|
54
|
+
nnUNet imports ``network_class_name`` and every keyword argument listed in ``_kw_requires_import`` by dotted
|
|
55
|
+
name and calls them, so each of these names must be under one of ``allowed_modules`` and, if it can be
|
|
56
|
+
imported, must refer to a ``torch.nn.Module`` subclass. The module prefix is checked before anything is
|
|
57
|
+
imported.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
class_name: the ``network_class_name`` from the plans.
|
|
61
|
+
init_kwargs: the ``arch_kwargs`` from the plans.
|
|
62
|
+
kwargs_requiring_import: the ``_kw_requires_import`` names from the plans.
|
|
63
|
+
allowed_modules: dotted module prefixes that may be referenced. Defaults to
|
|
64
|
+
``DEFAULT_NNUNET_NETWORK_MODULES``. Add the module of a custom architecture here to load it.
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
ValueError: if a name is outside ``allowed_modules`` or does not resolve to a ``torch.nn.Module`` subclass.
|
|
68
|
+
"""
|
|
69
|
+
allowed = tuple(DEFAULT_NNUNET_NETWORK_MODULES if allowed_modules is None else allowed_modules)
|
|
70
|
+
hint = "Pass the module in `allowed_network_modules` if this architecture is trusted."
|
|
71
|
+
|
|
72
|
+
def _check(name: Any, what: str) -> None:
|
|
73
|
+
if not isinstance(name, str) or not _in_allowed_modules(name, allowed):
|
|
74
|
+
raise ValueError(f"Refusing to load {what} {name!r} from nnUNet plans: not in {list(allowed)}. {hint}")
|
|
75
|
+
resolved = locate(name)
|
|
76
|
+
# an unresolved name is left to nnUNet, which only searches inside dynamic_network_architectures for it
|
|
77
|
+
if resolved is not None and not (isinstance(resolved, type) and issubclass(resolved, torch.nn.Module)):
|
|
78
|
+
raise ValueError(f"Refusing to load {what} {name!r} from nnUNet plans: not a torch.nn.Module subclass.")
|
|
79
|
+
|
|
80
|
+
_check(class_name, "network class")
|
|
81
|
+
init_kwargs = init_kwargs or {}
|
|
82
|
+
if not isinstance(init_kwargs, dict):
|
|
83
|
+
raise ValueError(
|
|
84
|
+
f"Invalid network arguments in nnUNet plans: expected a dict, got {type(init_kwargs).__name__}."
|
|
85
|
+
)
|
|
86
|
+
for key in kwargs_requiring_import or ():
|
|
87
|
+
value = init_kwargs.get(key)
|
|
88
|
+
if value is not None:
|
|
89
|
+
_check(value, f"network argument {key!r}")
|
|
90
|
+
|
|
37
91
|
|
|
38
92
|
def get_nnunet_trainer(
|
|
39
93
|
dataset_name_or_id: str | int,
|
|
@@ -152,6 +206,9 @@ class ModelnnUNetWrapper(torch.nn.Module):
|
|
|
152
206
|
The folder path where the model and related files are stored.
|
|
153
207
|
model_name : str, optional
|
|
154
208
|
The name of the model file, by default "model.pt".
|
|
209
|
+
allowed_network_modules : Sequence[str], optional
|
|
210
|
+
Module prefixes that the plans may reference for the network class and imported network arguments,
|
|
211
|
+
by default ``DEFAULT_NNUNET_NETWORK_MODULES``.
|
|
155
212
|
|
|
156
213
|
Attributes
|
|
157
214
|
----------
|
|
@@ -166,7 +223,13 @@ class ModelnnUNetWrapper(torch.nn.Module):
|
|
|
166
223
|
restoring network architecture, and setting up the predictor for inference.
|
|
167
224
|
"""
|
|
168
225
|
|
|
169
|
-
def __init__(
|
|
226
|
+
def __init__(
|
|
227
|
+
self,
|
|
228
|
+
predictor: object,
|
|
229
|
+
model_folder: str | Path,
|
|
230
|
+
model_name: str = "model.pt",
|
|
231
|
+
allowed_network_modules: Sequence[str] | None = None,
|
|
232
|
+
): # type: ignore
|
|
170
233
|
super().__init__()
|
|
171
234
|
self.predictor = predictor
|
|
172
235
|
|
|
@@ -216,6 +279,12 @@ class ModelnnUNetWrapper(torch.nn.Module):
|
|
|
216
279
|
f"Unable to locate trainer class {trainer_name} in nnunetv2.training.nnUNetTrainer. "
|
|
217
280
|
f"Please place it there (in any .py file)!"
|
|
218
281
|
)
|
|
282
|
+
_check_nnunet_network_spec(
|
|
283
|
+
configuration_manager.network_arch_class_name,
|
|
284
|
+
configuration_manager.network_arch_init_kwargs,
|
|
285
|
+
configuration_manager.network_arch_init_kwargs_req_import,
|
|
286
|
+
allowed_network_modules,
|
|
287
|
+
)
|
|
219
288
|
network = trainer_class.build_network_architecture(
|
|
220
289
|
configuration_manager.network_arch_class_name,
|
|
221
290
|
configuration_manager.network_arch_init_kwargs,
|
|
@@ -294,7 +363,9 @@ class ModelnnUNetWrapper(torch.nn.Module):
|
|
|
294
363
|
return MetaTensor(out_tensor, meta=x.meta)
|
|
295
364
|
|
|
296
365
|
|
|
297
|
-
def get_nnunet_monai_predictor(
|
|
366
|
+
def get_nnunet_monai_predictor(
|
|
367
|
+
model_folder: str | Path, model_name: str = "model.pt", allowed_network_modules: Sequence[str] | None = None
|
|
368
|
+
) -> ModelnnUNetWrapper:
|
|
298
369
|
"""
|
|
299
370
|
Initializes and returns a `nnUNetMONAIModelWrapper` containing the corresponding `nnUNetPredictor`.
|
|
300
371
|
The model folder should contain the following files, created during training:
|
|
@@ -325,6 +396,9 @@ def get_nnunet_monai_predictor(model_folder: str | Path, model_name: str = "mode
|
|
|
325
396
|
The folder where the model is stored.
|
|
326
397
|
model_name : str, optional
|
|
327
398
|
The name of the model file, by default "model.pt".
|
|
399
|
+
allowed_network_modules : Sequence[str], optional
|
|
400
|
+
Module prefixes that ``plans.json`` may reference for the network class and imported network arguments,
|
|
401
|
+
by default ``DEFAULT_NNUNET_NETWORK_MODULES``. Extend it to load a trusted custom architecture.
|
|
328
402
|
|
|
329
403
|
Returns
|
|
330
404
|
-------
|
|
@@ -344,7 +418,7 @@ def get_nnunet_monai_predictor(model_folder: str | Path, model_name: str = "mode
|
|
|
344
418
|
allow_tqdm=True,
|
|
345
419
|
)
|
|
346
420
|
# initializes the network architecture, loads the checkpoint
|
|
347
|
-
wrapper = ModelnnUNetWrapper(predictor, model_folder, model_name)
|
|
421
|
+
wrapper = ModelnnUNetWrapper(predictor, model_folder, model_name, allowed_network_modules)
|
|
348
422
|
return wrapper
|
|
349
423
|
|
|
350
424
|
|
|
@@ -428,6 +502,7 @@ def get_network_from_nnunet_plans(
|
|
|
428
502
|
configuration: str,
|
|
429
503
|
model_ckpt: str | None = None,
|
|
430
504
|
model_key_in_ckpt: str = "model",
|
|
505
|
+
allowed_network_modules: Sequence[str] | None = None,
|
|
431
506
|
) -> torch.nn.Module | Any:
|
|
432
507
|
"""
|
|
433
508
|
Load and initialize a nnUNet network based on nnUNet plans and configuration.
|
|
@@ -444,6 +519,9 @@ def get_network_from_nnunet_plans(
|
|
|
444
519
|
Path to the model checkpoint file. If None, the network is returned without loading weights (default is None).
|
|
445
520
|
model_key_in_ckpt : str, optional
|
|
446
521
|
The key in the checkpoint file that contains the model state dictionary (default is "model").
|
|
522
|
+
allowed_network_modules : Sequence[str], optional
|
|
523
|
+
Module prefixes that ``plans_file`` may reference for the network class and imported network arguments,
|
|
524
|
+
by default ``DEFAULT_NNUNET_NETWORK_MODULES``. Extend it to load a trusted custom architecture.
|
|
447
525
|
|
|
448
526
|
Returns
|
|
449
527
|
-------
|
|
@@ -465,6 +543,12 @@ def get_network_from_nnunet_plans(
|
|
|
465
543
|
|
|
466
544
|
enable_deep_supervision = True
|
|
467
545
|
|
|
546
|
+
_check_nnunet_network_spec(
|
|
547
|
+
configuration_manager.network_arch_class_name,
|
|
548
|
+
configuration_manager.network_arch_init_kwargs,
|
|
549
|
+
configuration_manager.network_arch_init_kwargs_req_import,
|
|
550
|
+
allowed_network_modules,
|
|
551
|
+
)
|
|
468
552
|
network = get_network_from_plans(
|
|
469
553
|
configuration_manager.network_arch_class_name,
|
|
470
554
|
configuration_manager.network_arch_init_kwargs,
|
|
@@ -63,13 +63,13 @@ def _require_pickle_allowed() -> None:
|
|
|
63
63
|
raise RuntimeError(_PICKLE_DISABLED_MSG)
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def _reject_non_algo_target(target: Any, filename: str) ->
|
|
66
|
+
def _reject_non_algo_target(target: Any, filename: str) -> type[Algo]:
|
|
67
67
|
"""
|
|
68
68
|
Require that ``target`` names an ``Algo`` subclass before it is instantiated.
|
|
69
69
|
|
|
70
|
-
``algo_from_json`` resolves ``_target_``
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
``algo_from_json`` resolves ``_target_`` by importing the dotted path and then calls it.
|
|
71
|
+
``algo_object.json`` has exactly one legitimate target type -- an ``Algo`` subclass -- so
|
|
72
|
+
resolving the name and checking it here rejects payloads such as
|
|
73
73
|
``subprocess.call`` or ``os.system`` before they are ever invoked.
|
|
74
74
|
|
|
75
75
|
Importing the named module still runs that module's top-level code, so this narrows the sink
|
|
@@ -80,6 +80,9 @@ def _reject_non_algo_target(target: Any, filename: str) -> None:
|
|
|
80
80
|
target: the ``_target_`` value read from the file.
|
|
81
81
|
filename: the file the value came from, used in the error message.
|
|
82
82
|
|
|
83
|
+
Returns:
|
|
84
|
+
the resolved ``Algo`` subclass.
|
|
85
|
+
|
|
83
86
|
Raises:
|
|
84
87
|
ValueError: if ``target`` is not a string, or does not resolve to a concrete ``Algo`` subclass.
|
|
85
88
|
ModuleNotFoundError: if the module cannot be imported, so callers can try the next
|
|
@@ -97,6 +100,7 @@ def _reject_non_algo_target(target: Any, filename: str) -> None:
|
|
|
97
100
|
"may be named in a configuration "
|
|
98
101
|
"(see https://github.com/Project-MONAI/MONAI/security/advisories/GHSA-2wx3-8x3w-r8qv)."
|
|
99
102
|
)
|
|
103
|
+
return resolved
|
|
100
104
|
|
|
101
105
|
|
|
102
106
|
measure_np, has_measure = optional_import("skimage.measure", "0.14.2", min_version)
|
|
@@ -525,15 +529,12 @@ def algo_from_json(filename: str, template_path: PathLike | None = None, **kwarg
|
|
|
525
529
|
sys.path.insert(0, path)
|
|
526
530
|
path_added = True
|
|
527
531
|
|
|
528
|
-
|
|
529
|
-
state_template_path = state.get("template_path")
|
|
530
|
-
if state_template_path:
|
|
531
|
-
algo_config["template_path"] = state_template_path
|
|
532
|
+
algo_cls: Any = _reject_non_algo_target(target, filename) # subclasses may accept template_path
|
|
532
533
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
algo =
|
|
534
|
+
# Values read from the file are plain data: pass them to the constructor as literals
|
|
535
|
+
# rather than through ConfigParser, which would evaluate "$"/"@"/"%" prefixed strings.
|
|
536
|
+
state_template_path = state.get("template_path")
|
|
537
|
+
algo = algo_cls(template_path=state_template_path) if state_template_path else algo_cls()
|
|
537
538
|
if not isinstance(algo, Algo):
|
|
538
539
|
raise ValueError(
|
|
539
540
|
f"refusing to return the object built from '{target}' in {filename}: it is a "
|
|
@@ -331,16 +331,23 @@ class DiceHelper:
|
|
|
331
331
|
self.per_component = per_component
|
|
332
332
|
self.ignore_index = ignore_index
|
|
333
333
|
|
|
334
|
-
def compute_cc_dice(self, y_pred: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
|
|
334
|
+
def compute_cc_dice(self, y_pred: torch.Tensor, y: torch.Tensor, mask: torch.Tensor | None = None) -> torch.Tensor:
|
|
335
335
|
"""
|
|
336
336
|
Compute per-component Dice for a single batch item.
|
|
337
337
|
|
|
338
338
|
Args:
|
|
339
339
|
y_pred (torch.Tensor): Predictions with shape (1, 2, D, H, W) or (1, 2, H, W).
|
|
340
340
|
y (torch.Tensor): Ground truth with shape (1, 2, D, H, W) or (1, 2, H, W).
|
|
341
|
+
mask (torch.Tensor, optional): spatial mask (1, D, H, W) or (1, H, W) from
|
|
342
|
+
``create_ignore_mask``, 1=valid, 0=ignore. Ignored voxels are forced to
|
|
343
|
+
agree as background in both `y` and `y_pred`, so they never contribute to
|
|
344
|
+
a component's TP/FP/FN, matching how `ignore_index` is handled elsewhere.
|
|
341
345
|
|
|
342
346
|
Returns:
|
|
343
347
|
torch.Tensor: Mean Dice over connected components.
|
|
348
|
+
Raises:
|
|
349
|
+
OptionalImportError: If the ground truth contains foreground voxels
|
|
350
|
+
after masking, is on the CPU, and SciPy is unavailable.
|
|
344
351
|
"""
|
|
345
352
|
if y_pred.ndim == y.ndim:
|
|
346
353
|
y_pred_idx = torch.argmax(y_pred, dim=1)
|
|
@@ -348,6 +355,10 @@ class DiceHelper:
|
|
|
348
355
|
else:
|
|
349
356
|
y_pred_idx = y_pred
|
|
350
357
|
y_idx = y
|
|
358
|
+
if mask is not None:
|
|
359
|
+
ignore = mask == 0
|
|
360
|
+
y_idx = y_idx.masked_fill(ignore, 0)
|
|
361
|
+
y_pred_idx = y_pred_idx.masked_fill(ignore, 0)
|
|
351
362
|
if y_idx[0].sum() == 0:
|
|
352
363
|
if self.ignore_empty:
|
|
353
364
|
data = torch.tensor(float("nan"), device=y_idx.device)
|
|
@@ -445,7 +456,10 @@ class DiceHelper:
|
|
|
445
456
|
data = []
|
|
446
457
|
for b in range(y_pred.shape[0]):
|
|
447
458
|
if self.per_component:
|
|
448
|
-
|
|
459
|
+
b_mask = mask[b, 0] if mask is not None else None
|
|
460
|
+
data.append(
|
|
461
|
+
self.compute_cc_dice(y_pred=y_pred[b].unsqueeze(0), y=y[b].unsqueeze(0), mask=b_mask).reshape(-1)
|
|
462
|
+
)
|
|
449
463
|
continue
|
|
450
464
|
c_list = []
|
|
451
465
|
for c in range(first_ch, n_pred_ch) if n_pred_ch > 1 else [1]:
|
|
@@ -17,6 +17,7 @@ from .drop_path import DropPath
|
|
|
17
17
|
from .factories import Act, Conv, Dropout, LayerFactory, Norm, Pad, Pool, RelPosEmbedding, split_args
|
|
18
18
|
from .filtering import BilateralFilter, PHLFilter, TrainableBilateralFilter, TrainableJointBilateralFilter
|
|
19
19
|
from .gmm import GaussianMixtureModel
|
|
20
|
+
from .layer_norm_nd import LayerNormNd
|
|
20
21
|
from .simplelayers import (
|
|
21
22
|
LLTM,
|
|
22
23
|
ApplyFilter,
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Copyright (c) MONAI Consortium
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
7
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
8
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
9
|
+
# See the License for the specific language governing permissions and
|
|
10
|
+
# limitations under the License.
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import torch
|
|
15
|
+
import torch.nn as nn
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LayerNormNd(nn.Module):
|
|
19
|
+
"""
|
|
20
|
+
Layer normalization over the channel dimension of a channels-first tensor.
|
|
21
|
+
|
|
22
|
+
`torch.nn.LayerNorm` normalizes over the trailing dimensions, so it expects a channels-last layout
|
|
23
|
+
such as ``(batch, *spatial, channel)``. Convolutional feature maps in MONAI are channels-first,
|
|
24
|
+
``(batch, channel, *spatial)``, and this module normalizes those over the channel dimension only,
|
|
25
|
+
for any number of spatial dimensions.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
num_channels: number of channels of the input, i.e. the size of dimension 1.
|
|
29
|
+
spatial_dims: number of spatial dimensions of the input image.
|
|
30
|
+
eps: value added to the denominator for numerical stability.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
ValueError: if ``num_channels`` is not positive, or ``spatial_dims`` is negative.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, num_channels: int, spatial_dims: int, eps: float = 1e-6) -> None:
|
|
37
|
+
super().__init__()
|
|
38
|
+
if num_channels <= 0:
|
|
39
|
+
raise ValueError(f"num_channels must be positive, got {num_channels}.")
|
|
40
|
+
if spatial_dims < 0:
|
|
41
|
+
raise ValueError(f"spatial_dims must be non-negative, got {spatial_dims}.")
|
|
42
|
+
self.eps = eps
|
|
43
|
+
self.weight = nn.Parameter(torch.ones(num_channels))
|
|
44
|
+
self.bias = nn.Parameter(torch.zeros(num_channels))
|
|
45
|
+
# broadcast the affine parameters against (batch, channel, *spatial); precomputed so that the
|
|
46
|
+
# module is scriptable without inspecting the rank of the input at runtime.
|
|
47
|
+
self.param_shape = [1, num_channels] + [1] * spatial_dims
|
|
48
|
+
|
|
49
|
+
def forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
50
|
+
mean = x.mean(dim=1, keepdim=True)
|
|
51
|
+
xmean = x - mean
|
|
52
|
+
var = xmean.pow(2).mean(dim=1, keepdim=True)
|
|
53
|
+
# `var` and the sqrt result are intermediates used nowhere else, so mutating them in place is
|
|
54
|
+
# safe; `xmean` must stay untouched since its pre-division value is what `pow(2)`'s backward
|
|
55
|
+
# needs, so the final division is deliberately out-of-place.
|
|
56
|
+
denom = var.add_(self.eps).sqrt_()
|
|
57
|
+
x = xmean / denom
|
|
58
|
+
return self.weight.view(self.param_shape).mul(x).add_(self.bias.view(self.param_shape))
|
|
@@ -19,6 +19,25 @@ from .basic_unet import BasicUNet, BasicUnet, Basicunet, basicunet
|
|
|
19
19
|
from .basic_unetplusplus import BasicUNetPlusPlus, BasicUnetPlusPlus, BasicunetPlusPlus, basicunetplusplus
|
|
20
20
|
from .classifier import Classifier, Critic, Discriminator
|
|
21
21
|
from .controlnet import ControlNet
|
|
22
|
+
from .convnext import (
|
|
23
|
+
ConvNeXt,
|
|
24
|
+
Convnext,
|
|
25
|
+
Convnext_base,
|
|
26
|
+
Convnext_large,
|
|
27
|
+
Convnext_small,
|
|
28
|
+
Convnext_tiny,
|
|
29
|
+
Convnext_xlarge,
|
|
30
|
+
ConvNeXtBase,
|
|
31
|
+
ConvNeXtLarge,
|
|
32
|
+
ConvNeXtSmall,
|
|
33
|
+
ConvNeXtTiny,
|
|
34
|
+
ConvNeXtXLarge,
|
|
35
|
+
convnext_base,
|
|
36
|
+
convnext_large,
|
|
37
|
+
convnext_small,
|
|
38
|
+
convnext_tiny,
|
|
39
|
+
convnext_xlarge,
|
|
40
|
+
)
|
|
22
41
|
from .daf3d import DAF3D
|
|
23
42
|
from .densenet import (
|
|
24
43
|
DenseNet,
|