opensportslib 0.3.1.dev16__tar.gz → 0.3.1.dev18__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 (231) hide show
  1. {opensportslib-0.3.1.dev16/opensportslib.egg-info → opensportslib-0.3.1.dev18}/PKG-INFO +1 -1
  2. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/adaptation/spotta.py +38 -4
  3. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/cli.py +8 -2
  4. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/e2e_spotta.yaml +10 -1
  5. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/setup/setup.py +28 -16
  6. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18/opensportslib.egg-info}/PKG-INFO +1 -1
  7. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/pyproject.toml +1 -1
  8. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/tools/test_setup.py +64 -11
  9. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/LICENSE +0 -0
  10. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/LICENSE-COMMERCIAL +0 -0
  11. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/MANIFEST.in +0 -0
  12. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/README.md +0 -0
  13. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/examples/quickstart/basic_classification.py +0 -0
  14. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/examples/quickstart/basic_localization.py +0 -0
  15. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/examples/quickstart/basic_vqa.py +0 -0
  16. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/__init__.py +0 -0
  17. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/adaptation/__init__.py +0 -0
  18. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/__init__.py +0 -0
  19. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/base_task_model.py +0 -0
  20. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/classification.py +0 -0
  21. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/config.py +0 -0
  22. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/configuration.py +0 -0
  23. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/localization.py +0 -0
  24. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/apis/vqa.py +0 -0
  25. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/classification/default.yaml +0 -0
  26. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
  27. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
  28. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/classification/video.yaml +0 -0
  29. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/default.yaml +0 -0
  30. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
  31. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/default.yaml +0 -0
  32. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/h5_header_distance.yaml +0 -0
  33. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/h5_header_skeleton.yaml +0 -0
  34. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
  35. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/tracking_action_spotting.yaml +0 -0
  36. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/video_dali.yaml +0 -0
  37. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/localization/video_ocv.yaml +0 -0
  38. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/default.yaml +0 -0
  39. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/qwen.yaml +0 -0
  40. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/qwen3_vl_native.yaml +0 -0
  41. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/qwen_lora.yaml +0 -0
  42. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/qwen_sngar_frames.yaml +0 -0
  43. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/configs/vqa/xvars.yaml +0 -0
  44. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/__init__.py +0 -0
  45. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/__init__.py +0 -0
  46. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/accessors.py +0 -0
  47. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/conflicts.py +0 -0
  48. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/editable.py +0 -0
  49. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/loader.py +0 -0
  50. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/migrate.py +0 -0
  51. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/migrations/__init__.py +0 -0
  52. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
  53. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/rule_variants.py +0 -0
  54. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/runtime_adapter.py +0 -0
  55. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/schema.py +0 -0
  56. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/schemas/__init__.py +0 -0
  57. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
  58. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
  59. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/config/validate.py +0 -0
  60. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/__init__.py +0 -0
  61. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/builder.py +0 -0
  62. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/calf.py +0 -0
  63. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/ce.py +0 -0
  64. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/combine.py +0 -0
  65. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/loss/nll.py +0 -0
  66. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/optimizer/__init__.py +0 -0
  67. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/optimizer/builder.py +0 -0
  68. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/sampler/weighted_sampler.py +0 -0
  69. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/scheduler/__init__.py +0 -0
  70. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/scheduler/builder.py +0 -0
  71. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/trainer/__init__.py +0 -0
  72. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/trainer/classification_trainer.py +0 -0
  73. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/trainer/localization_trainer.py +0 -0
  74. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/trainer/vqa_trainer.py +0 -0
  75. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/checkpoint.py +0 -0
  76. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/config.py +0 -0
  77. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/config_normalize.py +0 -0
  78. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/data.py +0 -0
  79. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/ddp.py +0 -0
  80. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/default_args.py +0 -0
  81. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/direct_video.py +0 -0
  82. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/hf_runtime.py +0 -0
  83. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/lightning.py +0 -0
  84. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/load_annotations.py +0 -0
  85. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/seed.py +0 -0
  86. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/video_processing.py +0 -0
  87. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/core/utils/wandb.py +0 -0
  88. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/__init__.py +0 -0
  89. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/builder.py +0 -0
  90. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/classification_dataset.py +0 -0
  91. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/localization_dataset.py +0 -0
  92. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/utils/__init__.py +0 -0
  93. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/utils/h5_tracking.py +0 -0
  94. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/utils/tracking.py +0 -0
  95. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/datasets/vqa_dataset.py +0 -0
  96. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/classification.yaml +0 -0
  97. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
  98. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
  99. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
  100. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/localization.yaml +0 -0
  101. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
  102. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
  103. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/metrics/classification_metric.py +0 -0
  104. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/metrics/localization_metric.py +0 -0
  105. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/metrics/vqa_metric.py +0 -0
  106. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/__init__.py +0 -0
  107. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/backbones/builder.py +0 -0
  108. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/contextaware.py +0 -0
  109. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/e2e.py +0 -0
  110. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/learnablepooling.py +0 -0
  111. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/qwen_vl_native.py +0 -0
  112. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/qwen_xvars.py +0 -0
  113. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/rule_based.py +0 -0
  114. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/tracking.py +0 -0
  115. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/vars.py +0 -0
  116. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/video.py +0 -0
  117. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
  118. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/video_mae.py +0 -0
  119. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/base/xvars_videochatgpt.py +0 -0
  120. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/builder.py +0 -0
  121. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/heads/builder.py +0 -0
  122. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/neck/builder.py +0 -0
  123. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/common.py +0 -0
  124. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/__init__.py +0 -0
  125. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/asformer.py +0 -0
  126. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/calf.py +0 -0
  127. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/gsm.py +0 -0
  128. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/gtad.py +0 -0
  129. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/impl/tsm.py +0 -0
  130. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/litebase.py +0 -0
  131. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/modules.py +0 -0
  132. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/shift.py +0 -0
  133. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/utils.py +0 -0
  134. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
  135. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/vqa_prompting.py +0 -0
  136. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/models/utils/xvars_clip_index.py +0 -0
  137. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/remote_registry.py +0 -0
  138. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/tools/__init__.py +0 -0
  139. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/tools/_common.py +0 -0
  140. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/tools/hf_transfer.py +0 -0
  141. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/tools/osl_json_to_parquet.py +0 -0
  142. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib/tools/parquet_to_osl_json.py +0 -0
  143. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib.egg-info/SOURCES.txt +0 -0
  144. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib.egg-info/dependency_links.txt +0 -0
  145. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib.egg-info/entry_points.txt +0 -0
  146. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib.egg-info/requires.txt +0 -0
  147. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/opensportslib.egg-info/top_level.txt +0 -0
  148. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/scripts/redact_test_stream.py +0 -0
  149. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/scripts/release_versions.py +0 -0
  150. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/scripts/run_h5_header_rule_inference.py +0 -0
  151. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/scripts/summarize_test_report.py +0 -0
  152. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/setup.cfg +0 -0
  153. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/__init__.py +0 -0
  154. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/conftest.py +0 -0
  155. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/helpers/__init__.py +0 -0
  156. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/helpers/configs.py +0 -0
  157. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/helpers/pipeline_stubs.py +0 -0
  158. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/integration/classification/test_pipeline.py +0 -0
  159. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/integration/localization/test_pipeline.py +0 -0
  160. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/integration/localization/test_spotta.py +0 -0
  161. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/integration/vqa/test_pipeline.py +0 -0
  162. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/__init__.py +0 -0
  163. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/_release_common.py +0 -0
  164. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/test_00_environment.py +0 -0
  165. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/test_classification_release.py +0 -0
  166. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/test_localization_release.py +0 -0
  167. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/release/test_vqa_release.py +0 -0
  168. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/smoke/test_cli.py +0 -0
  169. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/smoke/test_config_utils.py +0 -0
  170. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/smoke/test_environment.py +0 -0
  171. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/smoke/test_package.py +0 -0
  172. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/smoke/test_public_apis.py +0 -0
  173. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_remote_registry.py +0 -0
  174. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_remote_sessions.py +0 -0
  175. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_server_jobs.py +0 -0
  176. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_server_registry.py +0 -0
  177. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_server_startup_scripts.py +0 -0
  178. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_task_model_contract.py +0 -0
  179. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/api/test_vqa.py +0 -0
  180. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/config/test_architecture.py +0 -0
  181. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/config/test_editable.py +0 -0
  182. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/config/test_optional_hf.py +0 -0
  183. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/config/test_pretrained_merge.py +0 -0
  184. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/config/test_split_overrides.py +0 -0
  185. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/contracts/test_architecture.py +0 -0
  186. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/contracts/test_dependencies.py +0 -0
  187. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/contracts/test_package.py +0 -0
  188. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/contracts/test_release_versions.py +0 -0
  189. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/contracts/test_runner_contract.py +0 -0
  190. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/core/test_classification_trainer.py +0 -0
  191. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/core/test_localization_hf_backend.py +0 -0
  192. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/core/test_training_components.py +0 -0
  193. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/core/test_video_processing.py +0 -0
  194. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/data/test_classification_paths.py +0 -0
  195. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/data/test_h5_tracking.py +0 -0
  196. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/data/test_localization_dali.py +0 -0
  197. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/data/test_localization_intervals.py +0 -0
  198. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/data/test_osl_formats.py +0 -0
  199. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_classification_metrics.py +0 -0
  200. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_header_rule_spotter.py +0 -0
  201. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_header_skeleton_spotter.py +0 -0
  202. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_localization_metrics.py +0 -0
  203. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_temporal_shift.py +0 -0
  204. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_vqa_metrics.py +0 -0
  205. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_vqa_qwen_xvars.py +0 -0
  206. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_vqa_training_lora.py +0 -0
  207. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/models/test_vqa_xvars_videochatgpt.py +0 -0
  208. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/tools/test_conversion.py +0 -0
  209. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/tools/test_extract_xvars_features.py +0 -0
  210. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/tools/test_hf_transfer.py +0 -0
  211. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tests/unit/tools/test_report_summary.py +0 -0
  212. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_sn_vqa_2026_vqa.py +0 -0
  213. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_sngar_spotting.py +0 -0
  214. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_soccernet_gar.py +0 -0
  215. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
  216. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_soccernet_gar_vqa.py +0 -0
  217. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/build_xvars_indexes.py +0 -0
  218. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/extract_xvars_clip_features.py +0 -0
  219. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
  220. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
  221. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/sngar_dataset_card.py +0 -0
  222. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/sngar_events.py +0 -0
  223. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/convert/verify_sngar_spotting.py +0 -0
  224. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/download/download_hf_repo.py +0 -0
  225. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/download/download_osl_hf.py +0 -0
  226. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/download/push_sngar_spotting.py +0 -0
  227. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/download/upload_osl_hf.py +0 -0
  228. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/training/classification.py +0 -0
  229. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/training/localization.py +0 -0
  230. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/training/vqa.py +0 -0
  231. {opensportslib-0.3.1.dev16 → opensportslib-0.3.1.dev18}/tools/upload/upload_model_hf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.3.1.dev16
