mujoco 3.7.0__tar.gz → 3.8.1__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 (190) hide show
  1. {mujoco-3.7.0/mujoco.egg-info → mujoco-3.8.1}/PKG-INFO +4 -3
  2. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/CMakeLists.txt +4 -4
  3. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/bindings_test.py +8 -4
  4. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/MujocoDependencies.cmake +1 -1
  5. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/MujocoOptions.cmake +5 -1
  6. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/enum_traits.h +1 -1
  7. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/function_traits.h +76 -21
  8. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/functions.cc +32 -0
  9. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/enums.py +4 -4
  10. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/enums_test.py +2 -3
  11. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/functions.py +153 -23
  12. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/structs.py +62 -2
  13. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/mjpython/Info.plist +4 -4
  14. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/renderer_test.py +44 -0
  15. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rendering/classic/renderer.py +6 -2
  16. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/CMakeLists.txt +1 -1
  17. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/SimulateOptions.cmake +5 -1
  18. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/simulate.cc +3 -3
  19. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/specs.cc +147 -7
  20. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/specs.cc.inc +844 -820
  21. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/specs_test.py +50 -0
  22. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/specs_wrapper.cc +31 -29
  23. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/specs_wrapper.h +1 -1
  24. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/structs.cc +8 -10
  25. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/structs.h +9 -3
  26. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/structs_wrappers.cc +84 -24
  27. mujoco-3.8.1/mujoco/vfs.h +46 -0
  28. mujoco-3.8.1/mujoco/vfs_test.py +251 -0
  29. {mujoco-3.7.0 → mujoco-3.8.1/mujoco.egg-info}/PKG-INFO +4 -3
  30. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco.egg-info/SOURCES.txt +2 -0
  31. {mujoco-3.7.0 → mujoco-3.8.1}/pyproject.toml +4 -3
  32. {mujoco-3.7.0 → mujoco-3.8.1}/LICENSE +0 -0
  33. {mujoco-3.7.0 → mujoco-3.8.1}/LICENSES_THIRD_PARTY.md +0 -0
  34. {mujoco-3.7.0 → mujoco-3.8.1}/MANIFEST.in +0 -0
  35. {mujoco-3.7.0 → mujoco-3.8.1}/README.md +0 -0
  36. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/__init__.py +0 -0
  37. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/callbacks.cc +0 -0
  38. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cgl/__init__.py +0 -0
  39. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cgl/cgl.py +0 -0
  40. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/CheckAvxSupport.cmake +0 -0
  41. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/FindOrFetch.cmake +0 -0
  42. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/MujocoHarden.cmake +0 -0
  43. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/MujocoLinkOptions.cmake +0 -0
  44. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/MujocoMacOS.cmake +0 -0
  45. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/ShellTests.cmake +0 -0
  46. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/cmake/TargetAddRpath.cmake +0 -0
  47. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/constants.cc +0 -0
  48. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/egl/__init__.py +0 -0
  49. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/egl/egl_ext.py +0 -0
  50. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/enums.cc +0 -0
  51. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/errors.cc +0 -0
  52. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/errors.h +0 -0
  53. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/functions.h +0 -0
  54. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/gl_context.py +0 -0
  55. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/glfw/__init__.py +0 -0
  56. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/indexer_xmacro.h +0 -0
  57. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/indexers.cc +0 -0
  58. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/indexers.h +0 -0
  59. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/__init__.py +0 -0
  60. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/ast_nodes.py +0 -0
  61. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/ast_nodes_test.py +0 -0
  62. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/codegen/formatter.py +0 -0
  63. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/codegen/generate_enums.py +0 -0
  64. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/codegen/generate_functions.py +0 -0
  65. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/codegen/generate_structs.py +0 -0
  66. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/functions_test.py +0 -0
  67. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/mjxmacro.py +0 -0
  68. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/structs_test.py +0 -0
  69. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/type_parsing.py +0 -0
  70. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/introspect/type_parsing_test.py +0 -0
  71. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/memory_leak_test.py +0 -0
  72. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/minimize.py +0 -0
  73. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/minimize_test.py +0 -0
  74. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/mjpython/mjpython.icns +0 -0
  75. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/mjpython/mjpython.mm +0 -0
  76. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/mjpython/mjpython.py +0 -0
  77. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/msh2obj.py +0 -0
  78. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/msh2obj_test.py +0 -0
  79. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/osmesa/__init__.py +0 -0
  80. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/private.h +0 -0
  81. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/raw.h +0 -0
  82. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/render.cc +0 -0
  83. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/render_test.py +0 -0
  84. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/renderer.py +0 -0
  85. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rendering/classic/__init__.py +0 -0
  86. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rendering/classic/gl_context.py +0 -0
  87. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rollout.cc +0 -0
  88. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rollout.py +0 -0
  89. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/rollout_test.py +0 -0
  90. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/serialization.h +0 -0
  91. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/array_safety.h +0 -0
  92. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/CheckAvxSupport.cmake +0 -0
  93. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/FindOrFetch.cmake +0 -0
  94. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/MujocoHarden.cmake +0 -0
  95. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/MujocoLinkOptions.cmake +0 -0
  96. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/MujocoMacOS.cmake +0 -0
  97. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/cmake/SimulateDependencies.cmake +0 -0
  98. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_adapter.cc +0 -0
  99. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_adapter.h +0 -0
  100. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_corevideo.h +0 -0
  101. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_corevideo.mm +0 -0
  102. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_dispatch.cc +0 -0
  103. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/glfw_dispatch.h +0 -0
  104. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/macos_gui.mm +0 -0
  105. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/main.cc +0 -0
  106. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/platform_ui_adapter.cc +0 -0
  107. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/platform_ui_adapter.h +0 -0
  108. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate/simulate.h +0 -0
  109. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/simulate.cc +0 -0
  110. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/__init__.py +0 -0
  111. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/__init__.py +0 -0
  112. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/io.py +0 -0
  113. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/model_modifier.py +0 -0
  114. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/optimize.py +0 -0
  115. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/parameter.py +0 -0
  116. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/plotting.py +0 -0
  117. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/residual.py +0 -0
  118. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/signal_modifier.py +0 -0
  119. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/signal_transform.py +0 -0
  120. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/timeseries.py +0 -0
  121. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/_src/trajectory.py +0 -0
  122. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/py.typed +0 -0
  123. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/builder.py +0 -0
  124. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/defaults.py +0 -0
  125. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/__init__.py +0 -0
  126. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/base.py +0 -0
  127. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/covariance.py +0 -0
  128. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/group.py +0 -0
  129. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/insights.py +0 -0
  130. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/optimization_trace.py +0 -0
  131. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/parameter_distribution.py +0 -0
  132. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/parameters.py +0 -0
  133. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/row.py +0 -0
  134. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/signals.py +0 -0
  135. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/sections/video.py +0 -0
  136. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/covariance.html +0 -0
  137. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/group.html +0 -0
  138. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/insights.html +0 -0
  139. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/layout.html +0 -0
  140. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/optimization_trace.html +0 -0
  141. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/parameter_confidence.html +0 -0
  142. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/parameters_table.html +0 -0
  143. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/plot_generic.html +0 -0
  144. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/row.html +0 -0
  145. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/signals.html +0 -0
  146. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/templates/video.html +0 -0
  147. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/report/utils.py +0 -0
  148. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/__init__.py +0 -0
  149. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/conftest.py +0 -0
  150. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_integration.py +0 -0
  151. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_model_modifier.py +0 -0
  152. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_parameter.py +0 -0
  153. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_signal.py +0 -0
  154. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_timeseries.py +0 -0
  155. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/sysid/tests/test_trajectory.py +0 -0
  156. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/MJCF_NoRoot.zip +0 -0
  157. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/MJCF_Root.zip +0 -0
  158. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/abdomen_1_body.msh +0 -0
  159. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/model.urdf +0 -0
  160. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/model.xml +0 -0
  161. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/msh.xml +0 -0
  162. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/simple_usd_preview_surface.usda +0 -0
  163. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/testdata/usd_golden.usda +0 -0
  164. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/threadpool.cc +0 -0
  165. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/threadpool.h +0 -0
  166. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/camera.py +0 -0
  167. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/demo.py +0 -0
  168. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/exporter.py +0 -0
  169. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/exporter_test.py +0 -0
  170. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/lights.py +0 -0
  171. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/objects.py +0 -0
  172. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/shapes.py +0 -0
  173. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/usd/utils.py +0 -0
  174. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/CMakeLists.txt +0 -0
  175. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/array_traits.h +0 -0
  176. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/array_traits_test.cc +0 -0
  177. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/crossplatform.h +0 -0
  178. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/func_traits.h +0 -0
  179. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/func_traits_test.cc +0 -0
  180. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/func_wrap.h +0 -0
  181. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/func_wrap_test.cc +0 -0
  182. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/tuple_tools.h +0 -0
  183. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/util/tuple_tools_test.cc +0 -0
  184. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/viewer.py +0 -0
  185. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco/viewer_test.py +0 -0
  186. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco.egg-info/dependency_links.txt +0 -0
  187. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco.egg-info/requires.txt +0 -0
  188. {mujoco-3.7.0 → mujoco-3.8.1}/mujoco.egg-info/top_level.txt +0 -0
  189. {mujoco-3.7.0 → mujoco-3.8.1}/setup.cfg +0 -0
  190. {mujoco-3.7.0 → mujoco-3.8.1}/setup.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mujoco
