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