3
+ Version: 0.3.1.dev18
4
4
  Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
5
5
  Author: Jeet Vora
6
6
  Requires-Python: >=3.12
@@ -59,6 +59,7 @@ class SpoTTAConfig:
59
59
  drift_scale: float = 10.0
60
60
  drift_threshold: float = 1.0
61
61
  drift_gamma: float = 0.2
62
+ augmentation: bool = True
62
63
 
63
64
  @classmethod
64
65
  def from_mapping(cls, value: Any) -> "SpoTTAConfig":
@@ -69,6 +70,7 @@ class SpoTTAConfig:
69
70
  memory = _mapping(root.get("memory"))
70
71
  optimizer = _mapping(root.get("optimizer"))
71
72
  teacher = _mapping(root.get("teacher"))
73
+ augmentation = _mapping(root.get("augmentation"))
72
74
 
73
75
  _require_supported_value(
74
76
  root,
@@ -76,6 +78,34 @@ class SpoTTAConfig:
76
78
  "adapt_then_predict",
77
79
  "adaptation",
78
80
  )
81
+ _require_supported_value(tether, "mode", "bayesian", "robust_bn.tether")
82
+ _require_supported_value(
83
+ gate,
84
+ "uncertainty",
85
+ "one_minus_max_probability",
86
+ "confidence_gate",
87
+ )
88
+ _require_supported_value(
89
+ gate,
90
+ "aggregation",
91
+ "min_over_predicted_action_frames",
92
+ "confidence_gate",
93
+ )
94
+ _require_supported_value(optimizer, "type", "Adam", "optimizer")
95
+ _require_supported_value(
96
+ optimizer,
97
+ "trainable_parameters",
98
+ "batch_norm_affine_only",
99
+ "optimizer",
100
+ )
101
+ _require_supported_value(teacher, "type", "ema", "teacher")
102
+ _require_supported_value(
103
+ teacher, "adaptive_from_bn_drift", True, "teacher"
104
+ )
105
+ _require_supported_value(
106
+ augmentation, "mode", "framewise_rotta_strong", "augmentation"
107
+ )
108
+
79
109
  config = cls(
80
110
  alpha=float(robust_bn.get("alpha", cls.alpha)),
81
111
  tether_cap=float(tether.get("cap", cls.tether_cap)),
@@ -103,6 +133,7 @@ class SpoTTAConfig:
103
133
  teacher.get("drift_threshold", cls.drift_threshold)
104
134
  ),
