x4d-devkit 0.43.0rc2__tar.gz → 0.43.0rc3__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 (127) hide show
  1. {x4d_devkit-0.43.0rc2/x4d_devkit.egg-info → x4d_devkit-0.43.0rc3}/PKG-INFO +1 -1
  2. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/pyproject.toml +1 -1
  3. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_clean_basemap.py +49 -0
  4. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_sdk_api.py +1 -1
  5. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/clean_basemap.py +4 -4
  6. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3/x4d_devkit.egg-info}/PKG-INFO +1 -1
  7. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/LICENSE +0 -0
  8. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/README.md +0 -0
  9. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/setup.cfg +0 -0
  10. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_annotation_contract.py +0 -0
  11. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_annotation_reference.py +0 -0
  12. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_assets_client.py +0 -0
  13. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_boundary.py +0 -0
  14. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_box.py +0 -0
  15. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_build_info.py +0 -0
  16. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_clean_basemap_client.py +0 -0
  17. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_cli_auth.py +0 -0
  18. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_client_json_contract.py +0 -0
  19. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_client_projects.py +0 -0
  20. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_clip_archives.py +0 -0
  21. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_contract_validation.py +0 -0
  22. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_coordinate_frames.py +0 -0
  23. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_current_state.py +0 -0
  24. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_current_state_identity_consumers_example.py +0 -0
  25. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_dataset_contract.py +0 -0
  26. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_dataset_identity.py +0 -0
  27. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_detection_eval.py +0 -0
  28. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_evaluate.py +0 -0
  29. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_export_bundle.py +0 -0
  30. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_image_review.py +0 -0
  31. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_inference_input.py +0 -0
  32. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_inference_schemas.py +0 -0
  33. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_inference_service.py +0 -0
  34. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_label_schemas.py +0 -0
  35. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_lidar_materialization.py +0 -0
  36. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_loader.py +0 -0
  37. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_matching.py +0 -0
  38. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_metrics.py +0 -0
  39. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_models.py +0 -0
  40. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_platform_pose.py +0 -0
  41. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_preannotation_client.py +0 -0
  42. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_reconstruction_client.py +0 -0
  43. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_release_gate.py +0 -0
  44. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_roadmark_preview.py +0 -0
  45. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_semantic_scene_authoring.py +0 -0
  46. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_semantic_scene_client.py +0 -0
  47. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_semantic_scene_contract.py +0 -0
  48. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_semantic_scene_native_clip.py +0 -0
  49. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_time_contract.py +0 -0
  50. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_token.py +0 -0
  51. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_tracking_eval.py +0 -0
  52. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_training_identity.py +0 -0
  53. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_transform.py +0 -0
  54. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_transform_chain.py +0 -0
  55. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_validation.py +0 -0
  56. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/tests/test_work_session.py +0 -0
  57. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/__init__.py +0 -0
  58. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/annotation_contract.py +0 -0
  59. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/annotation_reference.py +0 -0
  60. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/build_info.py +0 -0
  61. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/cli.py +0 -0
  62. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/__init__.py +0 -0
  63. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/_origin.py +0 -0
  64. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/annotation_reference.py +0 -0
  65. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/assets.py +0 -0
  66. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/bags.py +0 -0
  67. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/capabilities.py +0 -0
  68. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/checkpoints.py +0 -0
  69. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/clean_basemap.py +0 -0
  70. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/client.py +0 -0
  71. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/clip_work_sessions.py +0 -0
  72. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/clips.py +0 -0
  73. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/dataset_identity.py +0 -0
  74. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/image_review.py +0 -0
  75. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/label_schemas.py +0 -0
  76. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/preannotation.py +0 -0
  77. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/projects.py +0 -0
  78. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/reconstruction.py +0 -0
  79. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/semantic_scene.py +0 -0
  80. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/semantic_scene_authoring.py +0 -0
  81. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/services.py +0 -0
  82. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/client/test_sets.py +0 -0
  83. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/consumer_identity.py +0 -0
  84. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/coordinate_contract.py +0 -0
  85. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/core/__init__.py +0 -0
  86. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/core/loader.py +0 -0
  87. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/core/models.py +0 -0
  88. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/core/token.py +0 -0
  89. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/core/transform.py +0 -0
  90. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/current_state.py +0 -0
  91. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/dataset_contract.py +0 -0
  92. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/dataset_identity.py +0 -0
  93. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/__init__.py +0 -0
  94. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/api.py +0 -0
  95. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/box.py +0 -0
  96. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/detection.py +0 -0
  97. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/matching.py +0 -0
  98. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/metrics.py +0 -0
  99. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/eval/tracking.py +0 -0
  100. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/export_bundle.py +0 -0
  101. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/image_review.py +0 -0
  102. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/__init__.py +0 -0
  103. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/input.py +0 -0
  104. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/models.py +0 -0
  105. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/schemas.py +0 -0
  106. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/service.py +0 -0
  107. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/inference/tasks.py +0 -0
  108. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/json_contract.py +0 -0
  109. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/label_schema.py +0 -0
  110. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/lidar_materialization.py +0 -0
  111. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/materialize.py +0 -0
  112. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/roadmark_preview.py +0 -0
  113. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/semantic_scene_authoring.py +0 -0
  114. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/semantic_scene_contract.py +0 -0
  115. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/time_contract.py +0 -0
  116. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/training_identity.py +0 -0
  117. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/validation/__init__.py +0 -0
  118. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/validation/contract.py +0 -0
  119. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/validation/platform_pose.py +0 -0
  120. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/validation/report.py +0 -0
  121. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/validation/validator.py +0 -0
  122. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit/work_session.py +0 -0
  123. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit.egg-info/SOURCES.txt +0 -0
  124. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit.egg-info/dependency_links.txt +0 -0
  125. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit.egg-info/entry_points.txt +0 -0
  126. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit.egg-info/requires.txt +0 -0
  127. {x4d_devkit-0.43.0rc2 → x4d_devkit-0.43.0rc3}/x4d_devkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: x4d-devkit