3
- Version: 3.7.0
3
+ Version: 3.8.1
4
4
  Summary: MuJoCo Physics Simulator
5
5
  Author-email: Google DeepMind <mujoco@deepmind.com>
6
6
  License-Expression: Apache-2.0
7
7
  Project-URL: Homepage, https://github.com/google-deepmind/mujoco
8
- Project-URL: Documentation, https://mujoco.readthedocs.io/en/3.7.0
8
+ Project-URL: Documentation, https://mujoco.readthedocs.io/en/3.8.1
9
9
  Project-URL: Repository, https://github.com/google-deepmind/mujoco
10
- Project-URL: Changelog, https://mujoco.readthedocs.io/en/3.7.0/changelog.html
10
+ Project-URL: Changelog, https://mujoco.readthedocs.io/en/3.8.1/changelog.html
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Science/Research
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Scientific/Engineering
21
22
  Requires-Python: >=3.10
22
23
  Description-Content-Type: text/markdown
@@ -86,7 +86,7 @@ if(NOT TARGET mujoco)
86
86
  if(MUJOCO_FRAMEWORK)
87
87
  message("MuJoCo framework is at ${MUJOCO_FRAMEWORK}/mujoco.framework")
88
88
  set(MUJOCO_LIBRARY
89
- ${MUJOCO_FRAMEWORK}/mujoco.framework/Versions/A/libmujoco.3.7.0.dylib
89
+ ${MUJOCO_FRAMEWORK}/mujoco.framework/Versions/A/libmujoco.3.8.1.dylib
90
90
  )
