mujoco-mojo 2.2.3__tar.gz → 2.3.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 (391) hide show
  1. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.github/workflows/docs.yml +1 -1
  2. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/PKG-INFO +1 -1
  3. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/dojo.md +13 -0
  4. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/getting-started.md +5 -5
  5. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/mosaic.md +22 -2
  6. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/runtime-script.md +1 -1
  7. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/mkdocs.yml +0 -2
  8. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/gen_ref_pages.py +0 -2
  9. mujoco_mojo-2.3.0/scripts/gen_ts_models.py +176 -0
  10. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/__init__.py +24 -0
  11. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/dataframe.py +49 -21
  12. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/filters/__init__.py +16 -0
  13. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/filters/filters.py +323 -7
  14. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/cli.py +20 -0
  15. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +290 -0
  16. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/plot_config.py +163 -0
  17. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +875 -0
  18. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +42 -24
  19. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +52 -0
  20. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +242 -42
  21. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +133 -68
  22. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_json_editor.html +37 -14
  23. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_lab_trigger.html +36 -0
  24. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +65 -0
  25. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_series_panel.html +489 -100
  26. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_signal_lab.html +1407 -0
  27. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +35 -11
  28. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +78 -27
  29. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +2409 -0
  30. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +23 -6
  31. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +182 -0
  32. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +8 -3
  33. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/cm-bundle.ts +7 -0
  34. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +102 -0
  35. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts +90 -0
  36. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +22 -68
  37. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/monitor.js → mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +108 -85
  38. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +125 -84
  39. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +2831 -0
  40. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/types/global.d.ts +35 -4
  41. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +1 -1
  42. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +12 -0
  43. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +8 -0
  44. mujoco_mojo-2.3.0/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +915 -0
  45. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +11 -1
  46. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/proximity.py +0 -4
  47. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +0 -488
  48. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -88
  49. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +0 -1388
  50. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/main.js +0 -295
  51. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/mosaic.js +0 -47
  52. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/trial-viewer.js +0 -2032
  53. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +0 -79
  54. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -245
  55. mujoco_mojo-2.2.3/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +0 -1417
  56. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.gitattributes +0 -0
  57. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.github/workflows/release.yml +0 -0
  58. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.gitignore +0 -0
  59. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.pre-commit-config.yaml +0 -0
  60. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.python-version +0 -0
  61. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/.vscode/settings.json +0 -0
  62. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/LICENSE +0 -0
  63. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/README.md +0 -0
  64. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/TODO.md +0 -0
  65. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/about.md +0 -0
  66. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/dark-hero-logo.png +0 -0
  67. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/dark-hero-logo.svg +0 -0
  68. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/dark-logo.svg +0 -0
  69. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/light-hero-logo.svg +0 -0
  70. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/light-logo.svg +0 -0
  71. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/logo.svg +0 -0
  72. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/bunny_original.jpg +0 -0
  73. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
  74. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
  75. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/frustums.jpg +0 -0
  76. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
  77. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
  78. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/with_coacd.jpg +0 -0
  79. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/mesh/without_coacd.jpg +0 -0
  80. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-export-options.jpg +0 -0
  81. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
  82. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
  83. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
  84. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
  85. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
  86. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
  87. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/generate-result.jpg +0 -0
  88. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-export-options.jpg +0 -0
  89. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
  90. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
  91. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
  92. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
  93. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
  94. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
  95. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/assets/user-guides/runtime-anim.gif +0 -0
  96. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/index.md +0 -0
  97. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/javascripts/favicon-switcher.js +0 -0
  98. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/javascripts/mojo-highlighter.js +0 -0
  99. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/javascripts/tablesort.js +0 -0
  100. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/stylesheets/extra.css +0 -0
  101. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
  102. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/generate-script.md +0 -0
  103. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/init.md +0 -0
  104. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/monitor.md +0 -0
  105. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/monte_carlo_example.py +0 -0
  106. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/optimization.md +0 -0
  107. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/optimization_example.py +0 -0
  108. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/reloaded.md +0 -0
  109. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/docs/user-guides/running-jobs.md +0 -0
  110. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/examples/boxes_and_springs_monte_carlo.py +0 -0
  111. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/examples/boxes_and_springs_optimization.py +0 -0
  112. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/examples/tennis_racket_theorem.py +0 -0
  113. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/pyproject.toml +0 -0
  114. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/requirements.txt +0 -0
  115. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/copy_docs_examples_to_examples.py +0 -0
  116. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/fix_smart_quotes.py +0 -0
  117. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/templating/filestomake.txt +0 -0
  118. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/templating/make_sensors.py +0 -0
  119. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/scripts/templating/sensor_template.py +0 -0
  120. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/__about__.py +0 -0
  121. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/base.py +0 -0
  122. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/meta.py +0 -0
  123. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/__init__.py +0 -0
  124. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/defaults.py +0 -0
  125. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
  126. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/extension.py +0 -0
  127. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
  128. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
  129. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
  130. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
  131. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco.py +0 -0
  132. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
  133. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
  134. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
  135. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
  136. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
  137. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
  138. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
  139. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
  140. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
  141. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
  142. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
  143. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
  144. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
  145. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
  146. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
  147. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
  148. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
  149. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
  150. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
  151. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
  152. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
  153. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
  154. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
  155. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
  156. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
  157. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
  158. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
  159. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
  160. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
  161. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
  162. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
  163. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
  164. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
  165. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
  166. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
  167. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
  168. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
  169. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
  170. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
  171. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
  172. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
  173. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +0 -0
  174. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +0 -0
  175. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
  176. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
  177. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
  178. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
  179. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
  180. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
  181. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
  182. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
  183. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
  184. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
  185. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
  186. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
  187. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
  188. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
  189. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
  190. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
  191. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
  192. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
  193. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
  194. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
  195. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
  196. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
  197. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
  198. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
  199. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
  200. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
  201. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
  202. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
  203. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
  204. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
  205. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
  206. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
  207. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
  208. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
  209. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
  210. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
  211. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
  212. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
  213. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
  214. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
  215. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
  216. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
  217. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
  218. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
  219. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
  220. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
  221. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
  222. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
  223. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
  224. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
  225. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
  226. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
  227. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
  228. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
  229. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
  230. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
  231. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
  232. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
  233. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
  234. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
  235. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
  236. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
  237. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
  238. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
  239. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
  240. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
  241. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
  242. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
  243. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
  244. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
  245. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
  246. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
  247. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
  248. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
  249. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
  250. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
  251. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
  252. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
  253. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
  254. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -0
  255. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
  256. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
  257. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
  258. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
  259. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
  260. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
  261. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
  262. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
  263. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
  264. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
  265. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
  266. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
  267. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
  268. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
  269. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
  270. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
  271. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
  272. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
  273. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
  274. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
  275. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
  276. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
  277. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
  278. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
  279. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
  280. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
  281. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
  282. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
  283. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
  284. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
  285. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
  286. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/orientation.py +0 -0
  287. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/plugin.py +0 -0
  288. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/pose.py +0 -0
  289. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/position.py +0 -0
  290. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
  291. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/mojo_model.py +0 -0
  292. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/runtime/__init__.py +0 -0
  293. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/runtime/load.py +0 -0
  294. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/runtime/runtime_manager.py +0 -0
  295. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/runtime/signal_manager.py +0 -0
  296. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
  297. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/stochas/__init__.py +0 -0
  298. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/__init__.py +0 -0
  299. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
  300. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/optimization.py +0 -0
  301. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/reloaded.sh +0 -0
  302. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/run_mc.sh +0 -0
  303. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/templates/run_opt.sh +0 -0
  304. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/typing.py +0 -0
  305. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/__init__.py +0 -0
  306. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/color.py +0 -0
  307. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/defaults.py +0 -0
  308. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/interp.py +0 -0
  309. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
  310. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
  311. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
  312. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
  313. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
  314. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
  315. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
  316. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
  317. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
  318. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
  319. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
  320. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
  321. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
  322. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
  323. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
  324. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
  325. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
  326. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
  327. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts.map +0 -0
  328. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
  329. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
  330. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
  331. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/format.ts +0 -0
  332. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/toast.ts +0 -0
  333. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
  334. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
  335. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
  336. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/confetti.browser.min.js +0 -0
  337. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
  338. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/lz-string.min.js +0 -0
  339. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/plotly-3.4.0.min.js +0 -0
  340. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
  341. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/layers/reloaded.py +0 -0
  342. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/log.py +0 -0
  343. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
  344. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/runner.py +0 -0
  345. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/statusing.py +0 -0
  346. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/utils/utils.py +0 -0
  347. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/src/mujoco_mojo/visualization.py +0 -0
  348. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/.gitignore +0 -0
  349. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/make_skybox.py +0 -0
  350. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/meshes/ball.stl +0 -0
  351. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/meshes/bunny2.stl +0 -0
  352. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/meshes/cup.stl +0 -0
  353. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/inertial_test.py +0 -0
  354. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/mesh.py +0 -0
  355. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/orientation_test.py +0 -0
  356. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/pos_test.py +0 -0
  357. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/pose_test.py +0 -0
  358. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/mjcf/xml_model_test.py +0 -0
  359. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/model_with_skybox.xml +0 -0
  360. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/monte_carlo_test/asset_image.png +0 -0
  361. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/monte_carlo_test/monte_carlo.py +0 -0
  362. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/monte_carlo_test/overrides.json +0 -0
  363. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
  364. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/conftest.py +0 -0
  365. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/loads_test.py +0 -0
  366. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/monte_carlo_bumper.py +0 -0
  367. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/optimizer_bumper.py +0 -0
  368. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/runtime_manager_test.py +0 -0
  369. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/runtime/signal_manager_test.py +0 -0
  370. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/smoke_test.py +0 -0
  371. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/test_writer.py +0 -0
  372. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/utils/color_test.py +0 -0
  373. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/utils/dataframe_test.py +0 -0
  374. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/utils/filter_test.py +0 -0
  375. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/utils/interp_test.py +0 -0
  376. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/tests/utils/proximity_test.py +0 -0
  377. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/__init__.pyi +0 -0
  378. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_callbacks.pyi +0 -0
  379. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_constants.pyi +0 -0
  380. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_enums.pyi +0 -0
  381. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_errors.pyi +0 -0
  382. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_functions.pyi +0 -0
  383. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_render.pyi +0 -0
  384. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_specs.pyi +0 -0
  385. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/_structs.pyi +0 -0
  386. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/cgl/__init__.pyi +0 -0
  387. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/cgl/cgl.pyi +0 -0
  388. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/gl_context.pyi +0 -0
  389. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/glfw/__init__.pyi +0 -0
  390. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/typings/mujoco/renderer.pyi +0 -0
  391. {mujoco_mojo-2.2.3 → mujoco_mojo-2.3.0}/uv.lock +0 -0