105
135
  drift_gamma=float(teacher.get("drift_gamma", cls.drift_gamma)),
136
+ augmentation=bool(augmentation.get("enabled", cls.augmentation)),
106
137
  )
107
138
  config.validate()
108
139
  return config
@@ -546,10 +577,13 @@ class SpoTTA:
546
577
  with torch.no_grad():
547
578
  teacher_logits = _logits(self.teacher(clips))
548
579
 
549
- batch, time, channels, height, width = clips.shape
550
- augmented = self.augmentation(
551
- clips.reshape(batch * time, channels, height, width)
552
- ).reshape(batch, time, channels, height, width)
580
+ if self.config.augmentation:
581
+ batch, time, channels, height, width = clips.shape
582
+ augmented = self.augmentation(
583
+ clips.reshape(batch * time, channels, height, width)
584
+ ).reshape(batch, time, channels, height, width)
585
+ else:
586
+ augmented = clips
553
587
 
554
588
  self.student.train()
555
589
  student_logits = _logits(self.student(augmented))
@@ -10,6 +10,7 @@ def main(argv: Optional[list[str]] = None) -> int:
10
10
  parser = argparse.ArgumentParser(prog="opensportslib")
11
11
  parser.add_argument("command", choices=["setup"])
12
12
  parser.add_argument("--pyg", action="store_true")
