srforge 0.16.2__tar.gz → 0.16.3__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.
- {srforge-0.16.2 → srforge-0.16.3}/CHANGELOG.md +14 -1
- {srforge-0.16.2/srforge.egg-info → srforge-0.16.3}/PKG-INFO +1 -1
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/model_ops.py +47 -18
- {srforge-0.16.2 → srforge-0.16.3/srforge.egg-info}/PKG-INFO +1 -1
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/SOURCES.txt +1 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/scm_file_list.json +1 -0
- srforge-0.16.3/srforge.egg-info/scm_version.json +8 -0
- srforge-0.16.3/tests/utils/test_model_ops_dotted.py +106 -0
- srforge-0.16.2/srforge.egg-info/scm_version.json +0 -8
- {srforge-0.16.2 → srforge-0.16.3}/.gitignore +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/.gitlab-ci.yml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/.graphify_concepts.yaml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/.graphifyignore +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/AGENTS.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/CLAUDE.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/README.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/TODO.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/benchmarks/README.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/benchmarks/corrected_loss_vs_clcombiner.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/architecture.puml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/design/distributed-training-rfc.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/design/external-metric-adapters-rfc.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/design/global-settings-shrink.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/design/lr-schedule-group-rfc.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/overrides/main.html +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/requirements.txt +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/anatomy-of-training.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/config.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/collation.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/entry.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/graph_entry.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/loader.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/descriptors.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/utils.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/lazy.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/patching.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/stats.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/deprecation.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/adapters.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/adversarial.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/base.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/classification.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/combiner.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/image.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/regression.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/regularization.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/schedule.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/scores.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/wrappers.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/MagNAt.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/RAMS.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/TRMISR.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/SISR/DSen2.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/SISR/FSRCNN.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/basic.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/convolution.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/interpolation.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/registry.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/runners.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/schedule.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/trainers.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/transforms.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/utils/io.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/architecture.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/cheatsheet.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/code-or-config.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/collation.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/concepts.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/config-indirection.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/configuration.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/datasets.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/distributed.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/entry.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/extending.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/faq.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/getting-started.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/hooks.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/io-binding.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/mathjax.js +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/mermaid-lightbox.js +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/sections.js +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/classification-metrics.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/external-metrics.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/writing-a-metric.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/gan-model.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/model.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/sequential-model.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/scripts.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/stylesheets/extra.css +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/stylesheets/sections.css +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/tracking.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/trainers-and-runners.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/data-transform.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/entry-transform.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/index.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/01-importance-aware-ranking.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/02-first-class-mcp-tools.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/README.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/README.md +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/config.yaml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/synthetic_data.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/train.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/mkdocs.yml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/pyproject.toml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/scripts/post_graphify.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/scripts/refresh_graph.sh +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/scripts/save_graph_answer.sh +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/setup.cfg +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_paths.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/benchmark-cfg.yaml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/benchmark.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/graphify_concepts.yaml.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/graphifyignore.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/mcp.json.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/post_graphify.py.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/pre-commit.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/refresh_graph.sh.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/save_graph_answer.sh.tmpl +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/train-cfg.yaml +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/train.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/cli.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/config/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/config/audit.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/config/resolver.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/config/spec.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/config/utils.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/collation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/entry.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/graph_entry.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/loader.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/descriptors.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/utils.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/lazy_datasets.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/patching.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/stats.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/distributed/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/distributed/strategy.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/adapters.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/adversarial.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/classification.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/metrics.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/schedule.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/storage.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/adapters.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/adversarial.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/base.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/classification.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/combiner.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/image.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/regression.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/regularization.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/schedule.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/scores.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/wrappers.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/DeepSent.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/HighResNet.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/MagNAt.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/PIUnet.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/RAMS.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/TRMISR.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/DSen2.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/FSRCNN.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/basic.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/models/discriminator.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/aggregation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/convert.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/convolution.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/dropout.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/embedding.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/interpolation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/transforms.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/registry.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/base.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/null.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/wandb.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/best_per_metric.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/context.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/hookpoint.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/hooks.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/optim.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/precision.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/runners.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/schedule.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/stop.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/training/trainers.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/data.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/entry.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/graph.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/_init_audit.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/checkpoint.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/child_processes.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/convert.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/deprecation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/experimental.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/io.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/io_parsing.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/iomodule.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/iospec.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/logging.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/model.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/multigpu.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/shape_trace.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/version_check.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/dependency_links.txt +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/entry_points.txt +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/requires.txt +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/top_level.txt +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_audit.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_config_io.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_resolver.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_resolver_graph.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_spec.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_collation_pyg_parity.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_dynamic_storage.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_batch_indexing.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_collation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_to_numpy.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_iomodule_set_io.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_lazy_graph_entry.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_merge_fields.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_dataset_caching.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_dataset_transforms.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_lazy_dataset_filters.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_lazy_multispectral_dataset.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_multispectral_patching.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_shape_tracing.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_stats.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_ddp_gloo.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_distributed_options.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_model_accessors.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_rank_gating.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_strategy.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/integration/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/integration/test_end_to_end_yaml.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_adapters.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_adversarial_losses.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_aggregate.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_band_aggregation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_classification_losses.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_classification_metrics.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_corrected_loss.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_deprecated_loss_paths.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_epoch_aggregation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_dict_inputs.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_entry_only.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_scheduler.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_set_io.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_lpips_pointwise.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_mask_counting.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_pointwise_and_uncertainty.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_pointwise_inputs.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_reduction_applies.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_sam_mask.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_total_variation_mask.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_uncertainty_any_base.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_windowed_masking.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_writing_a_metric_page.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_gan_model.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_graphentry_merge.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_optional_iospec.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_output_merge.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_set_io_validation.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_sequential_model_flow.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_cli_init.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_init.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_cheatsheet.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_integration.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_reference.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_preflight_audit.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/test_registry_collisions.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/test_null_tracker.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/test_tracker.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_best_per_metric.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_hookpoint_system.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_hooks.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_loss_gradient_check.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_output_directory.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_precision.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_progress_bar_values.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_graphentry_output.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_optimizers.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_output_merge.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runners_coverage.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_sampler_epoch.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_schedule.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_stop.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_trainers.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_batched_unbatched_equivalence.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_classification_glue.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_data_transforms.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_entry_transforms.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_equalization.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_no_redundant_unbatched.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_per_sample_transform.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_resize_bands.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/__init__.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_checkpoint.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_child_processes.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_init_audit.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_io_parsing.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_iospec.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_multigpu.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_utils_coverage.py +0 -0
- {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_version_check.py +0 -0
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.16.3] - 2026-11-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Dotted module paths in `srforge.utils.model_ops`.** `replace_module`,
|
|
15
|
+
`get_submodule` and `replace_with_modules_from_another_model` accept a
|
|
16
|
+
path to a nested module — `sr.regnet` is `model.sr.regnet`, `blocks.0` a
|
|
17
|
+
`ModuleList` entry — so a config can swap a module deep inside a wrapper
|
|
18
|
+
model. Plain names behave as before; the root model is still returned, so
|
|
19
|
+
an `io:` block on the node binds the whole model; a missing segment is
|
|
20
|
+
named in the error, with what exists at that level.
|
|
21
|
+
|
|
10
22
|
## [0.16.2] - 2026-10-19
|
|
11
23
|
|
|
12
24
|
### Added
|
|
@@ -1602,7 +1614,8 @@ likelihood of affecting a given codebase:
|
|
|
1602
1614
|
- `Preprocessor` and `TransformationSpec` removed; `EntryTransform` is standalone.
|
|
1603
1615
|
- Codebase cleanup: `assert` replaced with proper exceptions, `super()` modernized.
|
|
1604
1616
|
|
|
1605
|
-
[Unreleased]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.16.
|
|
1617
|
+
[Unreleased]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.16.3...HEAD
|
|
1618
|
+
[0.16.3]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.16.2...v0.16.3
|
|
1606
1619
|
[0.16.2]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.16.1...v0.16.2
|
|
1607
1620
|
[0.16.1]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.16.0...v0.16.1
|
|
1608
1621
|
[0.16.0]: https://gitlab.com/tarasiewicztomasz/sr-forge/-/compare/v0.15.4...v0.16.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: srforge
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.3
|
|
4
4
|
Summary: Super‑resolution research framework for PyTorch with a focus on simplicity and flexibility using config files.
|
|
5
5
|
Author-email: Tomasz Tarasiewicz <tomasz.tarasiewicz@polsl.pl>
|
|
6
6
|
Project-URL: Homepage, https://gitlab.com/tarasiewicztomasz/sr-forge
|
|
@@ -5,16 +5,44 @@ import torch
|
|
|
5
5
|
|
|
6
6
|
logger = logging.getLogger(__name__)
|
|
7
7
|
|
|
8
|
+
def _resolve(model: torch.nn.Module, path: str, role: str):
|
|
9
|
+
"""``(parent, last_name)`` for a dotted *path* such as ``"sr.regnet"``.
|
|
10
|
+
|
|
11
|
+
Walks one attribute per segment, so ``"sr.regnet"`` is
|
|
12
|
+
``model.sr.regnet`` and a ``ModuleList`` index works too
|
|
13
|
+
(``"blocks.0"``). A plain name (no dot) resolves to ``(model, name)``,
|
|
14
|
+
exactly as before dotted paths were supported. A missing segment raises,
|
|
15
|
+
naming it and what the module at that point does have.
|
|
16
|
+
"""
|
|
17
|
+
segments = path.split(".")
|
|
18
|
+
parent = model
|
|
19
|
+
for depth, segment in enumerate(segments):
|
|
20
|
+
if not hasattr(parent, segment):
|
|
21
|
+
where = ".".join(segments[:depth]) or "the model itself"
|
|
22
|
+
children = ([n for n, _ in parent.named_children()]
|
|
23
|
+
if isinstance(parent, torch.nn.Module) else [])
|
|
24
|
+
raise ValueError(
|
|
25
|
+
f"Module '{path}' not found in {role} "
|
|
26
|
+
f"'{model.__class__.__name__}': '{segment}' does not exist "
|
|
27
|
+
f"under {where}"
|
|
28
|
+
+ (f" (it has: {', '.join(children)})" if children else "") + "."
|
|
29
|
+
)
|
|
30
|
+
if depth < len(segments) - 1:
|
|
31
|
+
parent = getattr(parent, segment)
|
|
32
|
+
last = segments[-1]
|
|
33
|
+
return parent, last
|
|
34
|
+
|
|
35
|
+
|
|
8
36
|
def get_submodule(source_module: torch.nn.Module, submodule_name: str) -> torch.nn.Module:
|
|
9
37
|
"""
|
|
10
38
|
Get a submodule from a module by name.
|
|
11
39
|
:param source_module: The model instance.
|
|
12
|
-
:param submodule_name: The name of the module to get
|
|
40
|
+
:param submodule_name: The name of the module to get — a plain attribute
|
|
41
|
+
name, or a dotted path to a nested one (``"sr.regnet"``).
|
|
13
42
|
:return: The module instance (torch.nn.Module).
|
|
14
43
|
"""
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
module = getattr(source_module, submodule_name)
|
|
44
|
+
parent, name = _resolve(source_module, submodule_name, "model")
|
|
45
|
+
module = getattr(parent, name)
|
|
18
46
|
logger.info(f"Extracted module '{submodule_name}' from model '{source_module.__class__.__name__}'.")
|
|
19
47
|
return module
|
|
20
48
|
|
|
@@ -27,11 +55,12 @@ def replace_with_modules_from_another_model(target_model: torch.nn.Module,
|
|
|
27
55
|
Replace a single or multiple modules in a target model with modules from a source model.
|
|
28
56
|
:param target_model: The model instance to modify.
|
|
29
57
|
:param target_module_name: The name(s) of the module(s) in the target model to replace.
|
|
58
|
+
Plain names or dotted paths to nested modules (``"sr.regnet"``).
|
|
30
59
|
:param source_model: The model instance to copy modules from.
|
|
31
|
-
:param source_module_name: The name(s) of the module(s) in the source model to copy
|
|
32
|
-
|
|
60
|
+
:param source_module_name: The name(s) of the module(s) in the source model to copy,
|
|
61
|
+
plain or dotted. If None, the same names as target_module_name are used.
|
|
33
62
|
|
|
34
|
-
:return: The modified target model instance.
|
|
63
|
+
:return: The modified target model instance (the root, not the replaced module).
|
|
35
64
|
"""
|
|
36
65
|
if source_module_name is None:
|
|
37
66
|
source_module_name = target_module_name
|
|
@@ -43,11 +72,9 @@ def replace_with_modules_from_another_model(target_model: torch.nn.Module,
|
|
|
43
72
|
raise ValueError("'target_module_name' and 'source_module_name' parameters must have the same length if provided as lists.")
|
|
44
73
|
|
|
45
74
|
for t_name, s_name in zip(target_module_name, source_module_name):
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
raise ValueError(f"Module '{s_name}' not found in source model '{source_model.__class__.__name__}'.")
|
|
50
|
-
setattr(target_model, t_name, get_submodule(source_model, s_name))
|
|
75
|
+
parent, last = _resolve(target_model, t_name, "target model")
|
|
76
|
+
s_parent, s_last = _resolve(source_model, s_name, "source model")
|
|
77
|
+
setattr(parent, last, getattr(s_parent, s_last))
|
|
51
78
|
logger.info(f"Replaced module '{t_name}' in target model with module '{s_name}' from source model.")
|
|
52
79
|
|
|
53
80
|
return target_model
|
|
@@ -58,14 +85,16 @@ def replace_module(target_model: torch.nn.Module,
|
|
|
58
85
|
"""
|
|
59
86
|
Replace a module in a target model with a new module.
|
|
60
87
|
:param target_model: The model instance to modify.
|
|
61
|
-
:param target_module_name: The name of the module in the target model to
|
|
88
|
+
:param target_module_name: The name of the module in the target model to
|
|
89
|
+
replace — a plain attribute name, or a dotted path to a nested one
|
|
90
|
+
(``"sr.regnet"`` replaces ``target_model.sr.regnet``).
|
|
62
91
|
:param new_module: The new module instance to insert.
|
|
63
92
|
|
|
64
|
-
:return: The modified target model instance
|
|
93
|
+
:return: The modified target model instance — always the root model, so
|
|
94
|
+
an ``io:`` block on this config node binds the whole model.
|
|
65
95
|
"""
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
setattr(target_model, target_module_name, new_module)
|
|
96
|
+
parent, last = _resolve(target_model, target_module_name, "target model")
|
|
97
|
+
setattr(parent, last, new_module)
|
|
69
98
|
logger.info(f"Replaced module '{target_module_name}' in target model with new module '{new_module.__class__.__name__}'.")
|
|
70
99
|
|
|
71
|
-
return target_model
|
|
100
|
+
return target_model
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: srforge
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.3
|
|
4
4
|
Summary: Super‑resolution research framework for PyTorch with a focus on simplicity and flexibility using config files.
|
|
5
5
|
Author-email: Tomasz Tarasiewicz <tomasz.tarasiewicz@polsl.pl>
|
|
6
6
|
Project-URL: Homepage, https://gitlab.com/tarasiewicztomasz/sr-forge
|
|
@@ -321,6 +321,7 @@ tests/utils/test_child_processes.py
|
|
|
321
321
|
tests/utils/test_init_audit.py
|
|
322
322
|
tests/utils/test_io_parsing.py
|
|
323
323
|
tests/utils/test_iospec.py
|
|
324
|
+
tests/utils/test_model_ops_dotted.py
|
|
324
325
|
tests/utils/test_multigpu.py
|
|
325
326
|
tests/utils/test_utils_coverage.py
|
|
326
327
|
tests/utils/test_version_check.py
|
|
@@ -315,6 +315,7 @@
|
|
|
315
315
|
"tests/utils/test_init_audit.py",
|
|
316
316
|
"tests/utils/test_io_parsing.py",
|
|
317
317
|
"tests/utils/test_iospec.py",
|
|
318
|
+
"tests/utils/test_model_ops_dotted.py",
|
|
318
319
|
"tests/utils/test_multigpu.py",
|
|
319
320
|
"tests/utils/test_utils_coverage.py",
|
|
320
321
|
"tests/utils/test_version_check.py"
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Dotted module paths in srforge.utils.model_ops ("sr.regnet")."""
|
|
2
|
+
import pytest
|
|
3
|
+
import torch
|
|
4
|
+
from omegaconf import OmegaConf
|
|
5
|
+
|
|
6
|
+
from srforge.config import ConfigResolver
|
|
7
|
+
from srforge.models import Model
|
|
8
|
+
from srforge.registry import register_class
|
|
9
|
+
from srforge.utils.model_ops import (get_submodule, replace_module,
|
|
10
|
+
replace_with_modules_from_another_model)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class _Inner(torch.nn.Module):
|
|
14
|
+
def __init__(self, scale: float = 1.0):
|
|
15
|
+
super().__init__()
|
|
16
|
+
self.regnet = torch.nn.Linear(2, 2)
|
|
17
|
+
self.blocks = torch.nn.ModuleList([torch.nn.Identity(), torch.nn.Identity()])
|
|
18
|
+
self.scale = scale
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@register_class
|
|
22
|
+
class DottedProbeModel(Model):
|
|
23
|
+
"""An outer model holding an inner one as ``sr``, like a joint model."""
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
super().__init__()
|
|
27
|
+
self.sr = _Inner()
|
|
28
|
+
self.head = torch.nn.Linear(2, 2)
|
|
29
|
+
|
|
30
|
+
def _forward(self, x: torch.Tensor) -> torch.Tensor:
|
|
31
|
+
return self.head(self.sr.regnet(x))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_get_submodule_follows_a_dotted_path():
|
|
35
|
+
model = DottedProbeModel()
|
|
36
|
+
assert get_submodule(model, "sr.regnet") is model.sr.regnet
|
|
37
|
+
assert get_submodule(model, "sr.blocks.1") is model.sr.blocks[1]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_replace_module_replaces_the_nested_module_and_returns_the_root():
|
|
41
|
+
model = DottedProbeModel()
|
|
42
|
+
new = torch.nn.Linear(2, 2)
|
|
43
|
+
out = replace_module(model, "sr.regnet", new)
|
|
44
|
+
assert out is model
|
|
45
|
+
assert model.sr.regnet is new
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_replace_with_modules_from_another_model_accepts_dotted_paths():
|
|
49
|
+
target, source = DottedProbeModel(), DottedProbeModel()
|
|
50
|
+
replace_with_modules_from_another_model(target, "sr.regnet", source, "sr.regnet")
|
|
51
|
+
assert target.sr.regnet is source.sr.regnet
|
|
52
|
+
replace_with_modules_from_another_model(target, ["head"], source)
|
|
53
|
+
assert target.head is source.head
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_plain_names_behave_as_before():
|
|
57
|
+
model = DottedProbeModel()
|
|
58
|
+
assert get_submodule(model, "head") is model.head
|
|
59
|
+
new = torch.nn.Linear(2, 2)
|
|
60
|
+
assert replace_module(model, "head", new) is model and model.head is new
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@pytest.mark.parametrize("path, missing, where", [
|
|
64
|
+
("sr.regnett", "regnett", "under sr"),
|
|
65
|
+
("srr.regnet", "srr", "under the model itself"),
|
|
66
|
+
("nope", "nope", "under the model itself"),
|
|
67
|
+
])
|
|
68
|
+
def test_a_missing_segment_is_named(path, missing, where):
|
|
69
|
+
with pytest.raises(ValueError, match=rf"'{missing}' does not exist {where}"):
|
|
70
|
+
replace_module(DottedProbeModel(), path, torch.nn.Identity())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_the_error_lists_what_is_there():
|
|
74
|
+
with pytest.raises(ValueError, match=r"it has: regnet, blocks"):
|
|
75
|
+
get_submodule(DottedProbeModel(), "sr.regnett")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def test_an_outer_replace_module_node_keeps_its_io_binding():
|
|
79
|
+
"""The CD config shape: replace_module outermost, nested target, the
|
|
80
|
+
new module taken from another model, and io: on the outer node."""
|
|
81
|
+
cfg = OmegaConf.create("""
|
|
82
|
+
donor:
|
|
83
|
+
_target: DottedProbeModel
|
|
84
|
+
model:
|
|
85
|
+
_target: srforge.utils.model_ops.replace_module
|
|
86
|
+
params:
|
|
87
|
+
target_model:
|
|
88
|
+
_target: DottedProbeModel
|
|
89
|
+
target_module_name: sr.regnet
|
|
90
|
+
new_module:
|
|
91
|
+
_target: srforge.utils.model_ops.get_submodule
|
|
92
|
+
params:
|
|
93
|
+
source_module: ${ref:donor}
|
|
94
|
+
submodule_name: sr.regnet
|
|
95
|
+
io:
|
|
96
|
+
inputs: {x: lr}
|
|
97
|
+
outputs: sr_out
|
|
98
|
+
""")
|
|
99
|
+
resolver = ConfigResolver(cfg)
|
|
100
|
+
model = resolver(cfg.model)
|
|
101
|
+
donor = resolver(cfg.donor)
|
|
102
|
+
assert isinstance(model, DottedProbeModel)
|
|
103
|
+
assert model.sr.regnet is donor.sr.regnet
|
|
104
|
+
from srforge.data import Entry
|
|
105
|
+
out = model(Entry(lr=torch.rand(1, 2)))
|
|
106
|
+
assert out["sr_out"].shape == (1, 2)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|