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.
- {modssc-0.2.1.dev0 → modssc-0.2.2}/CHANGELOG.md +10 -2
- {modssc-0.2.1.dev0 → modssc-0.2.2}/PKG-INFO +1 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/index.md +1 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__about__.py +1 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/torch.py +29 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/bundles.py +23 -19
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/adamatch.py +5 -4
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/adsh.py +37 -26
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/co_training.py +17 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/comatch.py +5 -4
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/daso.py +27 -19
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/deep_utils.py +99 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/defixmatch.py +30 -24
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/democratic_co_learning.py +14 -6
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/fixmatch.py +20 -16
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/flexmatch.py +24 -18
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/free_match.py +20 -16
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/mean_teacher.py +15 -12
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/meta_pseudo_labels.py +27 -22
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/mixmatch.py +36 -24
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/noisy_student.py +22 -18
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/pi_model.py +14 -11
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/pseudo_label.py +21 -10
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/s4vm.py +4 -3
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/self_training.py +21 -11
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/setred.py +37 -19
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/simclr_v2.py +27 -23
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/softmatch.py +20 -16
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/temporal_ensembling.py +17 -14
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/tri_training.py +20 -11
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/trinet.py +37 -31
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/tsvm.py +13 -6
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/uda.py +20 -16
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/vat.py +33 -13
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/to_torch.py +4 -1
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/graphsage_inductive.py +66 -17
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/deep/test_bundles.py +52 -0
- modssc-0.2.2/tests/inductive/test_adsh_predict_proba.py +45 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_backends_deep_utils.py +86 -0
- modssc-0.2.2/tests/inductive/test_co_training_device_validation.py +57 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_co_training_helpers.py +7 -0
- modssc-0.2.2/tests/inductive/test_graph_dict_helpers.py +51 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_validation_adapters.py +33 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_to_numpy_torch.py +30 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_graphsage_inductive.py +77 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.editorconfig +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CODEOWNERS +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CODE_OF_CONDUCT.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/CONTRIBUTING.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/GOVERNANCE.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/ISSUE_TEMPLATE/new_method.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/SECURITY.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/dependabot.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/pull_request_template.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/ci.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/docs.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.github/workflows/release.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.gitignore +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/.pre-commit-config.yaml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/CITATION.bib +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/CITATION.cff +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/LICENSE +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/Makefile +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/README.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/codecov.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/assets/logo.jpeg +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/development/contributing.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/development/release-process.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/concepts.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/installation.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/getting-started/quickstart.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/augmentation.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/datasets.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/evaluation.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/graph.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/hpo.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/preprocess.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/sampling.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/how-to/views.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/javascripts/sidebar-toggle.js +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/data-augmentation.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/data-loader.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/device.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/evaluation.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/graph.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/hpo.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/index.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/inductive.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/logging.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/preprocess.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/sampling.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/supervised.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/transductive.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/api/views.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/benchmarks.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/catalogs.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/cli.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/reference/configuration.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/stylesheets/extra.css +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/tutorials/inductive-toy.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/docs/tutorials/transductive-toy.md +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/00_inductive_toy_pseudo_label.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/01_evaluation_quickstart.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/01_transductive_toy_label_propagation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/02_hpo_primitives_quickstart.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/02_sampling_toy_holdout.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/03_cli_smoke.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/examples/04_inductive_cotraining_two_views.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/mkdocs.yml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/00_cli_tour.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/01_data_loader_end_to_end.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/02_sampling_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/03_preprocess_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/04_data_augmentation_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/05_views_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/06_graph_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/07_supervised_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/08_inductive_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/09_transductive_quickstart.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/notebooks/10_hpo_bench_smoke.ipynb +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/pyproject.toml +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/__main__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/app.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/augmentation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/datasets.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/evaluation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/inductive.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/logging.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/preprocess.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/sampling.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/supervised.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/cli/transductive.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/audio.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/core.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/tabular.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/text.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/ops/vision.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_augmentation/utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/audio.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/tabular.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/text.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/toy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/catalog/vision.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/formats.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/manifest.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/numpy_adapter.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/hf.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/openml.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/tfds.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/torchaudio.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/torchvision.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/providers/toy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/storage/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/storage/files.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/data_loader/uri.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/device.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/evaluation/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/evaluation/metrics.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/adapters/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/adapters/pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/artifacts.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/faiss_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/numpy_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/backends/sklearn_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/builder.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/normalize.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/self_loops.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/symmetrize.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/ops/weights.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/schemes/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/construction/schemes/anchor.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/node2vec.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/ops/adjacency.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/attr.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/diffusion.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/featurization/views/struct.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/masks.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/specs.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/graph/validation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/patching.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/samplers.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/space.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/hpo/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/adapters/numpy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/backends/torch_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/deep/validation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/deep_co_training.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/methods/utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/seed.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/inductive/validation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/logging.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/catalog.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/open_clip.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/sentence_transformers.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/stub.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/models_backends/torchaudio_wav2vec2.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/numpy_adapter.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/load_waveform.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/spectrogram.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/audio/wav2vec2.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/cast_dtype.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/cast_fp16.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/copy_raw.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/ensure_2d.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/pca.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/random_projection.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/to_numpy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/core/to_torch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/embeddings/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/embeddings/auto.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/attach_edge_weight.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/dgi.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/edge_sparsify.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/node2vec.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/graph/sparse_adjacency.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/encode.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/ensure_onehot.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/labels/to_numpy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/impute.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/one_hot.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/tabular/standard_scaler.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/ensure_strings.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/hash_tokenizer.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/sentence_transformer.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/tfidf.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/text/vocab_tokenizer.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/channels_order.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/ensure_num_channels.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/layout.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/normalize.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/openclip.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/resize.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/squeeze.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/steps/vision/zca_whitening.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/store.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/preprocess/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/imbalance.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/labeling.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/result.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/splitters.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/stats.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/sampling/storage.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/numpy/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/numpy/knn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/extra_trees.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/gradient_boosting.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/knn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/linear_svm.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/logreg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/naive_bayes.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/random_forest.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/ridge.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/sklearn/svm_rbf.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_cnn_scratch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/audio_pretrained.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/image_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/image_pretrained.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/knn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/logreg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/lstm_scratch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/mlp.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/backends/torch/text_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/supervised/utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/adapters/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/adapters/pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/numpy_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/backends/torch_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/dynamic_label_propagation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/graph_mincuts.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/label_propagation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/label_spreading.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/laplace_learning.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/lazy_random_walk.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/classic/tsvm.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/appnp.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/chebnet.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/common.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gat.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gcn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/gcnii.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/grafn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/grand.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/graphhop.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/graphsage.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/h_gcn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/n_gcn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/planetoid.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/gnn/sgc.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/p_laplace_learning.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/poisson_learning.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/pde/poisson_mbo.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/methods/utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/clamp.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/laplacian.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/normalize.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/operators/spmm.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/cg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/solvers/fixed_point.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/transductive/validation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/src/modssc/views/types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_app.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_augmentation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_augmentation_module.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_cache_commands.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_datasets.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_datasets_app.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_evaluation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_inductive_cli.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_log_level_option.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_main.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_main_datasets.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_preprocess.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_sampling.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_supervised.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/cli/test_version.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_audio.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_core.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_tabular.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_text.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_torch_mock.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_vision.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/ops/test_vision_numpy.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_api_registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_pipeline.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_augmentation/test_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/catalog/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/catalog/test_catalog.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_hf.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_openml.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_stubs.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_tfds.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_torchaudio.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/providers/test_torchvision.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_edges_masks.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_files.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/storage/test_roundtrip.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api_end_to_end.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_api_meta.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_formats.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_import_light.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_manifest.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_numpy_adapter.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_types.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/data_loader/test_uri.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/evaluation/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/evaluation/test_metrics.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/adapters/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/adapters/test_pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_backends.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_faiss_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/backends/test_numpy_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/ops/test_ops.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/schemes/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/schemes/test_anchor.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_build_graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_builder.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/construction/test_construction.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/ops/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/ops/test_adjacency.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_featurization.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_node2vec.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/test_views.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/views/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/featurization/views/test_struct.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_artifacts.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_masks.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/graph/test_specs.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_patching.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_random.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/hpo/test_space.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/conftest.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/dummy_registry_module.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_comatch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_daso.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_deep_co_training.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_errors_registry_seed.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_meta_pseudo_labels.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_classic.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_deep.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_methods_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_s4vm.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_self_training.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_setred.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_simclr_v2.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_tri_training.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/inductive/test_trinet.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_backends.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_stub.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/models_backends/test_torchaudio_wav2vec2.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_load_waveform_fallback.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_load_waveform_transform.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/audio/test_spectrogram.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/graph/test_sparse_adjacency.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_encode.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/labels/test_ensure_onehot.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/tabular/test_impute.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/tabular/test_standard_scaler.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_audio_core.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_base_core.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_embeddings_graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_layout.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_tabular_one_hot.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_text_steps.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_to_numpy_torch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/test_vision_steps.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/text/test_vocab_tokenizer.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/steps/vision/test_squeeze.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_cache.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_models.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_plan_and_pipeline.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_store.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/preprocess/test_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/_stubs.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_cache_heuristic.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_complex.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_graph.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_api_inductive.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_fingerprint.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_imbalance.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_labeling.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_plan.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_result.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_result_properties.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters_holdout.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_splitters_kfold.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_stats.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_storage.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/sampling/test_storage_roundtrip.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/numpy/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/numpy/test_knn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/sklearn/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/sklearn/test_wrappers.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_cnn_scratch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_audio_pretrained.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_image_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_image_pretrained.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_knn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_logreg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_lstm_scratch.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_mlp.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/backends/torch/test_text_cnn.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_base.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_optional.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_registry_api.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/supervised/test_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_device.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_imports.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/test_logging_config.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/adapters/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/adapters/test_pyg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/test_numpy_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/backends/test_torch_backend.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/advanced/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/test_graph_mincuts.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/classic/test_label_methods.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_common.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_gnn_components.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/gnn/test_methods.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_p_laplace_learning.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_poisson_learning.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/pde/test_poisson_mbo.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/test_tsvm.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/methods/test_utils.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_clamp.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_laplacian.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/operators/test_torch_wrappers.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/test_cg.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/solvers/test_fixed_point.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_cli_transductive.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_errors.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_registry.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/transductive/test_validation.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/views/__init__.py +0 -0
- {modssc-0.2.1.dev0 → modssc-0.2.2}/tests/views/test_api.py +0 -0
- {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
|
-
-
|
|
9
|
-
-
|
|
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.
|
|
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.
|
|
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
|
|
@@ -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=
|
|
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
|
-
|
|
704
|
-
|
|
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
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
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 =
|
|
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
|
|
255
|
-
num_u = int(x_uw
|
|
256
|
-
expected = num_lb + num_u + int(x_us
|
|
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
|
|
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
|
|
55
|
-
batch = X_u_w
|
|
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
|
|
188
|
-
int(X_u_w
|
|
191
|
+
int(get_torch_len(X_l)),
|
|
192
|
+
int(get_torch_len(X_u_w)),
|
|
189
193
|
)
|
|
190
194
|
|
|
191
|
-
if int(X_l
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
244
|
-
steps_u = num_batches(int(X_u_w
|
|
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
|
|
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
|
|
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
|
|
278
|
-
x_us = X_u_s
|
|
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 =
|
|
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
|
|
286
|
-
num_u = int(x_uw
|
|
287
|
-
expected = num_lb + num_u + int(x_us
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
440
|
-
num_u = int(x_uw
|
|
441
|
-
expected = num_lb + num_u + int(x_us0
|
|
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
|
|
261
|
-
int(X_u_w
|
|
264
|
+
int(get_torch_len(X_l)),
|
|
265
|
+
int(get_torch_len(X_u_w)),
|
|
262
266
|
)
|
|
263
267
|
|
|
264
|
-
if int(X_l
|
|
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
|
|
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
|
|
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
|
|
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
|
|
321
|
-
steps_u = num_batches(int(X_u_w
|
|
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
|
|
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
|
|
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
|
|
350
|
-
x_us = X_u_s
|
|
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 =
|
|
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
|
|
358
|
-
num_u = int(x_uw
|
|
359
|
-
expected = num_lb + num_u + int(x_us
|
|
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(
|
|
379
|
-
|
|
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
|
|
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(
|
|
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
|