13
+ parser.add_argument("--pyg_extensions", action="store_true")
13
14
  parser.add_argument("--dali", action="store_true")
14
15
  parser.add_argument("--vqa_xvars", action="store_true")
15
16
  parser.add_argument("--vqa_qwen", action="store_true")
@@ -17,12 +18,17 @@ def main(argv: Optional[list[str]] = None) -> int:
17
18
  args = parser.parse_args(argv)
18
19
 
19
20
  if args.command == "setup":
20
- setup(
21
+ setup_kwargs = dict(
21
22
  pyg=args.pyg,
22
23
  dali=args.dali,
23
24
  vqa_xvars=args.vqa_xvars,
24
- vqa_qwen=args.vqa_qwen
25
+ vqa_qwen=args.vqa_qwen,
25
26
  )
27
+ # Preserve the established setup() call contract unless the new,
28
+ # opt-in extension install was explicitly requested.
29
+ if args.pyg_extensions:
30
+ setup_kwargs["pyg_extensions"] = True
31
+ setup(**setup_kwargs)
26
32
  return 0
27
33
 
28
34
  return 2
@@ -39,7 +39,6 @@ DATA:
39
39
  resize:
40
40
  height: 224
41
41
  width: 398
42
- preserve_aspect_ratio: true
43
42
  params:
44
43
  crop_dim: 224
45
44
  dilate_len: 0
@@ -70,10 +69,13 @@ MODEL:
70
69
  robust_bn:
71
70
  alpha: 0.05
72
71
  tether:
72
+ mode: bayesian
73
73
  cap: 0.5
74
74
  confidence_gate:
75
75
  action_class_index: 1
76
76
  min_action_frames: 1
77
+ uncertainty: one_minus_max_probability
78
+ aggregation: min_over_predicted_action_frames
77
79
  threshold: 0.3
78
80
  memory:
79
81
  capacity: 8
@@ -81,14 +83,21 @@ MODEL:
81
83
  lambda_t: 1.0
82
84
  lambda_u: 1.0
83
85
  optimizer:
86
+ type: Adam
84
87
  learning_rate: 0.001
85
88
  beta: 0.9
89
+ trainable_parameters: batch_norm_affine_only
86
90
  teacher:
91
+ type: ema
87
92
  base_nu: 0.001
93
+ adaptive_from_bn_drift: true
88
94
  max_nu: 0.02
89
95
  drift_scale: 10.0
90
96
  drift_threshold: 1.0
91
97
  drift_gamma: 0.2
98
+ augmentation:
99
+ enabled: true
100
+ mode: framewise_rotta_strong
92
101
 
93
102
  TRAIN:
94
103
  execution:
@@ -16,8 +16,9 @@ LEGACY_GPU_CUDA_WHEEL_MAX_COMPUTE_CAPABILITY = (9, 0)
16
16
  CUDA13_REQUIRED_MIN_COMPUTE_CAPABILITY = (10, 0)
17
17
 
18
18
  # PyG extension wheels are published for a narrower PyTorch matrix than the
19
- # base PyTorch packages. Keep this profile explicit: selecting ``--pyg`` is
20
- # allowed to replace an otherwise newer PyTorch installation.
19
+ # base PyTorch packages. They are optional: most OpenSportsLib graph paths
20
+ # only need ``torch-geometric`` and must remain usable on platforms where no
21
+ # matching extension wheels are published.
21
22
  PYG_TORCH_VERSION = "2.12.1"
22
23
  PYG_TORCH_PACKAGES = (
23
24
  f"torch=={PYG_TORCH_VERSION}",
@@ -199,7 +200,7 @@ def pyg_wheel_url(torch_version=None, cuda_tag=None):
199
200
 
200
201
 
201
202
  def validate_pyg_wheels():
202
- """Ensure every required PyG wheel exists before replacing Torch.
203
+ """Ensure every optional PyG extension wheel is available before installing it.
203
204
 
204
205
  ``--only-binary`` is intentional: pip otherwise falls back to a source
205
206
  build, which is both slow and incompatible with its isolated build
@@ -246,7 +247,7 @@ def install_dali():
246
247
  "cupy-cuda12x"
247
248
  ])