91
91
  target_compile_options(mujoco INTERFACE -F${MUJOCO_FRAMEWORK})
92
92
  endif()
@@ -94,7 +94,7 @@ if(NOT TARGET mujoco)
94
94
 
95
95
  if(NOT MUJOCO_FRAMEWORK)
96
96
  find_library(
97
- MUJOCO_LIBRARY mujoco mujoco.3.7.0 HINTS ${MUJOCO_LIBRARY_DIR} REQUIRED
97
+ MUJOCO_LIBRARY mujoco mujoco.3.8.1 HINTS ${MUJOCO_LIBRARY_DIR} REQUIRED
98
98
  )
99
99
  find_path(MUJOCO_INCLUDE mujoco/mujoco.h HINTS ${MUJOCO_INCLUDE_DIR} REQUIRED)
100
100
  message("MuJoCo is at ${MUJOCO_LIBRARY}")
@@ -175,7 +175,7 @@ findorfetch(
175
175
  GIT_REPO
176
176
  https://gitlab.com/libeigen/eigen
177
177
  GIT_TAG
178
- 75bcd155c40cb48e647c87c3f29052360255bc9e
178
+ ea13a98decd497a8c5588fb5de71b57bcf10d864
179
179
  TARGETS
180
180
  Eigen3::Eigen
181
181
  EXCLUDE_FROM_ALL
@@ -193,7 +193,7 @@ findorfetch(
193
193
  GIT_REPO
194
194
  https://github.com/pybind/pybind11
195
195
  GIT_TAG
196
- d0f1a2168f3335426f544171a3463c36edbd5cc3 # v3.0.3
196
+ c7fb32eea8c92bebeea9f0735041a72aa20c75f5 # v3.0.4
197
197
  TARGETS
198
198
  pybind11::pybind11_headers
199
199
  EXCLUDE_FROM_ALL
@@ -966,7 +966,7 @@ Euler integrator, semi-implicit in velocity.
966
966
  self.assertEqual(mujoco.mjtEnableBit.mjENBL_OVERRIDE, 1 << 0)
967
967
  self.assertEqual(mujoco.mjtEnableBit.mjENBL_ENERGY, 1 << 1)
968
968
  self.assertEqual(mujoco.mjtEnableBit.mjENBL_FWDINV, 1 << 2)
969
- self.assertEqual(mujoco.mjtEnableBit.mjNENABLE, 6)
969
+ self.assertEqual(mujoco.mjtEnableBit.mjNENABLE, 5)
970
970
  self.assertEqual(mujoco.mjtGeom.mjGEOM_PLANE, 0)
971
971
  self.assertEqual(mujoco.mjtGeom.mjGEOM_HFIELD, 1)
972
972
  self.assertEqual(mujoco.mjtGeom.mjGEOM_SPHERE, 2)
@@ -1216,13 +1216,15 @@ Euler integrator, semi-implicit in velocity.
1216
1216
  mujoco.set_mjcb_control(lambda m, d: None)
1217
1217
  mujoco.mj_step(model_instances[-1], data_instances[-1])
1218
1218
  mujoco.set_mjcb_control(None)
1219
+ # Reference counting changed in Python 3.14.
1220
+ expected_refcount = 2 if sys.version_info < (3, 14) else 1
1219
1221
  while data_instances:
1220
1222
  d = data_instances.pop()
1221
- self.assertEqual(sys.getrefcount(d), 2)
1223
+ self.assertEqual(sys.getrefcount(d), expected_refcount)
1222
1224
  del d
1223
1225
  while model_instances:
1224
1226
  m = model_instances.pop()
1225
- self.assertEqual(sys.getrefcount(m), 2)
1227
+ self.assertEqual(sys.getrefcount(m), expected_refcount)
1226
1228
 
1227
1229
  # This test is disabled on PyPy as it uses sys.getrefcount
1228
1230
  # However PyPy is not officially supported by MuJoCo
@@ -1236,7 +1238,9 @@ Euler integrator, semi-implicit in velocity.
1236
1238
  # passed to getrefcount.
1237
1239
  self.assertEqual(sys.getrefcount(data.model), 3)
1238
1240
  del data
1239
- self.assertEqual(sys.getrefcount(model), 2)
1241
+ # Reference counting changed in Python 3.14.
1242
+ expected_refcount = 2 if sys.version_info < (3, 14) else 1
1243
+ self.assertEqual(sys.getrefcount(model), expected_refcount)
1240
1244
 
1241
1245
  def test_can_initialize_mjv_structs(self):
1242
1246
  self.assertIsInstance(mujoco.MjvScene(), mujoco.MjvScene)
@@ -39,7 +39,7 @@ set(MUJOCO_DEP_VERSION_qhull
39
39
  CACHE STRING "Version of `qhull` to be fetched."
40
40
  )
41
41
  set(MUJOCO_DEP_VERSION_Eigen3
42
- 75bcd155c40cb48e647c87c3f29052360255bc9e
42
+ ea13a98decd497a8c5588fb5de71b57bcf10d864
43
43
  CACHE STRING "Version of `Eigen3` to be fetched."
44
44
  )
45
45
 
@@ -18,7 +18,11 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
18
18
  set(CMAKE_CXX_STANDARD 20)
19
19
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
20
20
  set(CMAKE_CXX_EXTENSIONS OFF)
21
- set(CMAKE_C_EXTENSIONS OFF)
21
+ if(EMSCRIPTEN)
22
+ set(CMAKE_C_EXTENSIONS ON)
23
+ else()
24
+ set(CMAKE_C_EXTENSIONS OFF)
25
+ endif()
22
26
  set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # For LLVM tooling
23
27
 
24
28
  if(NOT CMAKE_CONFIGURATION_TYPES)
@@ -46,6 +46,7 @@ struct mjtDisableBit {
46
46
  std::make_pair("mjDSBL_AUTORESET", ::mjtDisableBit::mjDSBL_AUTORESET),
47
47
  std::make_pair("mjDSBL_NATIVECCD", ::mjtDisableBit::mjDSBL_NATIVECCD),
48
48
  std::make_pair("mjDSBL_ISLAND", ::mjtDisableBit::mjDSBL_ISLAND),
49
+ std::make_pair("mjDSBL_MULTICCD", ::mjtDisableBit::mjDSBL_MULTICCD),
49
50
  std::make_pair("mjNDISABLE", ::mjtDisableBit::mjNDISABLE)};
50
51
  };
51
52
 
@@ -57,7 +58,6 @@ struct mjtEnableBit {
57
58
  std::make_pair("mjENBL_ENERGY", ::mjtEnableBit::mjENBL_ENERGY),
58
59
  std::make_pair("mjENBL_FWDINV", ::mjtEnableBit::mjENBL_FWDINV),
59
60
  std::make_pair("mjENBL_INVDISCRETE", ::mjtEnableBit::mjENBL_INVDISCRETE),
60
- std::make_pair("mjENBL_MULTICCD", ::mjtEnableBit::mjENBL_MULTICCD),
61
61
  std::make_pair("mjENBL_SLEEP", ::mjtEnableBit::mjENBL_SLEEP),
62
62
  std::make_pair("mjNENABLE", ::mjtEnableBit::mjNENABLE)};
63
63
  };