3
- Version: 0.43.0rc2
3
+ Version: 0.43.0rc3
4
4
  Summary: Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation
5
5
  Author: windzu
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "x4d-devkit"
7
- version = "0.43.0rc2"
7
+ version = "0.43.0rc3"
8
8
  description = "Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -10,6 +10,7 @@ from x4d_devkit.clean_basemap import (
10
10
  CLEAN_BASEMAP_CONTRACT_VERSION,
11
11
  CLEAN_BASEMAP_INPUT_FIELDS,
12
12
  DECISION_CODES,
13
+ KEEP_CODES,
13
14
  KEEP_GROUND,
14
15
  MAPPING_DTYPE,
15
16
  REMOVE_MODEL_DYNAMIC,
@@ -308,6 +309,54 @@ def test_previous_contract_and_decision_bytes_are_rejected():
308
309
  )
309
310
 
310
311
 
312
+ @pytest.mark.parametrize("family", ["decisions", "mapping"])
313
+ def test_every_byte_in_the_last_record_obeys_its_exact_decision_domain(family):
314
+ count = 4096
315
+ anchor = "sha256:" + "a" * 64
316
+ if family == "decisions":
317
+ carrier = encode_clean_basemap_decisions(
318
+ asset_sha256=anchor, decisions=np.full(count, KEEP_GROUND)
319
+ )
320
+ domain = DECISION_CODES
321
+ decode = decode_clean_basemap_decisions
322
+ arguments = dict(asset_sha256=anchor, point_count=count)
323
+ byte_offset = -1
324
+ else:
325
+ carrier = encode_clean_basemap_mapping(
326
+ geometry_raw_sha256=anchor,
327
+ sweep_indices=np.zeros(count, dtype=np.uint32),
328
+ raw_point_ordinals=np.arange(count),
329
+ timestamps_ns=np.full(count, 100),
330
+ owner_source_indices=np.zeros(count, dtype=np.uint32),
331
+ owner_point_ordinals=np.arange(count),
332
+ decisions=np.full(count, KEEP_GROUND),
333
+ )
334
+ domain = KEEP_CODES
335
+ decode = decode_clean_basemap_mapping
336
+ arguments = dict(geometry_raw_sha256=anchor, point_count=count)
337
+ byte_offset = -MAPPING_DTYPE.itemsize + MAPPING_DTYPE.fields["decision"][1]
338
+ raw = bytearray(zstandard.ZstdDecompressor().decompress(carrier.payload))
339
+ for code in range(256):
340
+ raw[byte_offset] = code
341
+ payload = zstandard.ZstdCompressor().compress(raw)
342
+ descriptor = carrier.descriptor(family)
343
+ descriptor.update(
344
+ path=f"generated/reconstruction/clean_basemap/{family}/{sha256_bytes(payload)[7:]}.zst",
345
+ sha256=sha256_bytes(payload),
346
+ raw_sha256=sha256_bytes(bytes(raw)),
347
+ size_bytes=len(payload),
348
+ )
349
+ if code in domain:
350
+ values = decode(payload, descriptor=descriptor, **arguments)
351
+ decisions = values if family == "decisions" else values["decision"]
352
+ assert decisions[-1] == code
353
+ assert np.all(decisions[:-1] == KEEP_GROUND)
354
+ else:
355
+ message = "decision" if family == "decisions" else "mapping records"
356
+ with pytest.raises(ValueError, match=message):
357
+ decode(payload, descriptor=descriptor, **arguments)
358
+
359
+
311
360
  def test_pose_coverage_rejections_are_accounted_and_cannot_be_mapped():