248
249
 
249
- def install_pyg():
250
+ def install_pyg(*, extensions=False):
250
251
  import torch
251
252
 
252
253
  python = sys.executable
@@ -257,23 +258,25 @@ def install_pyg():
257
258
  f"profile (PyTorch {PYG_TORCH_VERSION}); found PyTorch {torch_version}. "
258
259
  "Run 'opensportslib setup --pyg' so the matching Torch stack is installed."
259
260
  )
260
- print("\nInstalling Py-Geometric ecosystem...\n")
261
- url = pyg_wheel_url(torch_version)
261
+ print("\nInstalling PyTorch Geometric...\n")
262
262
 
263
263
  subprocess.check_call([
264
264
  python, "-m", "pip", "install", "torch-geometric",
265
265
  ])
266
- subprocess.check_call([
267
- python, "-m", "pip", "install",
268
- *PYG_EXTENSION_PACKAGES, "--only-binary=:all:", "-f", url
269
- ])
270
266
 
271
- def install_extras(dali=False, pyg=False):
267
+ if extensions:
268
+ url = pyg_wheel_url(torch_version)
269
+ subprocess.check_call([
270
+ python, "-m", "pip", "install",
271
+ *PYG_EXTENSION_PACKAGES, "--only-binary=:all:", "-f", url
272
+ ])
273
+
274
+ def install_extras(dali=False, pyg=False, pyg_extensions=False):
272
275
  if dali:
