praxis-eval 0.1.0__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 (110) hide show
  1. praxis_eval-0.1.0/LICENSE +181 -0
  2. praxis_eval-0.1.0/NOTICE +7 -0
  3. praxis_eval-0.1.0/PKG-INFO +506 -0
  4. praxis_eval-0.1.0/README.md +415 -0
  5. praxis_eval-0.1.0/pyproject.toml +132 -0
  6. praxis_eval-0.1.0/setup.cfg +4 -0
  7. praxis_eval-0.1.0/src/praxis_eval/__init__.py +97 -0
  8. praxis_eval-0.1.0/src/praxis_eval/api.py +21 -0
  9. praxis_eval-0.1.0/src/praxis_eval/artifacts.py +54 -0
  10. praxis_eval-0.1.0/src/praxis_eval/contracts.py +87 -0
  11. praxis_eval-0.1.0/src/praxis_eval/envs/__init__.py +5 -0
  12. praxis_eval-0.1.0/src/praxis_eval/envs/async_vector_env.py +304 -0
  13. praxis_eval-0.1.0/src/praxis_eval/envs/builtins.py +169 -0
  14. praxis_eval-0.1.0/src/praxis_eval/envs/eval_pool.py +59 -0
  15. praxis_eval-0.1.0/src/praxis_eval/envs/eval_registry.py +169 -0
  16. praxis_eval-0.1.0/src/praxis_eval/envs/factory.py +318 -0
  17. praxis_eval-0.1.0/src/praxis_eval/envs/libero/__init__.py +91 -0
  18. praxis_eval-0.1.0/src/praxis_eval/envs/libero/config.py +231 -0
  19. praxis_eval-0.1.0/src/praxis_eval/envs/libero/env.py +218 -0
  20. praxis_eval-0.1.0/src/praxis_eval/envs/libero/eval.py +225 -0
  21. praxis_eval-0.1.0/src/praxis_eval/envs/libero/output.py +24 -0
  22. praxis_eval-0.1.0/src/praxis_eval/envs/libero/processor.py +24 -0
  23. praxis_eval-0.1.0/src/praxis_eval/envs/libero/registration.py +104 -0
  24. praxis_eval-0.1.0/src/praxis_eval/envs/libero/runtime.py +218 -0
  25. praxis_eval-0.1.0/src/praxis_eval/envs/libero/spaces.py +118 -0
  26. praxis_eval-0.1.0/src/praxis_eval/envs/libero/spec.py +76 -0
  27. praxis_eval-0.1.0/src/praxis_eval/envs/libero/tasks.py +54 -0
  28. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/__init__.py +83 -0
  29. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/_compat.py +30 -0
  30. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/config.py +84 -0
  31. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/env.py +217 -0
  32. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/eval.py +156 -0
  33. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/registration.py +95 -0
  34. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/runtime.py +178 -0
  35. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/spec.py +26 -0
  36. praxis_eval-0.1.0/src/praxis_eval/envs/metaworld/tasks.py +167 -0
  37. praxis_eval-0.1.0/src/praxis_eval/envs/mshab/__init__.py +35 -0
  38. praxis_eval-0.1.0/src/praxis_eval/envs/mshab/eval.py +457 -0
  39. praxis_eval-0.1.0/src/praxis_eval/envs/mshab/registration.py +24 -0
  40. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/__init__.py +75 -0
  41. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/config.py +123 -0
  42. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/datasets.py +147 -0
  43. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/env.py +646 -0
  44. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/eval.py +208 -0
  45. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/processor.py +106 -0
  46. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/runtime.py +351 -0
  47. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/state.py +70 -0
  48. praxis_eval-0.1.0/src/praxis_eval/envs/robocasa/tasks.py +126 -0
  49. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/__init__.py +75 -0
  50. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/config.py +112 -0
  51. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/env.py +326 -0
  52. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/eval.py +221 -0
  53. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/processor.py +89 -0
  54. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/runtime.py +295 -0
  55. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/state.py +42 -0
  56. praxis_eval-0.1.0/src/praxis_eval/envs/robomimic/tasks.py +124 -0
  57. praxis_eval-0.1.0/src/praxis_eval/envs/simpler/__init__.py +28 -0
  58. praxis_eval-0.1.0/src/praxis_eval/envs/simpler/eval.py +362 -0
  59. praxis_eval-0.1.0/src/praxis_eval/envs/simpler/registration.py +24 -0
  60. praxis_eval-0.1.0/src/praxis_eval/envs/subprocess_runtime.py +589 -0
  61. praxis_eval-0.1.0/src/praxis_eval/evaluation/__init__.py +40 -0
  62. praxis_eval-0.1.0/src/praxis_eval/evaluation/artifacts.py +54 -0
  63. praxis_eval-0.1.0/src/praxis_eval/evaluation/config.py +127 -0
  64. praxis_eval-0.1.0/src/praxis_eval/evaluation/overrides.py +127 -0
  65. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/__init__.py +15 -0
  66. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/adapters.py +165 -0
  67. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/diagnostics.py +105 -0
  68. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/metrics.py +133 -0
  69. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/rollout_compat.py +695 -0
  70. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/runner.py +319 -0
  71. praxis_eval-0.1.0/src/praxis_eval/evaluation/sim/wave_retry.py +245 -0
  72. praxis_eval-0.1.0/src/praxis_eval/evaluation/watchdog.py +213 -0
  73. praxis_eval-0.1.0/src/praxis_eval/managed_paths.py +18 -0
  74. praxis_eval-0.1.0/src/praxis_eval/metrics.py +70 -0
  75. praxis_eval-0.1.0/src/praxis_eval/policies/__init__.py +18 -0
  76. praxis_eval-0.1.0/src/praxis_eval/policies/actions.py +47 -0
  77. praxis_eval-0.1.0/src/praxis_eval/policies/local.py +66 -0
  78. praxis_eval-0.1.0/src/praxis_eval/policies/remote.py +65 -0
  79. praxis_eval-0.1.0/src/praxis_eval/processing.py +116 -0
  80. praxis_eval-0.1.0/src/praxis_eval/registry.py +72 -0
  81. praxis_eval-0.1.0/src/praxis_eval/scripts/__init__.py +5 -0
  82. praxis_eval-0.1.0/src/praxis_eval/scripts/_conda_runtime.py +131 -0
  83. praxis_eval-0.1.0/src/praxis_eval/scripts/_dispatch.py +55 -0
  84. praxis_eval-0.1.0/src/praxis_eval/scripts/_package_sources.py +126 -0
  85. praxis_eval-0.1.0/src/praxis_eval/scripts/_verify_common.py +144 -0
  86. praxis_eval-0.1.0/src/praxis_eval/scripts/setup.py +27 -0
  87. praxis_eval-0.1.0/src/praxis_eval/scripts/setup_mshab.py +310 -0
  88. praxis_eval-0.1.0/src/praxis_eval/scripts/setup_robocasa.py +119 -0
  89. praxis_eval-0.1.0/src/praxis_eval/scripts/setup_simpler.py +305 -0
  90. praxis_eval-0.1.0/src/praxis_eval/scripts/verify.py +30 -0
  91. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_libero.py +197 -0
  92. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_metaworld.py +171 -0
  93. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_mshab.py +260 -0
  94. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_robocasa.py +113 -0
  95. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_robomimic.py +175 -0
  96. praxis_eval-0.1.0/src/praxis_eval/scripts/verify_simpler.py +103 -0
  97. praxis_eval-0.1.0/src/praxis_eval/types.py +82 -0
  98. praxis_eval-0.1.0/src/praxis_eval.egg-info/PKG-INFO +506 -0
  99. praxis_eval-0.1.0/src/praxis_eval.egg-info/SOURCES.txt +108 -0
  100. praxis_eval-0.1.0/src/praxis_eval.egg-info/dependency_links.txt +1 -0
  101. praxis_eval-0.1.0/src/praxis_eval.egg-info/entry_points.txt +3 -0
  102. praxis_eval-0.1.0/src/praxis_eval.egg-info/requires.txt +89 -0
  103. praxis_eval-0.1.0/src/praxis_eval.egg-info/top_level.txt +1 -0
  104. praxis_eval-0.1.0/tests/test_api.py +142 -0
  105. praxis_eval-0.1.0/tests/test_contracts.py +37 -0
  106. praxis_eval-0.1.0/tests/test_env_fork_contracts.py +422 -0
  107. praxis_eval-0.1.0/tests/test_package_sources.py +138 -0
  108. praxis_eval-0.1.0/tests/test_setup_robocasa.py +22 -0
  109. praxis_eval-0.1.0/tests/test_verify_common.py +37 -0
  110. praxis_eval-0.1.0/tests/test_verify_scripts.py +44 -0
