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.
Files changed (330) hide show
  1. {srforge-0.16.2 → srforge-0.16.3}/CHANGELOG.md +14 -1
  2. {srforge-0.16.2/srforge.egg-info → srforge-0.16.3}/PKG-INFO +1 -1
  3. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/model_ops.py +47 -18
  4. {srforge-0.16.2 → srforge-0.16.3/srforge.egg-info}/PKG-INFO +1 -1
  5. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/SOURCES.txt +1 -0
  6. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/scm_file_list.json +1 -0
  7. srforge-0.16.3/srforge.egg-info/scm_version.json +8 -0
  8. srforge-0.16.3/tests/utils/test_model_ops_dotted.py +106 -0
  9. srforge-0.16.2/srforge.egg-info/scm_version.json +0 -8
  10. {srforge-0.16.2 → srforge-0.16.3}/.gitignore +0 -0
  11. {srforge-0.16.2 → srforge-0.16.3}/.gitlab-ci.yml +0 -0
  12. {srforge-0.16.2 → srforge-0.16.3}/.graphify_concepts.yaml +0 -0
  13. {srforge-0.16.2 → srforge-0.16.3}/.graphifyignore +0 -0
  14. {srforge-0.16.2 → srforge-0.16.3}/AGENTS.md +0 -0
  15. {srforge-0.16.2 → srforge-0.16.3}/CLAUDE.md +0 -0
  16. {srforge-0.16.2 → srforge-0.16.3}/README.md +0 -0
  17. {srforge-0.16.2 → srforge-0.16.3}/TODO.md +0 -0
  18. {srforge-0.16.2 → srforge-0.16.3}/benchmarks/README.md +0 -0
  19. {srforge-0.16.2 → srforge-0.16.3}/benchmarks/corrected_loss_vs_clcombiner.py +0 -0
  20. {srforge-0.16.2 → srforge-0.16.3}/docs/architecture.puml +0 -0
  21. {srforge-0.16.2 → srforge-0.16.3}/docs/design/distributed-training-rfc.md +0 -0
  22. {srforge-0.16.2 → srforge-0.16.3}/docs/design/external-metric-adapters-rfc.md +0 -0
  23. {srforge-0.16.2 → srforge-0.16.3}/docs/design/global-settings-shrink.md +0 -0
  24. {srforge-0.16.2 → srforge-0.16.3}/docs/design/lr-schedule-group-rfc.md +0 -0
  25. {srforge-0.16.2 → srforge-0.16.3}/docs/overrides/main.html +0 -0
  26. {srforge-0.16.2 → srforge-0.16.3}/docs/requirements.txt +0 -0
  27. {srforge-0.16.2 → srforge-0.16.3}/docs/src/anatomy-of-training.md +0 -0
  28. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/config.md +0 -0
  29. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/collation.md +0 -0
  30. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/entry.md +0 -0
  31. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/graph_entry.md +0 -0
  32. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/loader.md +0 -0
  33. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/descriptors.md +0 -0
  34. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/index.md +0 -0
  35. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/data/multispectral/utils.md +0 -0
  36. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/index.md +0 -0
  37. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/lazy.md +0 -0
  38. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/patching.md +0 -0
  39. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/dataset/stats.md +0 -0
  40. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/deprecation.md +0 -0
  41. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/adapters.md +0 -0
  42. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/adversarial.md +0 -0
  43. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/base.md +0 -0
  44. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/classification.md +0 -0
  45. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/combiner.md +0 -0
  46. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/image.md +0 -0
  47. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/index.md +0 -0
  48. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/regression.md +0 -0
  49. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/regularization.md +0 -0
  50. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/schedule.md +0 -0
  51. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/scores.md +0 -0
  52. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/metrics/wrappers.md +0 -0
  53. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/MagNAt.md +0 -0
  54. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/RAMS.md +0 -0
  55. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/MISR/TRMISR.md +0 -0
  56. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/SISR/DSen2.md +0 -0
  57. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/SISR/FSRCNN.md +0 -0
  58. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/models/basic.md +0 -0
  59. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/convolution.md +0 -0
  60. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/index.md +0 -0
  61. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/nn/graph/interpolation.md +0 -0
  62. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/registry.md +0 -0
  63. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/index.md +0 -0
  64. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/runners.md +0 -0
  65. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/schedule.md +0 -0
  66. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/training/trainers.md +0 -0
  67. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/transforms.md +0 -0
  68. {srforge-0.16.2 → srforge-0.16.3}/docs/src/api/utils/io.md +0 -0
  69. {srforge-0.16.2 → srforge-0.16.3}/docs/src/architecture.md +0 -0
  70. {srforge-0.16.2 → srforge-0.16.3}/docs/src/cheatsheet.md +0 -0
  71. {srforge-0.16.2 → srforge-0.16.3}/docs/src/code-or-config.md +0 -0
  72. {srforge-0.16.2 → srforge-0.16.3}/docs/src/collation.md +0 -0
  73. {srforge-0.16.2 → srforge-0.16.3}/docs/src/concepts.md +0 -0
  74. {srforge-0.16.2 → srforge-0.16.3}/docs/src/config-indirection.md +0 -0
  75. {srforge-0.16.2 → srforge-0.16.3}/docs/src/configuration.md +0 -0
  76. {srforge-0.16.2 → srforge-0.16.3}/docs/src/datasets.md +0 -0
  77. {srforge-0.16.2 → srforge-0.16.3}/docs/src/distributed.md +0 -0
  78. {srforge-0.16.2 → srforge-0.16.3}/docs/src/entry.md +0 -0
  79. {srforge-0.16.2 → srforge-0.16.3}/docs/src/extending.md +0 -0
  80. {srforge-0.16.2 → srforge-0.16.3}/docs/src/faq.md +0 -0
  81. {srforge-0.16.2 → srforge-0.16.3}/docs/src/getting-started.md +0 -0
  82. {srforge-0.16.2 → srforge-0.16.3}/docs/src/hooks.md +0 -0
  83. {srforge-0.16.2 → srforge-0.16.3}/docs/src/index.md +0 -0
  84. {srforge-0.16.2 → srforge-0.16.3}/docs/src/io-binding.md +0 -0
  85. {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/mathjax.js +0 -0
  86. {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/mermaid-lightbox.js +0 -0
  87. {srforge-0.16.2 → srforge-0.16.3}/docs/src/javascripts/sections.js +0 -0
  88. {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/classification-metrics.md +0 -0
  89. {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/external-metrics.md +0 -0
  90. {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/index.md +0 -0
  91. {srforge-0.16.2 → srforge-0.16.3}/docs/src/metrics/writing-a-metric.md +0 -0
  92. {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/gan-model.md +0 -0
  93. {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/index.md +0 -0
  94. {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/model.md +0 -0
  95. {srforge-0.16.2 → srforge-0.16.3}/docs/src/models/sequential-model.md +0 -0
  96. {srforge-0.16.2 → srforge-0.16.3}/docs/src/scripts.md +0 -0
  97. {srforge-0.16.2 → srforge-0.16.3}/docs/src/stylesheets/extra.css +0 -0
  98. {srforge-0.16.2 → srforge-0.16.3}/docs/src/stylesheets/sections.css +0 -0
  99. {srforge-0.16.2 → srforge-0.16.3}/docs/src/tracking.md +0 -0
  100. {srforge-0.16.2 → srforge-0.16.3}/docs/src/trainers-and-runners.md +0 -0
  101. {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/data-transform.md +0 -0
  102. {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/entry-transform.md +0 -0
  103. {srforge-0.16.2 → srforge-0.16.3}/docs/src/transforms/index.md +0 -0
  104. {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/01-importance-aware-ranking.md +0 -0
  105. {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/02-first-class-mcp-tools.md +0 -0
  106. {srforge-0.16.2 → srforge-0.16.3}/docs/upstream-pr-drafts/README.md +0 -0
  107. {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/README.md +0 -0
  108. {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/config.yaml +0 -0
  109. {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/synthetic_data.py +0 -0
  110. {srforge-0.16.2 → srforge-0.16.3}/examples/minimal_sr/train.py +0 -0
  111. {srforge-0.16.2 → srforge-0.16.3}/mkdocs.yml +0 -0
  112. {srforge-0.16.2 → srforge-0.16.3}/pyproject.toml +0 -0
  113. {srforge-0.16.2 → srforge-0.16.3}/scripts/post_graphify.py +0 -0
  114. {srforge-0.16.2 → srforge-0.16.3}/scripts/refresh_graph.sh +0 -0
  115. {srforge-0.16.2 → srforge-0.16.3}/scripts/save_graph_answer.sh +0 -0
  116. {srforge-0.16.2 → srforge-0.16.3}/setup.cfg +0 -0
  117. {srforge-0.16.2 → srforge-0.16.3}/srforge/__init__.py +0 -0
  118. {srforge-0.16.2 → srforge-0.16.3}/srforge/_paths.py +0 -0
  119. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/__init__.py +0 -0
  120. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/benchmark-cfg.yaml +0 -0
  121. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/benchmark.py +0 -0
  122. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/graphify_concepts.yaml.tmpl +0 -0
  123. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/graphifyignore.tmpl +0 -0
  124. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/mcp.json.tmpl +0 -0
  125. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/post_graphify.py.tmpl +0 -0
  126. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/pre-commit.tmpl +0 -0
  127. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/refresh_graph.sh.tmpl +0 -0
  128. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/graphify/save_graph_answer.sh.tmpl +0 -0
  129. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/train-cfg.yaml +0 -0
  130. {srforge-0.16.2 → srforge-0.16.3}/srforge/_scaffold/train.py +0 -0
  131. {srforge-0.16.2 → srforge-0.16.3}/srforge/cli.py +0 -0
  132. {srforge-0.16.2 → srforge-0.16.3}/srforge/config/__init__.py +0 -0
  133. {srforge-0.16.2 → srforge-0.16.3}/srforge/config/audit.py +0 -0
  134. {srforge-0.16.2 → srforge-0.16.3}/srforge/config/resolver.py +0 -0
  135. {srforge-0.16.2 → srforge-0.16.3}/srforge/config/spec.py +0 -0
  136. {srforge-0.16.2 → srforge-0.16.3}/srforge/config/utils.py +0 -0
  137. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/__init__.py +0 -0
  138. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/collation.py +0 -0
  139. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/entry.py +0 -0
  140. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/graph_entry.py +0 -0
  141. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/loader.py +0 -0
  142. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/__init__.py +0 -0
  143. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/descriptors.py +0 -0
  144. {srforge-0.16.2 → srforge-0.16.3}/srforge/data/multispectral/utils.py +0 -0
  145. {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/__init__.py +0 -0
  146. {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/lazy_datasets.py +0 -0
  147. {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/patching.py +0 -0
  148. {srforge-0.16.2 → srforge-0.16.3}/srforge/dataset/stats.py +0 -0
  149. {srforge-0.16.2 → srforge-0.16.3}/srforge/distributed/__init__.py +0 -0
  150. {srforge-0.16.2 → srforge-0.16.3}/srforge/distributed/strategy.py +0 -0
  151. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/__init__.py +0 -0
  152. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/adapters.py +0 -0
  153. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/adversarial.py +0 -0
  154. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/classification.py +0 -0
  155. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/metrics.py +0 -0
  156. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/schedule.py +0 -0
  157. {srforge-0.16.2 → srforge-0.16.3}/srforge/loss/storage.py +0 -0
  158. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/__init__.py +0 -0
  159. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/adapters.py +0 -0
  160. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/adversarial.py +0 -0
  161. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/base.py +0 -0
  162. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/classification.py +0 -0
  163. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/combiner.py +0 -0
  164. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/image.py +0 -0
  165. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/regression.py +0 -0
  166. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/regularization.py +0 -0
  167. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/schedule.py +0 -0
  168. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/scores.py +0 -0
  169. {srforge-0.16.2 → srforge-0.16.3}/srforge/metrics/wrappers.py +0 -0
  170. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/DeepSent.py +0 -0
  171. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/HighResNet.py +0 -0
  172. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/MagNAt.py +0 -0
  173. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/PIUnet.py +0 -0
  174. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/RAMS.py +0 -0
  175. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/TRMISR.py +0 -0
  176. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/MISR/__init__.py +0 -0
  177. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/DSen2.py +0 -0
  178. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/FSRCNN.py +0 -0
  179. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/SISR/__init__.py +0 -0
  180. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/__init__.py +0 -0
  181. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/basic.py +0 -0
  182. {srforge-0.16.2 → srforge-0.16.3}/srforge/models/discriminator.py +0 -0
  183. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/__init__.py +0 -0
  184. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/__init__.py +0 -0
  185. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/aggregation.py +0 -0
  186. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/convert.py +0 -0
  187. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/convolution.py +0 -0
  188. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/dropout.py +0 -0
  189. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/embedding.py +0 -0
  190. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/interpolation.py +0 -0
  191. {srforge-0.16.2 → srforge-0.16.3}/srforge/nn/graph/transforms.py +0 -0
  192. {srforge-0.16.2 → srforge-0.16.3}/srforge/registry.py +0 -0
  193. {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/__init__.py +0 -0
  194. {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/base.py +0 -0
  195. {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/null.py +0 -0
  196. {srforge-0.16.2 → srforge-0.16.3}/srforge/tracking/wandb.py +0 -0
  197. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/__init__.py +0 -0
  198. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/best_per_metric.py +0 -0
  199. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/context.py +0 -0
  200. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/hookpoint.py +0 -0
  201. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/hooks.py +0 -0
  202. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/optim.py +0 -0
  203. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/precision.py +0 -0
  204. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/runners.py +0 -0
  205. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/schedule.py +0 -0
  206. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/stop.py +0 -0
  207. {srforge-0.16.2 → srforge-0.16.3}/srforge/training/trainers.py +0 -0
  208. {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/__init__.py +0 -0
  209. {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/data.py +0 -0
  210. {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/entry.py +0 -0
  211. {srforge-0.16.2 → srforge-0.16.3}/srforge/transform/graph.py +0 -0
  212. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/__init__.py +0 -0
  213. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/_init_audit.py +0 -0
  214. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/checkpoint.py +0 -0
  215. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/child_processes.py +0 -0
  216. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/convert.py +0 -0
  217. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/deprecation.py +0 -0
  218. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/experimental.py +0 -0
  219. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/io.py +0 -0
  220. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/io_parsing.py +0 -0
  221. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/iomodule.py +0 -0
  222. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/iospec.py +0 -0
  223. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/logging.py +0 -0
  224. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/model.py +0 -0
  225. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/multigpu.py +0 -0
  226. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/shape_trace.py +0 -0
  227. {srforge-0.16.2 → srforge-0.16.3}/srforge/utils/version_check.py +0 -0
  228. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/dependency_links.txt +0 -0
  229. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/entry_points.txt +0 -0
  230. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/requires.txt +0 -0
  231. {srforge-0.16.2 → srforge-0.16.3}/srforge.egg-info/top_level.txt +0 -0
  232. {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_audit.py +0 -0
  233. {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_config_io.py +0 -0
  234. {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_resolver.py +0 -0
  235. {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_resolver_graph.py +0 -0
  236. {srforge-0.16.2 → srforge-0.16.3}/tests/config/test_spec.py +0 -0
  237. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_collation_pyg_parity.py +0 -0
  238. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_dynamic_storage.py +0 -0
  239. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_batch_indexing.py +0 -0
  240. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_collation.py +0 -0
  241. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_entry_to_numpy.py +0 -0
  242. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_iomodule_set_io.py +0 -0
  243. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_lazy_graph_entry.py +0 -0
  244. {srforge-0.16.2 → srforge-0.16.3}/tests/data/test_merge_fields.py +0 -0
  245. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_dataset_caching.py +0 -0
  246. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_dataset_transforms.py +0 -0
  247. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_lazy_dataset_filters.py +0 -0
  248. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_lazy_multispectral_dataset.py +0 -0
  249. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_multispectral_patching.py +0 -0
  250. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_shape_tracing.py +0 -0
  251. {srforge-0.16.2 → srforge-0.16.3}/tests/dataset/test_stats.py +0 -0
  252. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/__init__.py +0 -0
  253. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_ddp_gloo.py +0 -0
  254. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_distributed_options.py +0 -0
  255. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_model_accessors.py +0 -0
  256. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_rank_gating.py +0 -0
  257. {srforge-0.16.2 → srforge-0.16.3}/tests/distributed/test_strategy.py +0 -0
  258. {srforge-0.16.2 → srforge-0.16.3}/tests/integration/__init__.py +0 -0
  259. {srforge-0.16.2 → srforge-0.16.3}/tests/integration/test_end_to_end_yaml.py +0 -0
  260. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_adapters.py +0 -0
  261. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_adversarial_losses.py +0 -0
  262. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_aggregate.py +0 -0
  263. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_band_aggregation.py +0 -0
  264. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_classification_losses.py +0 -0
  265. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_classification_metrics.py +0 -0
  266. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_corrected_loss.py +0 -0
  267. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_deprecated_loss_paths.py +0 -0
  268. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_epoch_aggregation.py +0 -0
  269. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_dict_inputs.py +0 -0
  270. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_entry_only.py +0 -0
  271. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_scheduler.py +0 -0
  272. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_loss_set_io.py +0 -0
  273. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_lpips_pointwise.py +0 -0
  274. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_mask_counting.py +0 -0
  275. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_pointwise_and_uncertainty.py +0 -0
  276. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_pointwise_inputs.py +0 -0
  277. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_reduction_applies.py +0 -0
  278. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_sam_mask.py +0 -0
  279. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_total_variation_mask.py +0 -0
  280. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_uncertainty_any_base.py +0 -0
  281. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_windowed_masking.py +0 -0
  282. {srforge-0.16.2 → srforge-0.16.3}/tests/loss/test_writing_a_metric_page.py +0 -0
  283. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_gan_model.py +0 -0
  284. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_graphentry_merge.py +0 -0
  285. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_optional_iospec.py +0 -0
  286. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_output_merge.py +0 -0
  287. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_model_set_io_validation.py +0 -0
  288. {srforge-0.16.2 → srforge-0.16.3}/tests/models/test_sequential_model_flow.py +0 -0
  289. {srforge-0.16.2 → srforge-0.16.3}/tests/test_cli_init.py +0 -0
  290. {srforge-0.16.2 → srforge-0.16.3}/tests/test_init.py +0 -0
  291. {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_cheatsheet.py +0 -0
  292. {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_integration.py +0 -0
  293. {srforge-0.16.2 → srforge-0.16.3}/tests/test_io_binding_reference.py +0 -0
  294. {srforge-0.16.2 → srforge-0.16.3}/tests/test_preflight_audit.py +0 -0
  295. {srforge-0.16.2 → srforge-0.16.3}/tests/test_registry_collisions.py +0 -0
  296. {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/__init__.py +0 -0
  297. {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/test_null_tracker.py +0 -0
  298. {srforge-0.16.2 → srforge-0.16.3}/tests/tracking/test_tracker.py +0 -0
  299. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_best_per_metric.py +0 -0
  300. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_hookpoint_system.py +0 -0
  301. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_hooks.py +0 -0
  302. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_loss_gradient_check.py +0 -0
  303. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_output_directory.py +0 -0
  304. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_precision.py +0 -0
  305. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_progress_bar_values.py +0 -0
  306. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_graphentry_output.py +0 -0
  307. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_optimizers.py +0 -0
  308. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runner_output_merge.py +0 -0
  309. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_runners_coverage.py +0 -0
  310. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_sampler_epoch.py +0 -0
  311. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_schedule.py +0 -0
  312. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_stop.py +0 -0
  313. {srforge-0.16.2 → srforge-0.16.3}/tests/training/test_trainers.py +0 -0
  314. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_batched_unbatched_equivalence.py +0 -0
  315. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_classification_glue.py +0 -0
  316. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_data_transforms.py +0 -0
  317. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_entry_transforms.py +0 -0
  318. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_equalization.py +0 -0
  319. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_no_redundant_unbatched.py +0 -0
  320. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_per_sample_transform.py +0 -0
  321. {srforge-0.16.2 → srforge-0.16.3}/tests/transform/test_resize_bands.py +0 -0
  322. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/__init__.py +0 -0
  323. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_checkpoint.py +0 -0
  324. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_child_processes.py +0 -0
  325. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_init_audit.py +0 -0
  326. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_io_parsing.py +0 -0
  327. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_iospec.py +0 -0
  328. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_multigpu.py +0 -0
  329. {srforge-0.16.2 → srforge-0.16.3}/tests/utils/test_utils_coverage.py +0 -0
  330. {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.2...HEAD
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.2
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
- if not hasattr(source_module, submodule_name):
16
- raise ValueError(f"Module '{submodule_name}' not found in model '{source_module.__class__.__name__}'.")
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
- If None, the same names as target_module_name are used.
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
- if not hasattr(target_model, t_name):
47
- raise ValueError(f"Module '{t_name}' not found in target model '{target_model.__class__.__name__}'.")
48
- if not hasattr(source_model, s_name):
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 replace.
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
- if not hasattr(target_model, target_module_name):
67
- raise ValueError(f"Module '{target_module_name}' not found in target model '{target_model.__class__.__name__}'.")
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.2
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,8 @@
1
+ {
2
+ "tag": "0.16.3",
3
+ "distance": 0,
4
+ "node": "g4ce74f192d3127977c356930d2db82f78ea2b6fd",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-11-08"
8
+ }
@@ -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)
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.16.2",
3
- "distance": 0,
4
- "node": "g7a5781d22b88e838359eed91e66df950fa1030a5",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-19"
8
- }
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