273
276
  install_dali()
274
277
  print("NVIDIA DALI installed successfully.")
275
278
  if pyg:
276
- install_pyg()
279
+ install_pyg(extensions=pyg_extensions)
277
280
  print("PyTorch Geometric installed successfully.")
278
281
 
279
282
 
@@ -289,11 +292,13 @@ def verify():
289
292
  else:
290
293
  print("Running on CPU")
291
294
 
292
- def setup(dali=False, pyg=False, vqa_xvars=False, vqa_qwen=False):
293
- if pyg:
295
+ def setup(dali=False, pyg=False, pyg_extensions=False, vqa_xvars=False, vqa_qwen=False):
296
+ if pyg_extensions and not pyg:
297
+ raise ValueError("--pyg_extensions requires --pyg")
298
+ if pyg_extensions:
294
299
  validate_pyg_wheels()
295
300
  install_torch(pyg_compatible=pyg)
296
- install_extras(dali=dali, pyg=pyg)
301
+ install_extras(dali=dali, pyg=pyg, pyg_extensions=pyg_extensions)
297
302
  if vqa_xvars:
298
303
  install_xvars_dependencies(XVARS_DEPENDENCY_PINS)
299
304
  if vqa_qwen:
@@ -310,9 +315,16 @@ if __name__ == "__main__":
310
315
  parser = argparse.ArgumentParser()
311
316
  parser.add_argument("--dali", action="store_true")
312
317
  parser.add_argument("--pyg", action="store_true")
318
+ parser.add_argument("--pyg_extensions", action="store_true")
313
319
  parser.add_argument("--vqa_xvars", action="store_true")
314
320
  parser.add_argument("--vqa_qwen", action="store_true")
315
321
 
316
322
  args = parser.parse_args()
317
323
 