@@ -24,7 +24,7 @@ jobs:
24
24
  - name: Install Python 3.13
25
25
  run: uv python install 3.13
26
26
  - name: Generate API reference pages
27
- run: uv run --python 3.13 --group dev python mujoco-mojo/scripts/gen_ref_pages.py
27
+ run: uv run --python 3.13 --group dev python scripts/gen_ref_pages.py
28
28
  - run: uv run --python 3.13 --group dev zensical build --clean
29
29
  - uses: actions/upload-pages-artifact@v4
30
30
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mujoco-mojo
3
- Version: 2.2.3
3
+ Version: 2.3.0
4
4
  Summary: A complete MJCF lifecycle and trial orchestration suite for MuJoCo, powered by Pydantic v2.
5
5
  Project-URL: Homepage, https://github.com/Hydrowelder/mujoco-mojo
6
6
  Project-URL: Documentation, https://hydrowelder.github.io/mujoco-mojo/
@@ -78,5 +78,18 @@ Dojo is split into two primary environments depending on your current needs:
78
78
 
79
79
  ---
80
80
 
81
+ ## Plot Notes
82
+
83
+ The trial viewer supports freeform notes anchored to specific points on a plot.
84
+
85
+ - **Add a note:** Middle-click anywhere on the plot area. The Notes panel opens with the cursor's data coordinates pre-filled.
86
+ - **Edit or delete:** Open the Notes panel (the speech-bubble icon in the sidebar) and use the edit/delete controls next to each note.
87
+ - **Jump to a note:** Click the note's coordinates in the list to zoom the plot to that location.
88
+ - **Close the panel:** Left-click anywhere outside the Notes panel, or press ++esc++.
89
+
90
+ Notes are persisted in the trial's saved configuration and are included when sharing a view via the share URL.
91
+
92
+ ---
93
+
81
94
  !!! success
