modssc 0.2.1.dev0__tar.gz → 0.2.2__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 (633) hide show
  1. {modssc-0.2.1.dev0 → modssc-0.2.2}/CHANGELOG.md +10 -2
  2. {modssc-0.2.1.dev0 → modssc-0.2.2}/PKG-INFO +1 -1
  3. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/index.md +1 -1
  4. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__about__.py +1 -1
  5. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/torch.py +29 -1
  6. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/bundles.py +23 -19
  7. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/adamatch.py +5 -4
  8. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/adsh.py +37 -26
  9. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/co_training.py +17 -1
  10. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/comatch.py +5 -4
  11. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/daso.py +27 -19
  12. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/deep_utils.py +99 -1
  13. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/defixmatch.py +30 -24
  14. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/democratic_co_learning.py +14 -6
  15. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/fixmatch.py +20 -16
  16. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/flexmatch.py +24 -18
  17. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/free_match.py +20 -16
  18. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/mean_teacher.py +15 -12
  19. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/meta_pseudo_labels.py +27 -22
  20. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/mixmatch.py +36 -24
  21. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/noisy_student.py +22 -18
  22. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/pi_model.py +14 -11
  23. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/pseudo_label.py +21 -10
  24. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/s4vm.py +4 -3
  25. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/self_training.py +21 -11
  26. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/setred.py +37 -19
  27. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/simclr_v2.py +27 -23
  28. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/softmatch.py +20 -16
  29. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/temporal_ensembling.py +17 -14
  30. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/tri_training.py +20 -11
  31. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/trinet.py +37 -31
  32. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/tsvm.py +13 -6
  33. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/uda.py +20 -16
  34. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/vat.py +33 -13
  35. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/to_torch.py +4 -1
  36. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/graphsage_inductive.py +66 -17
  37. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/deep/test_bundles.py +52 -0
  38. modssc-0.2.2/tests/inductive/test_adsh_predict_proba.py +45 -0
  39. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_backends_deep_utils.py +86 -0
  40. modssc-0.2.2/tests/inductive/test_co_training_device_validation.py +57 -0
  41. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_co_training_helpers.py +7 -0
  42. modssc-0.2.2/tests/inductive/test_graph_dict_helpers.py +51 -0
  43. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_validation_adapters.py +33 -0
  44. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_to_numpy_torch.py +30 -0
  45. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_graphsage_inductive.py +77 -0
  46. {modssc-0.2.1.dev0 → modssc-0.2.2}/.editorconfig +0 -0
  47. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CODEOWNERS +0 -0
  48. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CODE_OF_CONDUCT.md +0 -0
  49. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CONTRIBUTING.md +0 -0
  50. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/GOVERNANCE.md +0 -0
  51. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  52. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  53. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  54. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/new_method.yml +0 -0
  55. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/SECURITY.md +0 -0
  56. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/dependabot.yml +0 -0
  57. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/pull_request_template.md +0 -0
  58. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/ci.yml +0 -0
  59. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/docs.yml +0 -0
  60. {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/release.yml +0 -0
  61. {modssc-0.2.1.dev0 → modssc-0.2.2}/.gitignore +0 -0
  62. {modssc-0.2.1.dev0 → modssc-0.2.2}/.pre-commit-config.yaml +0 -0
  63. {modssc-0.2.1.dev0 → modssc-0.2.2}/CITATION.bib +0 -0
  64. {modssc-0.2.1.dev0 → modssc-0.2.2}/CITATION.cff +0 -0
  65. {modssc-0.2.1.dev0 → modssc-0.2.2}/LICENSE +0 -0
  66. {modssc-0.2.1.dev0 → modssc-0.2.2}/Makefile +0 -0
  67. {modssc-0.2.1.dev0 → modssc-0.2.2}/README.md +0 -0
  68. {modssc-0.2.1.dev0 → modssc-0.2.2}/codecov.yml +0 -0
  69. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/assets/logo.jpeg +0 -0
  70. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/development/contributing.md +0 -0
  71. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/development/release-process.md +0 -0
  72. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/concepts.md +0 -0
  73. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/installation.md +0 -0
  74. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/quickstart.md +0 -0
  75. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/augmentation.md +0 -0
  76. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/datasets.md +0 -0
  77. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/evaluation.md +0 -0
  78. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/graph.md +0 -0
  79. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/hpo.md +0 -0
  80. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/preprocess.md +0 -0
  81. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/sampling.md +0 -0
  82. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/views.md +0 -0
  83. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/javascripts/sidebar-toggle.js +0 -0
  84. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/data-augmentation.md +0 -0
  85. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/data-loader.md +0 -0
  86. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/device.md +0 -0
  87. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/evaluation.md +0 -0
  88. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/graph.md +0 -0
  89. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/hpo.md +0 -0
  90. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/index.md +0 -0
  91. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/inductive.md +0 -0
  92. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/logging.md +0 -0
  93. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/preprocess.md +0 -0
  94. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/sampling.md +0 -0
  95. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/supervised.md +0 -0
  96. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/transductive.md +0 -0
  97. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/views.md +0 -0
  98. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/benchmarks.md +0 -0
  99. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/catalogs.md +0 -0
  100. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/cli.md +0 -0
  101. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/configuration.md +0 -0
  102. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/stylesheets/extra.css +0 -0
  103. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/tutorials/inductive-toy.md +0 -0
  104. {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/tutorials/transductive-toy.md +0 -0
  105. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/00_inductive_toy_pseudo_label.py +0 -0
  106. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/01_evaluation_quickstart.py +0 -0
  107. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/01_transductive_toy_label_propagation.py +0 -0
  108. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/02_hpo_primitives_quickstart.py +0 -0
  109. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/02_sampling_toy_holdout.py +0 -0
  110. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/03_cli_smoke.py +0 -0
  111. {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/04_inductive_cotraining_two_views.py +0 -0
  112. {modssc-0.2.1.dev0 → modssc-0.2.2}/mkdocs.yml +0 -0
  113. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/00_cli_tour.ipynb +0 -0
  114. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/01_data_loader_end_to_end.ipynb +0 -0
  115. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/02_sampling_quickstart.ipynb +0 -0
  116. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/03_preprocess_quickstart.ipynb +0 -0
  117. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/04_data_augmentation_quickstart.ipynb +0 -0
  118. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/05_views_quickstart.ipynb +0 -0
  119. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/06_graph_quickstart.ipynb +0 -0
  120. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/07_supervised_quickstart.ipynb +0 -0
  121. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/08_inductive_quickstart.ipynb +0 -0
  122. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/09_transductive_quickstart.ipynb +0 -0
  123. {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/10_hpo_bench_smoke.ipynb +0 -0
  124. {modssc-0.2.1.dev0 → modssc-0.2.2}/pyproject.toml +0 -0
  125. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__init__.py +0 -0
  126. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__main__.py +0 -0
  127. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/__init__.py +0 -0
  128. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/_utils.py +0 -0
  129. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/app.py +0 -0
  130. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/augmentation.py +0 -0
  131. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/datasets.py +0 -0
  132. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/evaluation.py +0 -0
  133. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/graph.py +0 -0
  134. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/inductive.py +0 -0
  135. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/logging.py +0 -0
  136. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/preprocess.py +0 -0
  137. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/sampling.py +0 -0
  138. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/supervised.py +0 -0
  139. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/transductive.py +0 -0
  140. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/__init__.py +0 -0
  141. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/api.py +0 -0
  142. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/errors.py +0 -0
  143. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/__init__.py +0 -0
  144. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/audio.py +0 -0
  145. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/base.py +0 -0
  146. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/core.py +0 -0
  147. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/graph.py +0 -0
  148. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/tabular.py +0 -0
  149. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/text.py +0 -0
  150. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/vision.py +0 -0
  151. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/optional.py +0 -0
  152. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/plan.py +0 -0
  153. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/registry.py +0 -0
  154. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/types.py +0 -0
  155. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/utils.py +0 -0
  156. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/__init__.py +0 -0
  157. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/api.py +0 -0
  158. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/cache.py +0 -0
  159. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/__init__.py +0 -0
  160. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/audio.py +0 -0
  161. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/graph.py +0 -0
  162. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/tabular.py +0 -0
  163. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/text.py +0 -0
  164. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/toy.py +0 -0
  165. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/vision.py +0 -0
  166. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/errors.py +0 -0
  167. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/formats.py +0 -0
  168. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/manifest.py +0 -0
  169. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/numpy_adapter.py +0 -0
  170. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/optional.py +0 -0
  171. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/__init__.py +0 -0
  172. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/base.py +0 -0
  173. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/hf.py +0 -0
  174. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/openml.py +0 -0
  175. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/pyg.py +0 -0
  176. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/tfds.py +0 -0
  177. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/torchaudio.py +0 -0
  178. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/torchvision.py +0 -0
  179. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/toy.py +0 -0
  180. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/storage/__init__.py +0 -0
  181. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/storage/files.py +0 -0
  182. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/types.py +0 -0
  183. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/uri.py +0 -0
  184. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/device.py +0 -0
  185. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/evaluation/__init__.py +0 -0
  186. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/evaluation/metrics.py +0 -0
  187. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/__init__.py +0 -0
  188. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/adapters/__init__.py +0 -0
  189. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/adapters/pyg.py +0 -0
  190. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/artifacts.py +0 -0
  191. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/cache.py +0 -0
  192. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/__init__.py +0 -0
  193. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/api.py +0 -0
  194. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/__init__.py +0 -0
  195. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/faiss_backend.py +0 -0
  196. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/numpy_backend.py +0 -0
  197. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/sklearn_backend.py +0 -0
  198. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/builder.py +0 -0
  199. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/__init__.py +0 -0
  200. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/normalize.py +0 -0
  201. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/self_loops.py +0 -0
  202. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/symmetrize.py +0 -0
  203. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/weights.py +0 -0
  204. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/schemes/__init__.py +0 -0
  205. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/schemes/anchor.py +0 -0
  206. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/errors.py +0 -0
  207. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/__init__.py +0 -0
  208. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/api.py +0 -0
  209. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/node2vec.py +0 -0
  210. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/ops/__init__.py +0 -0
  211. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/ops/adjacency.py +0 -0
  212. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/__init__.py +0 -0
  213. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/attr.py +0 -0
  214. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/diffusion.py +0 -0
  215. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/struct.py +0 -0
  216. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/fingerprint.py +0 -0
  217. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/masks.py +0 -0
  218. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/optional.py +0 -0
  219. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/specs.py +0 -0
  220. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/validation.py +0 -0
  221. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/__init__.py +0 -0
  222. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/patching.py +0 -0
  223. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/samplers.py +0 -0
  224. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/space.py +0 -0
  225. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/types.py +0 -0
  226. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/__init__.py +0 -0
  227. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/__init__.py +0 -0
  228. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/numpy.py +0 -0
  229. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/backends/__init__.py +0 -0
  230. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/backends/torch_backend.py +0 -0
  231. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/base.py +0 -0
  232. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/__init__.py +0 -0
  233. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/types.py +0 -0
  234. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/validation.py +0 -0
  235. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/errors.py +0 -0
  236. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/__init__.py +0 -0
  237. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/deep_co_training.py +0 -0
  238. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/utils.py +0 -0
  239. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/optional.py +0 -0
  240. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/registry.py +0 -0
  241. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/seed.py +0 -0
  242. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/types.py +0 -0
  243. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/validation.py +0 -0
  244. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/logging.py +0 -0
  245. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/__init__.py +0 -0
  246. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/api.py +0 -0
  247. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/cache.py +0 -0
  248. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/catalog.py +0 -0
  249. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/errors.py +0 -0
  250. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/fingerprint.py +0 -0
  251. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models.py +0 -0
  252. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/__init__.py +0 -0
  253. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/base.py +0 -0
  254. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/open_clip.py +0 -0
  255. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/sentence_transformers.py +0 -0
  256. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/stub.py +0 -0
  257. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/torchaudio_wav2vec2.py +0 -0
  258. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/numpy_adapter.py +0 -0
  259. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/optional.py +0 -0
  260. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/plan.py +0 -0
  261. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/registry.py +0 -0
  262. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/__init__.py +0 -0
  263. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/__init__.py +0 -0
  264. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/load_waveform.py +0 -0
  265. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/spectrogram.py +0 -0
  266. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/wav2vec2.py +0 -0
  267. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/base.py +0 -0
  268. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/__init__.py +0 -0
  269. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/cast_dtype.py +0 -0
  270. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/cast_fp16.py +0 -0
  271. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/copy_raw.py +0 -0
  272. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/ensure_2d.py +0 -0
  273. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/pca.py +0 -0
  274. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/random_projection.py +0 -0
  275. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/to_numpy.py +0 -0
  276. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/to_torch.py +0 -0
  277. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/embeddings/__init__.py +0 -0
  278. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/embeddings/auto.py +0 -0
  279. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/__init__.py +0 -0
  280. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/attach_edge_weight.py +0 -0
  281. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/dgi.py +0 -0
  282. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/edge_sparsify.py +0 -0
  283. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/node2vec.py +0 -0
  284. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/sparse_adjacency.py +0 -0
  285. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/__init__.py +0 -0
  286. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/encode.py +0 -0
  287. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/ensure_onehot.py +0 -0
  288. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/to_numpy.py +0 -0
  289. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/__init__.py +0 -0
  290. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/impute.py +0 -0
  291. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/one_hot.py +0 -0
  292. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/standard_scaler.py +0 -0
  293. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/__init__.py +0 -0
  294. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/ensure_strings.py +0 -0
  295. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/hash_tokenizer.py +0 -0
  296. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/sentence_transformer.py +0 -0
  297. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/tfidf.py +0 -0
  298. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/vocab_tokenizer.py +0 -0
  299. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/__init__.py +0 -0
  300. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/channels_order.py +0 -0
  301. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/ensure_num_channels.py +0 -0
  302. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/layout.py +0 -0
  303. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/normalize.py +0 -0
  304. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/openclip.py +0 -0
  305. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/resize.py +0 -0
  306. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/squeeze.py +0 -0
  307. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/zca_whitening.py +0 -0
  308. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/store.py +0 -0
  309. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/types.py +0 -0
  310. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/__init__.py +0 -0
  311. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/api.py +0 -0
  312. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/errors.py +0 -0
  313. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/fingerprint.py +0 -0
  314. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/imbalance.py +0 -0
  315. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/labeling.py +0 -0
  316. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/plan.py +0 -0
  317. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/result.py +0 -0
  318. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/splitters.py +0 -0
  319. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/stats.py +0 -0
  320. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/storage.py +0 -0
  321. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/__init__.py +0 -0
  322. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/api.py +0 -0
  323. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/__init__.py +0 -0
  324. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/numpy/__init__.py +0 -0
  325. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/numpy/knn.py +0 -0
  326. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/__init__.py +0 -0
  327. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/extra_trees.py +0 -0
  328. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/gradient_boosting.py +0 -0
  329. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/knn.py +0 -0
  330. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/linear_svm.py +0 -0
  331. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/logreg.py +0 -0
  332. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/naive_bayes.py +0 -0
  333. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/random_forest.py +0 -0
  334. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/ridge.py +0 -0
  335. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/svm_rbf.py +0 -0
  336. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/__init__.py +0 -0
  337. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_cnn.py +0 -0
  338. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_cnn_scratch.py +0 -0
  339. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_pretrained.py +0 -0
  340. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/image_cnn.py +0 -0
  341. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/image_pretrained.py +0 -0
  342. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/knn.py +0 -0
  343. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/logreg.py +0 -0
  344. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/lstm_scratch.py +0 -0
  345. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/mlp.py +0 -0
  346. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/text_cnn.py +0 -0
  347. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/base.py +0 -0
  348. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/errors.py +0 -0
  349. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/optional.py +0 -0
  350. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/registry.py +0 -0
  351. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/types.py +0 -0
  352. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/utils.py +0 -0
  353. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/__init__.py +0 -0
  354. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/adapters/__init__.py +0 -0
  355. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/adapters/pyg.py +0 -0
  356. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/__init__.py +0 -0
  357. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/numpy_backend.py +0 -0
  358. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/torch_backend.py +0 -0
  359. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/base.py +0 -0
  360. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/errors.py +0 -0
  361. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/__init__.py +0 -0
  362. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/__init__.py +0 -0
  363. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/dynamic_label_propagation.py +0 -0
  364. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/graph_mincuts.py +0 -0
  365. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/label_propagation.py +0 -0
  366. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/label_spreading.py +0 -0
  367. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/laplace_learning.py +0 -0
  368. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/lazy_random_walk.py +0 -0
  369. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/tsvm.py +0 -0
  370. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/__init__.py +0 -0
  371. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/appnp.py +0 -0
  372. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/chebnet.py +0 -0
  373. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/common.py +0 -0
  374. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gat.py +0 -0
  375. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gcn.py +0 -0
  376. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gcnii.py +0 -0
  377. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/grafn.py +0 -0
  378. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/grand.py +0 -0
  379. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/graphhop.py +0 -0
  380. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/graphsage.py +0 -0
  381. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/h_gcn.py +0 -0
  382. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/n_gcn.py +0 -0
  383. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/planetoid.py +0 -0
  384. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/sgc.py +0 -0
  385. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/__init__.py +0 -0
  386. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/p_laplace_learning.py +0 -0
  387. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/poisson_learning.py +0 -0
  388. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/poisson_mbo.py +0 -0
  389. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/utils.py +0 -0
  390. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/__init__.py +0 -0
  391. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/clamp.py +0 -0
  392. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/laplacian.py +0 -0
  393. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/normalize.py +0 -0
  394. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/spmm.py +0 -0
  395. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/optional.py +0 -0
  396. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/registry.py +0 -0
  397. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/__init__.py +0 -0
  398. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/cg.py +0 -0
  399. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/fixed_point.py +0 -0
  400. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/types.py +0 -0
  401. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/validation.py +0 -0
  402. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/__init__.py +0 -0
  403. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/api.py +0 -0
  404. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/errors.py +0 -0
  405. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/plan.py +0 -0
  406. {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/types.py +0 -0
  407. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/__init__.py +0 -0
  408. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/__init__.py +0 -0
  409. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_app.py +0 -0
  410. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_augmentation.py +0 -0
  411. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_augmentation_module.py +0 -0
  412. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_cache_commands.py +0 -0
  413. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_datasets.py +0 -0
  414. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_datasets_app.py +0 -0
  415. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_evaluation.py +0 -0
  416. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_graph.py +0 -0
  417. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_inductive_cli.py +0 -0
  418. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_log_level_option.py +0 -0
  419. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_main.py +0 -0
  420. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_main_datasets.py +0 -0
  421. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_preprocess.py +0 -0
  422. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_sampling.py +0 -0
  423. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_supervised.py +0 -0
  424. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_utils.py +0 -0
  425. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_version.py +0 -0
  426. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/__init__.py +0 -0
  427. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/__init__.py +0 -0
  428. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_audio.py +0 -0
  429. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_core.py +0 -0
  430. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_graph.py +0 -0
  431. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_tabular.py +0 -0
  432. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_text.py +0 -0
  433. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_torch_mock.py +0 -0
  434. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_vision.py +0 -0
  435. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_vision_numpy.py +0 -0
  436. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_api_registry.py +0 -0
  437. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_optional.py +0 -0
  438. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_pipeline.py +0 -0
  439. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_registry.py +0 -0
  440. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_types.py +0 -0
  441. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_utils.py +0 -0
  442. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/__init__.py +0 -0
  443. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/catalog/__init__.py +0 -0
  444. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/catalog/test_catalog.py +0 -0
  445. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/__init__.py +0 -0
  446. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_hf.py +0 -0
  447. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_openml.py +0 -0
  448. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_pyg.py +0 -0
  449. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_registry.py +0 -0
  450. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_stubs.py +0 -0
  451. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_tfds.py +0 -0
  452. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_torchaudio.py +0 -0
  453. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_torchvision.py +0 -0
  454. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/__init__.py +0 -0
  455. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_edges_masks.py +0 -0
  456. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_files.py +0 -0
  457. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_roundtrip.py +0 -0
  458. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api.py +0 -0
  459. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api_end_to_end.py +0 -0
  460. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api_meta.py +0 -0
  461. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_cache.py +0 -0
  462. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_errors.py +0 -0
  463. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_fingerprint.py +0 -0
  464. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_formats.py +0 -0
  465. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_import_light.py +0 -0
  466. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_manifest.py +0 -0
  467. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_numpy_adapter.py +0 -0
  468. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_optional.py +0 -0
  469. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_types.py +0 -0
  470. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_uri.py +0 -0
  471. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/evaluation/__init__.py +0 -0
  472. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/evaluation/test_metrics.py +0 -0
  473. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/__init__.py +0 -0
  474. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/adapters/__init__.py +0 -0
  475. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/adapters/test_pyg.py +0 -0
  476. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/__init__.py +0 -0
  477. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/__init__.py +0 -0
  478. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_backends.py +0 -0
  479. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_faiss_backend.py +0 -0
  480. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_numpy_backend.py +0 -0
  481. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/ops/__init__.py +0 -0
  482. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/ops/test_ops.py +0 -0
  483. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/schemes/__init__.py +0 -0
  484. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/schemes/test_anchor.py +0 -0
  485. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_api.py +0 -0
  486. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_build_graph.py +0 -0
  487. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_builder.py +0 -0
  488. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_construction.py +0 -0
  489. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/__init__.py +0 -0
  490. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/ops/__init__.py +0 -0
  491. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/ops/test_adjacency.py +0 -0
  492. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_featurization.py +0 -0
  493. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_node2vec.py +0 -0
  494. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_views.py +0 -0
  495. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/views/__init__.py +0 -0
  496. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/views/test_struct.py +0 -0
  497. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_artifacts.py +0 -0
  498. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_cache.py +0 -0
  499. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_masks.py +0 -0
  500. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_optional.py +0 -0
  501. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_specs.py +0 -0
  502. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_patching.py +0 -0
  503. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_random.py +0 -0
  504. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_space.py +0 -0
  505. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/__init__.py +0 -0
  506. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/conftest.py +0 -0
  507. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/dummy_registry_module.py +0 -0
  508. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_comatch.py +0 -0
  509. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_daso.py +0 -0
  510. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_deep_co_training.py +0 -0
  511. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_errors_registry_seed.py +0 -0
  512. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_meta_pseudo_labels.py +0 -0
  513. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_classic.py +0 -0
  514. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_deep.py +0 -0
  515. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_utils.py +0 -0
  516. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_s4vm.py +0 -0
  517. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_self_training.py +0 -0
  518. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_setred.py +0 -0
  519. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_simclr_v2.py +0 -0
  520. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_tri_training.py +0 -0
  521. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_trinet.py +0 -0
  522. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/__init__.py +0 -0
  523. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/__init__.py +0 -0
  524. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_backends.py +0 -0
  525. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_stub.py +0 -0
  526. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_torchaudio_wav2vec2.py +0 -0
  527. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/__init__.py +0 -0
  528. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_load_waveform_fallback.py +0 -0
  529. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_load_waveform_transform.py +0 -0
  530. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_spectrogram.py +0 -0
  531. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/graph/test_sparse_adjacency.py +0 -0
  532. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/__init__.py +0 -0
  533. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_encode.py +0 -0
  534. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_ensure_onehot.py +0 -0
  535. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/tabular/test_impute.py +0 -0
  536. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/tabular/test_standard_scaler.py +0 -0
  537. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_audio_core.py +0 -0
  538. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_base_core.py +0 -0
  539. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_embeddings_graph.py +0 -0
  540. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_layout.py +0 -0
  541. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_tabular_one_hot.py +0 -0
  542. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_text_steps.py +0 -0
  543. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_to_numpy_torch.py +0 -0
  544. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_vision_steps.py +0 -0
  545. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/text/test_vocab_tokenizer.py +0 -0
  546. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/vision/test_squeeze.py +0 -0
  547. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_api.py +0 -0
  548. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_cache.py +0 -0
  549. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_errors.py +0 -0
  550. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_fingerprint.py +0 -0
  551. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_models.py +0 -0
  552. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_plan.py +0 -0
  553. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_plan_and_pipeline.py +0 -0
  554. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_registry.py +0 -0
  555. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_store.py +0 -0
  556. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_utils.py +0 -0
  557. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/__init__.py +0 -0
  558. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/_stubs.py +0 -0
  559. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api.py +0 -0
  560. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_cache_heuristic.py +0 -0
  561. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_complex.py +0 -0
  562. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_graph.py +0 -0
  563. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_inductive.py +0 -0
  564. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_fingerprint.py +0 -0
  565. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_imbalance.py +0 -0
  566. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_labeling.py +0 -0
  567. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_plan.py +0 -0
  568. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_result.py +0 -0
  569. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_result_properties.py +0 -0
  570. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters.py +0 -0
  571. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters_holdout.py +0 -0
  572. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters_kfold.py +0 -0
  573. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_stats.py +0 -0
  574. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_storage.py +0 -0
  575. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_storage_roundtrip.py +0 -0
  576. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/__init__.py +0 -0
  577. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/__init__.py +0 -0
  578. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/numpy/__init__.py +0 -0
  579. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/numpy/test_knn.py +0 -0
  580. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/sklearn/__init__.py +0 -0
  581. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/sklearn/test_wrappers.py +0 -0
  582. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_cnn.py +0 -0
  583. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_cnn_scratch.py +0 -0
  584. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_pretrained.py +0 -0
  585. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_image_cnn.py +0 -0
  586. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_image_pretrained.py +0 -0
  587. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_knn.py +0 -0
  588. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_logreg.py +0 -0
  589. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_lstm_scratch.py +0 -0
  590. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_mlp.py +0 -0
  591. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_text_cnn.py +0 -0
  592. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_base.py +0 -0
  593. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_optional.py +0 -0
  594. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_registry_api.py +0 -0
  595. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_utils.py +0 -0
  596. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_device.py +0 -0
  597. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_imports.py +0 -0
  598. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_logging_config.py +0 -0
  599. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/__init__.py +0 -0
  600. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/adapters/__init__.py +0 -0
  601. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/adapters/test_pyg.py +0 -0
  602. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/__init__.py +0 -0
  603. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/test_numpy_backend.py +0 -0
  604. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/test_torch_backend.py +0 -0
  605. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/__init__.py +0 -0
  606. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/advanced/__init__.py +0 -0
  607. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/__init__.py +0 -0
  608. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/test_graph_mincuts.py +0 -0
  609. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/test_label_methods.py +0 -0
  610. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/__init__.py +0 -0
  611. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_common.py +0 -0
  612. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_gnn_components.py +0 -0
  613. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_methods.py +0 -0
  614. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/__init__.py +0 -0
  615. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_p_laplace_learning.py +0 -0
  616. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_poisson_learning.py +0 -0
  617. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_poisson_mbo.py +0 -0
  618. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/test_tsvm.py +0 -0
  619. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/test_utils.py +0 -0
  620. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/__init__.py +0 -0
  621. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_clamp.py +0 -0
  622. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_laplacian.py +0 -0
  623. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_torch_wrappers.py +0 -0
  624. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/__init__.py +0 -0
  625. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/test_cg.py +0 -0
  626. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/test_fixed_point.py +0 -0
  627. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_cli_transductive.py +0 -0
  628. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_errors.py +0 -0
  629. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_registry.py +0 -0
  630. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_validation.py +0 -0
  631. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/views/__init__.py +0 -0
  632. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/views/test_api.py +0 -0
  633. {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/views/test_plan.py +0 -0
@@ -4,9 +4,17 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on "Keep a Changelog", and this project adheres to Semantic Versioning.
6
6
 
7
+ ## 0.2.2
8
+ - Ajout du support de `activation` pour GraphSAGE inductif.
9
+ - Ajout de `core.to_torch` dans les configs TriNet vision (best + smoke).
10
+ - Mise a jour des tests GraphSAGE.
11
+
12
+ ## 0.2.1
13
+ - Bump version metadata.
14
+
7
15
  ## 0.2.0
8
- - Amelioration des performances des pipelines inductifs et des chemins critiques.
9
- - Couverture de tests renforcee pour securiser les nouvelles optimisations.
16
+ - Improved inductive pipeline performance and critical paths.
17
+ - Strengthened test coverage to secure the new optimizations.
10
18
 
11
19
  ## 0.1.2
12
20
  - Fix misc bugs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modssc
3
- Version: 0.2.1.dev0
3
+ Version: 0.2.2
4
4
  Summary: ModSSC: a modular framework for semi-supervised classification on heterogeneous data
5
5
  Project-URL: Homepage, https://github.com/ModSSC/ModSSC
6
6
  Project-URL: Repository, https://github.com/ModSSC/ModSSC
@@ -33,7 +33,7 @@ ModSSC is a modular framework for semi-supervised classification across heteroge
33
33
  - [Transductive tutorial](tutorials/transductive-toy.md)
34
34
 
35
35
  ## Version
36
- Current version is `0.2.0`, sourced from [`src/modssc/__about__.py`](https://github.com/ModSSC/ModSSC/blob/main/src/modssc/__about__.py) and referenced by the Hatch version config in [`pyproject.toml`](https://github.com/ModSSC/ModSSC/blob/main/pyproject.toml). <sup class="cite"><a href="#source-18">[18]</a><a href="#source-2">[2]</a></sup>
36
+ Current version is `0.2.2`, sourced from [`src/modssc/__about__.py`](https://github.com/ModSSC/ModSSC/blob/main/src/modssc/__about__.py) and referenced by the Hatch version config in [`pyproject.toml`](https://github.com/ModSSC/ModSSC/blob/main/pyproject.toml). <sup class="cite"><a href="#source-18">[18]</a><a href="#source-2">[2]</a></sup>
37
37
 
38
38
 
39
39
  ## Project status and support
@@ -1,4 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024-present ModSSC contributors
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
- __version__ = "0.2.1.dev0"
4
+ __version__ = "0.2.2"
@@ -4,6 +4,8 @@ from collections.abc import Mapping
4
4
  from dataclasses import dataclass
5
5
  from typing import Any
6
6
 
7
+ import numpy as np
8
+
7
9
  from ..backends import torch_backend
8
10
  from ..base import InductiveDatasetLike
9
11
  from ..errors import InductiveValidationError
@@ -177,6 +179,32 @@ def to_torch_dataset(
177
179
  f"Tensor device mismatch: expected {expected}, got {t.device}"
178
180
  )
179
181
 
182
+ meta = data.meta
183
+ if isinstance(meta, Mapping):
184
+ meta = dict(meta)
185
+ torch = _torch()
186
+
187
+ def _device_of(obj: Any) -> Any | None:
188
+ if obj is None:
189
+ return None
190
+ if isinstance(obj, dict) and "x" in obj:
191
+ return obj["x"].device
192
+ return getattr(obj, "device", None)
193
+
194
+ idx_device = _device_of(X_u) or _device_of(X_u_w) or _device_of(X_u_s) or _device_of(X_l)
195
+ if idx_device is not None:
196
+ for key in ("idx_u", "unlabeled_idx", "unlabeled_indices"):
197
+ if key not in meta:
198
+ continue
199
+ idx_val = meta[key]
200
+ if isinstance(idx_val, torch.Tensor):
201
+ if idx_val.dtype != torch.int64 or idx_val.device != idx_device:
202
+ meta[key] = idx_val.to(device=idx_device, dtype=torch.int64)
203
+ else:
204
+ meta[key] = torch.as_tensor(
205
+ np.asarray(idx_val), device=idx_device, dtype=torch.int64
206
+ )
207
+
180
208
  return TorchDataset(
181
209
  X_l=X_l,
182
210
  y_l=y_l,
@@ -184,5 +212,5 @@ def to_torch_dataset(
184
212
  X_u_w=X_u_w,
185
213
  X_u_s=X_u_s,
186
214
  views=views,
187
- meta=data.meta,
215
+ meta=meta,
188
216
  )
@@ -670,8 +670,23 @@ def _build_graphsage_bundle(
670
670
  except ImportError as e:
671
671
  raise ImportError("torch_geometric is required for graphsage_inductive") from e
672
672
 
673
+ hidden_sizes = params.get("hidden_sizes")
673
674
  hidden_channels = int(params.get("hidden_channels", 128))
674
675
  num_layers = int(params.get("num_layers", 2))
676
+ if hidden_sizes is not None:
677
+ if isinstance(hidden_sizes, int):
678
+ hidden_sizes = [int(hidden_sizes)]
679
+ elif isinstance(hidden_sizes, (list, tuple)):
680
+ hidden_sizes = [int(h) for h in hidden_sizes]
681
+ else:
682
+ raise InductiveValidationError("hidden_sizes must be an int or a sequence of ints.")
683
+ if any(h <= 0 for h in hidden_sizes):
684
+ raise InductiveValidationError("hidden_sizes must be positive.")
685
+ if "num_layers" in params and num_layers != len(hidden_sizes) + 1:
686
+ raise InductiveValidationError(
687
+ "num_layers must equal len(hidden_sizes) + 1 when hidden_sizes is provided."
688
+ )
689
+ num_layers = len(hidden_sizes) + 1
675
690
  dropout = float(params.get("dropout", 0.5))
676
691
  lr = float(params.get("lr", 1e-2))
677
692
  weight_decay = float(params.get("weight_decay", 5e-4))
@@ -690,20 +705,11 @@ def _build_graphsage_bundle(
690
705
  )
691
706
 
692
707
  class _GraphSAGEWrapper(torch.nn.Module):
693
- def __init__(
694
- self,
695
- in_channels: int,
696
- hidden_channels: int,
697
- num_layers: int,
698
- out_channels: int,
699
- dropout: float,
700
- ):
708
+ def __init__(self, layer_sizes: list[int], dropout: float):
701
709
  super().__init__()
702
710
  self.convs = torch.nn.ModuleList()
703
- self.convs.append(SAGEConv(in_channels, hidden_channels))
704
- for _ in range(num_layers - 2):
705
- self.convs.append(SAGEConv(hidden_channels, hidden_channels))
706
- self.convs.append(SAGEConv(hidden_channels, out_channels))
711
+ for in_channels, out_channels in zip(layer_sizes[:-1], layer_sizes[1:], strict=False):
712
+ self.convs.append(SAGEConv(in_channels, out_channels))
707
713
  self.dropout = dropout
708
714
 
709
715
  def forward(self, x: Any):
@@ -726,13 +732,11 @@ def _build_graphsage_bundle(
726
732
  return {"logits": logits, "feat": feat}
727
733
 
728
734
  torch.manual_seed(int(seed))
729
- model = _GraphSAGEWrapper(
730
- in_channels=int(in_channels),
731
- hidden_channels=hidden_channels,
732
- num_layers=num_layers,
733
- out_channels=int(num_classes),
734
- dropout=dropout,
735
- ).to(device)
735
+ if hidden_sizes is not None:
736
+ layer_sizes = [int(in_channels), *hidden_sizes, int(num_classes)]
737
+ else:
738
+ layer_sizes = [int(in_channels)] + [hidden_channels] * (num_layers - 1) + [int(num_classes)]
739
+ model = _GraphSAGEWrapper(layer_sizes=layer_sizes, dropout=dropout).to(device)
736
740
 
737
741
  optimizer = torch.optim.AdamW(
738
742
  model.parameters(), lr=float(lr), weight_decay=float(weight_decay)
@@ -9,6 +9,7 @@ from modssc.inductive.base import InductiveMethod, MethodInfo
9
9
  from modssc.inductive.deep import TorchModelBundle
10
10
  from modssc.inductive.errors import InductiveValidationError
11
11
  from modssc.inductive.methods.deep_utils import (
12
+ concat_data,
12
13
  cycle_batch_indices,
13
14
  cycle_batches,
14
15
  ensure_float_tensor,
@@ -247,13 +248,13 @@ class AdaMatchMethod(InductiveMethod):
247
248
  x_us = _slice_dict(X_u_s, idx_u, int(_get_len(X_u_s)))
248
249
 
249
250
  if bool(self.spec.use_cat):
250
- inputs = torch.cat([x_lb, x_uw, x_us], dim=0)
251
+ inputs = concat_data([x_lb, x_uw, x_us])
251
252
  logits = extract_logits(model(inputs))
252
253
  if int(logits.ndim) != 2:
253
254
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
254
- num_lb = int(x_lb.shape[0])
255
- num_u = int(x_uw.shape[0])
256
- expected = num_lb + num_u + int(x_us.shape[0])
255
+ num_lb = int(_get_len(x_lb))
256
+ num_u = int(_get_len(x_uw))
257
+ expected = num_lb + num_u + int(_get_len(x_us))
257
258
  if int(logits.shape[0]) != expected:
258
259
  raise InductiveValidationError(
259
260
  "Concatenated logits batch size does not match inputs."
@@ -10,13 +10,17 @@ from modssc.inductive.base import InductiveMethod, MethodInfo
10
10
  from modssc.inductive.deep import TorchModelBundle
11
11
  from modssc.inductive.errors import InductiveValidationError
12
12
  from modssc.inductive.methods.deep_utils import (
13
+ concat_data,
13
14
  cycle_batch_indices,
14
15
  cycle_batches,
15
16
  ensure_float_tensor,
16
17
  ensure_model_bundle,
17
18
  ensure_model_device,
18
19
  extract_logits,
20
+ get_torch_device,
21
+ get_torch_len,
19
22
  num_batches,
23
+ slice_data,
20
24
  )
21
25
  from modssc.inductive.methods.utils import (
22
26
  detect_backend,
@@ -43,7 +47,7 @@ def _update_scores(
43
47
  torch = optional_import("torch", extra="inductive-torch")
44
48
  if score.ndim != 1:
45
49
  raise InductiveValidationError("ADSH score must be a 1D tensor.")
46
- if score.device != X_u_w.device:
50
+ if score.device != get_torch_device(X_u_w):
47
51
  raise InductiveValidationError("ADSH score must be on the same device as X_u_w.")
48
52
 
49
53
  n_classes = int(score.shape[0])
@@ -51,8 +55,8 @@ def _update_scores(
51
55
  was_training = model.training
52
56
  model.eval()
53
57
  with torch.no_grad():
54
- for start in range(0, int(X_u_w.shape[0]), int(batch_size)):
55
- batch = X_u_w[start : start + int(batch_size)]
58
+ for start in range(0, int(get_torch_len(X_u_w)), int(batch_size)):
59
+ batch = slice_data(X_u_w, slice(start, start + int(batch_size)))
56
60
  logits = extract_logits(model(batch))
57
61
  if int(logits.ndim) != 2:
58
62
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
@@ -184,15 +188,15 @@ class ADSHMethod(InductiveMethod):
184
188
  X_u_s = ds.X_u_s
185
189
  logger.info(
186
190
  "ADSH sizes: n_labeled=%s n_unlabeled=%s",
187
- int(X_l.shape[0]),
188
- int(X_u_w.shape[0]),
191
+ int(get_torch_len(X_l)),
192
+ int(get_torch_len(X_u_w)),
189
193
  )
190
194
 
191
- if int(X_l.shape[0]) == 0:
195
+ if int(get_torch_len(X_l)) == 0:
192
196
  raise InductiveValidationError("X_l must be non-empty.")
193
- if int(X_u_w.shape[0]) == 0 or int(X_u_s.shape[0]) == 0:
197
+ if int(get_torch_len(X_u_w)) == 0 or int(get_torch_len(X_u_s)) == 0:
194
198
  raise InductiveValidationError("X_u_w and X_u_s must be non-empty.")
195
- if int(X_u_w.shape[0]) != int(X_u_s.shape[0]):
199
+ if int(get_torch_len(X_u_w)) != int(get_torch_len(X_u_s)):
196
200
  raise InductiveValidationError("X_u_w and X_u_s must have the same number of rows.")
197
201
 
198
202
  ensure_float_tensor(X_l, name="X_l")
@@ -207,7 +211,7 @@ class ADSHMethod(InductiveMethod):
207
211
  bundle = ensure_model_bundle(self.spec.model_bundle)
208
212
  model = bundle.model
209
213
  optimizer = bundle.optimizer
210
- ensure_model_device(model, device=X_l.device)
214
+ ensure_model_device(model, device=get_torch_device(X_l))
211
215
 
212
216
  if int(self.spec.batch_size) <= 0:
213
217
  raise InductiveValidationError("batch_size must be >= 1.")
@@ -223,7 +227,7 @@ class ADSHMethod(InductiveMethod):
223
227
  was_training = model.training
224
228
  model.eval()
225
229
  with torch.no_grad():
226
- init_logits = extract_logits(model(X_l[:1]))
230
+ init_logits = extract_logits(model(slice_data(X_l, slice(0, 1))))
227
231
  if was_training:
228
232
  model.train()
229
233
  if int(init_logits.ndim) != 2:
@@ -236,12 +240,12 @@ class ADSHMethod(InductiveMethod):
236
240
  score = torch.full(
237
241
  (n_classes,),
238
242
  float(self.spec.p_cutoff),
239
- device=X_l.device,
243
+ device=get_torch_device(X_l),
240
244
  dtype=init_logits.dtype,
241
245
  )
242
246
 
243
- steps_l = num_batches(int(X_l.shape[0]), int(self.spec.batch_size))
244
- steps_u = num_batches(int(X_u_w.shape[0]), int(self.spec.batch_size))
247
+ steps_l = num_batches(int(get_torch_len(X_l)), int(self.spec.batch_size))
248
+ steps_u = num_batches(int(get_torch_len(X_u_w)), int(self.spec.batch_size))
245
249
  steps_per_epoch = max(int(steps_l), int(steps_u))
246
250
 
247
251
  gen_l = torch.Generator().manual_seed(int(seed))
@@ -267,24 +271,24 @@ class ADSHMethod(InductiveMethod):
267
271
  steps=steps_per_epoch,
268
272
  )
269
273
  iter_u_idx = cycle_batch_indices(
270
- int(X_u_w.shape[0]),
274
+ int(get_torch_len(X_u_w)),
271
275
  batch_size=int(self.spec.batch_size),
272
276
  generator=gen_u,
273
- device=X_u_w.device,
277
+ device=get_torch_device(X_u_w),
274
278
  steps=steps_per_epoch,
275
279
  )
276
280
  for step, ((x_lb, y_lb), idx_u) in enumerate(zip(iter_l, iter_u_idx, strict=False)):
277
- x_uw = X_u_w[idx_u]
278
- x_us = X_u_s[idx_u]
281
+ x_uw = slice_data(X_u_w, idx_u)
282
+ x_us = slice_data(X_u_s, idx_u)
279
283
 
280
284
  if bool(self.spec.use_cat):
281
- inputs = torch.cat([x_lb, x_uw, x_us], dim=0)
285
+ inputs = concat_data([x_lb, x_uw, x_us])
282
286
  logits = extract_logits(model(inputs))
283
287
  if int(logits.ndim) != 2:
284
288
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
285
- num_lb = int(x_lb.shape[0])
286
- num_u = int(x_uw.shape[0])
287
- expected = num_lb + num_u + int(x_us.shape[0])
289
+ num_lb = int(get_torch_len(x_lb))
290
+ num_u = int(get_torch_len(x_uw))
291
+ expected = num_lb + num_u + int(get_torch_len(x_us))
288
292
  if int(logits.shape[0]) != expected:
289
293
  raise InductiveValidationError(
290
294
  "Concatenated logits batch size does not match inputs."
@@ -350,28 +354,35 @@ class ADSHMethod(InductiveMethod):
350
354
  if backend != "torch":
351
355
  raise InductiveValidationError("ADSH predict_proba requires torch tensors.")
352
356
  torch = optional_import("torch", extra="inductive-torch")
353
- if not isinstance(X, torch.Tensor):
354
- raise InductiveValidationError("predict_proba requires torch.Tensor inputs.")
357
+ if not isinstance(X, torch.Tensor) and not isinstance(X, dict):
358
+ raise InductiveValidationError("predict_proba requires torch.Tensor or dict inputs.")
355
359
 
356
360
  model = self._bundle.model
357
361
  was_training = model.training
358
362
  model.eval()
359
363
 
360
364
  batch_size = int(self.spec.batch_size)
361
- n_samples = int(X.shape[0])
365
+ n_samples = int(get_torch_len(X))
362
366
  all_logits = []
363
367
 
364
368
  with torch.no_grad():
365
369
  for start in range(0, n_samples, batch_size):
366
370
  end = min(start + batch_size, n_samples)
367
- batch_X = X[start:end]
371
+ if isinstance(X, dict):
372
+ idx = torch.arange(start, end, device=get_torch_device(X))
373
+ batch_X = slice_data(X, idx)
374
+ else:
375
+ batch_X = X[start:end]
368
376
  logits_batch = extract_logits(model(batch_X))
369
377
 
370
378
  if int(logits_batch.ndim) != 2:
371
379
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
372
380
  all_logits.append(logits_batch)
373
381
 
374
- logits = torch.cat(all_logits, dim=0)
382
+ if not all_logits:
383
+ logits = torch.empty((0, 0), device=get_torch_device(X))
384
+ else:
385
+ logits = torch.cat(all_logits, dim=0)
375
386
  proba = torch.softmax(logits, dim=1)
376
387
 
377
388
  if was_training:
@@ -102,6 +102,13 @@ def _get_torch_device(obj: Any) -> Any:
102
102
  return obj.device
103
103
 
104
104
 
105
+ def _same_device(a: Any, b: Any) -> bool:
106
+ return (a == b) or (
107
+ getattr(a, "type", None) == getattr(b, "type", None)
108
+ and (getattr(a, "index", None) is None or getattr(b, "index", None) is None)
109
+ )
110
+
111
+
105
112
  def _view_payload_torch(value: Any, *, name: str):
106
113
  torch = optional_import("torch", extra="inductive-torch")
107
114
  if isinstance(value, Mapping):
@@ -280,7 +287,16 @@ class CoTrainingMethod(InductiveMethod):
280
287
  if backend == "torch":
281
288
  d1 = _get_torch_device(v1_l)
282
289
  d2 = _get_torch_device(v2_l)
283
- if y_l.device != d1 or y_l.device != d2:
290
+ if d1 != d2:
291
+ raise InductiveValidationError("views must be on the same device.")
292
+ if not _same_device(y_l.device, d1):
293
+ try:
294
+ y_l = y_l.to(d1)
295
+ except Exception as exc:
296
+ raise InductiveValidationError(
297
+ "y_l must be on the same device as the view tensors."
298
+ ) from exc
299
+ if not _same_device(y_l.device, d1) or not _same_device(y_l.device, d2):
284
300
  raise InductiveValidationError(
285
301
  "y_l must be on the same device as the view tensors."
286
302
  )
@@ -10,6 +10,7 @@ from modssc.inductive.base import InductiveMethod, MethodInfo
10
10
  from modssc.inductive.deep import TorchModelBundle
11
11
  from modssc.inductive.errors import InductiveValidationError
12
12
  from modssc.inductive.methods.deep_utils import (
13
+ concat_data,
13
14
  cycle_batch_indices,
14
15
  cycle_batches,
15
16
  ensure_float_tensor,
@@ -432,13 +433,13 @@ class CoMatchMethod(InductiveMethod):
432
433
  x_us1 = _slice(X_u_s1, idx_u)
433
434
 
434
435
  if bool(self.spec.use_cat):
435
- inputs = torch.cat([x_lb, x_uw, x_us0, x_us1], dim=0)
436
+ inputs = concat_data([x_lb, x_uw, x_us0, x_us1])
436
437
  logits_all, feats_all = _extract_logits_and_features(model(inputs))
437
438
  if int(logits_all.ndim) != 2 or int(feats_all.ndim) != 2:
438
439
  raise InductiveValidationError("Model logits/feat must be 2D tensors.")
439
- num_lb = int(x_lb.shape[0])
440
- num_u = int(x_uw.shape[0])
441
- expected = num_lb + num_u + int(x_us0.shape[0]) + int(x_us1.shape[0])
440
+ num_lb = int(_len(x_lb))
441
+ num_u = int(_len(x_uw))
442
+ expected = num_lb + num_u + int(_len(x_us0)) + int(_len(x_us1))
442
443
  if int(logits_all.shape[0]) != expected or int(feats_all.shape[0]) != expected:
443
444
  raise InductiveValidationError(
444
445
  "Concatenated logits/feat batch size does not match inputs."
@@ -11,6 +11,7 @@ from modssc.inductive.base import InductiveMethod, MethodInfo
11
11
  from modssc.inductive.deep import TorchModelBundle
12
12
  from modssc.inductive.errors import InductiveValidationError
13
13
  from modssc.inductive.methods.deep_utils import (
14
+ concat_data,
14
15
  cycle_batch_indices,
15
16
  cycle_batches,
16
17
  ensure_float_tensor,
@@ -18,7 +19,10 @@ from modssc.inductive.methods.deep_utils import (
18
19
  ensure_model_device,
19
20
  extract_features,
20
21
  extract_logits,
22
+ get_torch_device,
23
+ get_torch_len,
21
24
  num_batches,
25
+ slice_data,
22
26
  )
23
27
  from modssc.inductive.methods.utils import (
24
28
  detect_backend,
@@ -257,15 +261,15 @@ class DASOMethod(InductiveMethod):
257
261
  X_u_s = ds.X_u_s
258
262
  logger.info(
259
263
  "DASO sizes: n_labeled=%s n_unlabeled=%s",
260
- int(X_l.shape[0]),
261
- int(X_u_w.shape[0]),
264
+ int(get_torch_len(X_l)),
265
+ int(get_torch_len(X_u_w)),
262
266
  )
263
267
 
264
- if int(X_l.shape[0]) == 0:
268
+ if int(get_torch_len(X_l)) == 0:
265
269
  raise InductiveValidationError("X_l must be non-empty.")
266
- if int(X_u_w.shape[0]) == 0 or int(X_u_s.shape[0]) == 0:
270
+ if int(get_torch_len(X_u_w)) == 0 or int(get_torch_len(X_u_s)) == 0:
267
271
  raise InductiveValidationError("X_u_w and X_u_s must be non-empty.")
268
- if int(X_u_w.shape[0]) != int(X_u_s.shape[0]):
272
+ if int(get_torch_len(X_u_w)) != int(get_torch_len(X_u_s)):
269
273
  raise InductiveValidationError("X_u_w and X_u_s must have the same number of rows.")
270
274
 
271
275
  ensure_float_tensor(X_l, name="X_l")
@@ -280,7 +284,7 @@ class DASOMethod(InductiveMethod):
280
284
  bundle = ensure_model_bundle(self.spec.model_bundle)
281
285
  model = bundle.model
282
286
  optimizer = bundle.optimizer
283
- ensure_model_device(model, device=X_l.device)
287
+ ensure_model_device(model, device=get_torch_device(X_l))
284
288
 
285
289
  if int(self.spec.batch_size) <= 0:
286
290
  raise InductiveValidationError("batch_size must be >= 1.")
@@ -317,8 +321,8 @@ class DASOMethod(InductiveMethod):
317
321
  ema_model.eval()
318
322
  self._ema_model = ema_model
319
323
 
320
- steps_l = num_batches(int(X_l.shape[0]), int(self.spec.batch_size))
321
- steps_u = num_batches(int(X_u_w.shape[0]), int(self.spec.batch_size))
324
+ steps_l = num_batches(int(get_torch_len(X_l)), int(self.spec.batch_size))
325
+ steps_u = num_batches(int(get_torch_len(X_u_w)), int(self.spec.batch_size))
322
326
  steps_per_epoch = max(int(steps_l), int(steps_u))
323
327
 
324
328
  gen_l = torch.Generator().manual_seed(int(seed))
@@ -339,24 +343,24 @@ class DASOMethod(InductiveMethod):
339
343
  steps=steps_per_epoch,
340
344
  )
341
345
  iter_u_idx = cycle_batch_indices(
342
- int(X_u_w.shape[0]),
346
+ int(get_torch_len(X_u_w)),
343
347
  batch_size=int(self.spec.batch_size),
344
348
  generator=gen_u,
345
- device=X_u_w.device,
349
+ device=get_torch_device(X_u_w),
346
350
  steps=steps_per_epoch,
347
351
  )
348
352
  for step, ((x_lb, y_lb), idx_u) in enumerate(zip(iter_l, iter_u_idx, strict=False)):
349
- x_uw = X_u_w[idx_u]
350
- x_us = X_u_s[idx_u]
353
+ x_uw = slice_data(X_u_w, idx_u)
354
+ x_us = slice_data(X_u_s, idx_u)
351
355
 
352
356
  if bool(self.spec.use_cat):
353
- inputs = torch.cat([x_lb, x_uw, x_us], dim=0)
357
+ inputs = concat_data([x_lb, x_uw, x_us])
354
358
  logits_all, feats_all = _forward_logits_features(bundle, inputs)
355
359
  if int(logits_all.ndim) != 2:
356
360
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
357
- num_lb = int(x_lb.shape[0])
358
- num_u = int(x_uw.shape[0])
359
- expected = num_lb + num_u + int(x_us.shape[0])
361
+ num_lb = int(get_torch_len(x_lb))
362
+ num_u = int(get_torch_len(x_uw))
363
+ expected = num_lb + num_u + int(get_torch_len(x_us))
360
364
  if int(logits_all.shape[0]) != expected:
361
365
  raise InductiveValidationError(
362
366
  "Concatenated logits batch size does not match inputs."
@@ -375,8 +379,12 @@ class DASOMethod(InductiveMethod):
375
379
  else:
376
380
  logits_uw, feats_uw = _forward_logits_features(bundle, x_uw)
377
381
  logits_us, feats_us = _forward_logits_features(bundle, x_us)
378
- feats_uw = _flatten_features(feats_uw, name="feat_uw", batch=int(x_uw.shape[0]))
379
- feats_us = _flatten_features(feats_us, name="feat_us", batch=int(x_us.shape[0]))
382
+ feats_uw = _flatten_features(
383
+ feats_uw, name="feat_uw", batch=int(get_torch_len(x_uw))
384
+ )
385
+ feats_us = _flatten_features(
386
+ feats_us, name="feat_us", batch=int(get_torch_len(x_us))
387
+ )
380
388
 
381
389
  if int(logits_l.ndim) != 2 or int(logits_uw.ndim) != 2 or int(logits_us.ndim) != 2:
382
390
  raise InductiveValidationError("Model logits must be 2D (batch, classes).")
@@ -409,7 +417,7 @@ class DASOMethod(InductiveMethod):
409
417
  with torch.no_grad():
410
418
  feat_lb = _forward_features(bundle, x_lb, model_override=ema_model)
411
419
  feat_lb = _flatten_features(
412
- feat_lb, name="feat_lb", batch=int(x_lb.shape[0])
420
+ feat_lb, name="feat_lb", batch=int(get_torch_len(x_lb))
413
421
  ).detach()
414
422
  if int(feat_lb.shape[1]) != feat_dim:
415
423
  raise InductiveValidationError("Prototype feature dimension mismatch.")
@@ -82,6 +82,92 @@ def ensure_float_tensor(x: Any, *, name: str) -> None:
82
82
  raise InductiveValidationError(f"{name} must be float32 or float64.")
83
83
 
84
84
 
85
+ def get_torch_len(x: Any) -> int:
86
+ if isinstance(x, dict) and "x" in x:
87
+ return int(x["x"].shape[0])
88
+ return int(x.shape[0])
89
+
90
+
91
+ def get_torch_device(x: Any) -> Any:
92
+ if isinstance(x, dict) and "x" in x:
93
+ return x["x"].device
94
+ return x.device
95
+
96
+
97
+ def get_torch_feature_dim(x: Any) -> int:
98
+ if isinstance(x, dict) and "x" in x:
99
+ return int(x["x"].shape[1])
100
+ return int(x.shape[1])
101
+
102
+
103
+ def get_torch_ndim(x: Any) -> int:
104
+ if isinstance(x, dict) and "x" in x:
105
+ return int(x["x"].ndim)
106
+ return int(x.ndim)
107
+
108
+
109
+ def concat_data(items: list[Any]) -> Any:
110
+ """Concatenate tensors or graph dicts along the batch dimension.
111
+
112
+ For dict inputs with 'x' and 'edge_index', this builds a disjoint union graph
113
+ by offsetting edge indices for each block.
114
+ """
115
+ if not items:
116
+ return items
117
+ if not any(isinstance(x, dict) for x in items):
118
+ torch = _torch()
119
+ return torch.cat(items, dim=0)
120
+
121
+ torch = _torch()
122
+ graphs = []
123
+ for x in items:
124
+ if isinstance(x, dict):
125
+ graphs.append(x)
126
+ else:
127
+ graphs.append({"x": x})
128
+
129
+ xs = [torch.as_tensor(g["x"]) for g in graphs]
130
+ x_cat = torch.cat(xs, dim=0)
131
+ out: dict[str, Any] = {"x": x_cat}
132
+
133
+ if all(isinstance(g, dict) and "edge_index" in g for g in graphs):
134
+ edge_indices = []
135
+ edge_weights = []
136
+ offset = 0
137
+ for g in graphs:
138
+ ei = g["edge_index"]
139
+ if not isinstance(ei, torch.Tensor):
140
+ ei = torch.as_tensor(ei, device=x_cat.device, dtype=torch.long)
141
+ ei = ei + offset
142
+ edge_indices.append(ei)
143
+ if "edge_weight" in g:
144
+ ew = g["edge_weight"]
145
+ if not isinstance(ew, torch.Tensor):
146
+ ew = torch.as_tensor(ew, device=x_cat.device)
147
+ edge_weights.append(ew)
148
+ offset += int(g["x"].shape[0])
149
+ out["edge_index"] = torch.cat(edge_indices, dim=1)
150
+ if edge_weights:
151
+ out["edge_weight"] = torch.cat(edge_weights, dim=0)
152
+
153
+ # Concatenate per-node tensors for shared keys.
154
+ shared_keys = set.intersection(*(set(g.keys()) for g in graphs)) if graphs else set()
155
+ for key in shared_keys:
156
+ if key in {"x", "edge_index", "edge_weight"}:
157
+ continue
158
+ vals = [g[key] for g in graphs]
159
+ if all(isinstance(v, torch.Tensor) for v in vals):
160
+ # If node-wise (matching each graph's node count), concatenate
161
+ if all(v.shape[0] == g["x"].shape[0] for v, g in zip(vals, graphs, strict=False)):
162
+ out[key] = torch.cat(vals, dim=0)
163
+ else:
164
+ out[key] = vals[0]
165
+ else:
166
+ out[key] = vals[0]
167
+
168
+ return out
169
+
170
+
85
171
  @contextmanager
86
172
  def freeze_batchnorm(model: Any, *, enabled: bool):
87
173
  if not enabled:
@@ -142,8 +228,20 @@ def slice_data(X: Any, idx: Any) -> Any:
142
228
  try:
143
229
  from torch_geometric.utils import subgraph
144
230
 
231
+ subgraph_idx = idx
232
+ if isinstance(idx, slice):
233
+ start, stop, step = idx.indices(n)
234
+ device = (
235
+ X["edge_index"].device
236
+ if isinstance(X["edge_index"], torch.Tensor)
237
+ else None
238
+ )
239
+ subgraph_idx = torch.arange(start, stop, step, device=device)
240
+
145
241
  # relabel_nodes=True ensures indices map to 0..len(idx)
146
- edge_index, _ = subgraph(idx, X["edge_index"], relabel_nodes=True, num_nodes=n)
242
+ edge_index, _ = subgraph(
243
+ subgraph_idx, X["edge_index"], relabel_nodes=True, num_nodes=n
244
+ )
147
245
  batch_data["edge_index"] = edge_index
148
246
  except ImportError:
149
247
  pass