318
- setup(dali=args.dali, pyg=args.pyg, vqa_xvars=args.vqa_xvars, vqa_qwen=args.vqa_qwen)
324
+ setup(
325
+ dali=args.dali,
326
+ pyg=args.pyg,
327
+ pyg_extensions=args.pyg_extensions,
328
+ vqa_xvars=args.vqa_xvars,
329
+ vqa_qwen=args.vqa_qwen,
330
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.3.1.dev16
3
+ Version: 0.3.1.dev18
4
4
  Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
5
5
  Author: Jeet Vora
6
6
  Requires-Python: >=3.12
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "opensportslib"
7
- version = "0.3.1.dev16"
7
+ version = "0.3.1.dev18"
8
8
  description = "OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,16 +1,21 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import sys
4
+ import types
5
+
3
6
  import pytest
4
7
 
5
8
  from opensportslib import cli
6
9
  from opensportslib.setup import setup as setup_lib
7
10
 
8
11
 
9
- def test_select_cuda_wheel_uses_cu126_for_pre_sm75_gpu_with_cuda_13():
12
+ def test_select_cuda_wheel_uses_cu126_for_pre_sm75_gpu_with_cuda_13(monkeypatch):
13
+ monkeypatch.setattr(setup_lib.platform, "machine", lambda: "x86_64")
10
14
  assert setup_lib.select_cuda_wheel("13.0", [(7, 0)]) == "cu126"
11
15
 
12
16
 
13
- def test_select_cuda_wheel_uses_cu126_for_pascal_with_cuda_13():
17
+ def test_select_cuda_wheel_uses_cu126_for_pascal_with_cuda_13(monkeypatch):
18
+ monkeypatch.setattr(setup_lib.platform, "machine", lambda: "x86_64")
14
19
  assert setup_lib.select_cuda_wheel("13.0", [(6, 0)]) == "cu126"
15
20
 
16
21
 
@@ -46,7 +51,7 @@ def test_install_torch_uses_the_pinned_pyg_compatibility_profile(monkeypatch):
46
51
  )
47
52
 
48
53
 
49
- def test_validate_pyg_wheels_checks_all_binary_wheels_before_torch_reinstall(monkeypatch):
54
+ def test_validate_pyg_wheels_checks_all_optional_binary_wheels(monkeypatch):
50
55
  calls: list[list[str]] = []
51
56
 
52
57
  monkeypatch.setattr(setup_lib.sys, "executable", "/usr/bin/python3")
@@ -71,7 +76,23 @@ def test_pyg_extension_packages_match_the_supported_optional_libraries():
71
76
  )
72
77
 
73
78
 
74
- def test_setup_selects_pyg_torch_profile_before_installing_pyg(monkeypatch):
79
+ def test_install_pyg_skips_optional_extension_downloads_by_default(monkeypatch):
80
+ calls: list[list[str]] = []
81
+
82
+ monkeypatch.setattr(setup_lib.sys, "executable", "/usr/bin/python3")
83
+ monkeypatch.setitem(
84
+ sys.modules,
85
+ "torch",
86
+ types.SimpleNamespace(__version__="2.12.1+cu130"),
87
+ )
88
+ monkeypatch.setattr(setup_lib.subprocess, "check_call", lambda cmd: calls.append(cmd) or 0)
89
+
90
+ setup_lib.install_pyg()
91
+
92
+ assert calls == [["/usr/bin/python3", "-m", "pip", "install", "torch-geometric"]]
93
+
94
+
95
+ def test_setup_installs_pyg_without_optional_extensions(monkeypatch):
75
96
  calls: list[object] = []
76
97
 
77
98
  monkeypatch.setattr(
@@ -79,17 +100,41 @@ def test_setup_selects_pyg_torch_profile_before_installing_pyg(monkeypatch):
79
100
  "install_torch",
80
101
  lambda *, pyg_compatible=False: calls.append(("torch", pyg_compatible)),
81
102
  )
82
- monkeypatch.setattr(setup_lib, "validate_pyg_wheels", lambda: calls.append("validate"))
83
103
  monkeypatch.setattr(
84
104
  setup_lib,
85
105
  "install_extras",
86
- lambda dali=False, pyg=False: calls.append(("extras", dali, pyg)),
106
+ lambda dali=False, pyg=False, pyg_extensions=False: calls.append(
107
+ ("extras", dali, pyg, pyg_extensions)
108
+ ),
87
109
  )
88
110
  monkeypatch.setattr(setup_lib, "verify", lambda: calls.append("verify"))
89
111
 
90
112
  setup_lib.setup(pyg=True)
91
113
 
