weightslab 1.2.1__tar.gz → 1.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/ci.yml +80 -12
  2. {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/release.yml +26 -9
  3. {weightslab-1.2.1 → weightslab-1.2.3}/.gitignore +4 -0
  4. weightslab-1.2.3/AGENTS.md +209 -0
  5. weightslab-1.2.3/CHANGELOG.md +1 -0
  6. {weightslab-1.2.1/weightslab.egg-info → weightslab-1.2.3}/PKG-INFO +120 -219
  7. {weightslab-1.2.1 → weightslab-1.2.3}/README.md +118 -218
  8. {weightslab-1.2.1 → weightslab-1.2.3}/docs/quickstart.rst +55 -4
  9. {weightslab-1.2.1 → weightslab-1.2.3}/pyproject.toml +1 -0
  10. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/__init__.py +38 -44
  11. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/_version.py +3 -3
  12. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/dataloader_interface.py +48 -9
  13. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/global_monitoring.py +8 -2
  14. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/data_utils.py +34 -1
  15. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/dataframe_manager.py +3 -3
  16. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/h5_dataframe_store.py +12 -0
  17. weightslab-1.2.3/weightslab/data/point_cloud_utils.py +722 -0
  18. weightslab-1.2.3/weightslab/examples/Docker_training/README.md +38 -0
  19. weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/Dockerfile +58 -0
  20. weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/README.md +161 -0
  21. weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/docker-compose.yml +54 -0
  22. weightslab-1.2.3/weightslab/examples/Docker_training/docker_in_docker/entrypoint.sh +67 -0
  23. weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/Dockerfile +56 -0
  24. weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/README.md +159 -0
  25. weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/docker-compose.yml +44 -0
  26. weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/entrypoint.sh +101 -0
  27. weightslab-1.2.3/weightslab/examples/Docker_training/siblings_self_contained/ui-compose.yml +61 -0
  28. {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.3/weightslab/examples/Lightning}/ws-classification/main.py +4 -0
  29. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
  30. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-classification/main.py +15 -4
  31. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
  32. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/main.py +12 -8
  33. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/README.md +102 -0
  34. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/config.yaml +50 -0
  35. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/main.py +340 -0
  36. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +247 -0
  37. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/data.py +226 -0
  38. weightslab-1.2.3/weightslab/examples/PyTorch/ws-detection/utils/model.py +134 -0
  39. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.3/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
  40. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.3/weightslab/examples/PyTorch/ws-generation}/main.py +6 -2
  41. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
  42. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/main.py +6 -10
  43. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection}/config.yaml +1 -1
  44. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main_ul_native.py → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection/main.py +7 -0
  45. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +66 -0
  46. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +46 -0
  47. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +197 -0
  48. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +156 -0
  49. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +162 -0
  50. weightslab-1.2.3/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +148 -0
  51. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +190 -0
  52. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +72 -0
  53. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +431 -0
  54. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +279 -0
  55. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +597 -0
  56. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +190 -0
  57. weightslab-1.2.3/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +232 -0
  58. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/dataset.py +5 -3
  59. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/trainer.py +23 -10
  60. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service.proto +27 -0
  61. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service_pb2.py +55 -51
  62. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
  63. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/security/cert_auth_manager.py +64 -12
  64. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/src.py +76 -9
  65. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_compare_dataloaders.py +18 -2
  66. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
  67. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_logger_core.py +5 -0
  68. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_model_interface_unit.py +4 -0
  69. weightslab-1.2.3/weightslab/tests/backend/test_ui_docker_bridge.py +718 -0
  70. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_write_dataframe.py +3 -2
  71. weightslab-1.2.3/weightslab/tests/data/test_point_cloud_utils.py +330 -0
  72. weightslab-1.2.3/weightslab/tests/gRPC/test_get_point_cloud.py +99 -0
  73. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
  74. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
  75. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent.py +32 -1
  76. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/data_service.py +268 -56
  77. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/trainer_services.py +39 -25
  78. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
  79. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
  80. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/test-deployment.sh +0 -0
  81. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/build-and-deploy.sh +83 -62
  82. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
  83. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
  84. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
  85. weightslab-1.2.3/weightslab/ui_docker_bridge.py +1123 -0
  86. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/logs.py +28 -0
  87. {weightslab-1.2.1 → weightslab-1.2.3/weightslab.egg-info}/PKG-INFO +120 -219
  88. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/SOURCES.txt +47 -21
  89. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/requires.txt +1 -0
  90. weightslab-1.2.1/CHANGELOG.md +0 -1
  91. weightslab-1.2.1/_ck.txt +0 -1938
  92. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
  93. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
  94. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
  95. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
  96. weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
  97. weightslab-1.2.1/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
  98. weightslab-1.2.1/weightslab/tests/test_ddp_down_only_change.py +0 -62
  99. weightslab-1.2.1/weightslab/ui_docker_bridge.py +0 -589
  100. {weightslab-1.2.1 → weightslab-1.2.3}/.gitattributes +0 -0
  101. {weightslab-1.2.1 → weightslab-1.2.3}/.github/workflows/docs-pages.yml +0 -0
  102. {weightslab-1.2.1 → weightslab-1.2.3}/LICENSE +0 -0
  103. {weightslab-1.2.1 → weightslab-1.2.3}/agent_config.yaml +0 -0
  104. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/.gitkeep +0 -0
  105. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/custom.css +0 -0
  106. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/favicon.png +0 -0
  107. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/logo-dark.png +0 -0
  108. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/logo-light.png +0 -0
  109. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/version-switcher.js +0 -0
  110. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_static/weights_studio_architecture.png +0 -0
  111. {weightslab-1.2.1 → weightslab-1.2.3}/docs/_templates/.gitkeep +0 -0
  112. {weightslab-1.2.1 → weightslab-1.2.3}/docs/conf.py +0 -0
  113. {weightslab-1.2.1 → weightslab-1.2.3}/docs/configuration.rst +0 -0
  114. {weightslab-1.2.1 → weightslab-1.2.3}/docs/data_exploration.rst +0 -0
  115. {weightslab-1.2.1 → weightslab-1.2.3}/docs/four_way_approach.rst +0 -0
  116. {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/audit_logger.rst +0 -0
  117. {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/grpc_functions.rst +0 -0
  118. {weightslab-1.2.1 → weightslab-1.2.3}/docs/grpc/index.rst +0 -0
  119. {weightslab-1.2.1 → weightslab-1.2.3}/docs/hyperparameters.rst +0 -0
  120. {weightslab-1.2.1 → weightslab-1.2.3}/docs/index.rst +0 -0
  121. {weightslab-1.2.1 → weightslab-1.2.3}/docs/logger.rst +0 -0
  122. {weightslab-1.2.1 → weightslab-1.2.3}/docs/model_interaction.rst +0 -0
  123. {weightslab-1.2.1 → weightslab-1.2.3}/docs/pytorch_lightning.rst +0 -0
  124. {weightslab-1.2.1 → weightslab-1.2.3}/docs/requirements.txt +0 -0
  125. {weightslab-1.2.1 → weightslab-1.2.3}/docs/segmentation_usecase.rst +0 -0
  126. {weightslab-1.2.1 → weightslab-1.2.3}/docs/usecases.rst +0 -0
  127. {weightslab-1.2.1 → weightslab-1.2.3}/docs/user_functions.rst +0 -0
  128. {weightslab-1.2.1 → weightslab-1.2.3}/docs/weights_studio.rst +0 -0
  129. {weightslab-1.2.1 → weightslab-1.2.3}/setup.cfg +0 -0
  130. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/art.py +0 -0
  131. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/__init__.py +0 -0
  132. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/audit_logger.py +0 -0
  133. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/cli.py +0 -0
  134. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/ledgers.py +0 -0
  135. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/logger.py +0 -0
  136. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/model_interface.py +0 -0
  137. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/backend/optimizer_interface.py +0 -0
  138. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/__init__.py +0 -0
  139. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/pytorch/__init__.py +0 -0
  140. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/baseline_models/pytorch/models.py +0 -0
  141. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/__init__.py +0 -0
  142. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/checkpoint_manager.py +0 -0
  143. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/evaluation_controller.py +0 -0
  144. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/experiment_hash.py +0 -0
  145. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/parallel_primitives.py +0 -0
  146. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/components/tracking.py +0 -0
  147. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/__init__.py +0 -0
  148. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/array_proxy.py +0 -0
  149. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/data_samples_with_ops.py +0 -0
  150. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/h5_array_store.py +0 -0
  151. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/data/sample_stats.py +0 -0
  152. {weightslab-1.2.1/weightslab/examples/PyTorch_Lightning → weightslab-1.2.3/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
  153. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/__init__.py +0 -0
  154. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/data.py +0 -0
  155. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/model.py +0 -0
  156. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/signals.py +0 -0
  157. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.3/weightslab/examples/PyTorch/ws-clustering}/face/utils.py +0 -0
  158. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
  159. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
  160. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
  161. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
  162. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
  163. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
  164. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
  165. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
  166. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
  167. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
  168. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
  169. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
  170. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
  171. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
  172. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
  173. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
  174. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
  175. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
  176. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
  177. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
  178. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
  179. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
  180. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
  181. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
  182. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
  183. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
  184. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
  185. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
  186. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
  187. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
  188. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
  189. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
  190. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
  191. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
  192. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
  193. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
  194. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
  195. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
  196. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
  197. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
  198. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
  199. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
  200. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
  201. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
  202. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
  203. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
  204. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
  205. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
  206. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
  207. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
  208. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
  209. {weightslab-1.2.1/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.3/weightslab/examples/Ultralytics/ws-detection}/requirements.txt +0 -0
  210. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/__init__.py +0 -0
  211. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/README.md +0 -0
  212. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/__init__.py +0 -0
  213. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/_utils.py +0 -0
  214. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/collate.py +0 -0
  215. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/integrations/ultralytics/signals.py +0 -0
  216. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/__init__.py +0 -0
  217. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/model_with_ops.py +0 -0
  218. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/models/monkey_patcher.py +0 -0
  219. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/__init__.py +0 -0
  220. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/modules_with_ops.py +0 -0
  221. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/modules/neuron_ops.py +0 -0
  222. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/proto/__init__.py +0 -0
  223. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/security/__init__.py +0 -0
  224. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/__init__.py +0 -0
  225. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/__init__.py +0 -0
  226. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_audit_logger.py +0 -0
  227. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
  228. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
  229. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_ledgers.py +0 -0
  230. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
  231. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
  232. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/backend/test_write_history.py +0 -0
  233. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
  234. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
  235. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/__init__.py +0 -0
  236. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
  237. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
  238. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
  239. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/__init__.py +0 -0
  240. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
  241. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
  242. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_data_utils_unit.py +0 -0
  243. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
  244. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_flush_pipeline.py +0 -0
  245. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_h5_array_store.py +0 -0
  246. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
  247. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/__init__.py +0 -0
  248. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
  249. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/__init__.py +0 -0
  250. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_auditor_mode.py +0 -0
  251. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_cli.py +0 -0
  252. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_hyperparams.py +0 -0
  253. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
  254. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_signals.py +0 -0
  255. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/general/test_signals_wrapping.py +0 -0
  256. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/__init__.py +0 -0
  257. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
  258. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
  259. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
  260. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/__init__.py +0 -0
  261. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_constraint_generation.py +0 -0
  262. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_dependency_patterns.py +0 -0
  263. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_logger.py +0 -0
  264. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_model_with_ops.py +0 -0
  265. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
  266. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/model/test_tracking.py +0 -0
  267. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/modules/__init__.py +0 -0
  268. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
  269. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/test_secure_docker.py +0 -0
  270. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/test_src_functions.py +0 -0
  271. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/__init__.py +0 -0
  272. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/__init__.py +0 -0
  273. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
  274. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
  275. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
  276. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
  277. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/__init__.py +0 -0
  278. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
  279. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_logs_unit.py +0 -0
  280. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
  281. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
  282. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
  283. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
  284. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
  285. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/__init__.py +0 -0
  286. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
  287. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/tests/watchdog/test_watchdog.py +0 -0
  288. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/__init__.py +0 -0
  289. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/experiment_context.py +0 -0
  290. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/__init__.py +0 -0
  291. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/__init__.py +0 -0
  292. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
  293. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
  294. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
  295. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
  296. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/agent_service.py +0 -0
  297. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/data_image_utils.py +0 -0
  298. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/experiment_service.py +0 -0
  299. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/instance_merger.py +0 -0
  300. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/model_service.py +0 -0
  301. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/utils/__init__.py +0 -0
  302. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/services/utils/tools.py +0 -0
  303. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/trainer/trainer_tools.py +0 -0
  304. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/Dockerfile +0 -0
  305. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/.dockerignore +0 -0
  306. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/.env.example +0 -0
  307. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/docker-compose.yml +0 -0
  308. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
  309. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
  310. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/docker/nginx.conf +0 -0
  311. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
  312. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
  313. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
  314. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/envoy/envoy.yaml +0 -0
  315. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/ui/nginx.conf +0 -0
  316. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/__init__.py +0 -0
  317. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/computational_graph.py +0 -0
  318. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/modules_dependencies.py +0 -0
  319. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/plot_graph.py +0 -0
  320. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/shape_prop.py +0 -0
  321. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/utils/tools.py +0 -0
  322. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/__init__.py +0 -0
  323. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/grpc_watchdog.py +0 -0
  324. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/lock_monitor.py +0 -0
  325. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/log_level.py +0 -0
  326. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab/watchdog/watchdog.py +0 -0
  327. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/dependency_links.txt +0 -0
  328. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/entry_points.txt +0 -0
  329. {weightslab-1.2.1 → weightslab-1.2.3}/weightslab.egg-info/top_level.txt +0 -0
@@ -95,19 +95,22 @@ jobs:
95
95
  echo "$FILES" | xargs vulture --min-confidence 70 ./weightslab || true
96
96
  fi
97
97
 
98
+ # ── Fast install gate (always runs) ──────────────────────────────────────
99
+ # Single-version install on 3.11 — always runs so `test` has a gate to
100
+ # depend on regardless of branch.
98
101
  install:
99
102
  if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
100
103
  runs-on: ubuntu-latest
104
+ name: install (Python 3.11)
101
105
  steps:
102
106
  - name: Checkout repository
103
107
  uses: actions/checkout@v4
104
108
 
105
- - name: Set up Python
109
+ - name: Set up Python 3.11
106
110
  uses: actions/setup-python@v5
107
111
  with:
108
112
  python-version: '3.11'
109
113
 
110
-
111
114
  - name: Install project dependencies
112
115
  run: |
113
116
  python -m pip install --upgrade pip
@@ -117,9 +120,49 @@ jobs:
117
120
  run: |
118
121
  python -c "import weightslab; print(f'weightslab imported successfully')"
119
122
 
123
+ # ── Full Python version matrix (PR and main only) ─────────────────────────
124
+ # Verifies that `pip install` + basic import work across all supported Python
125
+ # versions. Runs on every PR and every push to main; skipped on dev/other
126
+ # branch pushes to avoid unnecessary cost on work-in-progress commits.
127
+ install-matrix:
128
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
129
+ runs-on: ubuntu-latest
130
+ strategy:
131
+ fail-fast: false # keep running other versions if one fails
132
+ matrix:
133
+ include:
134
+ - python-version: '3.10'
135
+ - python-version: '3.11'
136
+ - python-version: '3.12'
137
+ - python-version: '3.13'
138
+ - python-version: '3.14'
139
+ allow-prereleases: true # 3.14 is pre-release; visible failure but non-blocking
140
+ name: install (Python ${{ matrix.python-version }})
141
+ # 3.14 pre-release failures are informational — don't block the pipeline.
142
+ continue-on-error: ${{ matrix.allow-prereleases == true }}
143
+ steps:
144
+ - name: Checkout repository
145
+ uses: actions/checkout@v4
146
+
147
+ - name: Set up Python ${{ matrix.python-version }}
148
+ uses: actions/setup-python@v5
149
+ with:
150
+ python-version: ${{ matrix.python-version }}
151
+ allow-prereleases: ${{ matrix.allow-prereleases || false }}
152
+
153
+ - name: Install project dependencies
154
+ run: |
155
+ python -m pip install --upgrade pip
156
+ python -m pip install -e . --extra-index-url https://download.pytorch.org/whl/cpu
157
+
158
+ - name: Verify installation
159
+ run: |
160
+ python -c "import weightslab; print(f'weightslab imported successfully on Python ${{ matrix.python-version }}')"
161
+
120
162
  test:
121
163
  if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
122
164
  runs-on: ubuntu-latest
165
+ # Depends on the fast 3.11 gate only — the matrix runs independently in parallel.
123
166
  needs: install
124
167
  steps:
125
168
  - name: Checkout repository
@@ -133,13 +176,17 @@ jobs:
133
176
  - name: Install project dependencies
134
177
  run: |
135
178
  python -m pip install --upgrade pip
136
- python -m pip install . --extra-index-url https://download.pytorch.org/whl/cpu
179
+ # Install the test extra so pytest, graphviz, torchmetrics,
180
+ # pytorch-lightning and tensorboard are available (several test modules
181
+ # import pytest / use pytest fixtures and cannot run under bare unittest).
182
+ python -m pip install '.[utest]' --extra-index-url https://download.pytorch.org/whl/cpu
183
+ python -m pip install pytest-timeout
137
184
 
138
185
  - name: Run unit tests - General
139
186
  run: |
140
187
  export WEIGHTSLAB_LOG_LEVEL="DEBUG"
141
- python -m pip install pytorch_lightning
142
- python -m unittest discover -s ./weightslab/tests -p "test_*.py" -t . -v
188
+ # A per-test timeout guards against any regression that hangs a test.
189
+ python -m pytest ./weightslab/tests -v --timeout=300
143
190
 
144
191
  # TODO (GP): WL CI do not find WS CI for now; token or visibility problem ??
145
192
  # - name: Trigger WeightsStudio CI
@@ -161,7 +208,8 @@ jobs:
161
208
  # echo "WeightsStudio workflow dispatch requested successfully."
162
209
 
163
210
  build-and-publish-dev:
164
- if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
211
+ # Only publish to TestPyPI when pushing to main (not on PRs or dev branch pushes).
212
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
165
213
  name: Build & Publish Dev (TestPyPI)
166
214
  needs: test
167
215
  runs-on: ubuntu-latest
@@ -244,18 +292,34 @@ jobs:
244
292
  fi
245
293
  python -m twine upload --repository-url https://test.pypi.org/legacy/ --verbose dist/*
246
294
 
295
+ # ── Cross-version install test from TestPyPI ──────────────────────────────
296
+ # Installs the just-published dev package from TestPyPI on every supported
297
+ # Python version and verifies the import works end-to-end.
298
+ # Runs only on main branch pushes (same gate as the publish step above).
247
299
  test-install-from-pip-dev:
248
- if: ${{ github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/') }}
249
- name: Test Install From Pip Dev
300
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
301
+ name: Test Install From Pip Dev (Python ${{ matrix.python-version }})
250
302
  needs: build-and-publish-dev
251
303
  runs-on: ubuntu-latest
304
+ strategy:
305
+ fail-fast: false
306
+ matrix:
307
+ include:
308
+ - python-version: '3.10'
309
+ - python-version: '3.11'
310
+ - python-version: '3.12'
311
+ - python-version: '3.13'
312
+ - python-version: '3.14'
313
+ allow-prereleases: true
314
+ continue-on-error: ${{ matrix.allow-prereleases == true }}
252
315
  permissions:
253
316
  contents: read
254
317
  steps:
255
- - name: Set up Python
318
+ - name: Set up Python ${{ matrix.python-version }}
256
319
  uses: actions/setup-python@v5
257
320
  with:
258
- python-version: '3.11'
321
+ python-version: ${{ matrix.python-version }}
322
+ allow-prereleases: ${{ matrix.allow-prereleases || false }}
259
323
 
260
324
  - name: Create isolated virtual environment
261
325
  run: |
@@ -292,9 +356,13 @@ jobs:
292
356
  done
293
357
 
294
358
  python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://download.pytorch.org/whl/cpu --extra-index-url https://pypi.org/simple "weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
295
- echo "weightslab==${WL_VERSION} installed from TestPyPI"
359
+ echo "weightslab==${WL_VERSION} installed from TestPyPI on Python ${{ matrix.python-version }}"
296
360
 
297
361
  - name: Verify package import
298
362
  run: |
299
363
  . .venv-ci/bin/activate
300
- python -c "import weightslab; import importlib.metadata as m; print('weightslab import OK'); print('installed version:', m.version('weightslab'))"
364
+ python -c "
365
+ import weightslab, importlib.metadata as m
366
+ print('weightslab import OK on Python ${{ matrix.python-version }}')
367
+ print('installed version:', m.version('weightslab'))
368
+ "
@@ -114,16 +114,29 @@ jobs:
114
114
  path: dist/
115
115
  retention-days: 1
116
116
 
117
+ # ── Cross-version install test from TestPyPI (Dev Release) ───────────────
117
118
  test-install-from-pip-dev-release:
118
- name: Test Install From TestPyPI (Dev Release)
119
+ name: Test Install From TestPyPI — Python ${{ matrix.python-version }} (Dev Release)
119
120
  needs: build-and-publish-dev-release
120
121
  runs-on: ubuntu-latest
122
+ strategy:
123
+ fail-fast: false
124
+ matrix:
125
+ include:
126
+ - python-version: '3.10'
127
+ - python-version: '3.11'
128
+ - python-version: '3.12'
129
+ - python-version: '3.13'
130
+ - python-version: '3.14'
131
+ allow-prereleases: true
132
+ continue-on-error: ${{ matrix.allow-prereleases == true }}
121
133
  permissions:
122
134
  contents: read
123
135
  steps:
124
136
  - uses: actions/setup-python@v5
125
137
  with:
126
- python-version: '3.11'
138
+ python-version: ${{ matrix.python-version }}
139
+ allow-prereleases: ${{ matrix.allow-prereleases || false }}
127
140
 
128
141
  - name: Create isolated virtual environment
129
142
  run: python -m venv .venv-ci
@@ -159,14 +172,14 @@ jobs:
159
172
  --extra-index-url https://pypi.org/simple/ \
160
173
  --extra-index-url https://download.pytorch.org/whl/cpu \
161
174
  "weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
162
- echo "weightslab==${WL_VERSION} installed from TestPyPI"
175
+ echo "weightslab==${WL_VERSION} installed on Python ${{ matrix.python-version }}"
163
176
 
164
177
  - name: Verify package import
165
178
  run: |
166
179
  . .venv-ci/bin/activate
167
180
  python -c "
168
181
  import weightslab, importlib.metadata as m
169
- print('weightslab import OK')
182
+ print('weightslab import OK on Python ${{ matrix.python-version }}')
170
183
  print('installed version:', m.version('weightslab'))
171
184
  "
172
185
 
@@ -290,7 +303,6 @@ jobs:
290
303
 
291
304
  build-and-publish-main:
292
305
  name: Build & Publish Main (PyPI)
293
- # needs: [detect-target, ]
294
306
  needs: [detect-target]
295
307
  runs-on: ubuntu-latest
296
308
  if: ${{ needs.detect-target.outputs.is_main == 'true' }}
@@ -343,16 +355,21 @@ jobs:
343
355
  path: dist/
344
356
  retention-days: 1
345
357
 
358
+ # ── Cross-version install test from PyPI (Main Release) ──────────────────
346
359
  test-install-from-pip-main:
347
- name: Test Install From PyPI (Main Release)
360
+ name: Test Install From PyPI — Python ${{ matrix.python-version }} (Main Release)
348
361
  needs: build-and-publish-main
349
362
  runs-on: ubuntu-latest
363
+ strategy:
364
+ fail-fast: false
365
+ matrix:
366
+ python-version: ['3.10', '3.11', '3.12', '3.13']
350
367
  permissions:
351
368
  contents: read
352
369
  steps:
353
370
  - uses: actions/setup-python@v5
354
371
  with:
355
- python-version: '3.11'
372
+ python-version: ${{ matrix.python-version }}
356
373
 
357
374
  - name: Create isolated virtual environment
358
375
  run: python -m venv .venv-ci
@@ -387,14 +404,14 @@ jobs:
387
404
  --index-url https://pypi.org/simple/ \
388
405
  --extra-index-url https://download.pytorch.org/whl/cpu \
389
406
  "weightslab==${WL_VERSION}" --no-cache-dir --retries 10 --timeout 60
390
- echo "weightslab==${WL_VERSION} installed from PyPI"
407
+ echo "weightslab==${WL_VERSION} installed on Python ${{ matrix.python-version }}"
391
408
 
392
409
  - name: Verify package import
393
410
  run: |
394
411
  . .venv-ci/bin/activate
395
412
  python -c "
396
413
  import weightslab, importlib.metadata as m
397
- print('weightslab import OK')
414
+ print('weightslab import OK on Python ${{ matrix.python-version }}')
398
415
  print('installed version:', m.version('weightslab'))
399
416
  "
400
417
 
@@ -10,6 +10,7 @@ __pycache__
10
10
  venv
11
11
  runs
12
12
  data
13
+ MagicMock
13
14
 
14
15
  # Ignore hidden directories
15
16
  .history
@@ -48,6 +49,7 @@ _version.py
48
49
  *.log
49
50
  *.csv
50
51
  *.sqlite
52
+ *.txt
51
53
  *.db
52
54
  *.ipynb_checkpoints
53
55
  *.code-workspace
@@ -71,3 +73,5 @@ weightslab/ui/certs/*.srl
71
73
  # Ignore documentation build artifacts
72
74
  _build
73
75
  generated
76
+
77
+ CLAUDE.md
@@ -0,0 +1,209 @@
1
+ # AGENTS.md — coding-agent & contributor onboarding
2
+
3
+ This file is the shared context for **AI coding agents** (Claude Code, etc.) and
4
+ **human contributors** working on WeightsLab. It captures the cross-repo
5
+ architecture and the conventions that aren't obvious from any single file, so a
6
+ newcomer (or an agent with no prior memory of the project) can orient quickly
7
+ and debug confidently.
8
+
9
+ > File/line references drift as the code evolves — treat them as starting
10
+ > points and verify against the current source before relying on them.
11
+
12
+ ---
13
+
14
+ ## 1. Working with AI coding agents here
15
+
16
+ WeightsLab is developed with coding agents in the loop. A few things make that
17
+ productive and safe:
18
+
19
+ - **This repo is one of three that ship together** (see §2). Many changes are
20
+ *cross-repo* — a proto edit touches the Python backend *and* the TypeScript
21
+ frontend. An agent that edits only one side leaves the build broken. Always
22
+ ask "does this change cross the proto boundary?"
23
+ - **Keep changes additive and verify.** The default expectation is that
24
+ existing usecases keep working. Run the relevant test suites (§7) before
25
+ declaring done; prefer adding a new branch/flag over changing a shared path.
26
+ - **Agent memory ≠ this file.** Agents may keep private, point-in-time "memory"
27
+ notes outside the repo. This file is the *committed, reviewed* distillation of
28
+ that knowledge — the part we want every contributor and every future agent to
29
+ start from. When you learn something load-bearing and non-obvious, add it
30
+ here (in a PR) rather than leaving it only in private memory.
31
+ - **Onboarding flow:** read §2–§6 top to bottom, then skim §7–§8 before your
32
+ first change. For a feature, find the closest existing example in
33
+ `weightslab/weightslab/examples/` and mirror its structure.
34
+
35
+ ---
36
+
37
+ ## 2. The workspace: three repos, side by side
38
+
39
+ These must be checked out as **sibling directories** — codegen and proxy
40
+ configs reach across by relative path.
41
+
42
+ | Repo | Role | Stack |
43
+ |---|---|---|
44
+ | **weightslab** (this repo) | Backend / core: training instrumentation, data ledger, gRPC service, the shared proto | Python |
45
+ | **weights_studio** | Frontend: the studio UI that inspects/edits a running experiment | TypeScript + Vite |
46
+ | **weightslab_kitchen** | Private examples / reference material | mixed |
47
+
48
+ Layout assumption: `…/Codes/weightslab`, `…/Codes/weights_studio`,
49
+ `…/Codes/weightslab_kitchen`.
50
+
51
+ ---
52
+
53
+ ## 3. Runtime integration (how backend ↔ frontend connect)
54
+
55
+ One proto is the single source of truth:
56
+ `weightslab/weightslab/proto/experiment_service.proto` (`service
57
+ ExperimentService`, ~20 RPCs).
58
+
59
+ - **Backend** implements it in `weightslab/trainer/services/experiment_service.py`
60
+ (servicer), delegating to `data_service.py`, `model_service.py`,
61
+ `agent_service.py`. The servicer and the in-process training loop run in the
62
+ **same process, different threads**, coordinated by the locks in
63
+ `weightslab/components/global_monitoring.py`.
64
+ - **Frontend** consumes a generated TS client
65
+ (`weights_studio/src/experiment_service.client.ts`) produced by
66
+ `npm run generate-proto:data`, which runs `protoc` against the sibling
67
+ weightslab proto.
68
+ - **Wire path:** browser → `:8080` Envoy (grpc-web ↔ grpc transcoding) → Python
69
+ gRPC servicer → training loop. The browser can't speak raw gRPC, so Envoy
70
+ translates.
71
+
72
+ **Editing the proto is a three-step, cross-repo operation — do all three or the
73
+ build breaks:**
74
+ 1. Edit `experiment_service.proto`.
75
+ 2. Regenerate Python stubs **from the repo root** (import style matters):
76
+ `python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. weightslab/proto/experiment_service.proto`
77
+ 3. Regenerate the TS client in weights_studio: `npm run generate-proto:data`.
78
+
79
+ ---
80
+
81
+ ## 4. Backend module map (`weightslab/weightslab/`)
82
+
83
+ Public API is re-exported from `__init__.py` (← `src.py`); users do
84
+ `import weightslab as wl`.
85
+
86
+ - **`src.py`** — the public verbs: `watch_or_edit`, `serve`, `keep_serving`,
87
+ `save_signals`, `tag_samples`, `query_*`, decorators (`eval_fn`,
88
+ `pointcloud_thumbnail`, `pointcloud_boxes`), etc.
89
+ - **`trainer/`** — orchestration. `services/experiment_service.py` is the gRPC
90
+ servicer; `services/{model,data,agent}_service.py` are per-domain delegates;
91
+ `services/data_image_utils.py` handles preview/mask encoding.
92
+ - **`components/`** — cross-cutting runtime: `global_monitoring.py`
93
+ (`guard_training_context` / `guard_testing_context`, pause controller, global
94
+ rlock), `checkpoint_manager.py`, `evaluation_controller.py`, `tracking.py`.
95
+ - **`models/`** — `model_with_ops.py` (the watched/op-able model wrapper).
96
+ - **`data/`** — the dataframe + storage backbone: `dataframe_manager.py`,
97
+ `data_samples_with_ops.py`, `sample_stats.py` (`SampleStatsEx`), `data_utils.py`,
98
+ `point_cloud_utils.py`; storage in `h5_dataframe_store.py`, `h5_array_store.py`,
99
+ `array_proxy.py`.
100
+ - **`backend/`** — primitives: `ledgers.py` (`GLOBAL_LEDGER`, the watch/edit
101
+ substrate + hyperparameter registry), the watched-object interfaces, `logger.py`,
102
+ `audit_logger.py`, `cli.py`.
103
+ - **`proto/`**, **`security/`** (`CertAuthManager`), **`ui/`** (bundled
104
+ Docker/Envoy assets), **`examples/`**.
105
+
106
+ **Fan-in:** `ledgers.GLOBAL_LEDGER` is the hub — `watch_or_edit` registers
107
+ objects there; the servicer reads/mutates through it.
108
+
109
+ ---
110
+
111
+ ## 5. Frontend module map (`weights_studio/src/`)
112
+
113
+ Vite + TypeScript; entry `index.html` → `src/main.ts`.
114
+
115
+ - **`main.ts`** — bootstrap: infers host/port (default `:8080`), builds the
116
+ grpc-web transport, wires panels and the sample modal.
117
+ - **`experiment_service.client.ts` / `experiment_service.ts`** — generated
118
+ client/types (do **not** hand-edit; regenerate via `npm run generate-proto:data`).
119
+ - **`grid_data/`** — sample grid + modal rendering (`GridCell.ts`,
120
+ `DataImageService.ts`, `BboxRenderer.ts`, `SegmentationRenderer.ts`,
121
+ `PointCloudViewer.ts` / `PointCloudService.ts`).
122
+ - **`left_panel/`, `plots/`, `agent/`, `helpers.ts`, `ui/`, `utils/`** — controls,
123
+ Chart.js plots, the LLM agent panel, shared helpers/reconnection.
124
+ - Tests in `tests/` (vitest unit + Playwright E2E).
125
+
126
+ Build/proto scripts read the **sibling weightslab repo** at codegen time.
127
+
128
+ ---
129
+
130
+ ## 6. User-integration API (`import weightslab as wl`)
131
+
132
+ How a user's own PyTorch script plugs in so the studio can inspect/edit it live.
133
+ Examples: `weightslab/weightslab/examples/{PyTorch,Lightning,Usecases}/<usecase>/`
134
+ (each a `main.py` + `config.yaml`).
135
+
136
+ Wrap each training object with `wl.watch_or_edit(obj, flag=...)`; the returned
137
+ tracked proxy is registered in the global ledger:
138
+ - `flag="hyperparameters"` (dict), `flag="model"` (nn.Module, `device=…`),
139
+ `flag="optimizer"`, `flag="data"` (Dataset → tracked DataLoader: `loader_name`,
140
+ `batch_size`, `is_training`, `collate_fn`, …), `flag="loss"` (a
141
+ `reduction="none"` criterion; called with `(preds_raw, targets, batch_ids=ids,
142
+ preds=preds)`), `flag="metric"`.
143
+
144
+ Conventions:
145
+ - Wrap the train step in `with guard_training_context:` and eval in
146
+ `with guard_testing_context:` (from `weightslab.components.global_monitoring`)
147
+ — this is how pause/resume and train/test separation work.
148
+ - Use `model.get_age()` (steps actually trained; survives checkpoint reloads),
149
+ not the raw loop counter.
150
+ - `wl.serve(serving_grpc=…, serving_cli=…)` starts background serving threads in
151
+ the same process; end the script with `wl.keep_serving()`.
152
+ - `task_type` on the dataset/model selects rendering: `classification`,
153
+ `segmentation`, `detection`, `detection_pointcloud`.
154
+
155
+ ---
156
+
157
+ ## 7. Tests & verification
158
+
159
+ - **Backend (Python):** `python -m pytest weightslab/tests/...` — domains under
160
+ `tests/{data,trainer,gRPC,...}`.
161
+ - **Frontend unit (vitest):** `npm run test` in weights_studio
162
+ (`tests/utests/**`).
163
+ - **E2E / user-simulation (Playwright): lives in weights_studio, not here** —
164
+ the tests drive the real UI against a backend the harness spins up
165
+ (`test:realtime:*`, `test:e2e:*`).
166
+
167
+ Before declaring a cross-repo change done: regenerate protos (both sides),
168
+ build the frontend (`npm run build`), and run the affected unit suites.
169
+
170
+ ---
171
+
172
+ ## 8. Point-cloud detection pipeline (`detection_pointcloud`)
173
+
174
+ A worked example of a non-trivial cross-repo feature; see
175
+ `weightslab/weightslab/examples/Usecases/ws-3d-lidar-detection/` and
176
+ `weightslab/weightslab/data/point_cloud_utils.py`.
177
+
178
+ - **Task type** `detection_pointcloud` (covers 2D and 3D; box-row column count
179
+ decides dimensionality; legacy alias `detection_3d`).
180
+ - **Dataset yields** `(cloud [M,F], uid, boxes, metadata)`. Cloud columns:
181
+ `x,y,z,intensity` (model reads the first 4) + optional viz-only channels
182
+ (`nx,ny,nz` normals, `r,g,b` colour) named via `point_feature_names`. Boxes:
183
+ 3D `[cx,cy,cz,dx,dy,dz,yaw,cls?,conf?]` or 2D `[cx,cy,dx,dy,cls?,conf?]`;
184
+ predictions use the **same** schema.
185
+ - **Previews** (thumbnail/grid/modal image) are **server-rendered 2D** (BEV or
186
+ range projection) with boxes projected on; the raw cloud streams to the
187
+ browser only for the interactive **three.js 3D viewer** (modal "3D" toggle),
188
+ via the `GetPointCloud` streaming RPC. Colour modes are data-driven (height /
189
+ distance / intensity / camera-RGB / normal shading).
190
+ - **Override hooks:** dataset methods `render_thumbnail_2d` / `project_boxes_2d`,
191
+ or global decorators `@wl.pointcloud_thumbnail` / `@wl.pointcloud_boxes`.
192
+ - **Real data:** `source: kitti_raw` downloads a KITTI raw drive (sync +
193
+ tracklets for GT boxes + calibration for RGB) to a temp dir; falls back to
194
+ synthetic scenes offline.
195
+
196
+ ---
197
+
198
+ ## 9. Contributor checklist & gotchas
199
+
200
+ - Proto change → regen Python (from repo root) **and** TS, or runtime breaks.
201
+ - The three repos must sit side by side; codegen uses relative paths.
202
+ - Training + serving share a process — respect the `global_monitoring` locks and
203
+ the `guard_*` context managers.
204
+ - TLS/auth in the bundled UI is decided by the presence of certs under
205
+ `WEIGHTSLAB_CERTS_DIR` (single source of truth) — don't hardcode secure/insecure.
206
+ - Per-instance data (detection/segmentation) uses a MultiIndex
207
+ `(sample_id, annotation_id)` through the dataframe and H5 store.
208
+ - Playwright/E2E tests belong in weights_studio, not here.
209
+ - Don't commit large datasets; real-data downloads go to a temp dir.
@@ -0,0 +1 @@
1
+ # Changelog - 2026-06-12 v1.2.3 (1)