@@ -88,6 +88,28 @@ struct mj_deleteFileVFS {
88
88
  }
89
89
  };
90
90
 
91
+ struct mj_containsBufferVFS {
92
+ static constexpr char name[] = "mj_containsBufferVFS";
93
+ static constexpr char doc[] = "Check if buffer exists in VFS; return 1: exists, 0: not found.";
94
+ using type = int (mjVFS *, const char *);
95
+ static constexpr auto param_names = std::make_tuple("vfs", "name");
96
+
97
+ MUJOCO_ALWAYS_INLINE static type& GetFunc() {
98
+ return ::mj_containsBufferVFS;
99
+ }
100
+ };
101
+
102
+ struct mj_containsFileVFS {
103
+ static constexpr char name[] = "mj_containsFileVFS";
104
+ static constexpr char doc[] = "Check if file exists in VFS; return 1: exists, 0: not found.";
105
+ using type = int (mjVFS *, const char *, const char *);
106
+ static constexpr auto param_names = std::make_tuple("vfs", "directory", "filename");
107
+
108
+ MUJOCO_ALWAYS_INLINE static type& GetFunc() {
109
+ return ::mj_containsFileVFS;
110
+ }
111
+ };
112
+
91
113
  struct mj_deleteVFS {
92
114
  static constexpr char name[] = "mj_deleteVFS";
93
115
  static constexpr char doc[] = "Delete all files from VFS and deallocates VFS internal memory.";
@@ -1210,6 +1232,17 @@ struct mj_rnePostConstraint {
1210
1232
  }
1211
1233
  };
