weightslab 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. {weightslab-1.2.0 → weightslab-1.2.2}/.github/workflows/ci.yml +7 -3
  2. {weightslab-1.2.0 → weightslab-1.2.2}/.github/workflows/release.yml +20 -10
  3. {weightslab-1.2.0 → weightslab-1.2.2}/.gitignore +3 -0
  4. weightslab-1.2.2/AGENTS.md +209 -0
  5. weightslab-1.2.2/CHANGELOG.md +1 -0
  6. {weightslab-1.2.0/weightslab.egg-info → weightslab-1.2.2}/PKG-INFO +122 -219
  7. {weightslab-1.2.0 → weightslab-1.2.2}/README.md +118 -218
  8. {weightslab-1.2.0 → weightslab-1.2.2}/docs/quickstart.rst +55 -4
  9. {weightslab-1.2.0 → weightslab-1.2.2}/pyproject.toml +6 -0
  10. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/__init__.py +25 -37
  11. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/_version.py +3 -3
  12. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/data_utils.py +34 -1
  13. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/dataframe_manager.py +1 -1
  14. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/h5_dataframe_store.py +12 -0
  15. weightslab-1.2.2/weightslab/data/point_cloud_utils.py +722 -0
  16. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/.grpc_auth_token +1 -0
  17. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.crt +26 -0
  18. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/backend-server.key +28 -0
  19. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/ca.crt +30 -0
  20. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.crt +24 -0
  21. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-client.key +28 -0
  22. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.crt +25 -0
  23. weightslab-1.2.2/weightslab/examples/PyTorch/ws-classification/certs-debug/envoy-server.key +28 -0
  24. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/config.yaml +7 -8
  25. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-classification/main.py +11 -3
  26. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/config.yaml +1 -1
  27. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/main.py +8 -8
  28. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/README.md +102 -0
  29. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/config.yaml +50 -0
  30. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/main.py +340 -0
  31. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/criterions.py +247 -0
  32. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/data.py +226 -0
  33. weightslab-1.2.2/weightslab/examples/PyTorch/ws-detection/utils/model.py +134 -0
  34. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/config.yaml +4 -4
  35. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-vad → weightslab-1.2.2/weightslab/examples/PyTorch/ws-generation}/main.py +2 -2
  36. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/config.yaml +3 -3
  37. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/main.py +4 -8
  38. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src → weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection}/config.yaml +1 -1
  39. weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection/requirements.txt +1 -0
  40. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/README.md +66 -0
  41. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/config.yaml +46 -0
  42. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/main.py +194 -0
  43. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/criterions.py +156 -0
  44. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/data.py +162 -0
  45. weightslab-1.2.2/weightslab/examples/Usecases/ws-2d-lidar-detection/utils/model.py +148 -0
  46. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/README.md +190 -0
  47. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/config.yaml +72 -0
  48. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/main.py +431 -0
  49. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/criterions.py +279 -0
  50. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/data.py +597 -0
  51. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/kitti_download.py +190 -0
  52. weightslab-1.2.2/weightslab/examples/Usecases/ws-3d-lidar-detection/utils/model.py +232 -0
  53. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/trainer.py +6 -5
  54. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service.proto +27 -0
  55. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2.py +55 -51
  56. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/experiment_service_pb2_grpc.py +45 -0
  57. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/security/cert_auth_manager.py +73 -13
  58. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/src.py +72 -9
  59. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_compare_dataloaders.py +78 -62
  60. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_data_loader_interface.py +37 -46
  61. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_logger_core.py +5 -0
  62. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_model_interface_unit.py +4 -0
  63. weightslab-1.2.2/weightslab/tests/backend/test_ui_docker_bridge.py +718 -0
  64. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_write_dataframe.py +3 -2
  65. weightslab-1.2.2/weightslab/tests/data/test_point_cloud_utils.py +330 -0
  66. weightslab-1.2.2/weightslab/tests/gRPC/test_get_point_cloud.py +99 -0
  67. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_user_actions.py +5 -0
  68. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_unit.py +6 -0
  69. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent.py +32 -1
  70. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/data_service.py +247 -53
  71. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/trainer_services.py +5 -0
  72. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/DEPLOYMENT.md +14 -4
  73. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx-entrypoint.sh +0 -0
  74. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/test-deployment.sh +0 -0
  75. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/build-and-deploy.sh +106 -67
  76. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.ps1 +8 -2
  77. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/generate-certs-auth-token.sh +10 -1
  78. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/utils/test-deployment.sh +0 -0
  79. weightslab-1.2.2/weightslab/ui_docker_bridge.py +1123 -0
  80. {weightslab-1.2.0 → weightslab-1.2.2/weightslab.egg-info}/PKG-INFO +122 -219
  81. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/SOURCES.txt +45 -20
  82. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/requires.txt +4 -0
  83. weightslab-1.2.0/CHANGELOG.md +0 -1
  84. weightslab-1.2.0/_ck.txt +0 -1938
  85. weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/main.py +0 -135
  86. weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/criterions.py +0 -390
  87. weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/data.py +0 -116
  88. weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/utils/trainer.py +0 -195
  89. weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/yolo_pipeline.py +0 -171
  90. weightslab-1.2.0/weightslab/tests/backend/test_ui_docker_bridge.py +0 -567
  91. weightslab-1.2.0/weightslab/tests/test_ddp_down_only_change.py +0 -62
  92. weightslab-1.2.0/weightslab/ui_docker_bridge.py +0 -548
  93. {weightslab-1.2.0 → weightslab-1.2.2}/.gitattributes +0 -0
  94. {weightslab-1.2.0 → weightslab-1.2.2}/.github/workflows/docs-pages.yml +0 -0
  95. {weightslab-1.2.0 → weightslab-1.2.2}/LICENSE +0 -0
  96. {weightslab-1.2.0 → weightslab-1.2.2}/agent_config.yaml +0 -0
  97. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/.gitkeep +0 -0
  98. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/custom.css +0 -0
  99. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/favicon.png +0 -0
  100. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/logo-dark.png +0 -0
  101. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/logo-light.png +0 -0
  102. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/version-switcher.js +0 -0
  103. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_static/weights_studio_architecture.png +0 -0
  104. {weightslab-1.2.0 → weightslab-1.2.2}/docs/_templates/.gitkeep +0 -0
  105. {weightslab-1.2.0 → weightslab-1.2.2}/docs/conf.py +0 -0
  106. {weightslab-1.2.0 → weightslab-1.2.2}/docs/configuration.rst +0 -0
  107. {weightslab-1.2.0 → weightslab-1.2.2}/docs/data_exploration.rst +0 -0
  108. {weightslab-1.2.0 → weightslab-1.2.2}/docs/four_way_approach.rst +0 -0
  109. {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/audit_logger.rst +0 -0
  110. {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/grpc_functions.rst +0 -0
  111. {weightslab-1.2.0 → weightslab-1.2.2}/docs/grpc/index.rst +0 -0
  112. {weightslab-1.2.0 → weightslab-1.2.2}/docs/hyperparameters.rst +0 -0
  113. {weightslab-1.2.0 → weightslab-1.2.2}/docs/index.rst +0 -0
  114. {weightslab-1.2.0 → weightslab-1.2.2}/docs/logger.rst +0 -0
  115. {weightslab-1.2.0 → weightslab-1.2.2}/docs/model_interaction.rst +0 -0
  116. {weightslab-1.2.0 → weightslab-1.2.2}/docs/pytorch_lightning.rst +0 -0
  117. {weightslab-1.2.0 → weightslab-1.2.2}/docs/requirements.txt +0 -0
  118. {weightslab-1.2.0 → weightslab-1.2.2}/docs/segmentation_usecase.rst +0 -0
  119. {weightslab-1.2.0 → weightslab-1.2.2}/docs/usecases.rst +0 -0
  120. {weightslab-1.2.0 → weightslab-1.2.2}/docs/user_functions.rst +0 -0
  121. {weightslab-1.2.0 → weightslab-1.2.2}/docs/weights_studio.rst +0 -0
  122. {weightslab-1.2.0 → weightslab-1.2.2}/setup.cfg +0 -0
  123. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/art.py +0 -0
  124. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/__init__.py +0 -0
  125. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/audit_logger.py +0 -0
  126. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/cli.py +0 -0
  127. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/dataloader_interface.py +0 -0
  128. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/ledgers.py +0 -0
  129. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/logger.py +0 -0
  130. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/model_interface.py +0 -0
  131. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/backend/optimizer_interface.py +0 -0
  132. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/__init__.py +0 -0
  133. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/__init__.py +0 -0
  134. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/baseline_models/pytorch/models.py +0 -0
  135. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/__init__.py +0 -0
  136. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/checkpoint_manager.py +0 -0
  137. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/evaluation_controller.py +0 -0
  138. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/experiment_hash.py +0 -0
  139. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/global_monitoring.py +0 -0
  140. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/parallel_primitives.py +0 -0
  141. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/components/tracking.py +0 -0
  142. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/__init__.py +0 -0
  143. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/array_proxy.py +0 -0
  144. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/data_samples_with_ops.py +0 -0
  145. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/h5_array_store.py +0 -0
  146. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/data/sample_stats.py +0 -0
  147. {weightslab-1.2.0/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/config.yaml +0 -0
  148. {weightslab-1.2.0/weightslab/examples/PyTorch_Lightning → weightslab-1.2.2/weightslab/examples/Lightning}/ws-classification/main.py +0 -0
  149. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/__init__.py +0 -0
  150. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/data.py +0 -0
  151. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/model.py +0 -0
  152. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/signals.py +0 -0
  153. {weightslab-1.2.0/weightslab/examples/PyTorch/ws-face_recognition-triplet_loss → weightslab-1.2.2/weightslab/examples/PyTorch/ws-clustering}/face/utils.py +0 -0
  154. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0000f77c-6257be58.jpg +0 -0
  155. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/000f8d37-d4c09a0f.jpg +0 -0
  156. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00a0f008-a315437f.jpg +0 -0
  157. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c12bd0-bb46e479.jpg +0 -0
  158. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00c29c52-f9524f1e.jpg +0 -0
  159. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00ce6f6d-50bbee62.jpg +0 -0
  160. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d1bafa-1b47b41c.jpg +0 -0
  161. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00d7268f-fd4487be.jpg +0 -0
  162. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/00f0dd0f-5e9c9557.jpg +0 -0
  163. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a0d7f4c-ac5c3c8f.jpg +0 -0
  164. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a1f4fce-f9cac880.jpg +0 -0
  165. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/train/0a3bb2d8-c195d91e.jpg +0 -0
  166. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1cac6a7-04e33135.jpg +0 -0
  167. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ceb32e-3f481b43.jpg +0 -0
  168. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d10d08-5b108225.jpg +0 -0
  169. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d22449-15fb948f.jpg +0 -0
  170. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1d7b3ac-5af8623b.jpg +0 -0
  171. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1dce572-c6a8cb5e.jpg +0 -0
  172. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e1a7b8-0aec80e8.jpg +0 -0
  173. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1e8ad72-c3c79240.jpg +0 -0
  174. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1ee702d-0ae1fc10.jpg +0 -0
  175. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b1f0efd9-37a14dda.jpg +0 -0
  176. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2a0648b-d8e126bc.jpg +0 -0
  177. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/images/val/b2b70230-bad4ff6e.jpg +0 -0
  178. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0000f77c-6257be58.png +0 -0
  179. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/000f8d37-d4c09a0f.png +0 -0
  180. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00a0f008-a315437f.png +0 -0
  181. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c12bd0-bb46e479.png +0 -0
  182. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00c29c52-f9524f1e.png +0 -0
  183. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00ce6f6d-50bbee62.png +0 -0
  184. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d1bafa-1b47b41c.png +0 -0
  185. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00d7268f-fd4487be.png +0 -0
  186. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/00f0dd0f-5e9c9557.png +0 -0
  187. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a0d7f4c-ac5c3c8f.png +0 -0
  188. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a1f4fce-f9cac880.png +0 -0
  189. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/train/0a3bb2d8-c195d91e.png +0 -0
  190. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1cac6a7-04e33135.png +0 -0
  191. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ceb32e-3f481b43.png +0 -0
  192. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d10d08-5b108225.png +0 -0
  193. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d22449-15fb948f.png +0 -0
  194. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1d7b3ac-5af8623b.png +0 -0
  195. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1dce572-c6a8cb5e.png +0 -0
  196. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e1a7b8-0aec80e8.png +0 -0
  197. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1e8ad72-c3c79240.png +0 -0
  198. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1ee702d-0ae1fc10.png +0 -0
  199. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b1f0efd9-37a14dda.png +0 -0
  200. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2a0648b-d8e126bc.png +0 -0
  201. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/BDD_subset/labels/val/b2b70230-bad4ff6e.png +0 -0
  202. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/criterions.py +0 -0
  203. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/data.py +0 -0
  204. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/examples/PyTorch/ws-segmentation/utils/model.py +0 -0
  205. /weightslab-1.2.0/weightslab/examples/PyTorch/ws-detection/src/main_ul_native.py → /weightslab-1.2.2/weightslab/examples/Ultralytics/ws-detection/main.py +0 -0
  206. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/__init__.py +0 -0
  207. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/README.md +0 -0
  208. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/__init__.py +0 -0
  209. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/_utils.py +0 -0
  210. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/collate.py +0 -0
  211. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/dataset.py +0 -0
  212. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/integrations/ultralytics/signals.py +0 -0
  213. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/__init__.py +0 -0
  214. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/model_with_ops.py +0 -0
  215. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/models/monkey_patcher.py +0 -0
  216. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/__init__.py +0 -0
  217. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/modules_with_ops.py +0 -0
  218. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/modules/neuron_ops.py +0 -0
  219. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/proto/__init__.py +0 -0
  220. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/security/__init__.py +0 -0
  221. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/__init__.py +0 -0
  222. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/__init__.py +0 -0
  223. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_audit_logger.py +0 -0
  224. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_cli_additional_unit.py +0 -0
  225. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_instance_signal_logger.py +0 -0
  226. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_ledgers.py +0 -0
  227. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface.py +0 -0
  228. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_optimizer_interface_additional_unit.py +0 -0
  229. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/backend/test_write_history.py +0 -0
  230. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/__init__.py +0 -0
  231. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/chaos_monkeys_utests/test_grpc_chaos_monkey_robustness.py +0 -0
  232. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/__init__.py +0 -0
  233. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_checkpoint_workflow.py +0 -0
  234. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_experiment_hash_and_art.py +0 -0
  235. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/components/test_global_monitoring_unit.py +0 -0
  236. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/__init__.py +0 -0
  237. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_samples_with_ops.py +0 -0
  238. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_service_metadata_copy.py +0 -0
  239. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_data_utils_unit.py +0 -0
  240. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_dataframe_manager_unit.py +0 -0
  241. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_flush_pipeline.py +0 -0
  242. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_h5_array_store.py +0 -0
  243. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/data/test_h5_dataframe_store.py +0 -0
  244. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/gRPC/__init__.py +0 -0
  245. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/gRPC/test_grpc_tag_operations.py +0 -0
  246. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/__init__.py +0 -0
  247. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_auditor_mode.py +0 -0
  248. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_cli.py +0 -0
  249. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_hyperparams.py +0 -0
  250. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_logger_snapshot_rotation.py +0 -0
  251. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_signals.py +0 -0
  252. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/general/test_signals_wrapping.py +0 -0
  253. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/__init__.py +0 -0
  254. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/test_pytorch_lightning_integration.py +0 -0
  255. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_ablation.py +0 -0
  256. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/integrations/ultralytics/ddp/ddp_test_suite.py +0 -0
  257. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/__init__.py +0 -0
  258. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_constraint_generation.py +0 -0
  259. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_dependency_patterns.py +0 -0
  260. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_logger.py +0 -0
  261. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops.py +0 -0
  262. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_model_with_ops_unit.py +0 -0
  263. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/model/test_tracking.py +0 -0
  264. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/modules/__init__.py +0 -0
  265. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/modules/test_modules_with_ops.py +0 -0
  266. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/test_secure_docker.py +0 -0
  267. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/test_src_functions.py +0 -0
  268. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/__init__.py +0 -0
  269. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/__init__.py +0 -0
  270. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_prompt_unit.py +0 -0
  271. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_agent_service_unit.py +0 -0
  272. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/services/test_trainer_services_server.py +0 -0
  273. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/trainer/test_trainer_tools.py +0 -0
  274. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/__init__.py +0 -0
  275. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_computational_graph_utils_unit.py +0 -0
  276. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_logs_unit.py +0 -0
  277. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_modules_dependencies_unit.py +0 -0
  278. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_render_unit.py +0 -0
  279. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_plot_graph_unit.py +0 -0
  280. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_shape_prop_unit.py +0 -0
  281. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/utils/test_utils_tools_unit.py +0 -0
  282. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/__init__.py +0 -0
  283. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/test_lock_monitor.py +0 -0
  284. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/tests/watchdog/test_watchdog.py +0 -0
  285. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/__init__.py +0 -0
  286. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/experiment_context.py +0 -0
  287. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/__init__.py +0 -0
  288. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/__init__.py +0 -0
  289. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/agent.png +0 -0
  290. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/query_example.png +0 -0
  291. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/agent_overview/schema.png +0 -0
  292. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent/intent_prompt.py +0 -0
  293. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/agent_service.py +0 -0
  294. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/data_image_utils.py +0 -0
  295. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/experiment_service.py +0 -0
  296. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/instance_merger.py +0 -0
  297. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/model_service.py +0 -0
  298. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/utils/__init__.py +0 -0
  299. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/services/utils/tools.py +0 -0
  300. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/trainer/trainer_tools.py +0 -0
  301. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/Dockerfile +0 -0
  302. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/.dockerignore +0 -0
  303. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/.env.example +0 -0
  304. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/docker-compose.yml +0 -0
  305. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf copy.template +0 -0
  306. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.base-path.conf.template +0 -0
  307. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/docker/nginx.conf +0 -0
  308. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_plaintext.yaml +0 -0
  309. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.downstream_upstream_plaintext.yaml +0 -0
  310. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.upstream_plaintext.yaml +0 -0
  311. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/envoy/envoy.yaml +0 -0
  312. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/ui/nginx.conf +0 -0
  313. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/__init__.py +0 -0
  314. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/computational_graph.py +0 -0
  315. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/logs.py +0 -0
  316. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/modules_dependencies.py +0 -0
  317. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/plot_graph.py +0 -0
  318. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/shape_prop.py +0 -0
  319. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/utils/tools.py +0 -0
  320. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/__init__.py +0 -0
  321. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/grpc_watchdog.py +0 -0
  322. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/lock_monitor.py +0 -0
  323. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/log_level.py +0 -0
  324. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab/watchdog/watchdog.py +0 -0
  325. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/dependency_links.txt +0 -0
  326. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/entry_points.txt +0 -0
  327. {weightslab-1.2.0 → weightslab-1.2.2}/weightslab.egg-info/top_level.txt +0 -0
@@ -133,13 +133,17 @@ jobs:
133
133
  - name: Install project dependencies
134
134
  run: |
135
135
  python -m pip install --upgrade pip
136
- python -m pip install . --extra-index-url https://download.pytorch.org/whl/cpu
136
+ # Install the test extra so pytest, graphviz, torchmetrics,
137
+ # pytorch-lightning and tensorboard are available (several test modules
138
+ # import pytest / use pytest fixtures and cannot run under bare unittest).
139
+ python -m pip install '.[utest]' --extra-index-url https://download.pytorch.org/whl/cpu
140
+ python -m pip install pytest-timeout
137
141
 
138
142
  - name: Run unit tests - General
139
143
  run: |
140
144
  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
145
+ # A per-test timeout guards against any regression that hangs a test.
146
+ python -m pytest ./weightslab/tests -v --timeout=300
143
147
 
144
148
  # TODO (GP): WL CI do not find WS CI for now; token or visibility problem ??
145
149
  # - name: Trigger WeightsStudio CI
@@ -213,7 +213,7 @@ jobs:
213
213
 
214
214
  export PRS_JSON
215
215
  PRS_JSON=$(gh pr list --state merged --base "dev" --limit 100 \
216
- --json number,title,mergedAt,url,author \
216
+ --json number,title,mergedAt,url,author,body \
217
217
  2>/dev/null || echo "[]")
218
218
 
219
219
  python3 << 'PYEOF'
@@ -227,12 +227,17 @@ jobs:
227
227
  prs_data = json.loads(os.environ.get("PRS_JSON", "[]"))
228
228
  except Exception:
229
229
  prs_data = []
230
+ def _pr_entry(pr):
231
+ line = f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
232
+ desc = " ".join((pr.get("body") or "").split()) # collapse newlines/whitespace
233
+ if desc:
234
+ if len(desc) > 512:
235
+ desc = desc[:509].rstrip() + "..."
236
+ line += f"\n\n > {desc}"
237
+ return line
230
238
  filtered = [pr for pr in prs_data if pr.get("mergedAt", "") > prev_date]
231
239
  if filtered:
232
- prs_lines = "\n".join(
233
- f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
234
- for pr in filtered
235
- )
240
+ prs_lines = "\n".join(_pr_entry(pr) for pr in filtered)
236
241
  seen, clabels = set(), []
237
242
  for pr in filtered:
238
243
  login = pr.get("author", {}).get("login", "")
@@ -436,7 +441,7 @@ jobs:
436
441
 
437
442
  export PRS_JSON
438
443
  PRS_JSON=$(gh pr list --state merged --base "main" --limit 100 \
439
- --json number,title,mergedAt,url,author \
444
+ --json number,title,mergedAt,url,author,body \
440
445
  2>/dev/null || echo "[]")
441
446
 
442
447
  python3 << 'PYEOF'
@@ -450,12 +455,17 @@ jobs:
450
455
  prs_data = json.loads(os.environ.get("PRS_JSON", "[]"))
451
456
  except Exception:
452
457
  prs_data = []
458
+ def _pr_entry(pr):
459
+ line = f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
460
+ desc = " ".join((pr.get("body") or "").split()) # collapse newlines/whitespace
461
+ if desc:
462
+ if len(desc) > 512:
463
+ desc = desc[:509].rstrip() + "..."
464
+ line += f"\n\n > {desc}"
465
+ return line
453
466
  filtered = [pr for pr in prs_data if pr.get("mergedAt", "") > prev_date]
454
467
  if filtered:
455
- prs_lines = "\n".join(
456
- f"- [#{pr['number']}]({pr['url']}) {pr['title']} — {pr['mergedAt'][:10]}"
457
- for pr in filtered
458
- )
468
+ prs_lines = "\n".join(_pr_entry(pr) for pr in filtered)
459
469
  seen, clabels = set(), []
460
470
  for pr in filtered:
461
471
  login = pr.get("author", {}).get("login", "")
@@ -48,6 +48,7 @@ _version.py
48
48
  *.log
49
49
  *.csv
50
50
  *.sqlite
51
+ *.txt
51
52
  *.db
52
53
  *.ipynb_checkpoints
53
54
  *.code-workspace
@@ -71,3 +72,5 @@ weightslab/ui/certs/*.srl
71
72
  # Ignore documentation build artifacts
72
73
  _build
73
74
  generated
75
+
76
+ 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.2 (1)