dhb-xr 0.2.1__py3-none-any.whl

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 (82) hide show
  1. dhb_xr/__init__.py +61 -0
  2. dhb_xr/cli.py +206 -0
  3. dhb_xr/core/__init__.py +28 -0
  4. dhb_xr/core/geometry.py +167 -0
  5. dhb_xr/core/geometry_torch.py +77 -0
  6. dhb_xr/core/types.py +113 -0
  7. dhb_xr/database/__init__.py +10 -0
  8. dhb_xr/database/motion_db.py +79 -0
  9. dhb_xr/database/retrieval.py +6 -0
  10. dhb_xr/database/similarity.py +71 -0
  11. dhb_xr/decoder/__init__.py +13 -0
  12. dhb_xr/decoder/decoder_torch.py +52 -0
  13. dhb_xr/decoder/dhb_dr.py +261 -0
  14. dhb_xr/decoder/dhb_qr.py +89 -0
  15. dhb_xr/encoder/__init__.py +27 -0
  16. dhb_xr/encoder/dhb_dr.py +418 -0
  17. dhb_xr/encoder/dhb_qr.py +129 -0
  18. dhb_xr/encoder/dhb_ti.py +204 -0
  19. dhb_xr/encoder/encoder_torch.py +54 -0
  20. dhb_xr/encoder/padding.py +82 -0
  21. dhb_xr/generative/__init__.py +78 -0
  22. dhb_xr/generative/flow_matching.py +705 -0
  23. dhb_xr/generative/latent_encoder.py +536 -0
  24. dhb_xr/generative/sampling.py +203 -0
  25. dhb_xr/generative/training.py +475 -0
  26. dhb_xr/generative/vfm_tokenizer.py +485 -0
  27. dhb_xr/integration/__init__.py +13 -0
  28. dhb_xr/integration/vla/__init__.py +11 -0
  29. dhb_xr/integration/vla/libero.py +132 -0
  30. dhb_xr/integration/vla/pipeline.py +85 -0
  31. dhb_xr/integration/vla/robocasa.py +85 -0
  32. dhb_xr/losses/__init__.py +16 -0
  33. dhb_xr/losses/geodesic_loss.py +91 -0
  34. dhb_xr/losses/hybrid_loss.py +36 -0
  35. dhb_xr/losses/invariant_loss.py +73 -0
  36. dhb_xr/optimization/__init__.py +72 -0
  37. dhb_xr/optimization/casadi_solver.py +342 -0
  38. dhb_xr/optimization/constraints.py +32 -0
  39. dhb_xr/optimization/cusadi_solver.py +311 -0
  40. dhb_xr/optimization/export_casadi_decode.py +111 -0
  41. dhb_xr/optimization/fatrop_solver.py +477 -0
  42. dhb_xr/optimization/torch_solver.py +85 -0
  43. dhb_xr/preprocessing/__init__.py +42 -0
  44. dhb_xr/preprocessing/diagnostics.py +330 -0
  45. dhb_xr/preprocessing/trajectory_cleaner.py +485 -0
  46. dhb_xr/tokenization/__init__.py +56 -0
  47. dhb_xr/tokenization/causal_encoder.py +54 -0
  48. dhb_xr/tokenization/compression.py +749 -0
  49. dhb_xr/tokenization/hierarchical.py +359 -0
  50. dhb_xr/tokenization/rvq.py +178 -0
  51. dhb_xr/tokenization/vqvae.py +155 -0
  52. dhb_xr/utils/__init__.py +24 -0
  53. dhb_xr/utils/io.py +59 -0
  54. dhb_xr/utils/resampling.py +66 -0
  55. dhb_xr/utils/xdof_loader.py +89 -0
  56. dhb_xr/visualization/__init__.py +5 -0
  57. dhb_xr/visualization/plot.py +242 -0
  58. dhb_xr-0.2.1.dist-info/METADATA +784 -0
  59. dhb_xr-0.2.1.dist-info/RECORD +82 -0
  60. dhb_xr-0.2.1.dist-info/WHEEL +5 -0
  61. dhb_xr-0.2.1.dist-info/entry_points.txt +2 -0
  62. dhb_xr-0.2.1.dist-info/top_level.txt +3 -0
  63. examples/__init__.py +54 -0
  64. examples/basic_encoding.py +82 -0
  65. examples/benchmark_backends.py +37 -0
  66. examples/dhb_qr_comparison.py +79 -0
  67. examples/dhb_ti_time_invariant.py +72 -0
  68. examples/gpu_batch_optimization.py +102 -0
  69. examples/imitation_learning.py +53 -0
  70. examples/integration/__init__.py +19 -0
  71. examples/integration/libero_full_demo.py +692 -0
  72. examples/integration/libero_pro_dhb_demo.py +1063 -0
  73. examples/integration/libero_simulation_demo.py +286 -0
  74. examples/integration/libero_swap_demo.py +534 -0
  75. examples/integration/robocasa_libero_dhb_pipeline.py +56 -0
  76. examples/integration/test_libero_adapter.py +47 -0
  77. examples/integration/test_libero_encoding.py +75 -0
  78. examples/integration/test_libero_retrieval.py +105 -0
  79. examples/motion_database.py +88 -0
  80. examples/trajectory_adaptation.py +85 -0
  81. examples/vla_tokenization.py +107 -0
  82. notebooks/__init__.py +24 -0