312
361
  manifest, assets, _ = fixture()
313
362
  sweep = manifest["sweep_sources"][0]
@@ -11,7 +11,7 @@ from x4d_devkit.eval.matching import MetricData
11
11
 
12
12
 
13
13
  def test_package_version_is_current_release():
14
- assert x4d_devkit.__version__ == "0.43.0rc2"
14
+ assert x4d_devkit.__version__ == "0.43.0rc3"
15
15
 
16
16
 
17
17
  def test_loader_exposes_and_enforces_only_current_schema(tmp_path):
@@ -530,7 +530,7 @@ def encode_clean_basemap_mapping(
530
530
  _integer(count, 1, SEMANTIC_SCENE_MAX_SCENE_POINTS_PER_CHUNK, "point_count")
531
531
  if (
532
532
  any(len(vector) != count for vector in vectors.values())
533
- or not set(int(v) for v in vectors["decision"]) <= KEEP_CODES
533
+ or np.any(~np.isin(vectors["decision"], tuple(KEEP_CODES)))
534
534
  ):
535
535
  raise ValueError(
536
536
  "mapping must have one retained decision and address per geometry point"
@@ -560,7 +560,7 @@ def decode_clean_basemap_mapping(
560
560
  )
561
561
  if (
562
562
  np.any(records["reserved"] != 0)
563
- or not set(int(v) for v in records["decision"]) <= KEEP_CODES
563
+ or np.any(~np.isin(records["decision"], tuple(KEEP_CODES)))
564
564
  or np.any(records["timestamp_ns"] > _MAX_I64)
565
565
  ):
566
566
  raise ValueError(
@@ -574,7 +574,7 @@ def encode_clean_basemap_decisions(
574
574
  ) -> CleanBasemapPayload:
575
575
  values = _vector(decisions, 255, "decisions")
576
576
  _integer(len(values), 1, 1 << 24, "source_point_count")
577
- if not set(int(v) for v in values) <= DECISION_CODES:
577
+ if np.any(~np.isin(values, tuple(DECISION_CODES))):
578
578
  raise ValueError("unknown clean basemap decision code")
579
579
  return _encode(_DECISION_MAGIC, asset_sha256, values.astype(np.uint8))
580
580
 
@@ -591,7 +591,7 @@ def decode_clean_basemap_decisions(
591
591
  values = _decode(
592
592
  payload, descriptor, _DECISION_MAGIC, asset_sha256, point_count, np.dtype("u1")
593
593
  )
594
- if not set(int(v) for v in values) <= DECISION_CODES:
594
+ if np.any(~np.isin(values, tuple(DECISION_CODES))):
595
595
  raise ValueError("unknown clean basemap decision code")
596
596
  return values
597
597
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: x4d-devkit
3
- Version: 0.43.0rc2
3
+ Version: 0.43.0rc3
4
4
  Summary: Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation
5
5
  Author: windzu
6
6
  License-Expression: Apache-2.0
File without changes
File without changes
File without changes