1212
1234
 
1235
+ struct mj_maxContact {
1236
+ static constexpr char name[] = "mj_maxContact";
1237
+ static constexpr char doc[] = "Return the maximum number of contacts that can be generated between two geoms. If has_margin is -1, then the margin is pulled from the model, otherwise if has_margin > 0 indicates that the geoms have a positive margin.";
1238
+ using type = int (const mjModel *, int, int, int);
1239
+ static constexpr auto param_names = std::make_tuple("m", "g1", "g2", "has_margin");
1240
+
1241
+ MUJOCO_ALWAYS_INLINE static type& GetFunc() {
1242
+ return ::mj_maxContact;
1243
+ }
1244
+ };
1245
+
1213
1246
  struct mj_collision {
1214
1247
  static constexpr char name[] = "mj_collision";
1215
1248
  static constexpr char doc[] = "Run collision detection.";
@@ -3223,6 +3256,17 @@ struct mju_sparse2dense {
3223
3256
  }
3224
3257
  };
3225
3258
 
3259
+ struct mju_sym2dense {
3260
+ static constexpr char name[] = "mju_sym2dense";
3261
+ static constexpr char doc[] = "Convert lower-triangular symmetric CSR matrix to full dense matrix.";
3262
+ using type = void (mjtNum *, const mjtNum *, int, const int *, const int *, const int *);
3263
+ static constexpr auto param_names = std::make_tuple("res", "mat", "n", "rownnz", "rowadr", "colind");
3264
+
3265
+ MUJOCO_ALWAYS_INLINE static type& GetFunc() {
3266
+ return ::mju_sym2dense;
3267
+ }
3268
+ };
3269
+
3226
3270
  struct mju_rotVecQuat {
3227
3271
  static constexpr char name[] = "mju_rotVecQuat";
3228
3272
  static constexpr char doc[] = "Rotate vector by quaternion.";
@@ -4689,7 +4733,7 @@ struct mjs_makeMesh {
4689
4733
  struct mjs_getSpec {
4690
4734
  static constexpr char name[] = "mjs_getSpec";
4691
4735
  static constexpr char doc[] = "Get spec from body.";
4692
- using type = mjSpec * (mjsElement *);
4736
+ using type = mjSpec * (const mjsElement *);
4693
4737
  static constexpr auto param_names = std::make_tuple("element");
4694
4738
 
4695
4739
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4697,10 +4741,21 @@ struct mjs_getSpec {
4697
4741
  }
4698
4742
  };
4699
4743
 
4744
+ struct mjs_getOriginSpec {
4745
+ static constexpr char name[] = "mjs_getOriginSpec";
4746
+ static constexpr char doc[] = "get spec that originally defined an element contrary to mjs_getSpec, this does not change after attachment";
4747
+ using type = mjSpec * (const mjsElement *);
4748
+ static constexpr auto param_names = std::make_tuple("element");
4749
+
4750
+ MUJOCO_ALWAYS_INLINE static type& GetFunc() {
4751
+ return ::mjs_getOriginSpec;
4752
+ }
4753
+ };
4754
+
4700
4755
  struct mjs_getCompiler {
4701
4756
  static constexpr char name[] = "mjs_getCompiler";
4702
4757
  static constexpr char doc[] = "Get compiler associated with element's origin spec.";
4703
- using type = mjsCompiler * (mjsElement *);
4758
+ using type = mjsCompiler * (const mjsElement *);
4704
4759
  static constexpr auto param_names = std::make_tuple("element");
4705
4760
 
4706
4761
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4711,7 +4766,7 @@ struct mjs_getCompiler {
4711
4766
  struct mjs_findSpec {
4712
4767
  static constexpr char name[] = "mjs_findSpec";
4713
4768
  static constexpr char doc[] = "Find spec (model asset) by name.";
4714
- using type = mjSpec * (mjSpec *, const char *);
4769
+ using type = mjSpec * (const mjSpec *, const char *);
4715
4770
  static constexpr auto param_names = std::make_tuple("spec", "name");
4716
4771
 
4717
4772
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4722,7 +4777,7 @@ struct mjs_findSpec {
4722
4777
  struct mjs_findBody {
4723
4778
  static constexpr char name[] = "mjs_findBody";
4724
4779
  static constexpr char doc[] = "Find body in spec by name.";
4725
- using type = mjsBody * (mjSpec *, const char *);
4780
+ using type = mjsBody * (const mjSpec *, const char *);
4726
4781
  static constexpr auto param_names = std::make_tuple("s", "name");
4727
4782
 
4728
4783
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4733,7 +4788,7 @@ struct mjs_findBody {
4733
4788
  struct mjs_findElement {
4734
4789
  static constexpr char name[] = "mjs_findElement";
4735
4790
  static constexpr char doc[] = "Find element in spec by name.";
4736
- using type = mjsElement * (mjSpec *, mjtObj, const char *);
4791
+ using type = mjsElement * (const mjSpec *, mjtObj, const char *);
4737
4792
  static constexpr auto param_names = std::make_tuple("s", "type", "name");
4738
4793
 
4739
4794
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4744,7 +4799,7 @@ struct mjs_findElement {
4744
4799
  struct mjs_findChild {
4745
4800
  static constexpr char name[] = "mjs_findChild";
4746
4801
  static constexpr char doc[] = "Find child body by name.";
4747
- using type = mjsBody * (mjsBody *, const char *);
4802
+ using type = mjsBody * (const mjsBody *, const char *);
4748
4803
  static constexpr auto param_names = std::make_tuple("body", "name");
4749
4804
 
4750
4805
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4755,7 +4810,7 @@ struct mjs_findChild {
4755
4810
  struct mjs_getParent {
4756
4811
  static constexpr char name[] = "mjs_getParent";
4757
4812
  static constexpr char doc[] = "Get parent body.";
4758
- using type = mjsBody * (mjsElement *);
4813
+ using type = mjsBody * (const mjsElement *);
4759
4814
  static constexpr auto param_names = std::make_tuple("element");
4760
4815
 
4761
4816
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4766,7 +4821,7 @@ struct mjs_getParent {
4766
4821
  struct mjs_getFrame {
4767
4822
  static constexpr char name[] = "mjs_getFrame";
4768
4823
  static constexpr char doc[] = "Get parent frame.";
4769
- using type = mjsFrame * (mjsElement *);
4824
+ using type = mjsFrame * (const mjsElement *);
4770
4825
  static constexpr auto param_names = std::make_tuple("element");
4771
4826
 
4772
4827
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4777,7 +4832,7 @@ struct mjs_getFrame {
4777
4832
  struct mjs_findFrame {
4778
4833
  static constexpr char name[] = "mjs_findFrame";
4779
4834
  static constexpr char doc[] = "Find frame by name.";
4780
- using type = mjsFrame * (mjSpec *, const char *);
4835
+ using type = mjsFrame * (const mjSpec *, const char *);
4781
4836
  static constexpr auto param_names = std::make_tuple("s", "name");
4782
4837
 
4783
4838
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4788,7 +4843,7 @@ struct mjs_findFrame {
4788
4843
  struct mjs_getDefault {
4789
4844
  static constexpr char name[] = "mjs_getDefault";
4790
4845
  static constexpr char doc[] = "Get default corresponding to an element.";
4791
- using type = mjsDefault * (mjsElement *);
4846
+ using type = mjsDefault * (const mjsElement *);
4792
4847
  static constexpr auto param_names = std::make_tuple("element");
4793
4848
 
4794
4849
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4799,7 +4854,7 @@ struct mjs_getDefault {
4799
4854
  struct mjs_findDefault {
4800
4855
  static constexpr char name[] = "mjs_findDefault";
4801
4856
  static constexpr char doc[] = "Find default in model by class name.";
4802
- using type = mjsDefault * (mjSpec *, const char *);
4857
+ using type = mjsDefault * (const mjSpec *, const char *);
4803
4858
  static constexpr auto param_names = std::make_tuple("s", "classname");
4804
4859
 
4805
4860
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4810,7 +4865,7 @@ struct mjs_findDefault {
4810
4865
  struct mjs_getSpecDefault {
4811
4866
  static constexpr char name[] = "mjs_getSpecDefault";
4812
4867
  static constexpr char doc[] = "Get global default from model.";
4813
- using type = mjsDefault * (mjSpec *);
4868
+ using type = mjsDefault * (const mjSpec *);
4814
4869
  static constexpr auto param_names = std::make_tuple("s");
4815
4870
 
4816
4871
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4821,7 +4876,7 @@ struct mjs_getSpecDefault {
4821
4876
  struct mjs_getId {
4822
4877
  static constexpr char name[] = "mjs_getId";
4823
4878
  static constexpr char doc[] = "Get element id.";
4824
- using type = int (mjsElement *);
4879
+ using type = int (const mjsElement *);
4825
4880
  static constexpr auto param_names = std::make_tuple("element");
4826
4881
 
4827
4882
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4832,7 +4887,7 @@ struct mjs_getId {
4832
4887
  struct mjs_firstChild {
4833
4888
  static constexpr char name[] = "mjs_firstChild";
4834
4889
  static constexpr char doc[] = "Return body's first child of given type. If recurse is nonzero, also search the body's subtree.";
4835
- using type = mjsElement * (mjsBody *, mjtObj, int);
4890
+ using type = mjsElement * (const mjsBody *, mjtObj, int);
4836
4891
  static constexpr auto param_names = std::make_tuple("body", "type", "recurse");
4837
4892
 
4838
4893
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4843,7 +4898,7 @@ struct mjs_firstChild {
4843
4898
  struct mjs_nextChild {
4844
4899
  static constexpr char name[] = "mjs_nextChild";
4845
4900
  static constexpr char doc[] = "Return body's next child of the same type; return NULL if child is last. If recurse is nonzero, also search the body's subtree.";
4846
- using type = mjsElement * (mjsBody *, mjsElement *, int);
4901
+ using type = mjsElement * (const mjsBody *, const mjsElement *, int);
4847
4902
  static constexpr auto param_names = std::make_tuple("body", "child", "recurse");
4848
4903
 
4849
4904
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4854,7 +4909,7 @@ struct mjs_nextChild {
4854
4909
  struct mjs_firstElement {
4855
4910
  static constexpr char name[] = "mjs_firstElement";
4856
4911
  static constexpr char doc[] = "Return spec's first element of selected type.";
4857
- using type = mjsElement * (mjSpec *, mjtObj);
4912
+ using type = mjsElement * (const mjSpec *, mjtObj);
4858
4913
  static constexpr auto param_names = std::make_tuple("s", "type");
4859
4914
 
4860
4915
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4865,7 +4920,7 @@ struct mjs_firstElement {
4865
4920
  struct mjs_nextElement {
4866
4921
  static constexpr char name[] = "mjs_nextElement";
4867
4922
  static constexpr char doc[] = "Return spec's next element; return NULL if element is last.";
4868
- using type = mjsElement * (mjSpec *, mjsElement *);
4923
+ using type = mjsElement * (const mjSpec *, const mjsElement *);
4869
4924
  static constexpr auto param_names = std::make_tuple("s", "element");
4870
4925
 
4871
4926
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4876,7 +4931,7 @@ struct mjs_nextElement {
4876
4931
  struct mjs_getWrapTarget {
4877
4932
  static constexpr char name[] = "mjs_getWrapTarget";
4878
4933
  static constexpr char doc[] = "Get wrapped element in tendon path.";
4879
- using type = mjsElement * (mjsWrap *);
4934
+ using type = mjsElement * (const mjsWrap *);
4880
4935
  static constexpr auto param_names = std::make_tuple("wrap");
4881
4936
 
4882
4937
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4887,7 +4942,7 @@ struct mjs_getWrapTarget {
4887
4942
  struct mjs_getWrapSideSite {
4888
4943
  static constexpr char name[] = "mjs_getWrapSideSite";
4889
4944
  static constexpr char doc[] = "Get wrapped element side site in tendon path if it has one, nullptr otherwise.";
4890
- using type = mjsSite * (mjsWrap *);
4945
+ using type = mjsSite * (const mjsWrap *);
4891
4946
  static constexpr auto param_names = std::make_tuple("wrap");
4892
4947
 
4893
4948
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4898,7 +4953,7 @@ struct mjs_getWrapSideSite {
4898
4953
  struct mjs_getWrapDivisor {
4899
4954
  static constexpr char name[] = "mjs_getWrapDivisor";
4900
4955
  static constexpr char doc[] = "Get divisor of mjsWrap wrapping a puller.";
4901
- using type = double (mjsWrap *);
4956
+ using type = double (const mjsWrap *);
4902
4957
  static constexpr auto param_names = std::make_tuple("wrap");
4903
4958
 
4904
4959
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -4909,7 +4964,7 @@ struct mjs_getWrapDivisor {
4909
4964
  struct mjs_getWrapCoef {
4910
4965
  static constexpr char name[] = "mjs_getWrapCoef";
4911
4966
  static constexpr char doc[] = "Get coefficient of mjsWrap wrapping a joint.";
4912
- using type = double (mjsWrap *);
4967
+ using type = double (const mjsWrap *);
4913
4968
  static constexpr auto param_names = std::make_tuple("wrap");
4914
4969
 
4915
4970
  MUJOCO_ALWAYS_INLINE static type& GetFunc() {
@@ -304,6 +304,7 @@ PYBIND11_MODULE(_functions, pymodule) {
304
304
  m, d, flg_acc, result.data());
305
305
  });
306
306
  Def<traits::mj_rnePostConstraint>(pymodule);
307
+ Def<traits::mj_maxContact>(pymodule);
307
308
  Def<traits::mj_collision>(pymodule);
308
309
  Def<traits::mj_makeConstraint>(pymodule);
309
310
  Def<traits::mj_island>(pymodule);
@@ -1240,6 +1241,37 @@ PYBIND11_MODULE(_functions, pymodule) {
1240
1241
  colind.data());
1241
1242
  });
1242
1243
 
1244
+ DEF_WITH_OMITTED_PY_ARGS(traits::mju_sym2dense, "n")(
1245
+ pymodule,
1246
+ [](Eigen::Ref<EigenArrayXX> res,
1247
+ Eigen::Ref<const EigenVectorX> mat,
1248
+ Eigen::Ref<const EigenVectorI> rownnz,
1249
+ Eigen::Ref<const EigenVectorI> rowadr,
1250
+ Eigen::Ref<const EigenVectorI> colind) {
1251
+ if (res.rows() != res.cols()) {
1252
+ throw py::type_error("res should be a square matrix");
1253
+ }
1254
+ if (res.rows() != rownnz.size()) {
1255
+ throw py::type_error("#rows in res should equal size of rownnz");
1256
+ }
1257
+ if (res.rows() != rowadr.size()) {
1258
+ throw py::type_error("#rows in res should equal size of rowadr");
1259
+ }
1260
+ if (res.rows() > 0) {
1261
+ int nnz = rowadr.array().tail(1)[0] + rownnz.array().tail(1)[0];
1262
+ if (mat.size() < nnz) {
1263
+ throw py::type_error("mat size is too small for the given sparse "
1264
+ "structure");
1265
+ }
1266
+ if (colind.size() < nnz) {
1267
+ throw py::type_error("colind size is too small for the given "
1268
+ "sparse structure");
1269
+ }
1270
+ }
1271
+ return ::mju_sym2dense(res.data(), mat.data(), res.rows(),
1272
+ rownnz.data(), rowadr.data(), colind.data());
1273
+ });
1274
+
1243
1275
  // Quaternions
1244
1276
  Def<traits::mju_rotVecQuat>(pymodule);
1245
1277
  Def<traits::mju_negQuat>(pymodule);
@@ -46,7 +46,8 @@ ENUMS: Mapping[str, EnumDecl] = dict([
46
46
  ('mjDSBL_AUTORESET', 65536),
47
47
  ('mjDSBL_NATIVECCD', 131072),
48
48
  ('mjDSBL_ISLAND', 262144),
49
- ('mjNDISABLE', 19),
49
+ ('mjDSBL_MULTICCD', 524288),
50
+ ('mjNDISABLE', 20),
50
51
  ]),
51
52
  )),
52
53
  ('mjtEnableBit',
@@ -58,9 +59,8 @@ ENUMS: Mapping[str, EnumDecl] = dict([
58
59
  ('mjENBL_ENERGY', 2),
59
60
  ('mjENBL_FWDINV', 4),
60
61
  ('mjENBL_INVDISCRETE', 8),
61
- ('mjENBL_MULTICCD', 16),
62
- ('mjENBL_SLEEP', 32),
63
- ('mjNENABLE', 6),
62
+ ('mjENBL_SLEEP', 16),
63
+ ('mjNENABLE', 5),
64
64
  ]),
65
65
  )),
66
66
  ('mjtJoint',
@@ -42,9 +42,8 @@ class EnumsTest(absltest.TestCase):
42
42
  ('mjENBL_ENERGY', 1<<1),
43
43
  ('mjENBL_FWDINV', 1<<2),
44
44
  ('mjENBL_INVDISCRETE', 1<<3),
45
- ('mjENBL_MULTICCD', 1<<4),
46
- ('mjENBL_SLEEP', 1<<5),
47
- ('mjNENABLE', 6)))
45
+ ('mjENBL_SLEEP', 1<<4),
46
+ ('mjNENABLE', 5)))
48
47
 
49
48
  # values mostly increment by one with occasional overrides
50
49
  def test_mjtGeom(self): # pylint: disable=invalid-name