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.
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/PKG-INFO +2 -2
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/pyproject.toml +1 -1
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +10 -6
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/defaults.py +4 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +234 -1
- mujoco_mojo-2.4.2/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_distributions.html +479 -0
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +13 -1
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +423 -5
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +37 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +14 -1
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +1 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/runner.py +43 -5
- mujoco_mojo-2.4.2/tests/utils/runner_test.py +79 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.gitattributes +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.github/workflows/docs.yml +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.github/workflows/release.yml +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.gitignore +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.pre-commit-config.yaml +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.python-version +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/.vscode/settings.json +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/LICENSE +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/README.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/TODO.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/about.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-hero-logo.png +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-hero-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/dark-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/light-hero-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/light-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_original.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/frustums.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/with_coacd.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/mesh/without_coacd.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-export-options.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/generate-result.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-export-options.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/assets/user-guides/runtime-anim.gif +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/index.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/favicon-switcher.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/mojo-highlighter.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/javascripts/tablesort.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/stylesheets/extra.css +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/dojo.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/generate-script.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/getting-started.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/init.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/monitor.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/monte_carlo_example.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/mosaic.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/optimization.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/optimization_example.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/pose-context.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/pose_context_example.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/reloaded.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/running-jobs.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/docs/user-guides/runtime-script.md +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/boxes_and_springs_monte_carlo.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/boxes_and_springs_optimization.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/examples/tennis_racket_theorem.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/mkdocs.yml +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/requirements.txt +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/copy_docs_examples_to_examples.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/fix_smart_quotes.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/gen_ref_pages.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/gen_ts_models.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/filestomake.txt +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/make_sensors.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/scripts/templating/sensor_template.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/__about__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/base.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/meta.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mj_state.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/defaults.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/extension.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/orientation.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/plugin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/pose.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/pose_context.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/position.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mojo_model.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/load.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/runtime_manager.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/signal_manager.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/settings.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/stochas/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/dojo.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/optimization.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/reloaded.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/run_mc.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/templates/run_opt.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/typing.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/color.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/dataframe.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/filters/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/filters/filters.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/interp.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/cli.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/plot_config.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/routers/sensai.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/sensai/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/sensai/agent.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/_sensai.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +0 -0
- {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
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +0 -0
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
- {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
- {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
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/sensai.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/sensai.ts +0 -0
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +0 -0
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +0 -0
- {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
- {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
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/layers/reloaded.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/log.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/proximity.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/statusing.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/utils/utils.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/visualization.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/.gitignore +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/make_skybox.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/ball.stl +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/bunny2.stl +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/meshes/cup.stl +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/body_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/equality_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/inertial_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/joint_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/mesh.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/mujoco_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/orientation_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pos_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pose_graph_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/pose_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/site_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/visualization_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/mjcf/xml_model_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/model_with_skybox.xml +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/asset_image.png +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/monte_carlo.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/overrides.json +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/dojo.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/reloaded.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/run.sh +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/one_off/proximity/simulation.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/conftest.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/loads_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/mojo_model_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/monte_carlo_bumper.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/optimizer_bumper.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/runtime_manager_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/settings_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/runtime/signal_manager_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/smoke_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/test_writer.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/color_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/dataframe_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/filter_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/interp_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/load_func_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/proximity_test.py +0 -0
- {mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/tests/utils/utils_test.py +0 -0
- {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.
|
|
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.
|
|
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
|
{mujoco_mojo-2.4.0 → mujoco_mojo-2.4.2}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py
RENAMED
|
@@ -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
|
-
|
|
447
|
-
mojo_model.
|
|
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
|
-
|
|
454
|
-
mojo_model.
|
|
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
|
|
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
|
"""
|