@@ -0,0 +1,82 @@
1
+ dhb_xr/__init__.py,sha256=OGQACX9IP1hbUMgUDIOEGBlEbRFXNd2nncxJL5qOhwk,1381
2
+ dhb_xr/cli.py,sha256=BijyoMJN6K1VtbTAuDnMQa8_2x60zfRrJRmz-lYj6RY,7021
3
+ dhb_xr/core/__init__.py,sha256=hJYdZzd9gz7O8K1FuE_qE981sr_-2q_gLDTRz9COv7E,593
4
+ dhb_xr/core/geometry.py,sha256=UMkoS_zkKnPeT4KFJJwyNCxCESIXsFVFcmIF2Q_c2go,5090
5
+ dhb_xr/core/geometry_torch.py,sha256=0dUt_00r6v1bPugd3943mEPNJyRh1oF4QhhUewwhpV0,2832
6
+ dhb_xr/core/types.py,sha256=YdU6UpieQD0YjUKJox3cDLHxa7fHpBljO88c6fYd8rc,3671
7
+ dhb_xr/database/__init__.py,sha256=32HgJVcHcoLVevq1RioM0BJUl-wNRLu9QCln0RHFh4k,315
8
+ dhb_xr/database/motion_db.py,sha256=pnTrcXuswITtapUGKb2EWIaGfsd7c30mtlEEcVj2zv0,3099
9
+ dhb_xr/database/retrieval.py,sha256=e4_pewBFtQGAhPeiOAZfoQjQWlrjoD13qzlw2Dt3pVg,279
10
+ dhb_xr/database/similarity.py,sha256=rNtZEJJCAUuiX3rE_u-zEpW1gmDIa_Fwl68NoWMF9RM,2531
11
+ dhb_xr/decoder/__init__.py,sha256=I9h9Nzzu6ZTrZlFHVzBb-okNEJueSk3R3SLAipCGTlw,262
12
+ dhb_xr/decoder/decoder_torch.py,sha256=KVXgG3n9fDQeIsAqy_6R2V5lB6wrgG8OxLzeSo2C2lY,2133
13
+ dhb_xr/decoder/dhb_dr.py,sha256=dmkxLzUM1YmbKFtoOZ7hsLG0YW_nFxAlF4XsyA7BwMQ,9375
14
+ dhb_xr/decoder/dhb_qr.py,sha256=U-5YBFTGtUqpl3nVCf6pQIkQRf46sREknJ1mWZhb1WI,2969
15
+ dhb_xr/encoder/__init__.py,sha256=j69h5aslEbpBoEiYv0oqKMhMox_2KoBpbMEIqr3Be9E,691
16
+ dhb_xr/encoder/dhb_dr.py,sha256=ogLzF1Kx9-eFTtKSGoXgB65GQhMWRSpP4ql5KtANtRg,15448
17
+ dhb_xr/encoder/dhb_qr.py,sha256=LnBczpW9nRyM5GgGUHfvcWYuB6h46o95tNXzXMK8yQI,4580
18
+ dhb_xr/encoder/dhb_ti.py,sha256=P2QiZy2_7JWYEYDNpbGAzArnCZxDi_2iz2-8DtiWjrs,6611
19
+ dhb_xr/encoder/encoder_torch.py,sha256=LM-B6gTAkxcyxZWThJ5EXamvuithnVd_mbKnqGxAIPo,1986
20
+ dhb_xr/encoder/padding.py,sha256=vq9XtHBOayq94sTnc9BU4AR6wB0fGGivcRlPgu-g5iA,2741
21
+ dhb_xr/generative/__init__.py,sha256=acS5iNWRcWmJ-AlWKu7P8qpoER5QXi3f4D6FLePtdic,2269
22
+ dhb_xr/generative/flow_matching.py,sha256=tSryjgekkCGjTUgMHNd8Xw7oQIpHN6cypZ7OaR5VmAU,21442
23
+ dhb_xr/generative/latent_encoder.py,sha256=oREET0kAyE4z38s0lkMRzlrVJKCi2g6B--peWPmr6BU,16123
24
+ dhb_xr/generative/sampling.py,sha256=uIkOywq9_6m_YrKjhAQXv1SlvDzqHG5I3XdLs-dHlyw,5653
25
+ dhb_xr/generative/training.py,sha256=bVT9DhQxEJ2cL0pkKtve3J3vmeBfaf1ZLv7U4Vjv6Eg,14559
26
+ dhb_xr/generative/vfm_tokenizer.py,sha256=agH_0ok0EwR9b79Eo9651gtq4CKI6qzaF-VfsLGt3aU,15807
27
+ dhb_xr/integration/__init__.py,sha256=1nscdikjCAKmO0NHKQ0heFGYHVDRE9pRRLDsM0khFxU,234
28
+ dhb_xr/integration/vla/__init__.py,sha256=iw4SRn1Dbxjw5O5GgN71kRgMNbZnAh2-9SFJyjCqB48,291
29
+ dhb_xr/integration/vla/libero.py,sha256=dYjl9GB4_0HneZXxW4NpvrvefUwQmFOXUh1jcT047-8,4398
30
+ dhb_xr/integration/vla/pipeline.py,sha256=econak0wm-y8rrZvbRnwc9Ky7UFHYFIFho85EKdMx-E,2969
31
+ dhb_xr/integration/vla/robocasa.py,sha256=TfN_G4PWR1rME67gvaPfvE6QnOnbe0RHmUkYkvUza9U,2561
32
+ dhb_xr/losses/__init__.py,sha256=k0h45G3izn-mnLYG2gQaXnjULd3fBQasPP5pe3vdM4I,468
33
+ dhb_xr/losses/geodesic_loss.py,sha256=vlSnXDWqC1QLFzCQjMEDapKXlTTkDq5N83qaYXBEaRA,3030
34
+ dhb_xr/losses/hybrid_loss.py,sha256=sfMfSOEBUjWXRykD9XrJpLBf5wmf_VNwy_YZ06nST8w,1328
35
+ dhb_xr/losses/invariant_loss.py,sha256=FHLzlDWPjqHAa92XEv0_DPJWx0VM3zXvTgkFGCWhx3w,2627
36
+ dhb_xr/optimization/__init__.py,sha256=Ff5i4CpxtmaDl9TGdoByuBA4uWVfeIafOAYCfCqx4A4,2532
37
+ dhb_xr/optimization/casadi_solver.py,sha256=BQtKG8bu2lVUQc7S9-8rwsNbZVF8cWg7OSRZKZyTm4Q,12966
38
+ dhb_xr/optimization/constraints.py,sha256=MVrHJGHDT0D2aRfR1PmvCaEKxcvJxJZu8A_l1mr7ZwA,1046
39
+ dhb_xr/optimization/cusadi_solver.py,sha256=MYwNhC91mT2r23jk8jJcdljz_UOLVyuEHyxuRF-tovM,11297
40
+ dhb_xr/optimization/export_casadi_decode.py,sha256=sV3SjhRKaulIyCyqGCYeOGFYkrjKIPkNscZnmCxiZL4,3586
41
+ dhb_xr/optimization/fatrop_solver.py,sha256=49LlbsXjVPUx4B6WPCb33rFxry3VQW7NioI-eK9cU5k,16861
42
+ dhb_xr/optimization/torch_solver.py,sha256=YPnv3NR6zyC5eFim6-FUexHMR-1p3sFS0G1OCQRirbc,3536
43
+ dhb_xr/preprocessing/__init__.py,sha256=nJars3sC7erIn4vbbQkZKm9OGOteyerbHzDnoA6Tb2Q,1263
44
+ dhb_xr/preprocessing/diagnostics.py,sha256=ZNYdJjlcXHM1Gtm9MNoD922D5iEsUdHuAnKLaOO670Q,10986
45
+ dhb_xr/preprocessing/trajectory_cleaner.py,sha256=CZASDH35e9WrLS8uaaRg3ZRwEXke-6nvUck13mj3iW4,17036
46
+ dhb_xr/tokenization/__init__.py,sha256=YTr5Kg7mkkWbEBhVFXQErfKw-yGFv5A8Tb3tLpz9v54,1459
47
+ dhb_xr/tokenization/causal_encoder.py,sha256=rWm4vryH9NpNks3omr7aRBPk9ByhumHABpoTf1pkIPM,1681
48
+ dhb_xr/tokenization/compression.py,sha256=I-2QnB1bZpnvNucz6gWkFtuYhHS9uLudAOsbgoiZ_G0,25117
49
+ dhb_xr/tokenization/hierarchical.py,sha256=B8I0dZFZApPvH1ouAlUXYRBclcUTaygQQJ_r0fffL5k,13323
50
+ dhb_xr/tokenization/rvq.py,sha256=QMNqtjnKOF1oA10fD28rfODrOHoz_x9AUUPViuW7b8Q,5900
51
+ dhb_xr/tokenization/vqvae.py,sha256=duxkeqtznH6At2i6Cly_0eH6Tezc9YGe9PzWThrJfrA,5021
52
+ dhb_xr/utils/__init__.py,sha256=7y-Dqrb4yxxLsv2pUFKrayLtCdwpRVUCXi1oRE6SMuI,559
53
+ dhb_xr/utils/io.py,sha256=MbEQEqnqdl6_DHA31Ey98Uc-2ZCeyUfO-oQqRVdhR8U,2195
54
+ dhb_xr/utils/resampling.py,sha256=wlMt4rhqeeAH51uBxRYllpIZIE1xE0xSgFLB4OczyOU,2615
55
+ dhb_xr/utils/xdof_loader.py,sha256=uSbW_-l9PofC6KKqELY5JlKwgTqqkN4jE5_0HkgEgIk,2887
56
+ dhb_xr/visualization/__init__.py,sha256=ZnevC1zP2XqeTUXvH8zbbZdNs9YFQkCmlh3MjCao388,189
57
+ dhb_xr/visualization/plot.py,sha256=kqg-rNSqHvrP5-jCFkAWxvshBsE1py3MDGgZKSkZXYg,8083
58
+ examples/__init__.py,sha256=Lg0Tu6f20oyoCxWyl7MFDmgT6KYJL6Jd7zGG7SnRyJc,2077
59
+ examples/basic_encoding.py,sha256=XHytFrSEBcznmDSQbW_U_70qp7zet2mIjUjd_-eOcKw,2591
60
+ examples/benchmark_backends.py,sha256=6mvc0douictQ7zhaiQ5zHj9GvbhhSoDf4x0lgXELdcs,1233
61
+ examples/dhb_qr_comparison.py,sha256=xPLfA0ysAoytJHqdxLZELYk2QlEEGpVOodRUDCJYawo,2697
62
+ examples/dhb_ti_time_invariant.py,sha256=i0vz-pQTnddiQ-s0DpjpR8yT0i9Ic0aGRDmV8S2TrOc,2822
63
+ examples/gpu_batch_optimization.py,sha256=jv-Am9p5q4StK8FOpCiAVBpOMxWGLsu7mT7mLkJI2RI,3119
64
+ examples/imitation_learning.py,sha256=yWgZD0qIFJK2QMzMV_UWWnHi-S3EIaiNbvp1Qym3zkE,1879
65
+ examples/motion_database.py,sha256=Wvtc2bowMkdrNJJrVt-ORYGBY03OdKgD54RDvYmQlco,2891
66
+ examples/trajectory_adaptation.py,sha256=B6RRHHuc-JcOTQLZjv5U8UVwL4wVd6ZaZcga_P2rsec,2615
67
+ examples/vla_tokenization.py,sha256=TWejgxv5c9X8IJwNK3GR_5fmiVyBqPI7qaeqaquAk74,3239
68
+ examples/integration/__init__.py,sha256=SFF025lM9aV02z9QwKm4rrk6aUD0wy-9RjwRgQ8Gf0o,674
69
+ examples/integration/libero_full_demo.py,sha256=tgmtXjbdR4U3GI4trBI62ar8HlGeWOxHBMIBCDdRuC4,24601
70
+ examples/integration/libero_pro_dhb_demo.py,sha256=QT03UvkInuoPCtWM-9x7iF7R13JstiX1wfDQccBdi7U,44642
71
+ examples/integration/libero_simulation_demo.py,sha256=mIQVU1EnwMcgVhR318gcNN306miBt_yBdaCg6tjBQwQ,8869
72
+ examples/integration/libero_swap_demo.py,sha256=JqgnxGYLJ6LdQKb_1EQLvjQLf8-Wnpv6R-5MvDnechA,23422
73
+ examples/integration/robocasa_libero_dhb_pipeline.py,sha256=WXR8LcPwMg_rrGxjLG0kjfpivH9RFiKCp7k1xZGKCf4,2103
74
+ examples/integration/test_libero_adapter.py,sha256=JtY1__4cXNSiXf0e52J3_SAecBU2qGQvUiyrZ_GGVVk,1837
75
+ examples/integration/test_libero_encoding.py,sha256=Zc7O5UGkTKyJSjzM-hrgGkt7Y8JQScwtqU1pg-Ak-4E,2654
76
+ examples/integration/test_libero_retrieval.py,sha256=xYPpq6iLGTbO4VT6gWuV-q5eCG4tjaUtWtI4QFbMC-o,3264
77
+ notebooks/__init__.py,sha256=1wsz8H_tTQauGz70WLbu0sabmVXSczWgIz48lZH97Sw,678
78
+ dhb_xr-0.2.1.dist-info/METADATA,sha256=AJoBsoNzwCnnJ20SajWHqqnTzKj84b3zf_DgQTL7yz8,27562
79
+ dhb_xr-0.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
80
+ dhb_xr-0.2.1.dist-info/entry_points.txt,sha256=o5_lMpoEN0MDfU478Wi7eJc3oDa9OedgalKQ438KLJM,60
81
+ dhb_xr-0.2.1.dist-info/top_level.txt,sha256=dmAG5ym8zm7WzB1r3Gy9Sp9Tvux3k41TUEy-2P-VRXY,26
82
+ dhb_xr-0.2.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ dhb_xr-examples = dhb_xr.cli:examples_cmd
@@ -0,0 +1,3 @@
1
+ dhb_xr
2
+ examples
3
+ notebooks
examples/__init__.py ADDED
@@ -0,0 +1,54 @@
1
+ """
2
+ DHB-XR Examples Package
3
+
4
+ This package contains comprehensive examples demonstrating DHB-XR usage across
5
+ various robotics and VLA applications, including both Python scripts and Jupyter notebooks.
6
+
7
+ Quick Start Examples:
8
+ - basic_encoding: Core DHB-DR/DHB-QR encoding and decoding
9
+ - trajectory_adaptation: Retargeting trajectories to new poses
10
+ - dhb_qr_comparison: Comparing DHB-DR vs DHB-QR representations
11
+ - gpu_batch_optimization: Large-scale trajectory optimization
12
+ - vla_tokenization: DHB-Token for discrete action sequences
13
+ - motion_database: Similarity search and trajectory retrieval
14
+ - imitation_learning: Invariant-based imitation learning losses
15
+ - dhb_ti_time_invariant: Time-invariant reparameterization
16
+
17
+ VLA Integration Examples:
18
+ - libero_full_demo: Complete LIBERO simulation with DHB adaptation
19
+ - libero_pro_dhb_demo: LIBERO-PRO perturbation robustness testing
20
+ - libero_swap_demo: Spatial swap demonstration with naive vs DHB comparison
21
+ - robocasa_libero_dhb_pipeline: RoboCASA and LIBERO data processing pipeline
22
+
23
+ Tutorial Notebooks:
24
+ - tutorial_dhb_basics.ipynb: Basic encoding/decoding concepts
25
+ - tutorial_invariance_demo.ipynb: SE(3) invariance demonstration
26
+ - tutorial_umi_xdof_motion_analysis.ipynb: Real-world UMI dataset analysis
27
+ - demo_dhb_features_and_use_cases.ipynb: Comprehensive feature overview
28
+ - tutorial_vla_integration.ipynb: VLA integration with LIBERO/RoboCASA
29
+
30
+ Usage:
31
+ from dhb_xr_examples import *
32
+ # or import specific examples:
33
+ from dhb_xr_examples.basic_encoding import run_example
34
+
35
+ # Run notebooks with:
36
+ # jupyter notebook
37
+ # pixi run notebook
38
+ """
39
+
40
+ __version__ = "0.2.0"
41
+
42
+ # Convenience imports for common examples
43
+ from .basic_encoding import run_example as run_basic_encoding
44
+ from .trajectory_adaptation import run_example as run_trajectory_adaptation
45
+ from .dhb_qr_comparison import run_example as run_dhb_comparison
46
+
47
+ def __dir__():
48
+ """List all available examples."""
49
+ return [
50
+ 'run_basic_encoding',
51
+ 'run_trajectory_adaptation',
52
+ 'run_dhb_comparison',
53
+ # Add more as needed
54
+ ]
@@ -0,0 +1,82 @@
1
+ """
2
+ Basic DHB Encoding and Decoding Example
3
+
4
+ This example demonstrates the core DHB-XR functionality: encoding SE(3) trajectories
5
+ to invariant representations and decoding them back to poses.
6
+
7
+ The example:
8
+ 1. Creates a synthetic trajectory (50 poses with random walk positions)
9
+ 2. Encodes to DHB-DR invariants using double-reflection method
10
+ 3. Decodes back to reconstruct the original trajectory
11
+ 4. Shows the shape preservation of the roundtrip encoding/decoding
12
+ """
13
+
14
+ import numpy as np
15
+ from dhb_xr import encode_dhb_dr, decode_dhb_dr
16
+ from dhb_xr.core.types import DHBMethod, EncodingMethod
17
+
18
+
19
+ def run_example():
20
+ """Run the basic encoding/decoding example."""
21
+ print("DHB-XR Basic Encoding Example")
22
+ print("=" * 40)
23
+
24
+ # Create synthetic trajectory
25
+ np.random.seed(42)
26
+ n = 50
27
+ positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
28
+ quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
29
+
30
+ print(f"Original trajectory: {n} poses")
31
+ print(f"Positions shape: {positions.shape}")
32
+ print(f"Quaternions shape: {quaternions.shape}")
33
+
34
+ # Encode to DHB invariants
35
+ print("\nEncoding to DHB-DR invariants...")
36
+ out = encode_dhb_dr(
37
+ positions,
38
+ quaternions,
39
+ method=EncodingMethod.POSITION,
40
+ use_default_initial_frames=True,
41
+ dhb_method=DHBMethod.DOUBLE_REFLECTION,
42
+ )
43
+ print(f"Linear invariants shape: {out['linear_motion_invariants'].shape}")
44
+ print(f"Angular invariants shape: {out['angular_motion_invariants'].shape}")
45
+
46
+ # Decode back to poses
47
+ print("\nDecoding back to poses...")
48
+ decoded = decode_dhb_dr(
49
+ out["linear_motion_invariants"],
50
+ out["angular_motion_invariants"],
51
+ out["initial_pose"],
52
+ method=EncodingMethod.POSITION,
53
+ dhb_method=DHBMethod.DOUBLE_REFLECTION,
54
+ drop_padded=True,
55
+ )
56
+ print(f"Decoded positions shape: {decoded['positions'].shape}")
57
+ print(f"Decoded quaternions shape: {decoded['quaternions'].shape}")
58
+
59
+ # Check reconstruction quality
60
+ pos_error = np.mean(np.abs(positions - decoded["positions"]))
61
+ quat_error = np.mean(np.abs(quaternions - decoded["quaternions"]))
62
+
63
+ print("
64
+ Reconstruction errors:")
65
+ print(".2e")
66
+ print(".2e")
67
+
68
+ if pos_error < 1e-10 and quat_error < 1e-10:
69
+ print("✅ Perfect reconstruction (errors within numerical precision)")
70
+ else:
71
+ print("⚠️ Reconstruction has some error - check parameters")
72
+
73
+ return out, decoded
74
+
75
+
76
+ def main():
77
+ """Main function for command-line execution."""
78
+ run_example()
79
+
80
+
81
+ if __name__ == "__main__":
82
+ main()
@@ -0,0 +1,37 @@
1
+ """Benchmark encode/decode backends (numpy, optional torch/cpp)."""
2
+
3
+ import time
4
+ import numpy as np
5
+ from dhb_xr import encode_dhb_dr, decode_dhb_dr
6
+ from dhb_xr.core.types import DHBMethod, EncodingMethod
7
+
8
+ def main():
9
+ n = 100
10
+ np.random.seed(0)
11
+ positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
12
+ quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
13
+
14
+ # Encode
15
+ start = time.perf_counter()
16
+ for _ in range(50):
17
+ out = encode_dhb_dr(
18
+ positions, quaternions,
19
+ method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
20
+ )
21
+ elapsed = (time.perf_counter() - start) / 50
22
+ print(f"Encode (n={n}): {elapsed*1000:.2f} ms per call")
23
+
24
+ # Decode
25
+ start = time.perf_counter()
26
+ for _ in range(50):
27
+ decoded = decode_dhb_dr(
28
+ out["linear_motion_invariants"],
29
+ out["angular_motion_invariants"],
30
+ out["initial_pose"],
31
+ method=EncodingMethod.POSITION, dhb_method=DHBMethod.DOUBLE_REFLECTION, drop_padded=True,
32
+ )
33
+ elapsed = (time.perf_counter() - start) / 50
34
+ print(f"Decode: {elapsed*1000:.2f} ms per call")
35
+
36
+ if __name__ == "__main__":
37
+ main()
@@ -0,0 +1,79 @@
1
+ """
2
+ DHB-DR vs DHB-QR Comparison Example
3
+
4
+ This example compares the two DHB invariant representations:
5
+
6
+ DHB-DR (Double-Reflection with Euler angles):
7
+ - 4 values per component: magnitude + 3 Euler angles
8
+ - Compact representation, may have gimbal lock issues
9
+ - Good for most applications
10
+
11
+ DHB-QR (Double-Reflection with Quaternions):
12
+ - 5 values per component: magnitude + unit quaternion (4 values)
13
+ - More robust to singularities, smoother interpolation
14
+ - Better for applications requiring quaternion-based losses
15
+
16
+ Both provide SE(3)-invariant representations, but DHB-QR is preferred
17
+ for applications involving quaternion operations or optimization.
18
+ """
19
+
20
+ import numpy as np
21
+ from dhb_xr.encoder.dhb_dr import encode_dhb_dr
22
+ from dhb_xr.encoder.dhb_qr import encode_dhb_qr
23
+ from dhb_xr.core.types import DHBMethod, EncodingMethod
24
+
25
+
26
+ def run_example():
27
+ """Run the DHB-DR vs DHB-QR comparison example."""
28
+ print("DHB-DR vs DHB-QR Comparison")
29
+ print("=" * 40)
30
+
31
+ # Create synthetic trajectory
32
+ n = 40
33
+ np.random.seed(1)
34
+ positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
35
+ quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
36
+
37
+ print(f"Trajectory: {n} poses")
38
+ print(f"Positions shape: {positions.shape}")
39
+ print(f"Quaternions shape: {quaternions.shape}")
40
+
41
+ # Encode with DHB-DR (Euler angles)
42
+ print("\nEncoding with DHB-DR (Euler angles)...")
43
+ out_dr = encode_dhb_dr(
44
+ positions,
45
+ quaternions,
46
+ method=EncodingMethod.POSITION,
47
+ use_default_initial_frames=True,
48
+ dhb_method=DHBMethod.DOUBLE_REFLECTION,
49
+ )
50
+ print(f"DHB-DR linear invariants shape: {out_dr['linear_motion_invariants'].shape}")
51
+ print(f"DHB-DR angular invariants shape: {out_dr['angular_motion_invariants'].shape}")
52
+
53
+ # Encode with DHB-QR (Quaternions)
54
+ print("\nEncoding with DHB-QR (Quaternions)...")
55
+ out_qr = encode_dhb_qr(
56
+ positions,
57
+ quaternions,
58
+ method=EncodingMethod.POSITION,
59
+ use_default_initial_frames=True,
60
+ )
61
+ print(f"DHB-QR linear invariants shape: {out_qr['linear_motion_invariants'].shape}")
62
+ print(f"DHB-QR angular invariants shape: {out_qr['angular_motion_invariants'].shape}")
63
+
64
+ # Compare dimensions
65
+ print("\nDimension comparison:")
66
+ print(f"DHB-DR: {out_dr['linear_motion_invariants'].shape[1]} values per linear component")
67
+ print(f"DHB-QR: {out_qr['linear_motion_invariants'].shape[1]} values per linear component")
68
+ print("\nDHB-DR uses Euler angles (3 values), DHB-QR uses quaternions (4 values)")
69
+
70
+ return out_dr, out_qr
71
+
72
+
73
+ def main():
74
+ """Main function for command-line execution."""
75
+ run_example()
76
+
77
+
78
+ if __name__ == "__main__":
79
+ main()
@@ -0,0 +1,72 @@
1
+ """
2
+ DHB-TI: Time-invariant reparameterization.
3
+
4
+ Reparameterize by geometric progress (translational arc-length, angular, or hybrid)
5
+ and resample at uniform progress knots so invariants are approximately independent
6
+ of execution speed and sampling rate. Then encode with DHB-DR or DHB-QR.
7
+ """
8
+
9
+ import numpy as np
10
+ from dhb_xr.encoder.dhb_ti import (
11
+ compute_progress,
12
+ resample_by_progress,
13
+ encode_dhb_dr_ti,
14
+ encode_dhb_qr_ti,
15
+ )
16
+ from dhb_xr.encoder.dhb_dr import encode_dhb_dr
17
+ from dhb_xr.core.types import DHBMethod, EncodingMethod
18
+
19
+ def main():
20
+ np.random.seed(42)
21
+ n = 50
22
+ positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
23
+ quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
24
+
25
+ # Progress variables
26
+ progress_trans = compute_progress(positions, quaternions, kind="translation")
27
+ progress_angular = compute_progress(positions, quaternions, kind="angular")
28
+ progress_hybrid = compute_progress(positions, quaternions, kind="hybrid", alpha=0.5)
29
+ print("Progress (translation) total:", progress_trans[-1])
30
+ print("Progress (angular) total:", progress_angular[-1])
31
+ print("Progress (hybrid, α=0.5) total:", progress_hybrid[-1])
32
+
33
+ # Resample to M poses at uniform progress
34
+ M = 30
35
+ pos_m, quat_m = resample_by_progress(
36
+ positions, quaternions, M,
37
+ progress_kind="hybrid", alpha=0.5,
38
+ )
39
+ print("Resampled by progress: positions", pos_m.shape, "quaternions", quat_m.shape)
40
+
41
+ # Time-invariant encode (DHB-DR): same motion at different "speeds" gives similar invariants
42
+ out_ti = encode_dhb_dr_ti(
43
+ positions, quaternions, M,
44
+ progress_kind="hybrid", alpha=0.5,
45
+ method=EncodingMethod.POSITION, use_default_initial_frames=True,
46
+ dhb_method=DHBMethod.DOUBLE_REFLECTION,
47
+ )
48
+ print("DHB-TI (DR) linear invariants shape:", out_ti["linear_motion_invariants"].shape)
49
+
50
+ # Compare: raw encode vs TI encode (raw depends on sampling density)
51
+ out_raw = encode_dhb_dr(
52
+ positions, quaternions,
53
+ method=EncodingMethod.POSITION, use_default_initial_frames=True,
54
+ dhb_method=DHBMethod.DOUBLE_REFLECTION,
55
+ )
56
+ print("DHB-DR (raw) linear invariants shape:", out_raw["linear_motion_invariants"].shape)
57
+
58
+ # DHB-TI with DHB-QR
59
+ try:
60
+ out_ti_qr = encode_dhb_qr_ti(
61
+ positions, quaternions, M,
62
+ progress_kind="hybrid", alpha=0.5,
63
+ method=EncodingMethod.POSITION, use_default_initial_frames=True,
64
+ )
65
+ print("DHB-TI (QR) linear invariants shape:", out_ti_qr["linear_motion_invariants"].shape)
66
+ except ImportError:
67
+ print("DHB-QR not available; skip DHB-TI (QR).")
68
+
69
+ print("Done. Use progress_kind='translation'|'angular'|'hybrid' and alpha for rotation-dominant motions.")
70
+
71
+ if __name__ == "__main__":
72
+ main()
@@ -0,0 +1,102 @@
1
+ """
2
+ GPU Batched Trajectory Optimization Example
3
+
4
+ This example demonstrates batched trajectory optimization for processing multiple
5
+ trajectories simultaneously. Useful for:
6
+
7
+ - Large-scale trajectory adaptation datasets
8
+ - Real-time multi-trajectory optimization
9
+ - GPU-accelerated batch processing
10
+
11
+ The example:
12
+ 1. Creates a demo trajectory (30 poses)
13
+ 2. Defines two different start/goal pose pairs
14
+ 3. Uses BatchedTrajectoryOptimizer to adapt the trajectory for both pairs
15
+ 4. Shows the optimized results for both trajectories
16
+
17
+ For GPU acceleration, set device="cuda" (requires PyTorch CUDA).
18
+ """
19
+
20
+ import numpy as np
21
+ from dhb_xr.optimization.torch_solver import BatchedTrajectoryOptimizer
22
+
23
+
24
+ def run_example():
25
+ """Run the GPU batched trajectory optimization example."""
26
+ print("DHB-XR GPU Batched Trajectory Optimization")
27
+ print("=" * 45)
28
+
29
+ # Create demo trajectory
30
+ np.random.seed(1)
31
+ n = 30
32
+ demo_positions = np.cumsum(np.random.randn(n, 3) * 0.02, axis=0)
33
+ demo_quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
34
+
35
+ print(f"Demo trajectory: {n} poses")
36
+ print(f"Original start: {demo_positions[0]}")
37
+ print(f"Original goal: {demo_positions[-1]}")
38
+
39
+ # Define two different start/goal pairs for batch optimization
40
+ init_poses = [
41
+ {
42
+ "position": demo_positions[0].copy(),
43
+ "quaternion": demo_quaternions[0].copy()
44
+ },
45
+ {
46
+ "position": demo_positions[0].copy() + np.array([0.05, 0, 0]),
47
+ "quaternion": demo_quaternions[0].copy()
48
+ },
49
+ ]
50
+ goal_poses = [
51
+ {
52
+ "position": demo_positions[-1].copy(),
53
+ "quaternion": demo_quaternions[-1].copy()
54
+ },
55
+ {
56
+ "position": demo_positions[-1].copy() + np.array([0.1, 0.05, 0]),
57
+ "quaternion": demo_quaternions[-1].copy()
58
+ },
59
+ ]
60
+
61
+ print("
62
+ Batch optimization setup:")
63
+ print(f"Trajectory 0: {init_poses[0]['position']} → {goal_poses[0]['position']}")
64
+ print(f"Trajectory 1: {init_poses[1]['position']} → {goal_poses[1]['position']}")
65
+
66
+ # Run batched optimization
67
+ print("\nRunning batched optimization...")
68
+ optimizer = BatchedTrajectoryOptimizer(device="cpu", dhb_method="double_reflection")
69
+ adapted_pos, adapted_quat = optimizer.optimize(
70
+ demo_positions, demo_quaternions,
71
+ init_poses, goal_poses,
72
+ num_steps=20,
73
+ lr=1e-2,
74
+ )
75
+
76
+ print(f"✅ Optimization complete")
77
+ print(f"Adapted positions shape: {adapted_pos.shape}")
78
+ print(f"Adapted quaternions shape: {adapted_quat.shape}")
79
+
80
+ print("
81
+ Results:")
82
+ for i in range(len(init_poses)):
83
+ start_pos = adapted_pos[i, 0]
84
+ goal_pos = adapted_pos[i, -1]
85
+ target_goal = goal_poses[i]['position']
86
+
87
+ goal_error = np.linalg.norm(goal_pos - target_goal)
88
+ print(f"Trajectory {i}:")
89
+ print(f" Start: {start_pos}")
90
+ print(f" Goal: {goal_pos}")
91
+ print(".2e")
92
+
93
+ return adapted_pos, adapted_quat
94
+
95
+
96
+ def main():
97
+ """Main function for command-line execution."""
98
+ run_example()
99
+
100
+
101
+ if __name__ == "__main__":
102
+ main()
@@ -0,0 +1,53 @@
1
+ """Imitation learning: invariant-space and geodesic losses."""
2
+
3
+ import numpy as np
4
+ from dhb_xr.encoder.dhb_dr import encode_dhb_dr
5
+ from dhb_xr.core.types import DHBMethod, EncodingMethod
6
+ from dhb_xr.losses.invariant_loss import invariant_matching_loss
7
+ from dhb_xr.losses.geodesic_loss import se3_geodesic_loss_np
8
+ from dhb_xr.losses.hybrid_loss import hybrid_invariant_pose_loss
9
+
10
+ def main():
11
+ np.random.seed(4)
12
+ n = 25
13
+ demo_pos = np.cumsum(np.random.randn(n, 3) * 0.02, axis=0)
14
+ demo_quat = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
15
+ pred_pos = demo_pos + np.random.randn(n, 3) * 0.005
16
+ pred_quat = demo_quat.copy()
17
+
18
+ out_demo = encode_dhb_dr(
19
+ demo_pos, demo_quat,
20
+ method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
21
+ )
22
+ out_pred = encode_dhb_dr(
23
+ pred_pos, pred_quat,
24
+ method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
25
+ )
26
+ U_demo = np.concatenate([
27
+ out_demo["linear_motion_invariants"],
28
+ out_demo["angular_motion_invariants"],
29
+ ], axis=1)
30
+ U_pred = np.concatenate([
31
+ out_pred["linear_motion_invariants"],
32
+ out_pred["angular_motion_invariants"],
33
+ ], axis=1)
34
+
35
+ loss_inv = invariant_matching_loss(U_pred, U_demo, method="dhb_dr")
36
+ print("Invariant matching loss (L2):", loss_inv)
37
+
38
+ loss_pose = se3_geodesic_loss_np(
39
+ pred_pos[-1], pred_quat[-1],
40
+ demo_pos[-1], demo_quat[-1],
41
+ beta=1.0,
42
+ )
43
+ print("SE(3) geodesic loss (final pose):", loss_pose)
44
+
45
+ loss_hybrid = hybrid_invariant_pose_loss(
46
+ pred_pos, pred_quat, demo_pos, demo_quat,
47
+ pred_invariants=U_pred, demo_invariants=U_demo,
48
+ alpha=0.5, beta=1.0,
49
+ )
50
+ print("Hybrid (invariant + pose) loss:", loss_hybrid)
51
+
52
+ if __name__ == "__main__":
53
+ main()
@@ -0,0 +1,19 @@
1
+ """
2
+ VLA Integration Examples
3
+
4
+ Examples demonstrating DHB-XR integration with popular VLA benchmarks:
5
+
6
+ LIBERO & LIBERO-PRO:
7
+ - libero_full_demo: Complete simulation pipeline with trajectory adaptation
8
+ - libero_pro_dhb_demo: Perturbation robustness analysis and simulation
9
+ - libero_swap_demo: Spatial swap demonstration (naive vs DHB comparison)
10
+ - libero_simulation_demo: Basic LIBERO integration
11
+
12
+ Data Processing:
13
+ - robocasa_libero_dhb_pipeline: End-to-end VLA data processing
14
+ - test_libero_adapter: LIBERO HDF5 dataset loading
15
+ - test_libero_encoding: DHB encoding on LIBERO trajectories
16
+ - test_libero_retrieval: Motion retrieval across LIBERO tasks
17
+ """
18
+
19
+ __version__ = "0.2.0"