@@ -0,0 +1,181 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction, and
10
+ distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by the copyright
13
+ owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all other entities
16
+ that control, are controlled by, or are under common control with that entity.
17
+ For the purposes of this definition, "control" means (i) the power, direct or
18
+ indirect, to cause the direction or management of such entity, whether by
19
+ contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
20
+ outstanding shares, or (iii) beneficial ownership of such entity.
21
+
22
+ "You" (or "Your") shall mean an individual or Legal Entity exercising
23
+ permissions granted by this License.
24
+
25
+ "Source" form shall mean the preferred form for making modifications, including
26
+ but not limited to software source code, documentation source, and configuration
27
+ files.
28
+
29
+ "Object" form shall mean any form resulting from mechanical transformation or
30
+ translation of a Source form, including but not limited to compiled object code,
31
+ generated documentation, and conversions to other media types.
32
+
33
+ "Work" shall mean the work of authorship, whether in Source or Object form,
34
+ made available under the License, as indicated by a copyright notice that is
35
+ included in or attached to the work.
36
+
37
+ "Derivative Works" shall mean any work, whether in Source or Object form, that
38
+ is based on (or derived from) the Work and for which the editorial revisions,
39
+ annotations, elaborations, or other modifications represent, as a whole, an
40
+ original work of authorship. For the purposes of this License, Derivative Works
41
+ shall not include works that remain separable from, or merely link (or bind by
42
+ name) to the interfaces of, the Work and Derivative Works thereof.
43
+
44
+ "Contribution" shall mean any work of authorship, including the original version
45
+ of the Work and any modifications or additions to that Work or Derivative Works
46
+ thereof, that is intentionally submitted to Licensor for inclusion in the Work
47
+ by the copyright owner or by an individual or Legal Entity authorized to submit
48
+ on behalf of the copyright owner. For the purposes of this definition,
49
+ "submitted" means any form of electronic, verbal, or written communication sent
50
+ to the Licensor or its representatives, including but not limited to
51
+ communication on electronic mailing lists, source code control systems, and issue
52
+ tracking systems that are managed by, or on behalf of, the Licensor for the
53
+ purpose of discussing and improving the Work, but excluding communication that is
54
+ conspicuously marked or otherwise designated in writing by the copyright owner
55
+ as "Not a Contribution."
56
+
57
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf
58
+ of whom a Contribution has been received by Licensor and subsequently
59
+ incorporated within the Work.
60
+
61
+ 2. Grant of Copyright License. Subject to the terms and conditions of this
62
+ License, each Contributor hereby grants to You a perpetual, worldwide,
63
+ non-exclusive, no-charge, royalty-free, irrevocable copyright license to
64
+ reproduce, prepare Derivative Works of, publicly display, publicly perform,
65
+ sublicense, and distribute the Work and such Derivative Works in Source or Object
66
+ form.
67
+
68
+ 3. Grant of Patent License. Subject to the terms and conditions of this License,
69
+ each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
70
+ no-charge, royalty-free, irrevocable (except as stated in this section) patent
71
+ license to make, have made, use, offer to sell, sell, import, and otherwise
72
+ transfer the Work, where such license applies only to those patent claims
73
+ licensable by such Contributor that are necessarily infringed by their
74
+ Contribution(s) alone or by combination of their Contribution(s) with the Work to
75
+ which such Contribution(s) was submitted. If You institute patent litigation
76
+ against any entity (including a cross-claim or counterclaim in a lawsuit)
77
+ alleging that the Work or a Contribution incorporated within the Work constitutes
78
+ direct or contributory patent infringement, then any patent licenses granted to
79
+ You under this License for that Work shall terminate as of the date such
80
+ litigation is filed.
81
+
82
+ 4. Redistribution. You may reproduce and distribute copies of the Work or
83
+ Derivative Works thereof in any medium, with or without modifications, and in
84
+ Source or Object form, provided that You meet the following conditions:
85
+
86
+ (a) You must give any other recipients of the Work or Derivative Works a copy of
87
+ this License; and
88
+
89
+ (b) You must cause any modified files to carry prominent notices stating that You
90
+ changed the files; and
91
+
92
+ (c) You must retain, in the Source form of any Derivative Works that You
93
+ distribute, all copyright, patent, trademark, and attribution notices from the
94
+ Source form of the Work, excluding those notices that do not pertain to any part
95
+ of the Derivative Works; and
96
+
97
+ (d) If the Work includes a "NOTICE" text file as part of its distribution, then
98
+ any Derivative Works that You distribute must include a readable copy of the
99
+ attribution notices contained within such NOTICE file, excluding those notices
100
+ that do not pertain to any part of the Derivative Works, in at least one of the
101
+ following places: within a NOTICE text file distributed as part of the Derivative
102
+ Works; within the Source form or documentation, if provided along with the
103
+ Derivative Works; or, within a display generated by the Derivative Works, if and
104
+ wherever such third-party notices normally appear. The contents of the NOTICE
105
+ file are for informational purposes only and do not modify the License. You may
106
+ add Your own attribution notices within Derivative Works that You distribute,
107
+ alongside or as an addendum to the NOTICE text from the Work, provided that such
108
+ additional attribution notices cannot be construed as modifying the License.
109
+
110
+ You may add Your own copyright statement to Your modifications and may provide
111
+ additional or different license terms and conditions for use, reproduction, or
112
+ distribution of Your modifications, or for any such Derivative Works as a whole,
113
+ provided Your use, reproduction, and distribution of the Work otherwise complies
114
+ with the conditions stated in this License.
115
+
116
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any
117
+ Contribution intentionally submitted for inclusion in the Work by You to the
118
+ Licensor shall be under the terms and conditions of this License, without any
119
+ additional terms or conditions. Notwithstanding the above, nothing herein shall
120
+ supersede or modify the terms of any separate license agreement you may have
121
+ executed with Licensor regarding such Contributions.
122
+
123
+ 6. Trademarks. This License does not grant permission to use the trade names,
124
+ trademarks, service marks, or product names of the Licensor, except as required
125
+ for reasonable and customary use in describing the origin of the Work and
126
+ reproducing the content of the NOTICE file.
127
+
128
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in
129
+ writing, Licensor provides the Work (and each Contributor provides its
130
+ Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
131
+ either express or implied, including, without limitation, any warranties or
132
+ conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
133
+ PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness
134
+ of using or redistributing the Work and assume any risks associated with Your
135
+ exercise of permissions under this License.
136
+
137
+ 8. Limitation of Liability. In no event and under no legal theory, whether in
138
+ tort (including negligence), contract, or otherwise, unless required by
139
+ applicable law (such as deliberate and grossly negligent acts) or agreed to in
140
+ writing, shall any Contributor be liable to You for damages, including any
141
+ direct, indirect, special, incidental, or consequential damages of any character
142
+ arising as a result of this License or out of the use or inability to use the
143
+ Work (including but not limited to damages for loss of goodwill, work stoppage,
144
+ computer failure or malfunction, or any and all other commercial damages or
145
+ losses), even if such Contributor has been advised of the possibility of such
146
+ damages.
147
+
148
+ 9. Accepting Warranty or Additional Liability. While redistributing the Work or
149
+ Derivative Works thereof, You may choose to offer, and charge a fee for,
150
+ acceptance of support, warranty, indemnity, or other liability obligations and/or
151
+ rights consistent with this License. However, in accepting such obligations, You
152
+ may act only on Your own behalf and on Your sole responsibility, not on behalf of
153
+ any other Contributor, and only if You agree to indemnify, defend, and hold each
154
+ Contributor harmless for any liability incurred by, or claims asserted against,
155
+ such Contributor by reason of your accepting any such warranty or additional
156
+ liability.
157
+
158
+ END OF TERMS AND CONDITIONS
159
+
160
+ APPENDIX: How to apply the Apache License to your work.
161
+
162
+ To apply the Apache License to your work, attach the following boilerplate
163
+ notice, with the fields enclosed by brackets "[]" replaced with your own
164
+ identifying information. (Do not include the brackets!) The text should be
165
+ enclosed in the appropriate comment syntax for the file format. We also
166
+ recommend that a file or class name and description of purpose be included on the
167
+ same "printed page" as the copyright notice for easier identification within
168
+ third-party archives.
169
+
170
+ Copyright [yyyy] [name of copyright owner]
171
+
172
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
173
+ this file except in compliance with the License. You may obtain a copy of the
174
+ License at
175
+
176
+ http://www.apache.org/licenses/LICENSE-2.0
177
+
178
+ Unless required by applicable law or agreed to in writing, software distributed
179
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
180
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
181
+ specific language governing permissions and limitations under the License.
@@ -0,0 +1,7 @@
1
+ praxis-eval
2
+ Copyright 2026 Chaoqi Liu
3
+
4
+ This product includes software developed by Chaoqi Liu.
5
+
6
+ Redistributions must preserve this NOTICE file when required by the
7
+ Apache License, Version 2.0.
@@ -0,0 +1,506 @@
1
+ Metadata-Version: 2.4
2
+ Name: praxis-eval
3
+ Version: 0.1.0
4
+ Summary: Standalone robot-policy evaluation harness with local and remote policy adapters.
5
+ License-Expression: Apache-2.0
6
+ Requires-Python: >=3.10
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ License-File: NOTICE
10
+ Requires-Dist: numpy>=1.26.0
11
+ Requires-Dist: omegaconf>=2.3.0
12
+ Provides-Extra: dev
13
+ Requires-Dist: gymnasium>=1.0.0; extra == "dev"
14
+ Requires-Dist: lerobot==0.4.4; extra == "dev"
15
+ Requires-Dist: omegaconf>=2.3.0; extra == "dev"
16
+ Requires-Dist: pre-commit>=4.0.0; extra == "dev"
17
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
18
+ Requires-Dist: praxis-remote==0.1.0; extra == "dev"
19
+ Requires-Dist: praxis-simpler==0.0.1.post2; extra == "dev"
20
+ Requires-Dist: praxis-mshab==0.0.1.post2; extra == "dev"
21
+ Requires-Dist: pyyaml>=6.0.0; extra == "dev"
22
+ Requires-Dist: ruff>=0.4.0; extra == "dev"
23
+ Requires-Dist: torch>=2.7.0; extra == "dev"
24
+ Requires-Dist: tqdm>=4.66.0; extra == "dev"
25
+ Provides-Extra: remote
26
+ Requires-Dist: praxis-remote==0.1.0; extra == "remote"
27
+ Provides-Extra: libero
28
+ Requires-Dist: gymnasium>=1.0.0; extra == "libero"
29
+ Requires-Dist: lerobot==0.4.4; extra == "libero"
30
+ Requires-Dist: omegaconf>=2.3.0; extra == "libero"
31
+ Requires-Dist: pyyaml>=6.0.0; extra == "libero"
32
+ Requires-Dist: praxis-robosuite==1.5.2; extra == "libero"
33
+ Requires-Dist: praxis-libero==0.1.1; extra == "libero"
34
+ Requires-Dist: torch>=2.7.0; extra == "libero"
35
+ Requires-Dist: tqdm>=4.66.0; extra == "libero"
36
+ Provides-Extra: metaworld
37
+ Requires-Dist: gymnasium>=1.0.0; extra == "metaworld"
38
+ Requires-Dist: lerobot[metaworld]==0.4.4; extra == "metaworld"
39
+ Requires-Dist: omegaconf>=2.3.0; extra == "metaworld"
40
+ Requires-Dist: torch>=2.7.0; extra == "metaworld"
41
+ Requires-Dist: tqdm>=4.66.0; extra == "metaworld"
42
+ Provides-Extra: robocasa
43
+ Requires-Dist: gymnasium>=1.0.0; extra == "robocasa"
44
+ Requires-Dist: lerobot==0.4.4; extra == "robocasa"
45
+ Requires-Dist: omegaconf>=2.3.0; extra == "robocasa"
46
+ Requires-Dist: numpy==2.2.5; extra == "robocasa"
47
+ Requires-Dist: mujoco==3.3.1; extra == "robocasa"
48
+ Requires-Dist: praxis-robosuite==1.5.2; extra == "robocasa"
49
+ Requires-Dist: praxis-robocasa==1.0.0; extra == "robocasa"
50
+ Requires-Dist: lxml>=5.0.0; extra == "robocasa"
51
+ Requires-Dist: torch>=2.7.0; extra == "robocasa"
52
+ Requires-Dist: tqdm>=4.66.0; extra == "robocasa"
53
+ Provides-Extra: robomimic
54
+ Requires-Dist: gymnasium>=1.0.0; extra == "robomimic"
55
+ Requires-Dist: lerobot==0.4.4; extra == "robomimic"
56
+ Requires-Dist: omegaconf>=2.3.0; extra == "robomimic"
57
+ Requires-Dist: robomimic==0.2.0; extra == "robomimic"
58
+ Requires-Dist: praxis-robosuite==1.5.2; extra == "robomimic"
59
+ Requires-Dist: torch>=2.7.0; extra == "robomimic"
60
+ Requires-Dist: tqdm>=4.66.0; extra == "robomimic"
61
+ Provides-Extra: simpler
62
+ Requires-Dist: lerobot==0.4.4; extra == "simpler"
63
+ Requires-Dist: omegaconf>=2.3.0; extra == "simpler"
64
+ Requires-Dist: praxis-remote==0.1.0; extra == "simpler"
65
+ Requires-Dist: praxis-simpler==0.0.1.post2; extra == "simpler"
66
+ Requires-Dist: tqdm>=4.66.0; extra == "simpler"
67
+ Provides-Extra: mshab
68
+ Requires-Dist: lerobot==0.4.4; extra == "mshab"
69
+ Requires-Dist: omegaconf>=2.3.0; extra == "mshab"
70
+ Requires-Dist: praxis-remote==0.1.0; extra == "mshab"
71
+ Requires-Dist: praxis-mshab==0.0.1.post2; extra == "mshab"
72
+ Requires-Dist: tqdm>=4.66.0; extra == "mshab"
73
+ Provides-Extra: all
74
+ Requires-Dist: gymnasium>=1.0.0; extra == "all"
75
+ Requires-Dist: lerobot[metaworld]==0.4.4; extra == "all"
76
+ Requires-Dist: omegaconf>=2.3.0; extra == "all"
77
+ Requires-Dist: praxis-remote==0.1.0; extra == "all"
78
+ Requires-Dist: pyyaml>=6.0.0; extra == "all"
79
+ Requires-Dist: praxis-robosuite==1.5.2; extra == "all"
80
+ Requires-Dist: praxis-libero==0.1.1; extra == "all"
81
+ Requires-Dist: numpy==2.2.5; extra == "all"
82
+ Requires-Dist: mujoco==3.3.1; extra == "all"
83
+ Requires-Dist: praxis-robocasa==1.0.0; extra == "all"
84
+ Requires-Dist: lxml>=5.0.0; extra == "all"
85
+ Requires-Dist: robomimic==0.2.0; extra == "all"
86
+ Requires-Dist: praxis-simpler==0.0.1.post2; extra == "all"
87
+ Requires-Dist: praxis-mshab==0.0.1.post2; extra == "all"
88
+ Requires-Dist: torch>=2.7.0; extra == "all"
89
+ Requires-Dist: tqdm>=4.66.0; extra == "all"
90
+ Dynamic: license-file
91
+
92
+ # praxis-eval
93
+
94
+ `praxis-eval` is a standalone robot-policy evaluation package. It owns
95
+ benchmark setup, rollout execution, metrics, artifacts, and documented
96
+ environment contracts. It does not own model preprocessing, checkpoint loading,
97
+ training, logging, or scheduling.
98
+
99
+ The public boundary is intentionally small:
100
+
101
+ - Eval emits generic observations: `Mapping[str, numpy.ndarray | str | bool | int | float]`.
102
+ - Policy adapters consume those observations and return `numpy.ndarray` actions.
103
+ - Each benchmark driver documents the observation keys it emits and the action
104
+ shape, dtype, range, and convention it expects.
105
+ - Callers can run policies in the same process or call a remote policy through
106
+ `praxis-remote`.
107
+
108
+ This keeps benchmark logic inside `praxis-eval` and model-specific adaptation
109
+ inside the caller.
110
+
111
+ ## Installation
112
+
113
+ Install the core package from PyPI:
114
+
115
+ ```bash
116
+ pip install praxis-eval==0.1.0
117
+ ```
118
+
119
+ The core package contains the public API, contracts, registry, result types,
120
+ setup/verify dispatchers, and local policy adapter. Install benchmark extras
121
+ for the simulator families you plan to run:
122
+
123
+ ```bash
124
+ pip install "praxis-eval[remote]==0.1.0"
125
+ pip install "praxis-eval[libero]==0.1.0"
126
+ pip install "praxis-eval[metaworld]==0.1.0"
127
+ pip install "praxis-eval[robocasa]==0.1.0"
128
+ pip install "praxis-eval[robomimic]==0.1.0"
129
+ pip install "praxis-eval[simpler]==0.1.0"
130
+ pip install "praxis-eval[mshab]==0.1.0"
131
+ ```
132
+
133
+ Use the source install when you need the current `main` branch before the next
134
+ release:
135
+
136
+ ```bash
137
+ pip install "praxis-eval @ git+https://github.com/Chaoqi-LIU/praxis-eval.git@main"
138
+ ```
139
+
140
+ `remote` installs the optional
141
+ [`praxis-remote`](https://github.com/Chaoqi-LIU/praxis-remote) adapter.
142
+ `libero`, `metaworld`, `robocasa`, and `robomimic` normally run inside the
143
+ current Python environment. `simpler` and `mshab` install lightweight package
144
+ wrappers into the current environment, but their simulator stacks usually run
145
+ best in dedicated runtimes created by `praxis-eval-setup`.
146
+
147
+ For local development:
148
+
149
+ ```bash
150
+ git clone https://github.com/Chaoqi-LIU/praxis-eval.git
151
+ cd praxis-eval
152
+ uv sync --extra dev
153
+ uv run --extra dev pytest --strict-markers -m "not manual"
154
+ ```
155
+
156
+ The repository has no simulator source submodules and no vendored
157
+ `third_party/` checkouts. Simulator forks are normal Python dependencies
158
+ published as `praxis-*` packages; setup commands download assets and create
159
+ runtime environments outside the source tree.
160
+
161
+ ## Benchmark Extras
162
+
163
+ | Extra | Installs | Runtime model |
164
+ | --- | --- | --- |
165
+ | `remote` | `praxis-remote==0.1.0` | Optional gRPC policy client. |
166
+ | `libero` | `praxis-libero`, `praxis-robosuite` | Runs in the current Python environment. |
167
+ | `metaworld` | LeRobot Meta-World dependencies | Runs in the current Python environment. |
168
+ | `robocasa` | `praxis-robocasa`, `praxis-robosuite` | Runs in the current Python environment after asset setup. |
169
+ | `robomimic` | RoboMimic, `praxis-robosuite` | Runs in the current Python environment. |
170
+ | `simpler` | `praxis-simpler`, `praxis-remote` | Uses a dedicated SimplerEnv runtime for simulator execution. |
171
+ | `mshab` | `praxis-mshab`, `praxis-remote` | Uses a dedicated MS-HAB runtime for simulator execution. |
172
+
173
+ Prefer the narrowest extra that matches the benchmark you need. The `all` extra
174
+ is available for CI and broad integration environments, but it is usually not
175
+ the right choice for a policy-training environment because simulator dependency
176
+ sets can be heavy.
177
+
178
+ ## Setup CLI
179
+
180
+ Setup commands prepare benchmark assets or dedicated simulator runtimes. Run the
181
+ setup command after installing the relevant extra.
182
+
183
+ Top-level help:
184
+
185
+ ```bash
186
+ praxis-eval-setup --help
187
+ python -m praxis_eval.scripts.setup --help
188
+ ```
189
+
190
+ RoboCasa setup downloads kitchen assets and writes `robocasa/macros_private.py`
191
+ with the dataset root used by RoboCasa:
192
+
193
+ ```bash
194
+ pip install "praxis-eval[robocasa]==0.1.0"
195
+ praxis-eval-setup robocasa
196
+ praxis-eval-setup robocasa --dataset-base-path /data/robocasa
197
+ praxis-eval-setup robocasa --skip-download
198
+ ```
199
+
200
+ SimplerEnv setup creates or updates a dedicated conda/micromamba environment
201
+ from the env spec shipped inside `praxis-simpler`, installs the matching
202
+ runtime packages into that environment, downloads ManiSkill assets, and writes
203
+ activation hooks for Vulkan/EGL and `MS_ASSET_DIR`:
204
+
205
+ ```bash
206
+ pip install "praxis-eval[simpler]==0.1.0"
207
+ praxis-eval-setup simpler
208
+ praxis-eval-setup simpler --env-manager micromamba --env-name simpler-praxis
209
+ praxis-eval-setup simpler --ms-asset-dir /data/simpler/maniskill_assets
210
+ praxis-eval-setup simpler --skip-assets
211
+ ```
212
+
213
+ MS-HAB setup follows the same model using the env spec shipped inside
214
+ `praxis-mshab`:
215
+
216
+ ```bash
217
+ pip install "praxis-eval[mshab]==0.1.0"
218
+ praxis-eval-setup mshab
219
+ praxis-eval-setup mshab --env-manager micromamba --env-name mshab-praxis
220
+ praxis-eval-setup mshab --ms-asset-dir /data/mshab/maniskill_assets
221
+ praxis-eval-setup mshab --skip-assets
222
+ ```
223
+
224
+ Each setup command supports `--help`:
225
+
226
+ ```bash
227
+ praxis-eval-setup robocasa --help
228
+ praxis-eval-setup simpler --help
229
+ praxis-eval-setup mshab --help
230
+ ```
231
+
232
+ ## Verify CLI
233
+
234
+ Verifier commands run short random-action rollouts. They confirm that a
235
+ benchmark stack is importable, can create environments, can step, and can write
236
+ evaluation artifacts.
237
+
238
+ Top-level help:
239
+
240
+ ```bash
241
+ praxis-eval-verify --help
242
+ python -m praxis_eval.scripts.verify --help
243
+ ```
244
+
245
+ Current-environment verifiers:
246
+
247
+ ```bash
248
+ praxis-eval-verify libero --task libero_10 --task-id 0
249
+ praxis-eval-verify metaworld --task reach-v3
250
+ praxis-eval-verify robocasa --task CloseToasterOvenDoor
251
+ praxis-eval-verify robomimic --task Lift --disable-render
252
+ ```
253
+
254
+ Dedicated-runtime verifiers:
255
+
256
+ ```bash
257
+ praxis-eval-verify simpler --env-name simpler-praxis --num-episodes 1 --num-envs 1
258
+ praxis-eval-verify mshab --env-name mshab-praxis --num-episodes 1 --num-envs 1
259
+ ```
260
+
261
+ Pass an explicit interpreter when the runtime is a container, a manually managed
262
+ conda environment, or a cluster-provided Python binary:
263
+
264
+ ```bash
265
+ praxis-eval-verify simpler --env-python-bin /path/to/simpler/bin/python
266
+ praxis-eval-verify mshab --env-python-bin /path/to/mshab/bin/python
267
+ ```
268
+
269
+ Each verifier supports `--help`:
270
+
271
+ ```bash
272
+ praxis-eval-verify libero --help
273
+ praxis-eval-verify metaworld --help
274
+ praxis-eval-verify robocasa --help
275
+ praxis-eval-verify robomimic --help
276
+ praxis-eval-verify simpler --help
277
+ praxis-eval-verify mshab --help
278
+ ```
279
+
280
+ ## Dedicated SimplerEnv and MS-HAB Runtimes
281
+
282
+ SimplerEnv and MS-HAB are special because their simulator dependencies are often
283
+ better isolated from the caller's main environment. The setup helpers create
284
+ dedicated conda or micromamba environments from env specs shipped by
285
+ `praxis-simpler` and `praxis-mshab`, then install `praxis-eval`,
286
+ `praxis-remote`, and the matching simulator runtime package into that dedicated
287
+ environment.
288
+
289
+ The setup helpers do not clone simulator source trees. They read runtime env
290
+ specs from installed package resources:
291
+
292
+ ```text
293
+ praxis-simpler: simpler_env/praxis_conda_env.yaml
294
+ praxis-mshab: mshab/praxis_conda_env.yaml
295
+ ```
296
+
297
+ Default managed asset locations are:
298
+
299
+ ```text
300
+ ~/.cache/praxis_eval/assets/simpler/maniskill_assets
301
+ ~/.cache/praxis_eval/assets/mshab/maniskill_assets
302
+ ```
303
+
304
+ Override the asset location explicitly when a cluster or container already has a
305
+ fixed asset mount:
306
+
307
+ ```bash
308
+ praxis-eval-setup simpler --ms-asset-dir /path/to/simpler/maniskill_assets
309
+ praxis-eval-setup mshab --ms-asset-dir /path/to/mshab/maniskill_assets
310
+ ```
311
+
312
+ At evaluation time, pass the same path through the env config when you are not
313
+ using the default managed cache:
314
+
315
+ ```python
316
+ from praxis_eval import EvalConfig
317
+
318
+ config = EvalConfig(
319
+ task="widowx_carrot_on_plate",
320
+ num_eval_per_task=5,
321
+ output_dir="eval/simpler",
322
+ env_kwargs={
323
+ "python_bin": "/path/to/simpler-praxis/bin/python",
324
+ "ms_asset_dir": "/data/simpler/maniskill_assets",
325
+ },
326
+ )
327
+ ```
328
+
329
+ The caller's policy environment does not need SimplerEnv or MS-HAB simulator
330
+ dependencies installed. It only needs `praxis-eval` and a policy adapter that
331
+ understands the observation/action contract.
332
+
333
+ ## Supported Benchmarks
334
+
335
+ Built-in drivers are registered lazily when they are first requested.
336
+
337
+ | Driver | Extra | Notes |
338
+ | --- | --- | --- |
339
+ | `libero` | `libero` | LIBERO tasks through the Praxis-compatible fork. |
340
+ | `metaworld` | `metaworld` | Meta-World tasks through LeRobot integration. |
341
+ | `robocasa` | `robocasa` | RoboCasa tasks, assets, and metrics. |
342
+ | `robomimic` | `robomimic` | RoboMimic tasks and RoboSuite-backed rollouts. |
343
+ | `simpler` | `simpler` | Usually run through a dedicated interpreter via `env.python_bin`. |
344
+ | `mshab` | `mshab` | Usually run through a dedicated interpreter via `env.python_bin`. |
345
+
346
+ Check available registered drivers:
347
+
348
+ ```python
349
+ from praxis_eval import available_drivers
350
+
351
+ print(available_drivers())
352
+ ```
353
+
354
+ Inspect a benchmark contract:
355
+
356
+ ```python
357
+ from praxis_eval import get_driver
358
+
359
+ driver = get_driver("libero")
360
+ print(driver.contract.observation_keys)
361
+ print(driver.contract.action)
362
+ ```
363
+
364
+ ## Evaluation API
365
+
366
+ Use `evaluate(env, policy, config)` for both local and remote policies:
367
+
368
+ ```python
369
+ import numpy as np
370
+ from praxis_eval import EvalConfig, LocalPolicy, evaluate
371
+
372
+
373
+ def act(observations, *, policy_kwargs=None, episode_ids=None):
374
+ del policy_kwargs, episode_ids
375
+ return np.zeros((len(observations), 7), dtype=np.float32)
376
+
377
+
378
+ result = evaluate(
379
+ "libero",
380
+ policy=LocalPolicy(act),
381
+ config=EvalConfig(
382
+ task="libero_spatial",
383
+ num_eval_per_task=10,
384
+ num_parallel_env=4,
385
+ output_dir="eval/libero_spatial",
386
+ ),
387
+ )
388
+
389
+ print(result.overall)
390
+ ```
391
+
392
+ `EvalConfig` contains generic rollout settings. Benchmark-specific settings go
393
+ in `env_kwargs`; policy-adapter settings go in `policy_kwargs`.
394
+
395
+ ```python
396
+ from praxis_eval import EvalConfig
397
+
398
+ config = EvalConfig(
399
+ task="libero_spatial",
400
+ task_ids=(0, 1, 2),
401
+ num_eval_per_task=5,
402
+ num_parallel_env=3,
403
+ output_dir="eval/libero_spatial",
404
+ record_episodes_per_task=1,
405
+ step_timeout_sec=30.0,
406
+ env_kwargs={"max_episode_steps": 400},
407
+ policy_kwargs={"temperature": 0.0},
408
+ )
409
+ ```
410
+
411
+ The returned `EvalResult` has aggregate metrics, per-task metrics, optional
412
+ grouped metrics, artifact paths, and metadata:
413
+
414
+ ```python
415
+ print(result.overall)
416
+ print(result.per_task)
417
+ print(result.artifacts)
418
+ ```
419
+
420
+ ## Observation and Action Contract
421
+
422
+ An observation is a flat mapping. Keys are explicit and namespaced so policy
423
+ adapters can stay generic:
424
+
425
+ ```python
426
+ {
427
+ "task": "put the mug on the plate",
428
+ "observation.images.front": front_rgb,
429
+ "observation.images.wrist": wrist_rgb,
430
+ "observation.state": proprio,
431
+ "metadata.episode_index": 7,
432
+ }
433
+ ```
434
+
435
+ Values can be numpy arrays, strings, booleans, integers, floats, or numpy scalar
436
+ values. Arrays can represent RGB images, depth, state, masks, point clouds, or
437
+ calibration payloads. The benchmark contract tells the caller which keys are
438
+ present for that benchmark.
439
+
440
+ A policy adapter returns a batched `numpy.ndarray` action. `praxis-eval`
441
+ validates the action against the benchmark `ActionSpec` when a driver supplies
442
+ one. The policy itself does not need to know simulator internals; it only needs
443
+ to know the documented observation keys and action format.
444
+
445
+ ## Remote Policies
446
+
447
+ Install the remote extra and run a policy server with `praxis-remote`:
448
+
449
+ ```bash
450
+ pip install "praxis-eval[remote]==0.1.0"
451
+ ```
452
+
453
+ Then evaluate through `RemotePolicy`:
454
+
455
+ ```python
456
+ from praxis_eval import EvalConfig, RemotePolicy, evaluate
457
+
458
+ result = evaluate(
459
+ "robocasa",
460
+ policy=RemotePolicy("127.0.0.1:50051", timeout=30.0),
461
+ config=EvalConfig(
462
+ task="CloseDrawer",
463
+ num_eval_per_task=10,
464
+ output_dir="eval/robocasa",
465
+ ),
466
+ )
467
+ ```
468
+
469
+ Remote mode keeps the evaluator and policy in separate processes. This is useful
470
+ when the policy runtime and simulator runtime need incompatible dependencies.
471
+
472
+ ## Repository Structure
473
+
474
+ ```text
475
+ src/praxis_eval/
476
+ api.py # evaluate(env, policy, config)
477
+ contracts.py # EnvContract, ObservationKey, ActionSpec
478
+ registry.py # driver registration and lookup
479
+ types.py # public EvalConfig, EvalResult, Policy protocol
480
+ policies/ # local and remote policy adapters
481
+ envs/ # built-in benchmark drivers and env integration
482
+ evaluation/ # rollout orchestration, metrics, artifacts
483
+ scripts/ # setup and verify entry points
484
+ managed_paths.py # default cache paths for managed assets
485
+ tests/ # package and integration tests
486
+ ```
487
+
488
+ ## Development Checks
489
+
490
+ Run the same checks as CI:
491
+
492
+ ```bash
493
+ uv run --extra dev pre-commit run check-license-headers --all-files
494
+ uv run --extra dev ruff check .
495
+ uv run --extra dev ruff format --check .
496
+ uv run --extra dev pytest --strict-markers -m "not manual"
497
+ uv build --sdist --wheel
498
+ ```
499
+
500
+ Contributor setup and project rules are in [CONTRIBUTING.md](CONTRIBUTING.md).
501
+
502
+ ## License and Attribution
503
+
504
+ `praxis-eval` is licensed under Apache-2.0. Redistribution must preserve the
505
+ license, copyright notices, and `NOTICE` file. If this package supports your
506
+ research or product work, please cite the repository using `CITATION.cff`.