92
- assert calls == ["validate", ("torch", True), ("extras", False, True), "verify"]
114
+ assert calls == [("torch", True), ("extras", False, True, False), "verify"]
115
+
116
+
117
+ def test_setup_validates_extensions_only_when_explicitly_requested(monkeypatch):
118
+ calls: list[object] = []
119
+
120
+ monkeypatch.setattr(setup_lib, "validate_pyg_wheels", lambda: calls.append("validate"))
121
+ monkeypatch.setattr(
122
+ setup_lib,
123
+ "install_torch",
124
+ lambda *, pyg_compatible=False: calls.append(("torch", pyg_compatible)),
125
+ )
126
+ monkeypatch.setattr(
127
+ setup_lib,
128
+ "install_extras",
129
+ lambda dali=False, pyg=False, pyg_extensions=False: calls.append(
130
+ ("extras", dali, pyg, pyg_extensions)
131
+ ),
132
+ )
133
+ monkeypatch.setattr(setup_lib, "verify", lambda: calls.append("verify"))
134
+
135
+ setup_lib.setup(pyg=True, pyg_extensions=True)
136
+
137
+ assert calls == ["validate", ("torch", True), ("extras", False, True, True), "verify"]
93
138
 
94
139
 
95
140
  def test_select_cuda_wheel_uses_cu130_for_dgx_spark():
@@ -108,9 +153,10 @@ def test_select_cuda_wheel_uses_highest_driver_compatible_wheel():
108
153
  def test_cli_setup_forwards_xvars_flag(monkeypatch):
109
154
  captured: dict[str, object] = {}
110
155
 
111
- def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool):
156
+ def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool, **kwargs):
112
157
  captured["dali"] = dali
113
158
  captured["pyg"] = pyg
159
+ captured.update(kwargs)
114
160
  captured["vqa_xvars"] = vqa_xvars
115
161
  captured["vqa_qwen"] = vqa_qwen
116
162
 
@@ -125,9 +171,10 @@ def test_cli_setup_forwards_xvars_flag(monkeypatch):
125
171
  def test_cli_setup_forwards_qwen_flag(monkeypatch):
126
172
  captured: dict[str, object] = {}
127
173
 
128
- def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool):
174
+ def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool, **kwargs):
129
175
  captured["dali"] = dali
130
176
  captured["pyg"] = pyg
177
+ captured.update(kwargs)
131
178
  captured["vqa_xvars"] = vqa_xvars
132
179
  captured["vqa_qwen"] = vqa_qwen
133
180
 
@@ -192,7 +239,13 @@ def test_install_xvars_dependencies_uninstalls_then_reinstalls(monkeypatch):
192
239
  def test_setup_skips_vqa_dependency_install_when_flags_are_false(monkeypatch):
193
240
  calls: list[str] = []
194
241
 
195
- monkeypatch.setattr(setup_lib, "install_extras", lambda dali=False, pyg=False: calls.append(f"extras:{dali}:{pyg}"))
242
+ monkeypatch.setattr(
243
+ setup_lib,
244
+ "install_extras",
245
+ lambda dali=False, pyg=False, pyg_extensions=False: calls.append(
246
+ f"extras:{dali}:{pyg}:{pyg_extensions}"
247
+ ),
248
+ )
196
249
  monkeypatch.setattr(setup_lib, "install_xvars_dependencies", lambda pins: calls.append(f"deps:{sorted(pins)}"))
197
250
  monkeypatch.setattr(setup_lib, "verify", lambda: calls.append("verify"))
198
251
  monkeypatch.setattr(
@@ -203,4 +256,4 @@ def test_setup_skips_vqa_dependency_install_when_flags_are_false(monkeypatch):
203
256
 
204
257
  setup_lib.setup(dali=True, pyg=False, vqa_xvars=False, vqa_qwen=False)
205
258
 
206
- assert calls == ["torch:False", "extras:True:False", "verify"]
259
+ assert calls == ["torch:False", "extras:True:False:False", "verify"]