mujoco-mojo 2.4.0__tar.gz → 2.4.2__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 (402) hide show
  1. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/PKG-INFO +2 -2
  2. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/pyproject.toml +1 -1
  3. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +10 -6
  4. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/defaults.py +4 -0
  5. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +234 -1
  6. mujoco_mojo-2.4.2/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_distributions.html +479 -0
  7. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_trial_logs.html +10 -8
  8. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +13 -1
  9. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +423 -5
  10. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +37 -0
  11. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +14 -1
  12. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +516 -5
  13. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +1 -0
  14. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/runner.py +43 -5
  15. mujoco_mojo-2.4.2/tests/utils/runner_test.py +79 -0
  16. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.gitattributes +0 -0
  17. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.github/workflows/docs.yml +0 -0
  18. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.github/workflows/release.yml +0 -0
  19. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.gitignore +0 -0
  20. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.pre-commit-config.yaml +0 -0
  21. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.python-version +0 -0
  22. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.vscode/settings.json +0 -0
  23. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/LICENSE +0 -0
  24. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/README.md +0 -0
  25. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/TODO.md +0 -0
  26. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/about.md +0 -0
  27. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-hero-logo.png +0 -0
  28. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-hero-logo.svg +0 -0
  29. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-logo.svg +0 -0
  30. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/light-hero-logo.svg +0 -0
  31. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/light-logo.svg +0 -0
  32. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/logo.svg +0 -0
  33. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_original.jpg +0 -0
  34. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
  35. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
  36. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/frustums.jpg +0 -0
  37. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
  38. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
  39. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/with_coacd.jpg +0 -0
  40. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/without_coacd.jpg +0 -0
  41. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-export-options.jpg +0 -0
  42. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
  43. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
  44. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
  45. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
  46. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
  47. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
  48. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/generate-result.jpg +0 -0
  49. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-export-options.jpg +0 -0
  50. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
  51. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
  52. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
  53. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
  54. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
  55. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
  56. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/runtime-anim.gif +0 -0
  57. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/index.md +0 -0
  58. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/favicon-switcher.js +0 -0
  59. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/mojo-highlighter.js +0 -0
  60. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/tablesort.js +0 -0
  61. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/stylesheets/extra.css +0 -0
  62. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
  63. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/dojo.md +0 -0
  64. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/generate-script.md +0 -0
  65. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/getting-started.md +0 -0
  66. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/init.md +0 -0
  67. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/monitor.md +0 -0
  68. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/monte_carlo_example.py +0 -0
  69. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/mosaic.md +0 -0
  70. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/optimization.md +0 -0
  71. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/optimization_example.py +0 -0
  72. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/pose-context.md +0 -0
  73. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/pose_context_example.py +0 -0
  74. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/reloaded.md +0 -0
  75. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/running-jobs.md +0 -0
  76. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/runtime-script.md +0 -0
  77. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/boxes_and_springs_monte_carlo.py +0 -0
  78. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/boxes_and_springs_optimization.py +0 -0
  79. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/tennis_racket_theorem.py +0 -0
  80. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/mkdocs.yml +0 -0
  81. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/requirements.txt +0 -0
  82. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/copy_docs_examples_to_examples.py +0 -0
  83. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/fix_smart_quotes.py +0 -0
  84. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/gen_ref_pages.py +0 -0
  85. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/gen_ts_models.py +0 -0
  86. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/filestomake.txt +0 -0
  87. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/make_sensors.py +0 -0
  88. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/sensor_template.py +0 -0
  89. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/__about__.py +0 -0
  90. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/__init__.py +0 -0
  91. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/base.py +0 -0
  92. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/meta.py +0 -0
  93. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mj_state.py +0 -0
  94. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/__init__.py +0 -0
  95. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/defaults.py +0 -0
  96. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
  97. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/extension.py +0 -0
  98. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
  99. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
  100. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
  101. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
  102. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco.py +0 -0
  103. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
  104. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
  105. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
  106. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
  107. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
  108. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
  109. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
  110. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
  111. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
  112. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
  113. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
  114. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
  115. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
  116. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
  117. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
  118. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
  119. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
  120. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
  121. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
  122. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
  123. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
  124. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
  125. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
  126. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
  127. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
  128. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
  129. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
  130. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
  131. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
  132. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
  133. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
  134. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
  135. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
  136. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
  137. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
  138. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
  139. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
  140. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
  141. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
  142. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
  143. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
  144. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +0 -0
  145. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
  146. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
  147. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
  148. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
  149. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
  150. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
  151. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
  152. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
  153. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
  154. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
  155. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
  156. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
  157. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
  158. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
  159. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
  160. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
  161. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
  162. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
  163. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
  164. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
  165. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
  166. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
  167. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
  168. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
  169. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
  170. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
  171. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
  172. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
  173. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
  174. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
  175. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
  176. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
  177. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
  178. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
  179. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
  180. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
  181. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
  182. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
  183. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
  184. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
  185. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
  186. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
  187. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
  188. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
  189. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
  190. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
  191. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
  192. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
  193. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
  194. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
  195. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
  196. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
  197. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
  198. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
  199. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
  200. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
  201. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
  202. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
  203. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
  204. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
  205. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
  206. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
  207. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
  208. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
  209. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
  210. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
  211. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
  212. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
  213. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
  214. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
  215. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
  216. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
  217. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
  218. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
  219. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
  220. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
  221. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
  222. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
  223. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
  224. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -0
  225. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
  226. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
  227. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
  228. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
  229. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
  230. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
  231. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
  232. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
  233. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
  234. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
  235. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
  236. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
  237. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
  238. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
  239. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
  240. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
  241. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
  242. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
  243. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
  244. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
  245. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
  246. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
  247. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
  248. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
  249. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
  250. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
  251. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
  252. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
  253. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
  254. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
  255. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
  256. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/orientation.py +0 -0
  257. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/plugin.py +0 -0
  258. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/pose.py +0 -0
  259. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/pose_context.py +0 -0
  260. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/position.py +0 -0
  261. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
  262. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mojo_model.py +0 -0
  263. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/__init__.py +0 -0
  264. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/load.py +0 -0
  265. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/runtime_manager.py +0 -0
  266. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/signal_manager.py +0 -0
  267. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
  268. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/settings.py +0 -0
  269. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/stochas/__init__.py +0 -0
  270. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/__init__.py +0 -0
  271. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/dojo.sh +0 -0
  272. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
  273. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/optimization.py +0 -0
  274. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/reloaded.sh +0 -0
  275. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/run_mc.sh +0 -0
  276. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/run_opt.sh +0 -0
  277. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/typing.py +0 -0
  278. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/__init__.py +0 -0
  279. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/color.py +0 -0
  280. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/dataframe.py +0 -0
  281. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/filters/__init__.py +0 -0
  282. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/filters/filters.py +0 -0
  283. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/interp.py +0 -0
  284. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
  285. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/cli.py +0 -0
  286. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
  287. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +0 -0
  288. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
  289. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/plot_config.py +0 -0
  290. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
  291. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
  292. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
  293. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/sensai.py +0 -0
  294. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/sensai/__init__.py +0 -0
  295. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/sensai/agent.py +0 -0
  296. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
  297. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
  298. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +0 -0
  299. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
  300. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
  301. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -0
  302. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
  303. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/_sensai.html +0 -0
  304. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +0 -0
  305. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +0 -0
  306. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_json_editor.html +0 -0
  307. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_lab_trigger.html +0 -0
  308. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +0 -0
  309. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_media_player.html +0 -0
  310. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
  311. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_series_panel.html +0 -0
  312. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_signal_lab.html +0 -0
  313. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_trial_status.html +0 -0
  314. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
  315. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
  316. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
  317. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
  318. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +0 -0
  319. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
  320. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/sensai.js +0 -0
  321. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
  322. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts.map +0 -0
  323. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
  324. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
  325. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
  326. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +0 -0
  327. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +0 -0
  328. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +0 -0
  329. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/cm-bundle.ts +0 -0
  330. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/format.ts +0 -0
  331. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +0 -0
  332. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts +0 -0
  333. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/resize.ts +0 -0
  334. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/schema-validate.ts +0 -0
  335. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/toast.ts +0 -0
  336. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -0
  337. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
  338. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/sensai.ts +0 -0
  339. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/types/global.d.ts +0 -0
  340. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +0 -0
  341. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
  342. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
  343. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +0 -0
  344. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/confetti.browser.min.js +0 -0
  345. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
  346. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +0 -0
  347. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +0 -0
  348. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/lz-string.min.js +0 -0
  349. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/plotly-3.4.0.min.js +0 -0
  350. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
  351. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/reloaded.py +0 -0
  352. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/log.py +0 -0
  353. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/proximity.py +0 -0
  354. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
  355. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/statusing.py +0 -0
  356. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/utils.py +0 -0
  357. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/visualization.py +0 -0
  358. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/.gitignore +0 -0
  359. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/make_skybox.py +0 -0
  360. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/ball.stl +0 -0
  361. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/bunny2.stl +0 -0
  362. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/cup.stl +0 -0
  363. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/body_test.py +0 -0
  364. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/equality_test.py +0 -0
  365. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/inertial_test.py +0 -0
  366. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/joint_test.py +0 -0
  367. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/mesh.py +0 -0
  368. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/mujoco_test.py +0 -0
  369. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/orientation_test.py +0 -0
  370. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pos_test.py +0 -0
  371. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pose_graph_test.py +0 -0
  372. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pose_test.py +0 -0
  373. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/site_test.py +0 -0
  374. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/visualization_test.py +0 -0
  375. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/xml_model_test.py +0 -0
  376. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/model_with_skybox.xml +0 -0
  377. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/asset_image.png +0 -0
  378. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/monte_carlo.py +0 -0
  379. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/overrides.json +0 -0
  380. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
  381. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/dojo.sh +0 -0
  382. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/reloaded.sh +0 -0
  383. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/run.sh +0 -0
  384. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/simulation.py +0 -0
  385. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/conftest.py +0 -0
  386. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/loads_test.py +0 -0
  387. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/mojo_model_test.py +0 -0
  388. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/monte_carlo_bumper.py +0 -0
  389. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/optimizer_bumper.py +0 -0
  390. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/runtime_manager_test.py +0 -0
  391. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/settings_test.py +0 -0
  392. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/signal_manager_test.py +0 -0
  393. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/smoke_test.py +0 -0
  394. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/test_writer.py +0 -0
  395. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/color_test.py +0 -0
  396. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/dataframe_test.py +0 -0
  397. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/filter_test.py +0 -0
  398. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/interp_test.py +0 -0
  399. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/load_func_test.py +0 -0
  400. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/proximity_test.py +0 -0
  401. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/utils_test.py +0 -0
  402. {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mujoco-mojo
3
- Version: 2.4.0
3
+ Version: 2.4.2
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/
@@ -51,7 +51,7 @@ Requires-Dist: rtree>=1.4.1
51
51
  Requires-Dist: scipy-stubs[scipy]>=1.17.0.2
52
52
  Requires-Dist: scipy>=1.17.0
53
53
  Requires-Dist: sse-starlette>=3.3.4
54
- Requires-Dist: stochas>=2.1.0
54
+ Requires-Dist: stochas>=2.1.4
55
55
  Requires-Dist: tabulate>=0.9.0
56
56
  Requires-Dist: tomli-w>=1.2.0
57
57
  Requires-Dist: trimesh>=4.11.2
@@ -27,7 +27,7 @@ dependencies = [
27
27
  "rich>=14.3.3",
28
28
  "scipy>=1.17.0",
29
29
  "scipy-stubs[scipy]>=1.17.0.2",
30
- "stochas>=2.1.0",
30
+ "stochas>=2.1.4",
31
31
  "sse-starlette>=3.3.4",
32
32
  "tabulate>=0.9.0",
33
33
  "trimesh>=4.11.2",
@@ -402,6 +402,7 @@ class Inertial(XMLModel):
402
402
  | AnyOrientation
403
403
  | None = None,
404
404
  max_retries: int = 10,
405
+ reset_rng: bool = True,
405
406
  ) -> Inertial:
406
407
  """
407
408
  Generates an Inertial element by sampling from provided distributions.
@@ -416,6 +417,7 @@ class Inertial(XMLModel):
416
417
  fullinertia (Vec6 | tuple[ float | Dist, float | Dist, float | Dist, float | Dist, float | Dist, float | Dist, ] | None, optional): Full inertia vector or tuple of component distributions. Defaults to None.
417
418
  orientation (tuple[type[OrientationBase], list[float | Dist], EulerSeq | None] | Orientation | None, optional): Orientation for the inertial frame. Defaults to None.
418
419
  max_retries (int, optional): Maximum number of re-samples on physics failure. Defaults to 10.
420
+ reset_rng (bool, optional): Whether or not to reset the seed and trial number for the distribution. Setting the seed and trial number will reset the random number cycle. This will not skip registering the distribution or NamedValues to the MojoModel. If you want pseudorandom number generation, setting to False will require you to manually set the seed and trial number before passing the distribution into `from_random`. Defaults to True.
419
421
 
420
422
  Raises:
421
423
  ValueError: If neither diaginertia nor fullinertia are provided.
@@ -443,16 +445,18 @@ class Inertial(XMLModel):
443
445
  if isinstance(input_val, (list, tuple)):
444
446
  for item in input_val:
445
447
  if isinstance(item, Distribution):
446
- item.with_seed(mojo_model.seed).with_trial_num(
447
- mojo_model.trial_num
448
- )
448
+ if not reset_rng:
449
+ item.with_seed(mojo_model.seed).with_trial_num(
450
+ mojo_model.trial_num
451
+ )
449
452
 
450
453
  # register the distribution for serialization
451
454
  mojo_model.dists[item.name] = cast(Dist, item)
452
455
  elif isinstance(input_val, Distribution):
453
- input_val.with_seed(mojo_model.seed).with_trial_num(
454
- mojo_model.trial_num
455
- )
456
+ if not reset_rng:
457
+ input_val.with_seed(mojo_model.seed).with_trial_num(
458
+ mojo_model.trial_num
459
+ )
456
460
 
457
461
  # register the distribution for serialization
458
462
  mojo_model.dists[input_val.name] = cast(Dist, input_val)
@@ -16,6 +16,8 @@ __all__ = [
16
16
  "DEFAULT_SEED",
17
17
  "DEFAULT_XML_NAME",
18
18
  "NAMED_VALUES_FNAME",
19
+ "STOCHAS_DIR_NAME",
20
+ "STOCHAS_DISTS_FNAME",
19
21
  "TIME_COLUMN_NAME",
20
22
  ]
21
23
 
@@ -28,6 +30,8 @@ DEFAULT_WORKDIR = Path("./mojo-models")
28
30
  DEFAULT_MODEL_CONFIG_NAME = "model_config.json"
29
31
  DEFAULT_XML_NAME = "model.xml"
30
32
  NAMED_VALUES_FNAME = "named_values.json"
33
+ STOCHAS_DIR_NAME = "stochas"
34
+ STOCHAS_DISTS_FNAME = "dists.json"
31
35
  DEFAULT_SEED = None
32
36
  DEFAULT_N_PROC = 1
33
37
 
@@ -11,12 +11,16 @@ from pathlib import Path
11
11
  from typing import get_args
12
12
 
13
13
  import polars as pl
14
+ import stochas
14
15
  from fastapi import APIRouter, HTTPException, Query, Request
15
16
  from fastapi.responses import FileResponse, HTMLResponse
16
17
 
17
18
  from mujoco_mojo.meta import MUJOCO_MOJO_DIR
18
19
  from mujoco_mojo.typing import SignalCategory
19
20
  from mujoco_mojo.utils.dataframe import ColumnManifest, MojoDataFrame
21
+ from mujoco_mojo.utils.defaults import NAMED_VALUES_FNAME as _NAMED_VALUES_FNAME
22
+ from mujoco_mojo.utils.defaults import STOCHAS_DIR_NAME as _STOCHAS_DIR_NAME
23
+ from mujoco_mojo.utils.defaults import STOCHAS_DISTS_FNAME as _STOCHAS_DISTS_FNAME
20
24
  from mujoco_mojo.utils.defaults import TIME_COLUMN_NAME as _TIME_COLUMN_NAME
21
25
  from mujoco_mojo.utils.filters.filters import UNIT_GROUPS as _UNIT_GROUPS
22
26
  from mujoco_mojo.utils.filters.filters import AnyFilter as _AnyFilter
@@ -145,7 +149,7 @@ async def get_mosaic(request: Request):
145
149
 
146
150
  @router.get("/api/trials")
147
151
  async def get_valid_trials():
148
- """Scans the workdir for folders containing 'telemetry.parquet'"""
152
+ """Scans the workdir for folders containing telemetry data."""
149
153
  job = shared.CURRENT_JOB
150
154
  from mujoco_mojo.runtime.signal_manager import SignalManager
151
155
 
@@ -1065,6 +1069,235 @@ def _parse_log_file(log_path: Path) -> list[dict]:
1065
1069
  return entries
1066
1070
 
1067
1071
 
1072
+ def _chart_data(dist: stochas.Dist) -> dict:
1073
+ """
1074
+ Return chart data for the distribution tooltip.
1075
+
1076
+ Categorical distributions are detected by duck-typing `choices` and rendered
1077
+ as a bar chart. Permutations expose `items` but have no meaningful density to
1078
+ plot, so only params are shown. All other distributions get a PDF/PMF trace
1079
+ plus a CDF trace on a secondary y-axis.
1080
+ """
1081
+ import numpy as np
1082
+
1083
+ choices = getattr(dist, "choices", None)
1084
+ if isinstance(choices, dict):
1085
+ labels = [str(k) for k in choices]
1086
+ probs = [float(v) for v in choices.values()]
1087
+ return {
1088
+ "chart_type": "categorical",
1089
+ "pdf_x": [],
1090
+ "pdf_y": [],
1091
+ "cdf_x": [],
1092
+ "cdf_y": [],
1093
+ "cat_labels": labels,
1094
+ "cat_probs": probs,
1095
+ "is_discrete": True,
1096
+ }
1097
+
1098
+ if getattr(dist, "items", None) is not None:
1099
+ return {
1100
+ "chart_type": "permutation",
1101
+ "pdf_x": [],
1102
+ "pdf_y": [],
1103
+ "cdf_x": [],
1104
+ "cdf_y": [],
1105
+ "cat_labels": [],
1106
+ "cat_probs": [],
1107
+ "is_discrete": True,
1108
+ }
1109
+
1110
+ n = 200
1111
+ try:
1112
+ if dist.is_discrete:
1113
+ k_low = int(dist.ppf(0.001))
1114
+ k_high = max(int(dist.ppf(0.999)), k_low + 1)
1115
+ k = np.arange(k_low, k_high + 1)
1116
+ pdf_y = np.asarray(dist.pdf(k), dtype=float) # pyright: ignore[reportArgumentType]
1117
+ cdf_y = np.asarray(dist.cdf(k), dtype=float) # pyright: ignore[reportArgumentType]
1118
+ xs = [float(v) for v in k]
1119
+ return {
1120
+ "chart_type": "discrete",
1121
+ "pdf_x": xs,
1122
+ "pdf_y": pdf_y.tolist(),
1123
+ "cdf_x": xs,
1124
+ "cdf_y": cdf_y.tolist(),
1125
+ "cat_labels": [],
1126
+ "cat_probs": [],
1127
+ "is_discrete": True,
1128
+ }
1129
+ x_low = float(dist.ppf(0.001))
1130
+ x_high = float(dist.ppf(0.999))
1131
+ x = np.linspace(x_low, x_high, n)
1132
+ pdf_y = np.asarray(dist.pdf(x), dtype=float)
1133
+ cdf_y = np.asarray(dist.cdf(x), dtype=float)
1134
+ return {
1135
+ "chart_type": "continuous",
1136
+ "pdf_x": x.tolist(),
1137
+ "pdf_y": pdf_y.tolist(),
1138
+ "cdf_x": x.tolist(),
1139
+ "cdf_y": cdf_y.tolist(),
1140
+ "cat_labels": [],
1141
+ "cat_probs": [],
1142
+ "is_discrete": False,
1143
+ }
1144
+ except Exception:
1145
+ return {
1146
+ "chart_type": "none",
1147
+ "pdf_x": [],
1148
+ "pdf_y": [],
1149
+ "cdf_x": [],
1150
+ "cdf_y": [],
1151
+ "cat_labels": [],
1152
+ "cat_probs": [],
1153
+ "is_discrete": dist.is_discrete,
1154
+ }
1155
+
1156
+
1157
+ def _stat(
1158
+ dist: stochas.Dist, sampled: float | None
1159
+ ) -> tuple[float | None, float | None]:
1160
+ """
1161
+ Return (z_score, percentile) for a sampled value against a distribution.
1162
+
1163
+ z-score is returned for any distribution that exposes `mu` and `sigma` (normal-family). New normal-like distributions gain z-score support automatically via duck-typing.
1164
+ """
1165
+ if sampled is None:
1166
+ return None, None
1167
+ try:
1168
+ pct = round(float(dist.cdf(sampled)) * 100, 1)
1169
+ mu = getattr(dist, "mu", None)
1170
+ sigma = getattr(dist, "sigma", None)
1171
+ if mu is not None and sigma is not None and float(sigma) > 0:
1172
+ return round((sampled - float(mu)) / float(sigma), 3), pct
1173
+ return None, pct
1174
+ except Exception:
1175
+ return None, None
1176
+
1177
+
1178
+ def _safe_param(v: object) -> object:
1179
+ """Convert values that can't be serialized to standard JSON to a display string."""
1180
+ import math
1181
+
1182
+ if isinstance(v, float) and math.isinf(v):
1183
+ return "-∞" if v < 0 else "∞"
1184
+ return v
1185
+
1186
+
1187
+ def _extract_sampled_value(named_raw: dict, name: str) -> float | None:
1188
+ """Pull the first scalar out of a NamedValue's stored_value regardless of nesting."""
1189
+ import numpy as np
1190
+
1191
+ entry = named_raw.get(name) or named_raw.get("root", {}).get(name)
1192
+ if entry is None:
1193
+ return None
1194
+ sv = entry.get("stored_value")
1195
+ if sv is None:
1196
+ return None
1197
+ try:
1198
+ flat = np.array(sv, dtype=float).flatten()
1199
+ return float(flat[0]) if len(flat) > 0 else None
1200
+ except Exception:
1201
+ return None
1202
+
1203
+
1204
+ def _extract_sampled_label(named_raw: dict, name: str) -> str | None:
1205
+ """Pull the raw string sampled value for non-numeric distributions (e.g. categorical)."""
1206
+ entry = named_raw.get(name) or named_raw.get("root", {}).get(name)
1207
+ if entry is None:
1208
+ return None
1209
+ sv = entry.get("stored_value")
1210
+ if isinstance(sv, str):
1211
+ return sv
1212
+ if isinstance(sv, list) and sv and isinstance(sv[0], str):
1213
+ return sv[0]
1214
+ return None
1215
+
1216
+
1217
+ @router.get("/{trial_id}/dists")
1218
+ async def get_trial_dists(trial_id: str) -> dict:
1219
+ """Returns per-trial distribution configs merged with sampled values and PDF/PMF data."""
1220
+ trial_dir = _resolve_trial_dir(trial_id)
1221
+ job = shared.CURRENT_JOB
1222
+ if not job:
1223
+ raise HTTPException(status_code=503, detail="No job active")
1224
+
1225
+ dists_path = job.workdir / _STOCHAS_DIR_NAME / _STOCHAS_DISTS_FNAME
1226
+ if not dists_path.exists():
1227
+ return {"entries": []}
1228
+
1229
+ try:
1230
+ text = dists_path.read_text(encoding="utf-8")
1231
+ dist_dict = stochas.DistributionDict.model_validate_json(text)
1232
+ except Exception as exc:
1233
+ logger.error(f"Failed to parse {dists_path}: {exc}")
1234
+ raise HTTPException(
1235
+ status_code=500, detail=f"Failed to parse distribution metadata: {exc}"
1236
+ ) from exc
1237
+
1238
+ named_path = trial_dir / _NAMED_VALUES_FNAME
1239
+ named_raw: dict = {}
1240
+ if named_path.exists():
1241
+ try:
1242
+ named_raw = json.loads(named_path.read_text(encoding="utf-8"))
1243
+ except Exception as exc:
1244
+ # non-standard JSON (e.g. Infinity from numpydantic) - continue
1245
+ # without sampled values rather than returning 500
1246
+ logger.warning(f"Failed to parse {named_path}: {exc}")
1247
+
1248
+ loop = asyncio.get_running_loop()
1249
+
1250
+ def _build_entries() -> list[dict]:
1251
+ entries = []
1252
+ for dist in dist_dict.values():
1253
+ chart = _chart_data(dist)
1254
+ sampled = _extract_sampled_value(named_raw, dist.name)
1255
+ sampled_label = _extract_sampled_label(named_raw, dist.name)
1256
+ z_score, percentile = _stat(dist, sampled)
1257
+ # nominal may be any type T (float, str, list...); expose as a
1258
+ # scalar float when possible, or as a string label (e.g. for
1259
+ # categorical nominals like "class_A"), mirroring sampled_value /
1260
+ # sampled_label
1261
+ nominal_raw = dist.nominal if dist.has_nominal else None
1262
+ nominal: float | None = None
1263
+ nominal_label: str | None = None
1264
+ if nominal_raw is not None:
1265
+ try:
1266
+ nominal = float(nominal_raw) # pyright: ignore[reportArgumentType]
1267
+ except (TypeError, ValueError):
1268
+ if isinstance(nominal_raw, str):
1269
+ nominal_label = nominal_raw
1270
+ elif isinstance(nominal_raw, (list, tuple)):
1271
+ nominal_label = ", ".join(str(v) for v in nominal_raw)
1272
+ entries.append(
1273
+ {
1274
+ "name": dist.name,
1275
+ "dist_type": dist.dist_type,
1276
+ "category": dist.category,
1277
+ "units": dist.units,
1278
+ "nominal": nominal,
1279
+ "nominal_label": nominal_label,
1280
+ "sampled_value": sampled,
1281
+ "sampled_label": sampled_label,
1282
+ "z_score": z_score,
1283
+ "percentile": percentile,
1284
+ "is_discrete": chart["is_discrete"],
1285
+ "chart_type": chart["chart_type"],
1286
+ "pdf_x": chart["pdf_x"],
1287
+ "pdf_y": chart["pdf_y"],
1288
+ "cdf_x": chart["cdf_x"],
1289
+ "cdf_y": chart["cdf_y"],
1290
+ "cat_labels": chart["cat_labels"],
1291
+ "cat_probs": chart["cat_probs"],
1292
+ "params": {k: _safe_param(v) for k, v in dist.table_params.items()},
1293
+ }
1294
+ )
1295
+ return entries
1296
+
1297
+ entries = await loop.run_in_executor(None, _build_entries)
1298
+ return {"entries": entries}
1299
+
1300
+
1068
1301
  @router.get("/{trial_id}/logs")
1069
1302
  async def get_trial_logs(trial_id: str) -> dict:
1070
1303
  """