82
95
  Dojo is now live! Now that you have the interface running, move on to the **Monitor** tool to learn how to track your job's progress in real-time.
@@ -283,23 +283,23 @@ MuJoCo does not currently ship first-party Python typing stubs. To enable proper
283
283
 
284
284
  > Thanks to the work by [@kevinzakka](https://github.com/google-deepmind/mujoco/issues/1292#issuecomment-1874138201) and [@mluogh-xdof](https://github.com/google-deepmind/mujoco/issues/1292#issuecomment-3208219200) for figuring all this out!
285
285
 
286
- 1. In your terminal:
286
+ 1. From your project root, generate stubs into a local `typings/` directory:
287
287
 
288
288
  ```bash linenums="0"
289
- pybind11-stubgen mujoco -o ~/typings/ --numpy-array-wrap-with-annotated
289
+ pybind11-stubgen mujoco -o typings/ --numpy-array-wrap-with-annotated
290
290
  ```
291
291
 
292
292
  2. Recent MuJoCo builds compiled with newer pybind11 versions correctly expose enums as `SupportsInt`. If you encounter Pyright enum type errors, apply the compatibility patch:
293
293
 
294
294
  ```bash linenums="0"
295
- python ~/typings/patch_mujoco_enums.py ~/typings/mujoco/_enums.pyi
295
+ python typings/patch_mujoco_enums.py typings/mujoco/_enums.pyi
296
296
  ```
297
297
 
298
298
  3. Then in `pyproject.toml` (for me, VSCode already type hints correctly, but this should fix things if you use `pyright` with your pre-commit hooks):
299
299
 
300
300
  ```toml title="pyproject.toml"
301
301
  [tool.pyright]
302
- stubPath = "~/typings"
302
+ stubPath = "typings"
303
303
  venvPath = "."
304
304
  venv = ".venv"
305
305
  ```
@@ -307,7 +307,7 @@ MuJoCo does not currently ship first-party Python typing stubs. To enable proper
307
307
  ---
308
308
 
309
309
  !!! tip "Tip: Scaffold a New Project"
310
- Before diving into the generate script, run `mujoco-mojo init` in a new directory to get a working project skeleton `simulation.py`, `run.sh`, and `reloaded.sh` pre-wired and ready to edit.
310
+ Before diving into the generate script, run `mujoco-mojo init` in a new directory to get a working project skeleton (`simulation.py`, `run.sh`, and `reloaded.sh`) pre-wired and ready to edit.
311
311
 
312
312
  ```bash linenums="0"
313
313
  mujoco-mojo init
@@ -58,7 +58,7 @@ Adjust the visual style. Switch between Lines, Markers, or both. Change interpol
58
58
 
59
59
  ### Notes Editor
60
60
 
61
- Click anywhere on the plot to drop a persistent note. These are saved into the JSON config and help you flag specific events (like "Impact Start" or "Sensor Saturation"). The editor allows you to go back and edit the note's label. Typos happen!
61
+ **Middle-click** anywhere on the plot to drop a persistent note at the exact data coordinates of your cursor. Notes are saved into the JSON config and help you flag specific events (like "Impact Start" or "Sensor Saturation"). The editor allows you to go back and edit the note's label. Press ++esc++ to cancel an in-progress note or close the panel.
62
62
 
63
63
  ???+ tip "Tip: Clickable Buttons"
64
64
  You can click on a note in the editor to "focus" on the note!
@@ -71,18 +71,38 @@ Click anywhere on the plot to drop a persistent note. These are saved into the J
71
71
 
72
72
  ### Shapes Editor
73
73
 
74
- Add various shapes to the plot. After selecting an option in the menu, your mouse becomes a placement tool. Clicking on the plot configures the placement of the shape.
74
+ Add various shapes to the plot. After selecting an option in the menu, your mouse becomes a placement tool. Clicking on the plot configures the placement of the shape. Press ++esc++ at any time to cancel placement.
75
75
 
76
76
  - **V-Line:** Draws a vertical line on the plot. The abscissa of the mouse determines the abscissa of the line.
77
77
  - **H-Line:** Draws a horizontal line on the plot. The ordinate of the mouse determines the ordinate of the line.
78
78
  - **Rect:** Draws a rectangle on the plot. The abscissa and ordinate of the mouse determines one of the corners of the rectangle. Likewise, the second click determines the other corner.
79
79
 
80
+ Each new shape is automatically assigned the next color in the preset palette so overlapping shapes remain visually distinct. The shape editor includes a full color picker (identical to the signal color picker) for precise color control.
81
+
80
82
  <figure align="center">
81
83
  <img src="../../assets/user-guides/light-shapes-editor.jpg#only-light" alt="Shapes editor menu" style="width: 60%; height: auto;">
82
84
  <img src="../../assets/user-guides/dark-shapes-editor.jpg#only-dark" alt="Shapes editor menu" style="width: 60%; height: auto;">
83
85
  <figcaption>The menu for <b>shapes editor</b> is active and in editing mode. A shape's label and color is being edited. The plot area shows a vertical (yellow) and horizontal (red) line and a rectangle (purple).</figcaption>
84
86
  </figure>
85
87
 
88
+ ### Saved Profiles
89
+
90
+ Profiles save your complete plot configuration (selected signals, axes, display settings, zoom, annotations, and shapes) under a named key so you can restore a view instantly.
91
+
92
+ Profiles are stored globally in `~/.mujoco-mojo/profiles/` and are available across all workdirs, making it easy to share a standard analysis setup between projects.
93
+
94
+ **Creating a profile**
95
+
96
+ Type a name in the save box and press **Save** or ++enter++. To organize profiles into folders use a `folder/name` path, for example `arm-reach/baseline`. Folders are created automatically and the input field offers Tab-completion for existing folder names.
97
+
98
+ **Loading a profile**
99
+
100
+ Click **Load** next to any profile in the list. If the profile references signals, axes, or reference frames that do not exist in the current trial it will be rejected with an error toast rather than silently applying an invalid configuration. Profiles that are incompatible with the current trial are marked with a warning icon in the list.
101
+
102
+ **Searching profiles**
103
+
104
+ A search box filters the profile list by name (including folder path) as you type.
105
+
86
106
  ### Undo/Redo
87
107
 
88
108
  Every change to the plot configuration is tracked. Use the standard shortcuts (++ctrl+z++ / ++ctrl+y++ or ++cmd+z++ / ++cmd+shift+z++) to step through your edits.
@@ -49,7 +49,7 @@ Mojo provides high-level force abstractions like `PointToPointForce`, which auto
49
49
 
50
50
  ---
51
51
 
52
- **6-DOF force and torque**. The "multi-tool" of loads—defines full spatial dynamics in either a relative frame or local to a site.
52
+ **6-DOF force and torque**. Defines full spatial dynamics in either a relative frame or local to a site.
53
53
 
54
54
  > Think of it as a `VectorForce` and `VectorTorque` combined into one robust plugin.
55
55
 
@@ -29,9 +29,7 @@ nav:
29
29
  - Optimization: user-guides/optimization.md
30
30
  - Reloaded: user-guides/reloaded.md
31
31
  - Code Reference:
32
- - reference/index.md
33
32
  - mujoco_mojo:
34
- - reference/mujoco_mojo/index.md
35
33
  - MojoModel: reference/mujoco_mojo/mojo_model.md
36
34
  - Base: reference/mujoco_mojo/base.md
37
35
  - Visualization: reference/mujoco_mojo/visualization.md
@@ -19,8 +19,6 @@ DOCS_REF = ROOT / "docs" / "reference"
19
19
  # Modules to document: (dotted identifier, output path relative to DOCS_REF)
20
20
  # ---------------------------------------------------------------------------
21
21
  MODULES: list[tuple[str, str]] = [
22
- # top-level package
23
- ("mujoco_mojo", "mujoco_mojo/index.md"),
24
22
  ("mujoco_mojo.mojo_model", "mujoco_mojo/mojo_model.md"),
25
23
  ("mujoco_mojo.base", "mujoco_mojo/base.md"),
26
24
  ("mujoco_mojo.visualization", "mujoco_mojo/visualization.md"),
@@ -0,0 +1,176 @@
1
+ """
2
+ Generate TypeScript types from Pydantic models in plot_config.py.
3
+
4
+ Run from the repo root:
5
+
6
+ python scripts/gen_ts_models.py
7
+
8
+ Writes:
9
+ src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import sys
15
+ import textwrap
16
+ from pathlib import Path
17
+
18
+ ROOT = Path(__file__).parent.parent
19
+ TS_OUT = (
20
+ ROOT
21
+ / "src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib"
22
+ / "plot-config.generated.ts"
23
+ )
24
+
25
+ # ---------------------------------------------------------------------------
26
+ # JSON Schema → TypeScript converter
27
+ # ---------------------------------------------------------------------------
28
+
29
+
30
+ def _ref_name(ref: str) -> str:
31
+ """'#/$defs/FooBar' → 'FooBar'"""
32
+ return ref.rsplit("/", 1)[-1]
33
+
34
+
35
+ def _schema_to_ts(node: dict, defs: dict) -> str:
36
+ """Recursively convert a JSON Schema node to a TypeScript type string."""
37
+ if "$ref" in node:
38
+ return _ref_name(node["$ref"])
39
+
40
+ if "anyOf" in node:
41
+ parts = [_schema_to_ts(s, defs) for s in node["anyOf"]]
42
+ return " | ".join(parts)
43
+
44
+ if "enum" in node:
45
+ return " | ".join(f'"{v}"' for v in node["enum"])
46
+
47
+ t = node.get("type")
48
+
49
+ if t == "string":
50
+ return "string"
51
+ if t in ("number", "integer"):
52
+ return "number"
53
+ if t == "boolean":
54
+ return "boolean"
55
+ if t == "null":
56
+ return "null"
57
+
58
+ if t == "array":
59
+ if "prefixItems" in node:
60
+ items = [_schema_to_ts(s, defs) for s in node["prefixItems"]]
61
+ return f"[{', '.join(items)}]"
62
+ if "items" in node:
63
+ return f"{_schema_to_ts(node['items'], defs)}[]"
64
+ return "unknown[]"
65
+
66
+ if t == "object":
67
+ add_props = node.get("additionalProperties")
68
+ props = node.get("properties", {})
69
+ required = set(node.get("required", []))
70
+
71
+ if add_props and not props:
72
+ # Pure dict / Record
73
+ if add_props is True or add_props == {}:
74
+ return "Record<string, unknown>"
75
+ return f"Record<string, {_schema_to_ts(add_props, defs)}>"
76
+
77
+ # Inline object (rare — models surface as $defs, not inline)
78
+ lines = _props_to_ts_lines(props, required, defs)
79
+ if add_props is True:
80
+ lines.append(" [key: string]: unknown;")
81
+ body = "\n".join(lines)
82
+ return "{\n" + body + "\n}"
83
+
84
+ return "unknown"
85
+
86
+
87
+ def _props_to_ts_lines(
88
+ props: dict,
89
+ required: set[str],
90
+ defs: dict,
91
+ ) -> list[str]:
92
+ """Return one ' field?: Type;' string per property."""
93
+ lines: list[str] = []
94
+ for name, schema in props.items():
95
+ ts_type = _schema_to_ts(schema, defs)
96
+ opt = "" if name in required else "?"
97
+ lines.append(f" {name}{opt}: {ts_type};")
98
+ return lines
99
+
100
+
101
+ # ---------------------------------------------------------------------------
102
+ # $defs → top-level TypeScript declarations
103
+ # ---------------------------------------------------------------------------
104
+
105
+
106
+ def _def_to_ts(name: str, schema: dict, defs: dict) -> str:
107
+ """Convert one $defs entry to a TypeScript type or interface block."""
108
+ # StrEnum / Literal → export type Name = "a" | "b";
109
+ if "enum" in schema:
110
+ values = " | ".join(f'"{v}"' for v in schema["enum"])
111
+ return f"export type {name} = {values};\n"
112
+
113
+ # BaseModel → export interface Name { ... }
114
+ if schema.get("type") == "object":
115
+ props = schema.get("properties", {})
116
+ required = set(schema.get("required", []))
117
+ lines = _props_to_ts_lines(props, required, defs)
118
+ if schema.get("additionalProperties") is True:
119
+ lines.append(" [key: string]: unknown;")
120
+ body = "\n".join(lines) if lines else " [key: string]: unknown;"
121
+ return f"export interface {name} {{\n{body}\n}}\n"
122
+
123
+ return f"// Unhandled $def: {name}\n"
124
+
125
+
126
+ def _top_level_interface(schema: dict, defs: dict) -> str:
127
+ """Generate the top-level model (PlotConfig) as an interface."""
128
+ name = schema.get("title", "PlotConfig")
129
+ desc = schema.get("description", "")
130
+ props = schema.get("properties", {})
131
+ required = set(schema.get("required", []))
132
+ lines = _props_to_ts_lines(props, required, defs)
133
+ body = "\n".join(lines)
134
+ comment = f"/** {desc} */\n" if desc else ""
135
+ return f"{comment}export interface {name} {{\n{body}\n}}\n"
136
+
137
+
138
+ # ---------------------------------------------------------------------------
139
+ # Entry point
140
+ # ---------------------------------------------------------------------------
141
+
142
+
143
+ def main() -> None:
144
+ # Import inside main so sys.path manipulation is localised
145
+ sys.path.insert(0, str(ROOT / "src"))
146
+ from mujoco_mojo.utils.layers.dojo.plot_config import PlotConfig
147
+
148
+ schema = PlotConfig.model_json_schema()
149
+ defs: dict = schema.get("$defs", {})
150
+
151
+ blocks: list[str] = []
152
+
153
+ # Emit each $def in definition order
154
+ for def_name, def_schema in defs.items():
155
+ blocks.append(_def_to_ts(def_name, def_schema, defs))
156
+
157
+ # Emit the top-level PlotConfig interface
158
+ blocks.append(_top_level_interface(schema, defs))
159
+
160
+ header = textwrap.dedent("""\
161
+ // ============================================================
162
+ // AUTO-GENERATED - do not edit manually.
163
+ // Source: src/mujoco_mojo/utils/layers/dojo/plot_config.py
164
+ // Regenerate: python scripts/gen_ts_models.py
165
+ // ============================================================
166
+
167
+ """)
168
+
169
+ output = header + "\n".join(blocks)
170
+ TS_OUT.parent.mkdir(parents=True, exist_ok=True)
171
+ TS_OUT.write_text(output, encoding="utf-8")
172
+ print(f"Written → {TS_OUT.relative_to(ROOT)}")
173
+
174
+
175
+ if __name__ == "__main__":
176
+ main()
@@ -2,6 +2,30 @@
2
2
  mujoco_mojo is a collection of Python objects built to make working with MuJoCo via Python easier.
3
3
 
4
4
  It provides vast bindings for all MJCF XML schema objects, tools to convert to XML, run MuJoCo simulations, and more.
5
+
6
+ MuJoCo Type Stubs:
7
+ ------------------
8
+
9
+ MuJoCo does not ship Python type stubs. Generate them once with pybind11-stubgen:
10
+
11
+ .. code-block:: bash
12
+ pip install pybind11-stubgen
13
+ pybind11-stubgen mujoco -o typings/ --numpy-array-wrap-with-annotated
14
+
15
+ Run this from the project root. The ``typings/`` directory is gitignored.
16
+ Then add to pyproject.toml:
17
+
18
+ .. code-block:: toml
19
+ [tool.pyright]
20
+ stubPath = "typings"
21
+ venvPath = "."
22
+ venv = ".venv"
23
+
24
+ If you encounter Pyright enum errors on recent MuJoCo builds, apply the
25
+ compatibility patch that ships alongside the stubs:
26
+
27
+ .. code-block:: bash
28
+ python typings/patch_mujoco_enums.py typings/mujoco/_enums.pyi
5
29
  """
6
30
 
7
31
  from mujoco_mojo.__about__ import __version__ # noqa: F401
@@ -1,7 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import TYPE_CHECKING, Any, Protocol, TypedDict, cast
4
+ from typing import TYPE_CHECKING, Any, TypedDict, cast
5
+
6
+ if TYPE_CHECKING:
7
+ from typing import Self
5
8
 
6
9
  import polars as pl
7
10
  from scipy.spatial.transform import Rotation as R
@@ -28,13 +31,6 @@ from mujoco_mojo.utils.log import get_logger
28
31
  logger = get_logger(__name__)
29
32
 
30
33
 
31
- class MojoFrameProtocol(Protocol):
32
- """Protocol to tell type checkers that .mojo is available on the DataFrame."""
33
-
34
- @property
35
- def mojo(self) -> MojoNamespace: ...
36
-
37
-
38
34
  class _MojoFrame(pl.DataFrame):
39
35
  """
40
36
  Internal implementation of MojoFrame to house static loaders.
@@ -78,10 +74,30 @@ class _MojoFrame(pl.DataFrame):
78
74
 
79
75
  if TYPE_CHECKING:
80
76
  # MojoFrame is seen by the IDE as the combination of:
81
- # 1. Our loaders (_MojoFrame)
77
+ # 1. loaders (_MojoFrame)
82
78
  # 2. Polars methods (pl.DataFrame)
83
- # 3. Our namespace (MojoFrameProtocol)
84
- class MojoDataFrame(_MojoFrame, MojoFrameProtocol): ...
79
+ # 3. namespace (MojoFrameProtocol)
80
+ class MojoDataFrame(_MojoFrame):
81
+ @property
82
+ def mojo(self) -> MojoNamespace: ...
83
+
84
+ # override polars methods that return DataFrame so the type propagates
85
+ def select(self, *args: Any, **kwargs: Any) -> Self: ...
86
+ def filter(self, *args: Any, **kwargs: Any) -> Self: ...
87
+ def with_columns(self, *args: Any, **kwargs: Any) -> Self: ...
88
+ def sort(self, *args: Any, **kwargs: Any) -> Self: ...
89
+ def head(self, *args: Any, **kwargs: Any) -> Self: ...
90
+ def tail(self, *args: Any, **kwargs: Any) -> Self: ...
91
+ def limit(self, *args: Any, **kwargs: Any) -> Self: ...
92
+ def slice(self, *args: Any, **kwargs: Any) -> Self: ...
93
+ def rename(self, *args: Any, **kwargs: Any) -> Self: ...
94
+ def drop(self, *args: Any, **kwargs: Any) -> Self: ...
95
+ def drop_nulls(self, *args: Any, **kwargs: Any) -> Self: ...
96
+ def unique(self, *args: Any, **kwargs: Any) -> Self: ...
97
+ def sample(self, *args: Any, **kwargs: Any) -> Self: ...
98
+ def join(self, *args: Any, **kwargs: Any) -> Self: ...
99
+ def hstack(self, *args: Any, **kwargs: Any) -> Self: ...
100
+ def vstack(self, *args: Any, **kwargs: Any) -> Self: ...
85
101
  else:
86
102
  # At runtime, it's just our internal class
87
103
  MojoDataFrame = _MojoFrame
@@ -93,7 +109,6 @@ class ColumnManifest(TypedDict):
93
109
  available_quats: list[str]
94
110
 
95
111
 
96
- @pl.api.register_dataframe_namespace("mojo")
97
112
  class MojoNamespace:
98
113
  """
99
114
  Enhanced Polars DataFrame for MuJoCo Mojo telemetry.
@@ -216,18 +231,22 @@ class MojoNamespace:
216
231
  self._df.select(pl.col(rf"^{SignalCategory.DEFORMABLES}/{name}/.*$"))
217
232
  )
218
233
 
219
- def _get_base_map(self) -> dict[str, set[str]]:
234
+ def _get_base_map(
235
+ self, extra_columns: list[str] | None = None
236
+ ) -> dict[str, set[str]]:
220
237
  """
221
238
  Internal helper to group suffixes by their common prefixes.
222
239
 
223
240
  Example:
224
- 'Bodies/racket:xvelr:x', 'Bodies/racket:xvelr:y' -> {'Bodies/racket:xvelr': {'x', 'y'}}
241
+ 'Bodies/racket/xvelr:x', 'Bodies/racket/xvelr:y' -> {'Bodies/racket/xvelr': {'x', 'y'}}
242
+
243
+ extra_columns are included in discovery but are not expected to exist in self._df.
225
244
 
226
245
  """
227
246
  base_map: dict[str, set[str]] = {}
228
- for c in self._df.columns:
247
+ for c in list(self._df.columns) + (extra_columns or []):
229
248
  if ":" in c:
230
- prefix, suffix = c.rsplit(":") # we may have :ke_trans, or ke_rot, etc.
249
+ prefix, suffix = c.rsplit(":", 1)
231
250
  base_map.setdefault(prefix, set()).add(suffix)
232
251
  return base_map
233
252
 
@@ -265,12 +284,17 @@ class MojoNamespace:
265
284
  expanded.extend([f"{base}:w", f"{base}:x", f"{base}:y", f"{base}:z"])
266
285
  return expanded
267
286
 
268
- def get_manifest(self) -> ColumnManifest:
269
- """Returns the structured manifest used by the frontend."""
287
+ def get_manifest(self, extra_columns: list[str] | None = None) -> ColumnManifest:
288
+ """Returns the structured manifest used by the frontend. extra_columns are appended to 'all' and included in rotatable/quat discovery."""
289
+ bm = self._get_base_map(extra_columns)
270
290
  return {
271
- "all": self._df.columns,
272
- "rotatable_vectors": sorted(list(self.rotatable_bases)),
273
- "available_quats": sorted(list(self.quaternion_bases)),
291
+ "all": list(self._df.columns) + (extra_columns or []),
292
+ "rotatable_vectors": sorted(
293
+ b for b, s in bm.items() if {"x", "y", "z"}.issubset(s) and "w" not in s
294
+ ),
295
+ "available_quats": sorted(
296
+ b for b, s in bm.items() if {"w", "x", "y", "z"}.issubset(s)
297
+ ),
274
298
  }
275
299
 
276
300
  def with_rotation(self, quat_base: str, invert: bool = True) -> MojoDataFrame:
@@ -370,3 +394,7 @@ class MojoNamespace:
370
394
  target_cols = columns or self._df.columns
371
395
  filter_map = {col: filters for col in target_cols}
372
396
  return self.with_filter_map(filter_map, omit_time=omit_time)
397
+
398
+
399
+ if not TYPE_CHECKING:
400
+ pl.api.register_dataframe_namespace("mojo")(MojoNamespace)
@@ -2,18 +2,26 @@ from .filters import (
2
2
  AbsoluteValueFilter,
3
3
  AnyFilter,
4
4
  ClipFilter,
5
+ ComparisonFilter,
5
6
  DeadbandFilter,
6
7
  DerivativeFilter,
8
+ ExpFilter,
7
9
  FilterType,
8
10
  HighPassFilter,
9
11
  IntegralFilter,
12
+ LogFilter,
10
13
  LowPassFilter,
11
14
  MedianFilter,
12
15
  NormalizeFilter,
16
+ PowerFilter,
13
17
  RollingMeanFilter,
18
+ RotationFilter,
19
+ RoundFilter,
14
20
  SavitzkyGolayFilter,
15
21
  ScaleFilter,
22
+ SignFilter,
16
23
  TaringFilter,
24
+ TrigFilter,
17
25
  UnitFilter,
18
26
  WrapFilter,
19
27
  filter_adapter,
@@ -23,18 +31,26 @@ __all__ = [
23
31
  "AbsoluteValueFilter",
24
32
  "AnyFilter",
25
33
  "ClipFilter",
34
+ "ComparisonFilter",
26
35
  "DeadbandFilter",
27
36
  "DerivativeFilter",
37
+ "ExpFilter",
28
38
  "FilterType",
29
39
  "HighPassFilter",
30
40
  "IntegralFilter",
41
+ "LogFilter",
31
42
  "LowPassFilter",
32
43
  "MedianFilter",
33
44
  "NormalizeFilter",
45
+ "PowerFilter",
34
46
  "RollingMeanFilter",
47
+ "RotationFilter",
48
+ "RoundFilter",
35
49
  "SavitzkyGolayFilter",
36
50
  "ScaleFilter",
51
+ "SignFilter",
37
52
  "TaringFilter",
53
+ "TrigFilter",
38
54
  "UnitFilter",
39
55
  "WrapFilter",
40
56
  "filter_adapter",