Skip to content

Configure banned-module-level-imports for ruff#1583

Merged
shi-eric merged 3 commits into
newton-physics:mainfrom
adenzler-nvidia:adenzler/configure-banned-module-level-imports
Feb 12, 2026
Merged

Configure banned-module-level-imports for ruff#1583
shi-eric merged 3 commits into
newton-physics:mainfrom
adenzler-nvidia:adenzler/configure-banned-module-level-imports

Conversation

@adenzler-nvidia

@adenzler-nvidia adenzler-nvidia commented Feb 9, 2026

Copy link
Copy Markdown
Member

Add TID253 rule and configure banned-module-level-imports in pyproject.toml for 24 optional third-party dependencies. When a module is in the banned list and TID253 is active, PLC0415 no longer fires for deferred imports of that module, removing the need for noqa comments.

Defer pxr imports in examples and tests from module level into init or test methods, consistent with the existing test patterns.

This removes 133 noqa: PLC0415 comments (202 -> 69) and leaves only 8 targeted noqa: TID253 on top-level imports that cannot be deferred (torch, mujoco, trimesh in examples; PIL in icon.py; pxr in notebook).

Fixes #785

Summary by CodeRabbit

  • Chores
    • Removed inline lint-suppression comments from many import statements for consistency.
    • Added new linting configuration to enforce banned module-level imports.
    • Moved some imports into function-local scope to align with lint rules.
  • Tests
    • Updated tests and fixtures to use string-based type values instead of enum constants.

@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

@codecov

codecov Bot commented Feb 9, 2026

Copy link
Copy Markdown

@adenzler-nvidia adenzler-nvidia force-pushed the adenzler/configure-banned-module-level-imports branch from d71dd1d to 960261b Compare February 9, 2026 15:54
@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Removed inline # noqa: PLC0415 suppression comments from many lazy/module-level imports across the codebase and added a Ruff configuration section (flake8-tidy-imports / banned-module-level-imports) to pyproject.toml to manage banned module-level imports centrally.

Changes

Cohort / File(s) Summary
Geometry
newton/_src/geometry/remesh.py, newton/_src/geometry/utils.py
Removed inline # noqa: PLC0415 on lazy imports (open3d, pyfqmr, scipy, etc.). No runtime changes.
Simulation
newton/_src/sim/builder.py, newton/_src/sim/graph_coloring.py
Stripped # noqa: PLC0415 from plotting/mesh helper imports (matplotlib, networkx, etc.).
Solvers (MuJoCo)
newton/_src/solvers/mujoco/solver_mujoco.py
Removed # noqa: PLC0415 from MuJoCo-related lazy imports (mujoco, mujoco_warp, mujoco.viewer).
Utils
newton/_src/utils/download_assets.py, newton/_src/utils/import_urdf.py, newton/_src/utils/import_usd.py, newton/_src/utils/mesh.py, newton/_src/utils/texture.py
Removed inline noqa comments from various lazy imports (requests, pxr modules, trimesh, PIL).
Viewer & GL
newton/_src/viewer/camera.py, newton/_src/viewer/gl/gui.py, newton/_src/viewer/gl/opengl.py, newton/_src/viewer/gl/shaders.py, newton/_src/viewer/viewer_gl.py, newton/_src/viewer/viewer_viser.py
Removed # noqa: PLC0415 from many pyglet/imgui_bundle and related imports; minor reflow of multi-line imports.
Viewer icon
newton/_src/viewer/gl/icon.py
Added # noqa: TID253 to the PIL import line.
Tests
newton/tests/* (e.g., test_anymal_reset.py, test_import_usd.py, test_mujoco_*, test_sensor_*, etc.)
Removed inline # noqa: PLC0415 from numerous test imports; notable test changes: test_anymal_reset.py uses string cone_type values; test_sites_usd_import.py moves Usd import local and removes a return type annotation.
Configuration
pyproject.toml
Added [tool.ruff.lint.flake8-tidy-imports] with banned-module-level-imports and enabled TID253 in Ruff select; expanded per-file ignores for TID253 in examples/docs/asv.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • eric-heiden
  • shi-eric
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 74.83% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly describes the main objective: configuring banned-module-level-imports for ruff, which is the primary focus of the changes.
Linked Issues check ✅ Passed The PR successfully implements the main objective from #785: configuring banned-module-level-imports in pyproject.toml for 24 optional dependencies and adding TID253 rule to reduce unnecessary noqa: PLC0415 comments.
Out of Scope Changes check ✅ Passed All changes are directly scoped to implementing the banned-module-level-imports configuration: removing PLC0415 suppressions across the codebase and deferring some imports from module to function level.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR implements banned-module-level imports configuration in Ruff (TID253 rule) by updating pyproject.toml and refactoring the codebase. Changes include removing PLC0415 noqa suppressions, converting module-level imports to lazy imports in examples and tests, and replacing MuJoCo cone enums with string literals.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Ruff Configuration - TID253 Rule** <br> `pyproject.toml`|Added `[tool.ruff.lint.flake8-tidy-imports]` configuration block with `banned-module-level-imports` list and added TID253 rule to Ruff lint configuration.|\n|**Lazy/Local Import Refactoring - Examples (Basic)** <br> `newton/examples/basic/example_basic_shapes.py`, `newton/examples/basic/example_basic_viewer.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method for lazy loading.|\n|**Lazy/Local Import Refactoring - Examples (Cable)** <br> `newton/examples/cable/example_cable_*.py`|Moved `pxr.Usd` imports from module scope to `Example.__init__` method across three cable example files.|\n|**Lazy/Local Import Refactoring - Examples (Cloth)** <br> `newton/examples/cloth/example_cloth_*.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method across five cloth example files.|\n|**Lazy/Local Import Refactoring - Examples (Other)** <br> `newton/examples/diffsim/example_diffsim_bear.py`, `newton/examples/sensors/example_sensor_*.py`, `newton/examples/robot/example_robot_panda_hydro.py`, `newton/examples/contacts/example_sdf.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `trimesh` imports from module scope to method scope for lazy loading.|\n|**Lazy/Local Import Refactoring - Tests** <br> `newton/tests/test_sensor_tiled_camera.py`, `newton/tests/test_sites_usd_import.py`, `newton/tests/test_import_usd.py`, `newton/tests/test_collision_cloth.py`, `newton/tests/test_sensor_raycast.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `PIL.Image` imports from module scope to method scope; removed return type annotation from `_create_usd_stage` in test_sites_usd_import.py.|\n|**PLC0415 noqa Removal - Core Library Utils** <br> `newton/_src/utils/download_assets.py`, `newton/_src/utils/import_urdf.py`, `newton/_src/utils/import_usd.py`, `newton/_src/utils/mesh.py`, `newton/_src/utils/texture.py`|Removed inline `# noqa: PLC0415` comments from lazy import statements; imports remain functionally identical.|\n|**PLC0415 noqa Removal - Core Library Geometry & Solvers** <br> `newton/_src/geometry/remesh.py`, `newton/_src/geometry/utils.py`, `newton/_src/sim/builder.py`, `newton/_src/sim/graph_coloring.py`, `newton/_src/solvers/mujoco/solver_mujoco.py`|Removed inline `# noqa: PLC0415` comments from conditional imports across geometry, simulation, and solver modules.|\n|**PLC0415 noqa Removal - Viewer Module** <br> `newton/_src/viewer/camera.py`, `newton/_src/viewer/gl/gui.py`, `newton/_src/viewer/gl/opengl.py`, `newton/_src/viewer/gl/shaders.py`, `newton/_src/viewer/viewer_gl.py`, `newton/_src/viewer/viewer_viser.py`|Removed inline `# noqa: PLC0415` comments from imports in viewer and GUI module files.|\n|**PLC0415 noqa Removal - Tests & Benchmarks** <br> `newton/tests/test_coloring.py`, `newton/tests/test_examples.py`, `newton/tests/test_mujoco_general_actuators.py`, `newton/tests/test_mujoco_solver.py`, `asv/benchmarks/simulation/bench_sensor_tiled_camera.py`|Removed inline `# noqa: PLC0415` comments from test and benchmark imports.|\n|**PLC0415 noqa Removal - Selection Examples** <br> `newton/examples/selection/example_selection_*.py`|Removed inline `# noqa: PLC0415` comments from `torch` imports across selection example files.|\n|**MuJoCo Cone Type: Enum to String** <br> `newton/examples/robot/example_robot_anymal_d.py`, `newton/tests/test_anymal_reset.py`|Replaced `mujoco.mjtCone.mjCONE_ELLIPTIC` and `mujoco.mjtCone.mjCONE_PYRAMIDAL` enum references with string literals `\"elliptic\"` and `\"pyramidal\"`; removed mujoco import dependency where no longer needed.|\n|**TID253 noqa Comments Added** <br> `newton/examples/mpm/example_mpm_anymal.py`, `newton/examples/robot/example_robot_anymal_c_walk.py`, `newton/examples/robot/example_robot_policy.py`, `newton/_src/viewer/gl/icon.py`, `docs/tutorials/00_introduction.ipynb`|Added `# noqa: TID253` comments to module-level imports of `torch`, `pxr` modules, and other libraries that are intentionally imported at module scope.|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- newton-physics/newton#912: Updates linting behavior and modifies import-related lint directives across the codebase in coordination with Ruff configuration changes.\n- newton-physics/newton#962: Introduces MuJoCo cone parameter configuration that is directly affected by the enum-to-string conversion changes in this PR.\n- newton-physics/newton#1392: Modifies `newton/_src/utils/import_usd.py` with substantive changes to import topology that intersect with this PR's noqa comment removal.\n\n## Suggested reviewers\n\n- shi-eric\n- eric-heiden\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 59.46% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                       |\n| :------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                       |\n|         Title check        | ✅ Passed | The PR title clearly and concisely describes the main change: configuring banned-module-level-imports for ruff linter.                                            |\n|     Linked Issues check    | ✅ Passed | The PR successfully implements the objective from `#785` by configuring banned-module-level-imports in pyproject.toml and removing excessive PLC0415 noqa comments. |\n| Out of Scope Changes check | ✅ Passed | All changes are in-scope: ruff configuration setup, PLC0415 comment removal, and deferred imports of pxr to match test patterns from the issue objectives.        |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=newton-physics/newton&utm_content=1583)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:11 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"682C:3F166A:1090D5D:476ABCC:698A084A","x-ratelimit-limit":"6800","x-ratelimit-remaining":"6611","x-ratelimit-reset":"1770656199","x-ratelimit-resource":"core","x-ratelimit-used":"189","x-xss-protection":"0"},"data":""}}

3 similar comments
@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR implements banned-module-level imports configuration in Ruff (TID253 rule) by updating pyproject.toml and refactoring the codebase. Changes include removing PLC0415 noqa suppressions, converting module-level imports to lazy imports in examples and tests, and replacing MuJoCo cone enums with string literals.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Ruff Configuration - TID253 Rule** <br> `pyproject.toml`|Added `[tool.ruff.lint.flake8-tidy-imports]` configuration block with `banned-module-level-imports` list and added TID253 rule to Ruff lint configuration.|\n|**Lazy/Local Import Refactoring - Examples (Basic)** <br> `newton/examples/basic/example_basic_shapes.py`, `newton/examples/basic/example_basic_viewer.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method for lazy loading.|\n|**Lazy/Local Import Refactoring - Examples (Cable)** <br> `newton/examples/cable/example_cable_*.py`|Moved `pxr.Usd` imports from module scope to `Example.__init__` method across three cable example files.|\n|**Lazy/Local Import Refactoring - Examples (Cloth)** <br> `newton/examples/cloth/example_cloth_*.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method across five cloth example files.|\n|**Lazy/Local Import Refactoring - Examples (Other)** <br> `newton/examples/diffsim/example_diffsim_bear.py`, `newton/examples/sensors/example_sensor_*.py`, `newton/examples/robot/example_robot_panda_hydro.py`, `newton/examples/contacts/example_sdf.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `trimesh` imports from module scope to method scope for lazy loading.|\n|**Lazy/Local Import Refactoring - Tests** <br> `newton/tests/test_sensor_tiled_camera.py`, `newton/tests/test_sites_usd_import.py`, `newton/tests/test_import_usd.py`, `newton/tests/test_collision_cloth.py`, `newton/tests/test_sensor_raycast.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `PIL.Image` imports from module scope to method scope; removed return type annotation from `_create_usd_stage` in test_sites_usd_import.py.|\n|**PLC0415 noqa Removal - Core Library Utils** <br> `newton/_src/utils/download_assets.py`, `newton/_src/utils/import_urdf.py`, `newton/_src/utils/import_usd.py`, `newton/_src/utils/mesh.py`, `newton/_src/utils/texture.py`|Removed inline `# noqa: PLC0415` comments from lazy import statements; imports remain functionally identical.|\n|**PLC0415 noqa Removal - Core Library Geometry & Solvers** <br> `newton/_src/geometry/remesh.py`, `newton/_src/geometry/utils.py`, `newton/_src/sim/builder.py`, `newton/_src/sim/graph_coloring.py`, `newton/_src/solvers/mujoco/solver_mujoco.py`|Removed inline `# noqa: PLC0415` comments from conditional imports across geometry, simulation, and solver modules.|\n|**PLC0415 noqa Removal - Viewer Module** <br> `newton/_src/viewer/camera.py`, `newton/_src/viewer/gl/gui.py`, `newton/_src/viewer/gl/opengl.py`, `newton/_src/viewer/gl/shaders.py`, `newton/_src/viewer/viewer_gl.py`, `newton/_src/viewer/viewer_viser.py`|Removed inline `# noqa: PLC0415` comments from imports in viewer and GUI module files.|\n|**PLC0415 noqa Removal - Tests & Benchmarks** <br> `newton/tests/test_coloring.py`, `newton/tests/test_examples.py`, `newton/tests/test_mujoco_general_actuators.py`, `newton/tests/test_mujoco_solver.py`, `asv/benchmarks/simulation/bench_sensor_tiled_camera.py`|Removed inline `# noqa: PLC0415` comments from test and benchmark imports.|\n|**PLC0415 noqa Removal - Selection Examples** <br> `newton/examples/selection/example_selection_*.py`|Removed inline `# noqa: PLC0415` comments from `torch` imports across selection example files.|\n|**MuJoCo Cone Type: Enum to String** <br> `newton/examples/robot/example_robot_anymal_d.py`, `newton/tests/test_anymal_reset.py`|Replaced `mujoco.mjtCone.mjCONE_ELLIPTIC` and `mujoco.mjtCone.mjCONE_PYRAMIDAL` enum references with string literals `\"elliptic\"` and `\"pyramidal\"`; removed mujoco import dependency where no longer needed.|\n|**TID253 noqa Comments Added** <br> `newton/examples/mpm/example_mpm_anymal.py`, `newton/examples/robot/example_robot_anymal_c_walk.py`, `newton/examples/robot/example_robot_policy.py`, `newton/_src/viewer/gl/icon.py`, `docs/tutorials/00_introduction.ipynb`|Added `# noqa: TID253` comments to module-level imports of `torch`, `pxr` modules, and other libraries that are intentionally imported at module scope.|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- newton-physics/newton#912: Updates linting behavior and modifies import-related lint directives across the codebase in coordination with Ruff configuration changes.\n- newton-physics/newton#962: Introduces MuJoCo cone parameter configuration that is directly affected by the enum-to-string conversion changes in this PR.\n- newton-physics/newton#1392: Modifies `newton/_src/utils/import_usd.py` with substantive changes to import topology that intersect with this PR's noqa comment removal.\n\n## Suggested reviewers\n\n- shi-eric\n- eric-heiden\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 59.46% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                       |\n| :------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                       |\n|         Title check        | ✅ Passed | The PR title clearly and concisely describes the main change: configuring banned-module-level-imports for ruff linter.                                            |\n|     Linked Issues check    | ✅ Passed | The PR successfully implements the objective from `#785` by configuring banned-module-level-imports in pyproject.toml and removing excessive PLC0415 noqa comments. |\n| Out of Scope Changes check | ✅ Passed | All changes are in-scope: ruff configuration setup, PLC0415 comment removal, and deferred imports of pxr to match test patterns from the issue objectives.        |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=newton-physics/newton&utm_content=1583)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:11 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"682C:3F166A:1090D5D:476ABCC:698A084A","x-ratelimit-limit":"6800","x-ratelimit-remaining":"6611","x-ratelimit-reset":"1770656199","x-ratelimit-resource":"core","x-ratelimit-used":"189","x-xss-protection":"0"},"data":""}}

@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR implements banned-module-level imports configuration in Ruff (TID253 rule) by updating pyproject.toml and refactoring the codebase. Changes include removing PLC0415 noqa suppressions, converting module-level imports to lazy imports in examples and tests, and replacing MuJoCo cone enums with string literals.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Ruff Configuration - TID253 Rule** <br> `pyproject.toml`|Added `[tool.ruff.lint.flake8-tidy-imports]` configuration block with `banned-module-level-imports` list and added TID253 rule to Ruff lint configuration.|\n|**Lazy/Local Import Refactoring - Examples (Basic)** <br> `newton/examples/basic/example_basic_shapes.py`, `newton/examples/basic/example_basic_viewer.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method for lazy loading.|\n|**Lazy/Local Import Refactoring - Examples (Cable)** <br> `newton/examples/cable/example_cable_*.py`|Moved `pxr.Usd` imports from module scope to `Example.__init__` method across three cable example files.|\n|**Lazy/Local Import Refactoring - Examples (Cloth)** <br> `newton/examples/cloth/example_cloth_*.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method across five cloth example files.|\n|**Lazy/Local Import Refactoring - Examples (Other)** <br> `newton/examples/diffsim/example_diffsim_bear.py`, `newton/examples/sensors/example_sensor_*.py`, `newton/examples/robot/example_robot_panda_hydro.py`, `newton/examples/contacts/example_sdf.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `trimesh` imports from module scope to method scope for lazy loading.|\n|**Lazy/Local Import Refactoring - Tests** <br> `newton/tests/test_sensor_tiled_camera.py`, `newton/tests/test_sites_usd_import.py`, `newton/tests/test_import_usd.py`, `newton/tests/test_collision_cloth.py`, `newton/tests/test_sensor_raycast.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `PIL.Image` imports from module scope to method scope; removed return type annotation from `_create_usd_stage` in test_sites_usd_import.py.|\n|**PLC0415 noqa Removal - Core Library Utils** <br> `newton/_src/utils/download_assets.py`, `newton/_src/utils/import_urdf.py`, `newton/_src/utils/import_usd.py`, `newton/_src/utils/mesh.py`, `newton/_src/utils/texture.py`|Removed inline `# noqa: PLC0415` comments from lazy import statements; imports remain functionally identical.|\n|**PLC0415 noqa Removal - Core Library Geometry & Solvers** <br> `newton/_src/geometry/remesh.py`, `newton/_src/geometry/utils.py`, `newton/_src/sim/builder.py`, `newton/_src/sim/graph_coloring.py`, `newton/_src/solvers/mujoco/solver_mujoco.py`|Removed inline `# noqa: PLC0415` comments from conditional imports across geometry, simulation, and solver modules.|\n|**PLC0415 noqa Removal - Viewer Module** <br> `newton/_src/viewer/camera.py`, `newton/_src/viewer/gl/gui.py`, `newton/_src/viewer/gl/opengl.py`, `newton/_src/viewer/gl/shaders.py`, `newton/_src/viewer/viewer_gl.py`, `newton/_src/viewer/viewer_viser.py`|Removed inline `# noqa: PLC0415` comments from imports in viewer and GUI module files.|\n|**PLC0415 noqa Removal - Tests & Benchmarks** <br> `newton/tests/test_coloring.py`, `newton/tests/test_examples.py`, `newton/tests/test_mujoco_general_actuators.py`, `newton/tests/test_mujoco_solver.py`, `asv/benchmarks/simulation/bench_sensor_tiled_camera.py`|Removed inline `# noqa: PLC0415` comments from test and benchmark imports.|\n|**PLC0415 noqa Removal - Selection Examples** <br> `newton/examples/selection/example_selection_*.py`|Removed inline `# noqa: PLC0415` comments from `torch` imports across selection example files.|\n|**MuJoCo Cone Type: Enum to String** <br> `newton/examples/robot/example_robot_anymal_d.py`, `newton/tests/test_anymal_reset.py`|Replaced `mujoco.mjtCone.mjCONE_ELLIPTIC` and `mujoco.mjtCone.mjCONE_PYRAMIDAL` enum references with string literals `\"elliptic\"` and `\"pyramidal\"`; removed mujoco import dependency where no longer needed.|\n|**TID253 noqa Comments Added** <br> `newton/examples/mpm/example_mpm_anymal.py`, `newton/examples/robot/example_robot_anymal_c_walk.py`, `newton/examples/robot/example_robot_policy.py`, `newton/_src/viewer/gl/icon.py`, `docs/tutorials/00_introduction.ipynb`|Added `# noqa: TID253` comments to module-level imports of `torch`, `pxr` modules, and other libraries that are intentionally imported at module scope.|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- newton-physics/newton#912: Updates linting behavior and modifies import-related lint directives across the codebase in coordination with Ruff configuration changes.\n- newton-physics/newton#962: Introduces MuJoCo cone parameter configuration that is directly affected by the enum-to-string conversion changes in this PR.\n- newton-physics/newton#1392: Modifies `newton/_src/utils/import_usd.py` with substantive changes to import topology that intersect with this PR's noqa comment removal.\n\n## Suggested reviewers\n\n- shi-eric\n- eric-heiden\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 59.46% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                       |\n| :------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                       |\n|         Title check        | ✅ Passed | The PR title clearly and concisely describes the main change: configuring banned-module-level-imports for ruff linter.                                            |\n|     Linked Issues check    | ✅ Passed | The PR successfully implements the objective from `#785` by configuring banned-module-level-imports in pyproject.toml and removing excessive PLC0415 noqa comments. |\n| Out of Scope Changes check | ✅ Passed | All changes are in-scope: ruff configuration setup, PLC0415 comment removal, and deferred imports of pxr to match test patterns from the issue objectives.        |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=newton-physics/newton&utm_content=1583)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:11 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"682C:3F166A:1090D5D:476ABCC:698A084A","x-ratelimit-limit":"6800","x-ratelimit-remaining":"6611","x-ratelimit-reset":"1770656199","x-ratelimit-resource":"core","x-ratelimit-used":"189","x-xss-protection":"0"},"data":""}}

@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThis PR implements banned-module-level imports configuration in Ruff (TID253 rule) by updating pyproject.toml and refactoring the codebase. Changes include removing PLC0415 noqa suppressions, converting module-level imports to lazy imports in examples and tests, and replacing MuJoCo cone enums with string literals.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Ruff Configuration - TID253 Rule** <br> `pyproject.toml`|Added `[tool.ruff.lint.flake8-tidy-imports]` configuration block with `banned-module-level-imports` list and added TID253 rule to Ruff lint configuration.|\n|**Lazy/Local Import Refactoring - Examples (Basic)** <br> `newton/examples/basic/example_basic_shapes.py`, `newton/examples/basic/example_basic_viewer.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method for lazy loading.|\n|**Lazy/Local Import Refactoring - Examples (Cable)** <br> `newton/examples/cable/example_cable_*.py`|Moved `pxr.Usd` imports from module scope to `Example.__init__` method across three cable example files.|\n|**Lazy/Local Import Refactoring - Examples (Cloth)** <br> `newton/examples/cloth/example_cloth_*.py`|Moved `pxr.Usd` and `pxr.UsdGeom` imports from module scope to `Example.__init__` method across five cloth example files.|\n|**Lazy/Local Import Refactoring - Examples (Other)** <br> `newton/examples/diffsim/example_diffsim_bear.py`, `newton/examples/sensors/example_sensor_*.py`, `newton/examples/robot/example_robot_panda_hydro.py`, `newton/examples/contacts/example_sdf.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `trimesh` imports from module scope to method scope for lazy loading.|\n|**Lazy/Local Import Refactoring - Tests** <br> `newton/tests/test_sensor_tiled_camera.py`, `newton/tests/test_sites_usd_import.py`, `newton/tests/test_import_usd.py`, `newton/tests/test_collision_cloth.py`, `newton/tests/test_sensor_raycast.py`|Moved `pxr.Usd`, `pxr.UsdGeom`, and `PIL.Image` imports from module scope to method scope; removed return type annotation from `_create_usd_stage` in test_sites_usd_import.py.|\n|**PLC0415 noqa Removal - Core Library Utils** <br> `newton/_src/utils/download_assets.py`, `newton/_src/utils/import_urdf.py`, `newton/_src/utils/import_usd.py`, `newton/_src/utils/mesh.py`, `newton/_src/utils/texture.py`|Removed inline `# noqa: PLC0415` comments from lazy import statements; imports remain functionally identical.|\n|**PLC0415 noqa Removal - Core Library Geometry & Solvers** <br> `newton/_src/geometry/remesh.py`, `newton/_src/geometry/utils.py`, `newton/_src/sim/builder.py`, `newton/_src/sim/graph_coloring.py`, `newton/_src/solvers/mujoco/solver_mujoco.py`|Removed inline `# noqa: PLC0415` comments from conditional imports across geometry, simulation, and solver modules.|\n|**PLC0415 noqa Removal - Viewer Module** <br> `newton/_src/viewer/camera.py`, `newton/_src/viewer/gl/gui.py`, `newton/_src/viewer/gl/opengl.py`, `newton/_src/viewer/gl/shaders.py`, `newton/_src/viewer/viewer_gl.py`, `newton/_src/viewer/viewer_viser.py`|Removed inline `# noqa: PLC0415` comments from imports in viewer and GUI module files.|\n|**PLC0415 noqa Removal - Tests & Benchmarks** <br> `newton/tests/test_coloring.py`, `newton/tests/test_examples.py`, `newton/tests/test_mujoco_general_actuators.py`, `newton/tests/test_mujoco_solver.py`, `asv/benchmarks/simulation/bench_sensor_tiled_camera.py`|Removed inline `# noqa: PLC0415` comments from test and benchmark imports.|\n|**PLC0415 noqa Removal - Selection Examples** <br> `newton/examples/selection/example_selection_*.py`|Removed inline `# noqa: PLC0415` comments from `torch` imports across selection example files.|\n|**MuJoCo Cone Type: Enum to String** <br> `newton/examples/robot/example_robot_anymal_d.py`, `newton/tests/test_anymal_reset.py`|Replaced `mujoco.mjtCone.mjCONE_ELLIPTIC` and `mujoco.mjtCone.mjCONE_PYRAMIDAL` enum references with string literals `\"elliptic\"` and `\"pyramidal\"`; removed mujoco import dependency where no longer needed.|\n|**TID253 noqa Comments Added** <br> `newton/examples/mpm/example_mpm_anymal.py`, `newton/examples/robot/example_robot_anymal_c_walk.py`, `newton/examples/robot/example_robot_policy.py`, `newton/_src/viewer/gl/icon.py`, `docs/tutorials/00_introduction.ipynb`|Added `# noqa: TID253` comments to module-level imports of `torch`, `pxr` modules, and other libraries that are intentionally imported at module scope.|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- newton-physics/newton#912: Updates linting behavior and modifies import-related lint directives across the codebase in coordination with Ruff configuration changes.\n- newton-physics/newton#962: Introduces MuJoCo cone parameter configuration that is directly affected by the enum-to-string conversion changes in this PR.\n- newton-physics/newton#1392: Modifies `newton/_src/utils/import_usd.py` with substantive changes to import topology that intersect with this PR's noqa comment removal.\n\n## Suggested reviewers\n\n- shi-eric\n- eric-heiden\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 59.46% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                       |\n| :------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|      Description Check     | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                       |\n|         Title check        | ✅ Passed | The PR title clearly and concisely describes the main change: configuring banned-module-level-imports for ruff linter.                                            |\n|     Linked Issues check    | ✅ Passed | The PR successfully implements the objective from `#785` by configuring banned-module-level-imports in pyproject.toml and removing excessive PLC0415 noqa comments. |\n| Out of Scope Changes check | ✅ Passed | All changes are in-scope: ruff configuration setup, PLC0415 comment removal, and deferred imports of pxr to match test patterns from the issue objectives.        |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=newton-physics/newton&utm_content=1583)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKPR1AGxJcAwvgwAZvBE2BQkkAKY5LRgzIrYXmBeUh5g8Mzc+BS4yAFZkBTYAQEGAHKOApRcAIwArAAcAMwGAKo2ADJcsLi43IgcAPQDROqw2AIaTMwD5ADuBBhg3LCyiPAMiDMk8/4D3AkeA3VNrYhV6EoYAF5eFGAYEvC08GgGAMr4oQzhAlQYDLAuGhLjdKAMmIFgqESGBIhhorF4olkiRUulMtlEAZoM5SLgIn8AVxmNoMO9cNRsP1+NwyAYbCRHttKNTEAgwJR1gYfGFqHR0JxIAAmAAMQoAbGAxVKAJzQaoAFg4IqV1XFAC03AhkLYLrRkLhYOFoABJAAiQtqjQKCXCmHoEKCITCMiidERtFtSUZqLSGSyORQWG4sl4+BEYg0BGYHkgeT4QoVNPE/jQscN8AoMW4zlw8iUtIwlwY8GkGkgAHVRpA4p6vMgPEgaPQ0K74fz7TBzZbrWQVF5aAAaaztHwquqQDD4SAefykPi4CjBee5fJKAKUML0dEB5D4AKQQ34M41pHSYeo9LwDDUa9EQ9GyckfnxmuYeQAIksU4AjmguFYo7jrUH4KKw7CIOW3AAB58DumJBpAJDQWgGT1ugRaHtIgbOOE66bi+FAsKedbhCisbXgQkAAPrUde6i0fwC7YTWJBHvqh7TiSuAAkh0FNneWGIPiOY9JQGCQTAj4ApgpAFCQcRSMg1SNNaX6Tvgf4AUBCp1KBUxsBggYABRbtgJYYPeBAUrGAREcwwpipxkDijKACUGH0F4aBKZA9SHribH8upv7/l2FpWvpLCGYGr4ENw3opCg/oIYa1CMFE+D4pUkD4RQW6QMZBAUACw7MNgQj4Eww6Luk0iwIhyGodw9YANzWCa7SIes/gaCG7UwXBWBTjQAj4PgADWbnlnA4S6mEG5hP80goIgDjhGYADs9S1Bo5iWAA8sIojiL5dnEY2GATfySDrViBgmmt2AbdttRcGaJBBOQERujEtZeuRfoYoG148KGRERpo0a2fkhTFOWR2Q5I4SoFRjpQmENrFAA5G2CL/ciPpoilgZnD0gmINO+DcCmN7pggWZLLm8gEyttDTiN8k/tgmbhLMTzSLwJDApAIWaWFgFjrpIGQFSaCkMO6JEY8lm5UT1OUHxtJLmQ3wRPIQtSEZgmS8BkCzM4GB3qufB5QV8E4ZhZkWVZj7kPyVGZRSNBxvA6H84aGl/mBMWQUY+jGOAUBkPQ+44AQxBkMozYh+wXC8Pwx1iMjMjyEwShUKo6haDoEcmFAcCoKgmDx4QpDkFQKcGWnBRoLM9iOCSLj6woBcqGomjaLoYCGJHpgGK2EgDJU/ywF3E2bGs5UeLeuwzwC1FnBJWTUeIA7UQwqHKH1sgcAYH4XwYFiQAAgiaicN3y9AOE43dxzJlnSEYDKKR2WDXpdcI+dwjczTOofMvNs5SEKpAb84ttJSwnB5c6DlDRzU6slYGkATQkjkg7RCuBZjTlnIfWmyAA4ICwDQZw7NZgYGHN5FW940A8BXqDfBwk+QxXLKUaclRYA+XgFkNMTEFBGSIqkAIs524f1IGHIwBgoC8J4OMRsDABjIWBu6dg4D7DBBvLgaEjABGf2QEoGgYg6B7QMO0a8K1ZF0C4AAamqAMMA1QjAAFFhLpCfr3cIYQmTt0+vGQU7R8CzHPpfRR492YbAGIY4qLwPCbBFCKOi4j4jZ16vAEMGABBnwvh+K+lg74P2TvyF+Xd5DvxMXI8OkAGQtTQN8ZAwDGColjB+SmXwSBRSMuwOM9l0AzibPwA8gCDTThYWsSyXh7C1VVhCCk9FVZzEAcY5wLSaAUGQKDQh052nfA8Ckma2pNmmMgLACJHSTliJoEZZAuEFlZDoAMM4S4wFXH5MZFBozhJgH3EkOxUyRmzKIPM4SS5LLTUgIo7BVDHxBF2fiWs8Agj8iOZ0mqj4WhvDNJggM8kSTXhkHgVaGlgnMEqLQJQLYnl6LmeEKFd52poK1mo9QkAWiIG3CTUZ30wgkoksOChD4AksTjuygQJCJpiMuGcbcRkqbfRZZZPaUATSIvCGwNkSR8DAkElik5OLwiGyEVSGsCQ952P+fiOOkyKVhGad8egYqZl3khYs+8yzSSCXZTozG7SZVVQmsOTsLC5hBg2c3IyFLgR0q4GLLS4UeygUqPGcI7KeV8uBhqyAniiyAoCGAII8z1m2s4YYvZTzaBCCpCnYyU4nyzA2elGO4zfZeA8vsx8zxiiAEwCXI14RHLOQpoBRJTb4eB2avCSzl2VKAYCvRuQj51x00QGfk+R9gyvWEhY24gv7wt4eQIwtjyBtLqY4yATjGhuMtF4nx3FMWKAlUEpCxQAxcAALJ0HgI4KJxSYlgCMHMBYAxN4lWGCQFgbEXADCFfVE+hTL7XzKfXCpz9O7OBqQeBx90oA/3wFIegSlxAjBEQA21Xs502wWbeBgGE0yrFQH8w0YQyJoCuLIIGRKq0KQgmfSAugaRkEaLmoloM3ihACC0kgDIIRQvMsVDQYQlOLhUwYETUA3jokbAEeQ+DQab30+i2Q1EQwBB/MwCg2nROIBzLslG/LQbjqoGIaiK65G4DoogFeRYT2HOvYhZZEi4zSNEYUY2bAIgkAEY8LI7V/AeHkPGbi4hLLgmioM5dwsMDYG4NYhpp6SD7UgD+zA6KWIADE/bhBvnTWQ3y7M2JBRc0gtBnH3rAM0Aw3jxAvodG++SH6QnfsgOEyJRTw7j3A7sKD6jSBwcXLIAYeA/aQRDKh4p6H76YcbpUnDb98PXsI40hSJGboYA2aFVOjyhnETOFIKgFEBkUDptYWQR5/4k0QKK6s7LEBH0JdkBjNBQ48BdJQUjPC+HxcEcI2MBH2ocO9oJh7U525oG4LSZw5tRifHxKbaWYBhKyEhYVoWa0135pvnctAxQTo3T+8S0kcZsD/FpmmVLSFuaSDTOwdqzaCPOTC/gWy0iLz5XyCY2gl0iDDh3ao/dN8rAmmK1O+ns6yELr7aIFddHO2buyNuvgu61EHvEEe87yjRdUSXYb3XG7oJaNjublXTGdE27VhY5s1jr6VathuYSkA6vzMayxlr572sOK67emUbiZRPsG349pgTSzBK/dkX9/7AMzZA2B7YEHFvvPSNPHmHgC4oaA1r/bSdDvYdfnhjrx6oA/uvPkS6mWfXeQK9wLgY1A6gxallaiuZ1gJDnZ5dAuOiL8RfdRXVRp/uHiIaD/EjrZwnjQZmHglBgXfVCggs2Dg5/SDWP4SSNXOfZLpql4c/DEd8CFaSPZlxxCHw8Mlm78gq37u7wwhGiN2eSFSu1oE13QxnWTjXVBUXQNy2WdwPBNxTmVz3S90PVLFt2nDWCIAMSMVF3MWZyVS1i3VoD2E9yt3UCwID0sCD2q1D3Dwaya2jza0vVb3jycQVDcQVBT18SbhGwz22E/VCS4Cm1r0LwMHmwwEg0QGgyXmGCoGWAPglyyDvBrxmz23KUbw7mb07QIwaS1VYTHyICUNgGHDANI2jVtTu1jVimGXZQOQ33BwxxyGHFkUEhQWE1E3wW4lH1wEbAmBDH8PQGQBanxFgSDglh0jqHsygHwXIAOQoAmmglCMnFSMiOPxHEQVqHswIDiOcL8NnACPgCCNDGKLSPCIKISLYiIWSNSNbHSPs0rhrRGX2DCF53S2oB71bwJ0DmbXRG2X4CwHF0lxuS73wBGAYEgNKWgNXSvz1zwgQPmPXWQNdzINEQt33W9ywJK38DKzYPsWvU4KFAfT4KG38VG0zxEIm3EILwgFAykOLwWzkPUUpg8Be02HKkqiYHeQlxeyXwqiqnwA0LQ1KXr0fhTiqVw30LOwaSaRXldQfE43lWoNTAon5UdTFWaXYVZxaSIjWnFQq2wAACl8A/AwAOi08RtRJYB+hqj+VvjgSRNLBzVPh/N5AxUsiScJwR5CigSmAGSsEmSmBqILYKBuAWSodGQLUOS+iGpuSYjahdA9B+Sfj8AxTnBuAhSiURTpxIi2SqRecuT4FsizYTN6JfNtlsBqAsgsQdM1TgSNAglNYDSM92TjTqxFSciVTHSmBnTM9KAgtW9QVRiItxi+BNxZd7QFd2on9EsX8FI38iTgc2Aldf9iUSN/VHxqMj9xYO5z8ad/BhjnCBNQ4Zjp0ddYDFi1Zl1EDqyXc3dNjKCdi29IBlEUC3ktiMDrc/99FKQXRzZKAgFjjrEL0jjZIb0nFag3Fcj+tn1qSlArjhDxsc8Ks89mAJCHii8dgZDS8NsUkBhaEbsDVaBx81o2IttT5a8tCDs/FoSTsQz4TLsrDczwg7sz9qdL8RicsHtXwABxdQKwb7a5X7YGJ5TCQC3APwJwIsTxGXOCVnXtFEgIW/MhM5VAUXFLeQbvQSUlTTO/RAYXeHBLIRV7URUY0tSLLChgBgUIM5FzcCyleSXnYs9cNAa1AVHo+Msi+UonM06WPiBSGmWAis7XGAhYqieAuslYvcNYpstAy3Vs+6O3M7ZyXA/Awc/ITs8g7sqgn3IgyxCAowUoA6UoTxYwEkYPbCaiMtEgQwMIfnJDR5KMaCXAAwYIiGE6KMFgDwAwYAAYKyhg3zOymPdguPZxbgsAXg+c1PAQpcoQrPUQ9c54fPaJbcp43c2Q6DA8zYB2aiUIWgAIUE3bcE7Q+847FvAwgwDvK2EkZHa9LgdlaiY82cYEWy+rDnLnNdZih2ZARy56YSchQncldlN8qIk/QSuwuHXoqiHi/IfIMMqRCJH/XnFhLo8mLLQAz8l0b8oArKafVASwqxSddvNia5Z+fswxTGW/Y44MwQD5CQfsEcyc0FKMvgOXBXKLTnQbMiSYrkJRDmYQvStXR6IMRcLJM3TM0jEysyiyw4q9Sczg1xdxc4xc99a41csJCJLcubZ4vc149bPePKkmAq3lEquvcqqEyq2E16583+egKRNAa6fyb0s2WjXXdjdffBXCVsbwzVYMZwM4Mm+PP5QaZwt4Iq4cHNaW3lf82DZgWW2gKwFYNYDYQqQ0uUsVOBFNHk2oNyAoowl0f4kgEW2y+yAqigDwLgezB0/BAa7CZAYyTWz0wOHW6InIg2kTB0sW2CZwnNDW90o0zk6sd2yauoA2wGrqu/ERWcKYkMuLWQfwegSw7MlGG7Gw/Mnai/NdVHfleavgTsd6q5GMwSV/XtZlI+Mc2PY47rNxPrAbfg19BKmUlc7PbG6bdKvGrK/c4mwK5DbbG8squ86mvQ2pOm+FWq/IDanohxJqnM/lKVJcZfIMNYJctqs85faQc2lgDq+ZVALHNothMColChfimuca6a9ski5/ERRa/wCGyRais7NlBerBNQkYLAcu+dIHEHTsdlF0e1A8dlVC7q4suO/dVAW6pGsSuYo3KS/XGSo3RsjYxS7YzAts5RbsjRdY03GIUGhOwy/3MKicz+ZGtxDxWKpu4bFusbdu3PVKzc+47ukvQm3KhJcdaECm28hvCqse07Ce2q3xBqyc+exiolOOHBeWcIP5dXLqUGDe3eThsIHe5gPeiVYVA0R8VM8IZCb4GmIky+38/EZND24CUCC2fql8qxa+uLUipHCih+iRKim5FHG0GLH4BHBM2WG8JnIy2BqsyS6caSp3Bs+S1Bj3dA/S3Y+FJtYLV6g2qdegkPfEJg2+FgoMhGjg5xFGyhxui49PVupK24nG5hx46Q7K9RF0igcEI+Kgbh4e3h0e6pWm0xem8A6w76baqnXanquwp20WMOgSvSSAZBYZZecQFqcRhCOOYCgANVEEaGHGAsq1wAVHDSdlRHvNkGpQlz2RGLqbQBPgYvQDEBtIxKwTLIgjZ1BlAZjpOSMw/3WDTEf3JW6cLL2oPuITnE1mp0GWLKPBPEmRmoLrvr4EouWpkTO2sSjvt2nDudpj0TwIHPPHkmuqoVDFRbQaYwIcd3rKvxhYq07z4HJ0bB8SYwcWGN51xMufR0h3xOPGQDxB3qMmHGZaXCIG6DZbYgKu4G5d8yCSX2oCXGgn5csy8rvyFdqlFZn2ZbqKr2oioANmoDpPanea/J6uOvoAEHJWi1+rsefx8bj011hbUqoh0ooKieUqRc0uPXHMRrIecU2jcU2jRvioxrbuSr/UYdxvKfxsqYGGqeGEOBCHgAadvghKw10JafHraexD7XRQPGwouHrSGucJnrwu1RogyQYmolYnYk7RaBNDPigB8GOMewcipEEhrg1itlVgmfgEP2mfxHdX/gzu+jsOchYTy0wEoGHE5w5v5AbabY3y4D+XSFDeoh1aLH3v5WMmSlDcVmYFDauDiGHEjouwZsMfbY2gmuGeVP6YrcMeXZ5inc53lztEwhDAhR5ciAYGukwj6rKHhbQrXTBfuWcchZDOIoNe8e0oQrAE+sEjRSCFIVEsnSgMCZ/uCcQdCYWJQbwebKtYwZUv2JIYdc62cVOLACFDdebo9eKbXLuK7r9Z7sJqDYhQGB6gwHDYwyaaO34afMnuJa4spK2ZTg5p6oTQ9mmRPrB0ATEY6nkf5UPuvGXWwCUAZSyNNAimtCvtUsnMQj1bql/d4uxdvnV3amLqA9Vk7CWsi2/pTKrqkglVDylSRVffAf+qYygdniRsVn+A8Ak88IfrjB5zvblU7FoCoH5lVjOCss/3kXteydvVybw5oYI5uLXIAAlghYBfWdzWHoMKPDha2IVaPI2dCHyqq4T4ViNXyd2oiCyNXizD2/lntlALn+M6XrnjISANAiANBhwPwxbZAb38R8EIVQJOwWvhlr2vBNBfPaFnCqwiwIkPwPIGXCSG2pmZwqo6Nywb8wH795ASB+cnqvA40+qbn6EIg3nKJiveniz54WR0BMZm1ZxP5zdoc40AXrkgWQV80FPLk0YnGJdwzZhpciIPrS7LIldwXXk5upjX7dHngcJMZ2jUQ0ssgMs7wBhOP/A2OV4OO60G1IcqI0cuEIIAmJLoOiS8XZLjdcHUDImlKUO9jSC8HLWyfeybWUXyFhy9Q6ALDrGhxREQPSxjKsmIrQuRQKGRRwvLjEqovBRvWAMmGSPEuXjkvAyanKO2RgQWQMuqaGOY2BG42iNWfOmyJKJNZnh1NToZHxnrVcl5laJLTGI+ryw3haQSxQOedZBTVnCNlWv2uGuzD1hIIFeC5mK9GnPJOiTTHw6ZZO2pvkAKvyLvfNY6yLzJJlEEW33YwC7HHMkxioXXrVr5AWFAD9eTpkZoa0wcfCeEGlikGkDKeSeVFkPrcYnAaz1ufa7b0ZywA5z8n0blzCPReNyEvMqkuqnZfA3ZfqJ0vB7NDGnITVeYTY36kaqWPgFIgTwe3+8uAI+qNMT2tZhGfgRU2U45BobM2Nlu8nb2U9aiv+me0sAZv5k2B2I4+b6Ez32IXn6M+NI6frqVp1OCG0woPJJZoE7GcNwYgKljhUohk48w8yBHvOmcCfBH2/KK5i5UnQNI/0BbbjvHinBnozqBbDSii1ljcBaAT8LgOgLKxQA5mzgF4DKglQ3g2AaAtDg3yRrOJxQbicUIL0KZ0MvW3fMplLwJoy9mQNTaptREeAfJleI9Sfo+WqpCN6q7hY8Df33QEYuAx1fZrdlNKn9D2nYKkCtE4RFgaEG+fZvYB9CR9MgOQcsPThEaXI/mFAaBMhAEiqx8EyfIughRLoztWUr/KNHoxIAiUr8j+QkCvn+4fsJcLjdPqYhOYJ90SPAFVvRkEGawHYNUZevVFljA4FYWENykYh06K4Z8I0EgGNEmi5QkAzSeQIZzW48wNugyOap9FeQmtbG2DHSm/wIJqUiGJ1OgY6yb6zkWBghIpiLzEKlNJevfXYE1DQjSBp4rYdYDg2aheAp2QwhgJvAES0gryO2SmiIKbxq8mO7eK7Fo2baFteUR7dlKzHsBMBaQXbObl/mcKkoBYRJTxChH6EaBzeVsXzHmxv4XUTm8URKKiGcK9diI4tfBDmgsaNEtWGzFsC2kOEiI3hDkD4fyi+HxpaU/IHfnFkzQoBYomYUPHLDwRYBrhubIvvAxg6l84OqxCvlDT0rKU9i9fYLjzycTYc8mC5d1h3w6EpVxePfCpn0KmabAF+wwhkWMOZGTDqmwg+josKn7q8Z+KwqwmNUXoHhBoGgAOp2FFE5p5axEdjI+B2GIA9hWaaZICKq5g4ThS5dlOcNGH1dURtw/Ng8NsZZQjQfACBhSxfpEkc0AwKUQrXsA7MxoKSM7u+RuQOxt0GZWYEaCwA1wtR/Q1ehSGWgUoGAvIZsA52EjCxY4B4dKDsPwS/V0RuuEvrWWxFyVcR7uKvjT2oKYN4mL3acBa3xGHo+yyLd/kFxrr0Db0ZI1obQ0xr0MaRaVYDBlXpEXDGRtTCgSMP6EHxnq4wk5NREqiURZhQ9CNirx5FiDcumvEhHyDWHOE44kozYbKJ1RngrkYYzWBjwkinDNRDYrwFcJzZ6j7higGaiEM+yUsqISIzxknUwhKAV4sgOHg7EEgB0fqfsX0ZgD1iWlkk8AK4HOljHVl4xBPZBuE0Q7qcCRQWIkcWKaGkiKG5YyLljQYa0jOBPQmQqyIGGHxmxcEtsRQI6rQQ6AXY/AD2K5ET9BxOXCegKI9hv0JGB4AOn8nlGKjnI6orNI+G9FTMNxFvO4edR3GbsOmjhamM8K6S+1EKWCcETzUwioCRko41US21GAmZNxjEDNIDyraqwA6VEDenFnxx4oCUrYMmHf34BoI+AoLUwXImcimiU+j9D7u1CPEbDtw4fPeLGCEk1knxXyafLSWrrhVG+IE1GlQwKZtC2BE2MXjWNmykcIMcEzYMuiNEtipmB8YorACnYxx1Co/MEv2IWHRteRywliYKPYnkQJxJE6cQ4TlFziI0kI/4ZZOMzLiNRNEtcTqPEmMT2IGFMxJ9FO7ZpNh+CW8W9k0GPibhz418bTHcJ1I06pZCiWRLnEKiNYzkPcbsP6ln1yU3/TkKrCPEXg/GhvXnGeLQAXibB/KZCKIA2y9QIOsxH/jWS/Hl9qhf48nsGRzGUFsBhYjgrQQqxVYUmYeTqpHlSysFiRjkssS5Pb7C8IJ1YiXrWJYa9Dip/k0KUFLGEBTDQ5tTABNCOZRTSqMU7kXFKHH4STOJEAGETFSncpNhvyPrn7U+G8oPIljaGszxnzZ9uMRmYUUjLdSNEBJVEs4cVPok3DGI24iAlJEwpmsiJYOQbNW34lPU/YKgP2OAi4AB1UAybF0W6g9EYQC0xU+8f6MwpBicZjcY0Q+BriRi5x8kmMYaI0lA99099VPh9wTqb9MYlEIiJ6FdTvigm+PZYt+OTFIc0xNuQkQcXuklinJ5IuKvhypGvTPJ707yVwL+nwTfpSEgGWFNgDVBsJUbbLq035EVZVhx7d+mlJbCYRrRMojKbONIjzjFeQ0eMbqOplMS2eCaatiqOcIaT6usMp4SlPwQbIjqrPP4USTymuZkAy0uiinHdFkAhZtE/ehJD9GPi2kV+AisQwURQArAnuHBk2W2mwEuApWU6ehxC62ywJjsqsc7LpH+s/J4IT2cVJClGjN44AkgBJn9lZcaa0/Nsj+lYmMygGRMrYY+HzkIzyJ/UyiMqPLlYIyZDckqQxOHDmCmE8Q6Rnt3xCAMlw2cVWEKKwRLjqCNkxFjGODJwtUxqudXKIkGnHToQRFVTrDCTKkojOsWIYUuXHZwDFRBsvHiE3xY4jdppPdBjXwzH19A8F02rNdIyatZrZwEx6W30pEvTJ5HA7ofWO1E/TApXs0KbvH5jCR15fDJYdVQIl7JCZpE8Zr1IolLi164QG+ZTLRGwy9xIiYyd/XHE6N2oPM5AKJxJj8ghJrtShESQ0yFAxAsMFVouJMQCgiS8UTtNsLPCEtnuOkqiHpT3FzyVJNQrSpGWJ78hlK9k0hph1LGgSnp1C9oa9OI4fSfJX0xhdliMjbJNgSE3lMVTBnzDIZgcreedh3mCi95pi2IWyEPlxzbQM4BGSIpXGPgE0S+eqNREECQxo6tMCqQnS/n8ZupwyCFIIBERyT5usYChBXVKVroGEwsR+SA0s5UJvmIsbYXEPwEUgZ82ilTESRXojTX5hQzMP6lSUNR0o0YuqDNSAXgKrqkCs2SAo1ynVbGQCw6dX10QQKXQbijDlOUoUUiHZNC5Kv4tdkwT3ZmwftAEAUJIT7lS8cKc4E4XNN4pPCkOUkvWFxxxRUcuWjaJnFwz5kRoROZRIKnUSxFFMlOWVINF/9j5SUYzFYwZog9nCh9KqHRV2QqjZpoQTNr/MbCtTac60ysrjzgKwdMFSY7BcAp7LpjsCgEhyTbNOX2yIuE89gT62gkML+hXxbgNMCQkZA1G74equ8tEF4S42B0DMoXNtQ882JJUBqJ11JB/xte92fEMZCGYycewsKZRP50wCf59Jn7Z/kEJJXiVi+mIhMZSqJ4KUcFtKi2bE0sUrRzWzi3SpQX7lX5EmhC6yowRIVR5Mm5CjxS4i8VULzlviqsVcskJcrGxREIfO7MVaCAx8QqtMAfE1IeAJoIq3CUHO3ksdcKSyRqkSWAo/ZnetqOKFkF4hfNsc8IA6jXOrCRp8ynbYyNGJLUNRMippDVVaDcjDhs6NOXTjwCyg6JY6uvPgOKTrb3gJl6AOYmXVvGxYC6FQk1RiJpW9yNirqiSPzWvoMr3FU5MLt4uDXuSYucXaeVlVnlRqsoMao9VaQwA7NE1EBaJTwxwlQyxVwchEvJnoDsof0pJckocn2L2Bbe6KZ5oi2kwm0KAr6skn4CDAEqXx0+YFWQEcC48rU6pDQMwCEDQV9i8GoQD4DhrURPE7QdoCaCsCmgfANZNVPeA/CdJckn+D8Cc3wRxw9S5sH4azxmpGjNYektWQZK/ZYUBAj1E6iJgUSQcyVW042TtKdXrKbVtfdclgNWU3U8BBAhFC2l8nfTEMca3ACeoU3j5z19VFqifCd5f50wQNXchoHeKfENAHwD4pQCA3vrmKOYWPmIhIAABeYjSclI3rBQI+FMMfoX2LWa9SKGpDeQBQ1obzKGGrDThrw1nTkmxCiPKQpHkkiUauHLdayouUTZYunLfdbJuCWnqlNQ+SzPaDQDUQVg3nEEtevH4BzN5fI7ebvN+URz0lIK8ILUsiCxg+p+wz2FnPymiLyZ2oiRVuLTknMeZFc33mhOrmujjSgsr0SLPwoPiUYrcpuTouDGtxlZaUT0aijnELK2ASys1t83jppR8Q6g5ADLVCKnDgVzM1WOZ2bZHLR5zK6hkLxDWXKuhASt2YeoU1pax8mQNRLIDTV3qM1CSljvgjsJAgcpIyKcIfnxC58oE4QO7kqLlXOF61/KYqLxGbUppW1jQLVffzIrvsCGbjEXG9yfoRkkIAHVISRB/VgcCWxquBnGLNVLqqVgmvaXgvpUHEPVwVK6WFp9VkKgJ/qzdUGti0XaPJdC67TctnlnAvAd+GNbzrz7+Bx82QSfMj1Er5aIZt6uJcVvOz5drsSg4OIDsN6HyUSmK0IEtFaSdoPwDauVaBHrUojSpHamgHyxnzQ4RI4QhHa0tCHMaDVrjc0dt0M4CxjYRwhjRQHYX1dCdm0z8fxrCamyKddKhpHExDLuq6CRCr1fTtum+qmdU5HrA3TOVs6d1HdJLUEu5XvJUQQu2CQvMF2StD42QR7fV0l10dpdRWhKfLqVRgB2k6rI7j+XAh/l8g0ARtToJgSn8L+a+b5vjokjtQfEdyXXbxFrlYA8UniaiNAAOg2AfA0XClJplzn2rnIynKdV4zU4A91ZkLCofarepOrqe+6UnYVGbQHLUWA6uTK0l8G5jKduOjFLQGmgRaHpZxGLedqT2QSvJ4ameXJpz20wBdGeyVi+k+SnIi9mXLhZ8uHFEspwfADNjmtEZhyiUUOhqEXKzZD6R9Y+ifREFlSdpzdO3XIN0od4oAnmX+V5viDGqFdO2Qffdt8JRXgFltinV7ivsiz5Bp1Wy2dcTqNll8/d1K0/YHoAlWyY95DZyazvv2VjLtndLnRGvrDp6+d7+iJZ/tpiAkZ0pvQvdeTH5S7CtjHL5eXu3YxpjGgzPdnrVAjld9BQIvvbAFAjwCcIgYxlkSTsrBDMDSfRfTAs0ZGtjimfMuQOpyEG98+xchmsdpJFx7x5cWojlduuXCGBhW8SmLsg/3bwKAdEcqC9pl1l7rGUyBKAXP4XpT3haMrNlGL+x05aUDKS+cRIPnXyYVpU4yO2phFSSzgT3KmMrK0kVLpw1kwldPnyBHjFFmwnyNoBXhqBGweYClIfTIAOACojwFhHjJ4wb5PDN+ngwnr4OesOdHK+hS/uCXBG7SYRkI7vHqxnlD4bAepn/oHGvb4lSA0rYjIEXEQWEiKl4eke/kXzGlxwyFS1suGwr9RzEloprMFlKKN8PyFeDxgGCWSJAkkarWv2BgeQdWIkaHBYJWjGTmlhuhiTNX30J1P+oCjnp3vkTlYGDH4knb7vg4/jK+bB21aa1erORWDLZPMQ4rZhBR/G1+plYGvGOsD+DUxqCTMayo0AhqHDYSCpovUeBFW0gNiNEdL0qH3BiJFaFBuYCwhWwr6b6HmH2EAhRAC8eUgsmhREBBTiqGcCoFRC6D6T+IMmIVhnyaIToC3SADb1EB46HeK6vwCKcxZgQnMSAYsogADjincgwyaSfeA80IavN9XBDb5uH1WAAAmjYBvg/pzQN8LqPGMI2iwQwVAZgE8DTAfgtO9mkSkxhx1VxAgBERmsMkDMbdBqBCFiEumETFQn5pAPaHbQyDzEVZTGQ+m/uUgaARQcYfIB+GDOoQwzHgbrphGqBpIyz6k40R7sKhht6uw4dAUsFkAhnazV+h0ioXIC7xMW1EKgTqjTmv9Lu84N8H0C/V6nQOB6RwJABTMOrpwH4TDdhtw0mgfAH4AYB+A9NemfTZoP0/WaVShiRYYQdFuOOvD7B8QEIU2qKfTq4DtYh8MowUWgAsQRld+eIRoO9RWaRz+w1c07Ts2NhozZ5oM72ZrP4C6zF/C8+GKXMOQNMuqsOJr1/jjjqN+CYyOoNjgZlXw/JsRJoJyCTdNmjYD/lgEI1ynhTj5k0xxk+Cct+KjhbCPmgOgvYecfgtPugfgUkA8DWimkiq2YodEsCJZQM1MDNOUwoBmEYCxWeX1AJ/AToUINPk7BUD1CXu3jT7uYNon/d1q6Jm2WMjr7cTm+zE/mNtaVS/cViUPedM9WpNvVUexnYyuAlRVGzPh9nWuSnmcr/WKpzYCqZUL2bvyi8w0JyeUNAHVDBBxXSwmV359gVmPCHIMlBjMtBlaAIo2O1RncSiU226OQ5Bh1mNBKfJLif7V5RK1pRzAcpZS0vChmDEDq7Rt7H3SYAWMawcPj0xzrFk4oAiDrvylHUAC8+qsefZ43sYUARjNslnRSbclUm/DghgI55cdqMnfMTAWcDKaCvcKgDEqzojD26J3gkeaeXNU4SlXsEXaWfCtejjdTVquKmsTtXtXnZDNW9JdaBAImfXaMmrRZL+nRtsZaSpBqfAIb4PeqAdfuPqc0SDXVwor2c0DMhmgvJVYiLVCHDE/icp1B6RcZ2SyyFoj3MEGdpJihbft4OUnJjblznZNbpPTWfLfkxa4AYnqhWcyhXbvGdcet7VGcOyDfP6ib0tKVT7jBuBQc/hz7J1fVw1rbve6Qs0V9tWBfOhCA0J+Qe/ANPxB8SqwfALQE8+gDZltHOZnR8U/ewgr0A3BHgrAKkMGvAThrLKiY5306ETXn9+Nhkz5fypUgr18h6KcXqUNLWJ6f/UXEpibDsBecx1NQ5nWDids/kT1JcOyS+xWAdA23fZCxDsqr4PCqsLfPAGuhHtQRPEzYdleD4DTUrBV2mQ8a6tiA9wGZavc1c9GYROYvV6BRQB/bSKLJ1nL7tGScF/d9VvNw1TpOeQ6zIaXPNC3sdP4flqbPVY7ib1m4xXXCq+MaTKeAFcVDuOd9IVlCErVziVXGxE0TuRNMHExlqiJjSt0tU7Ya5lNG/6t0g8E7ZZ2rGwbbekp6ZCXlma4CXVLD9eGrJ60raV2TE3oZcbCQaOm2tHyWIKipitRs6tttwrKqn9geNW3rB3rLGqXKIm06/WTmgDUxU/dDxyLsDOiXA/YER35AI0F5UXQsWeQg3Osa+7MUZZhv7LxN66rnn6o3Xkm9bu96ke5dpMQYj7PlvUpvAA03371makA6WRq5xoVgIwJOPIK15GM69JkBwLxEaJXWlSYzJ7HoeEkCoVonYS0+oHFPPw4MTDrHg9msXH1m9dXBrk1z9IalxSkpTsL4QFL4ArdVRnmxjsCE6T6htARw2AeYSYRu8gHA7pANrQ78Gh0973Sic0tYLydOl/8XX04MOXmdfPdxALzv0kOnZuN42xQ4Js2V5jERpVm+c0CbHYpMR8QfRHqqt5BOcjQtd9FBjA4pALVdwYDN8SkBzyw/JVgqMFw0b7HDaUW/kJfIsygwI7Owu0sESfzklxh63St3sMwMKeP9jixrP/bfdHB8uZwcnyge/1Ys6KITvGnlvPV2et0VS1HQMckskyLu6o2rBpjyrcEZqIiK0nBSiIsngkU0WDb42uOydVqpe549XXU6w91lunSjbsvr3CHYx4h6NexvJ6PLJtnIMfcifLH94ax4+HE9iVcmgDf/ZNpS1QCKROplG8rZ2EysVbWYHEiFc1uapns/YZ5BUUnDuOp3zk9ubRhRMO3psals4GrbpIuNgmZZqKNOQDn6IVHpZTG5fY/QCEhkZqUaEu7ojjMQ09ZUNLVonWTopk9hgkXFw7AOcaX57UNvEdg6xPbKVt2l05wSf31mXiC2t/1adtckVjnnj+l2aE92CUOIn6gbehbciN5o/nJe4KzDNCvJSEZELg+Xp3LYHwJZZtThHJAx5gjNh6iozFcf6XlS6ZlUxaDef5T1Sxlk5zCjzhOrN2flaLUIBi32GQCj2Nr4WDQDtcUg5IztIOnKT5I5pDNCbkgFfqgBLd7mhdriyM7tDNbgVc02QCziwT/1tGZmC/YSZ/Zu7CzDLtS6arnuQ30TorvZeK+QEXVCTuAwZTegAAG64GiIGNjem09X9rkgMZF50BB+2vKIcw8kFBQoPIqb8mm8Azd9vEIfbiplq6ZNrB6TZtAVyGHXeAAkwkgADvPoQ7212O4zeTvUQ07+IasYfotxF3670GJu6mum3tXe7vVwe9kB9vrlBDzgj1mi2Y2nne9sh1zs8rhhvK0MOYTettsk2NeCKNl+ZHEcAj0YzoafCGnvaQAAA2gQAlxqYigxVbvBoCZos0wA4gWgLxj6oABdKU3CHxhngOJfGTEAwmsHMI9B+81mFo3SjPIGPhEYiLC8SPgVywcKKADfCyNEk4dNoeZMZH4/0AhP5rv7B5HjFWDJb94GwER6HvofFLZSrjRXDdjCF5PLHwMFh88645hY2K/ZOvjOBOY+QgI3XCS8g+QwfKMYKaYAJmn5hCsaiW8E08rqxYdPKxUT8x0YcWOU2aPFuOyhsAtAasVubuEXKeSNg8CbyTRPaB+TRfYvXx8sBl6lMZzuctWnMC7BU/TJaK0URQPZ/ZRRppP7AFwIK5cfCvW3KYzEyJoMtURZXC938R45Q6+55X5WJGzZcj3NZo9Pj2PX4+3vKvwJtC6Yx9NHjlwD0CFjignFilfbW47cQOXv2ASFwB4JcYeIYDm8GQGITwRAGyZdIouKQYOCOP5SjiQAZQ4oMUOKGqACBagtABgGqDQCNARQz3tAPUBlAKhnwCoWoGgHFABAhQ/cQHwEGqAygZQAQAQLt7HhQADvvmI7yd8DJnkO0Zca70LAKUUACnytheMvNzBw+DAAAb3sw67EAtgAAEKyo6AMFGKFYGPDNgPwY7NMGcEHBk+2QnwKvNT9DS2BmfbnFJDxbJ9IBWLm4J4JcH59yZBf7PkTB+GeC0BNPGAM0FVFXcynEAZbCU/z+n0y/RY8vxX+4ACIkANf97LX4UCF+y+9fnOD6AqKXAa3jfE0SX6z/N+ixLo10WgI9Duiq/+fH4AADoYA/fPv3AIH+D9B/Q/wAV3+hNujPQ9AAf0PyH5D8WBLAW0HaO9E+i2o+3xnxTykBM+IAX3WAPt85+g++V13r4Pt3DACB9uA//vuPzX8D/XwDfXgKvx9C+jhAM/v0D0PDOz99U8/p7wv5GGhgl/8gZfoj5X/98YBr41vwMQ5v8BV+HjlLTnwkFzTKwoVasFIBrCcXaxSw/ovfpzFIp+fwyigPi0oAX58xqwfbgRzkVH9+/ugvQfoEMDiSQRWwi4QvmyEQxEf09m1IgJsDMDd5bKK8cj5R7Uef2OMLtgf0Ex6AwfVLH7x+NfgFQR+Z5FH72UH4Dr4fgK8MJD2+DIA4AzoiAPz44ettJACk+3tN7QfgePqUBHw3vpP62+iLPb5IBeAbL5VoVIKb7PQOvoQHEaruAFhzo3vvb72AE0Lki0g9AKWxvoNgP3DqAQ6FchxccLoHKoAfYBQIQENAYQGy+tYH0hJoQ6neByB8gR+Af0I6B4D2+pAWwDe+knFP4a2xSIQEAAvswH4BtAaLAkBZAUmgN+I5Jr7mBdAd7AMBTVGb6OBosJojsBtMN75/8uoNbjzIPbFbQHWw2P8BIAUPGrA2+pRFVY6o7OHPRiIClgPaZ+4AUTA5+MlljATIA6hoBqBLAYoHe+KgZZDZBRAepjyWGMEoEC+bPpYEaBHLFoE6BNgaLD+BfSHgFmBeAQQHqB1gXoFJoF6G77YIT0EcQOBlQfQHYBrgUwGVBngXVbeBtgY+C6gvDls6oUDzJgheA6PI+DFKefNAh/IyfsqQbeJQc6CCQSQaRDMeQdsGDgwUHv36+UZutU6qwbgjTjQIrdrWrGMkEIUEKBb6HkGWwqge4EfgxQZCDOgZQVL4VB8gaLCaBdMLUEdBLvteBu+HvoNQ3wsfIgAxQxgd7TNBhAa0EsB7QWUEfgB0OShxwbwBRJlsOJnj6PBosIMGMBzviwFjBBiGuje+Jgv/zayiwHVreA6QfEEYw0+Gqam6KghoaWELzDPh2wZbruCdo4tFRDcQvEMzaiQOyPOjRWvQZnBIwSkFkHvBuQcoGvBBQe8GfBCQT8FO+7wYCFpgwIaiFE4B0AEBYhGsDiGmIUIWcBrQsIU0HmBSIUQEoh5AVVCBmfgGxakA+Id0jOBQweUHEhRAaSEcBSaMr4bA/5kwD2hY2pAC1AMoBoAKg4oAACk5sAgClq+zA4DFA6wFv6aAsMgNS8w91i6DXIVeBSj1AIoGWYigYYdKGVBxtE5wTBosBWBLgPsA/7eo9GF0rLcyAKGZdqrsApDqUt4IgCGYfFv6HIk9UBLiyBMoc8FyhH2G8GVB6odoFGg97LoGohFYWr5whImCYH2YNHsgGoBuALYAUB0/hgDe+APgECbQSgBJibQQoAEAKgIoND60AQoKoAigm0DD7igAgAwAPeWYbUANAtACKBoALSLSh1ARVLUABA+AiKCveDACKABAt3gIBpIjQJtCNA9QGgBqBKAU/62Adgd76bQCoNtDigCoAIBHhAgBKBpIDAH95oAQoEVRoAukImABAIoPUBNAJAJtAHhAgJtBA+IoP+EygTQDKDERjQMhEARaAHQCig1QAwAwRDAGBEThd4HaHKApAFqgihaYKu58g/PhaEfgk8NPC6wc8M4ALwZeMvBzo4kbPCbwPRjvB7w6Ej84bGsgMJGVB1kGmA5uZCPz7VA7wXuKIAVYIaDehhGi6EC8pgeYEfgFTKXjLYN/Ahi5UJ8JpH/BH4NpEeAukbAT8+9QIZHdKxkaMBmRlYfz7MCVkXgE2R/rKXgKEphDjhhSc1moTqoIYC5HqB7kZ5FX4+kb5E1hJkbACBRk4TUBmhYUbZFsMfdK1Snk55KpLORXABaGy+KUX5H8+SzJUFGRWUTlHWwdUflEsBhUTlR905tlmBRKGkZVFaRB1B5G1RNQBlGEUTUTaFBRXAJZHwh1kR1FLYCtPBhrYSGGyAVRFga5E1RNYXVGjRZCONE+huUZADNAoUe1ERRRUZtj90K0YlH9R60YNGpREkOlENRfkbtHmR+kW1FEBc0UTRnR5tuTSXRa0clE3Rw0cKDbRsBE9GTRwoK9Gy+70eww0AyQmECrRVUfUH/Rm0SNEPRmUQFETR+0R4hHRb0SdE8CWsrUzrGoMn1G/RLARtGEU/PptBAxV+CDH7RrrFjEQxOMf3y8CwbFRwQgcMQNE2Qt0S6EGRKMWNFoxe0S1F5RdMaLDvRKXMMA8wbMddEcxAMdzGuRjUXzHPRU0eDHCxDMYPxMx8vHdZK8P0fDFuRiMWTFcAtQJTESQ1MQLGQA00dOGzRKsfposggVLo5/ExmhEYeaWsezE6RAMfVGyxj0fLGgxh0TNEFRKsaLFpcHgBLF/RUsUjE3ehsf5GmR6MSbGYxPscdFkc8hOXg6syLpQBBxJMbrF6RXAG7HqBcsZHH8xlkC6G4cQseFEHqcmuyIxq7IlMI44ZYE7GSxLsaHEyx2cR7G5xCsabFKxxcX3yqxeMfwKRCA1jXHBxdcXrEHR4ccbH5xrUUXEixA/PwIj8RMdrGkxGcS5DDxnsftEhRscdjElxwSmXFISFcZyJ9xacSHGDxDcSwE5x2UVHGjxisePGzGaeghJeAMatfGm0NWqybdiLlLvFEBc8V5HIx7sajHNxoMWbGQACIWvHJaV8fPLaiAVmFIzwzwAlEzxzsUNH1xi8d/H7Rv8f/H0x68VfHPUt8e2JBAaEmeRPxRgi/HVR6ce/GQAh8UQHHxzUWfGtxF8SgmNi3srfGsKpLKvKW2SUXvEDx88cQmy+pCafFf+/PogkWxVCSIY0JLCkvKEITYKnGvxBCWlEfxjcV/EnxecVwnnxq8cgmAJ1CcAmti3stlp+yeCQjH7xrCXAkyJLcTwm+xfCR7LMKC8mol2QwMoTFMJYidomEJbCaLAcJsiRZFtxgRv5IP0YSgLpFUoifgk2JEiUQm6JZCXIkUJCicrFGJdyomyPKC8s8rpAryr3FQJtcTAkHx/iZwlOJlCUokiGqWkhKnqzJmpqMJV0f3EJJOiTzE7RS8SbEGJccWklBGkhmugf6Yhmuhti+ehLhyGVid4ksJhCUKBJJjidwnOJl8ZGp3amScpo5gWgtlqyAuWl4laJrSb4l2JLXE3F6JP8d0mhJohpno1JmeiLqf4U+OhSaJOsT4l3RmcR0n6J8yRUmLwVSanrBSb+nUnf6ySFeTNJ4yQUm2JeyXMmpJJySIaRO4StnpKRERukDYAYyVskTJOyX4lFJwMSUnkJZSQAlPJlSbUlgpikRCkYA0hpMzrimyW/G+JWcUfEzJASSknBJ7cZq7hOTJgmqsm5ut8mIpfycikkJqKckldJjyYfbYps1qoQLWCKeIl/J7SQClUxQKYEkgpiiWClHJ4Rq8kgJnzipGrGhzASn0pXMfckIJByVikfuTJkTZ0p2yQXEip0cWKmUpEqdSl+WdSd7KCpMqfdGfxvMfAmlJCqTNbeWETu8mKs80jE7qpvycKlMpRsSylcxeqdu6+Y1DneQX2ZzFfZXJeScwm3JkyXKnkJMcebGGJYTkqmKR4Rl86qRAqdKnmpmqVInapsyaKkUp+qR846ux3t+4kwZqR6l/JUyQ4ktxPqX/G8J/qe85m2pNBbYppnMfz4KgxKewmkpnSZnG5EsaXakn2wJDQ72xRadLEigXqYEnJ4pgfZgzhM4Vd4QA0pNj64+I4fj7o+I8D2lQAi3hqQ5g6ggT5xunCBd4jpJPuBHCQVgBxSKoN8LgAMgp3nT7qAfgD9TM+IoN2lze46RlpTpAmNRDDpegEAA== -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/newton-physics/newton/issues/comments/3872574819","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:11 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"682C:3F166A:1090D5D:476ABCC:698A084A","x-ratelimit-limit":"6800","x-ratelimit-remaining":"6611","x-ratelimit-reset":"1770656199","x-ratelimit-resource":"core","x-ratelimit-used":"189","x-xss-protection":"0"},"data":""}}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@newton/_src/viewer/gl/opengl.py`:
- Around line 882-883: Remove the redundant "# noqa: F401" directives on the
unused-import suppression lines in the module: update the import statements that
bring in Shader, ShaderProgram (from pyglet.graphics.shader) and Vec3 as PyVec3
(from pyglet.math) by deleting the trailing "# noqa: F401" comments so the
linter no longer flags RUF100 for redundant noqa directives while keeping the
imports themselves unchanged.

In `@newton/examples/robot/example_robot_policy.py`:
- Line 36: The noqa comment on the torch import ("import torch  # noqa: TID253")
is flagged as unused because rule TID253 isn't enabled in Ruff; either enable
TID253 in the Ruff configuration or remove the unused noqa directive. Locate the
import statement in example_robot_policy.py (the "import torch" line) and fix by
updating your ruff config to include TID253 in selected rules (or, if the
directive is unnecessary, delete the "# noqa: TID253" suffix).
🧹 Nitpick comments (1)
docs/tutorials/00_introduction.ipynb (1)

59-59: Notebook source format inconsistency: single string vs. list-of-lines.

This cell and the one at Line 162 use a single-string "source" format while all other code cells in the notebook use the list-of-lines format. Both are valid per the nbformat spec, but mixing styles within the same notebook can cause noisy diffs when tools like nbconvert or jupyter normalize the format. Consider keeping a consistent format across cells.

Comment thread newton/_src/viewer/gl/opengl.py
Comment thread newton/examples/robot/example_robot_policy.py Outdated
Comment thread pyproject.toml Outdated
@adenzler-nvidia adenzler-nvidia force-pushed the adenzler/configure-banned-module-level-imports branch from 960261b to 0a4955b Compare February 11, 2026 08:47
Add TID253 rule and configure banned-module-level-imports in
pyproject.toml for 24 optional third-party dependencies. When a module
is in the banned list and TID253 is active, PLC0415 no longer fires for
deferred imports of that module, removing the need for noqa comments.

Defer pxr imports in examples and tests from module level into __init__
or test methods, consistent with the existing test patterns.

This removes 133 noqa: PLC0415 comments (202 -> 69) and leaves only 8
targeted noqa: TID253 on top-level imports that cannot be deferred
(torch, mujoco, trimesh in examples; PIL in icon.py; pxr in notebook).

Fixes newton-physics#785
@adenzler-nvidia adenzler-nvidia force-pushed the adenzler/configure-banned-module-level-imports branch from 0a4955b to 25e7f3a Compare February 11, 2026 08:51
shi-eric
shi-eric previously approved these changes Feb 11, 2026

@shi-eric shi-eric left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@adenzler-nvidia adenzler-nvidia added this pull request to the merge queue Feb 11, 2026
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Feb 11, 2026
@adenzler-nvidia adenzler-nvidia added this pull request to the merge queue Feb 11, 2026
@adenzler-nvidia adenzler-nvidia removed this pull request from the merge queue due to a manual request Feb 11, 2026
@shi-eric shi-eric added this pull request to the merge queue Feb 12, 2026
Merged via the queue into newton-physics:main with commit 51ce35e Feb 12, 2026
22 checks passed
dylanturpin pushed a commit to dylanturpin/newton-collab that referenced this pull request Feb 13, 2026
vastsoun added a commit to vastsoun/newton that referenced this pull request Mar 3, 2026
* [Warp Raytrace] Added device parameter (newton-physics#1544)

* [Warp Raytrace] Added device parameter to previously overlooked call (newton-physics#1545)

* SolverMuJoCo: Fix tolerance clamping in update_solver_options_kernel (newton-physics#1546)

* Change default shape_ke to align with MuJoCo, parse geom solref from MJCF for contact stiffness/damping (newton-physics#1491)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>

* Fix log_shapes broadcasting for length-1 warp arrays (newton-physics#1550)

* Fix XPBD restitution particle index (newton-physics#1557)

* Out-of-Bound memory read in example_diffsim_bear newton-physics#1386 (newton-physics#1533)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add versioned documentation deployment to GitHub Pages (newton-physics#1560)

* Fix broken documentation links after versioned docs deployment (newton-physics#1566)

* VBD New Features (newton-physics#1479)

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* Add banners to membership verification workflow steps (newton-physics#1569)

* Support cable junctions (newton-physics#1519)

Signed-off-by: JC <jumyungc@nvidia.com>

* Rename parameter I to inertia newton-physics#1543 (newton-physics#1551)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix example_robot_anymal_c_walk.py (newton-physics#1574)

* Change everywhere linesearch to iterative (newton-physics#1573)

* Remove standard collision pipeline (newton-physics#1538)

* USD Plumbing MJC solver attributes through resolver and custom attribute framework (newton-physics#1463)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix child shape filtering (newton-physics#1559)

* Fix ViewerRerun ignoring hidden parameter in log_mesh and log_instances (newton-physics#1555)

* Make NxN and SAP broad phase respect filtered pairs (newton-physics#1554)

* Add --quiet flag to examples to suppress Warp messages (newton-physics#1585)

* Defer resolution of MESH_MAXHULLVERT default in importers (newton-physics#1587)

* Fix TypeError when finalizing SDF geometry with device kwarg (newton-physics#1586)

* Make MESH_MAXHULLVERT a static class attribute Mesh.MAX_HULL_VERTICES. (newton-physics#1598)

* Significant non-determinism in unified collision pipeline for anymal_c_walking example newton-physics#1505 (newton-physics#1588)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add test for non-contiguous case (newton-physics#1549)

* Fix nightly Warp CI to resolve pre-release builds (newton-physics#1606)

* Verify default class and value handling (newton-physics#1556)

* SolverMuJoCo: Expand geom_margin to avoid OOB read with heterogeneous worlds (newton-physics#1607)

* Fix bug in control clear method (newton-physics#1602)

* Enable Use of Newton IK in Lab newton-physics#662 (newton-physics#1539)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix import  of non-articulated joints (newton-physics#1535)

* Deduplicate _process_joint_custom_attributes frequency handling (newton-physics#1584)

* Add CI check for stale API docs and fix local build warnings (newton-physics#1570)

* Update Pillow 12.0.0 to 12.1.1 (newton-physics#1612)

* Prepare handling of mimic constraints in Newton (newton-physics#1523)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support floating,  base_joint and parent_body arguments for importers (newton-physics#1498)

* Fix contact buffer memory overestimation (newton-physics#1614)

* Configure banned-module-level-imports for ruff (newton-physics#1583)

* Explicit `Contacts` instantiation with `Model.contacts()` and `CollisionPipeline.contacts()` (newton-physics#1445)

* Fix the quadruped benchmark regression (newton-physics#1615)

* Change default ignore_inertial_definitions from True to False (newton-physics#1537)

* Finalize the Recording API (newton-physics#1600)

* SolverMuJoCo: Fix ccd_iterations default (newton-physics#1631)

* update gitignore to ignore Claude Code sandbox files (newton-physics#1628)

* Add mimic joint support to SolverMuJoCo (newton-physics#1627)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add --no-cache-clear flag to test runner (newton-physics#1629)

* Update MuJoCo and MuJoCo Warp to 3.5.0 release (newton-physics#1633)

* Improve inertia parsing from USD (newton-physics#1605)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Remove standalone .typos.toml in favor of pyproject.toml config (newton-physics#1642)

* Heightfield support newton-physics#1189 (newton-physics#1547)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Example_robot_policy: Replace ValueError with clean error for missing PhysX policy (newton-physics#1636)

Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Avoid unnecessary inflation of the contact reduction voxel aabb (newton-physics#1650)

* Rename num_worlds to world_count (newton-physics#1634)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support parsing autolimits from MJCF (newton-physics#1651)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix particle-shape restitution ignoring body velocity (newton-physics#1273) (newton-physics#1580)

* Add overflow warnings for narrow-phase collision buffers (newton-physics#1643)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Documentation: add units to model/state docstrings (newton-physics#1649)

* fix(viewer): add missing JointType.BALL support to contact line kernel (newton-physics#1640)

* Make terrain mesh visual-only in anymal C walking example (newton-physics#1660)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Fix initialization of collider state in MPM finite difference mode (newton-physics#1652)

* docs: document ModelBuilder.default_shape_cfg (newton-physics#1662)

* Finalize the collision API (newton-physics#1581)

* Remove hardcoded subnet ID from AWS workflow (newton-physics#1664)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Attempt to fix AWS config (newton-physics#1666)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Update AWS workflows to g7e.2xlarge with multi-AZ failover (newton-physics#1669)

* fix(viewer-usd): disambiguate log_points colors for N=3 warp arrays (newton-physics#1661)

* Viewer gl optimizations (newton-physics#1656)

Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* docs: add articulation workflow guidance and regression check (newton-physics#1663)

* fix(examples): propagate IK solution to model state in Franka example (newton-physics#1637)

* fix(deps,docs): bump nbconvert to 7.17.0 and fix ArticulationView doctest (newton-physics#1670)

* Cleanup and improve some example (newton-physics#1625)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Handle zero-mass bodies and flip ensure_nonstatic_links default (newton-physics#1635)

* Additional testing for ArticulationView (newton-physics#1527)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Update warp-lang nightly to 1.12.0.dev20260217 (newton-physics#1677)

* Change default friction coefficients to match MuJoCo (newton-physics#1681)

* Refactor mesh creation functions (newton-physics#1654)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Parse joint frictionloss from MJCF (newton-physics#1680)

* Fix free joint body_pos and add ref/qpos0 support for MuJoCo solver (newton-physics#1645)

* Fix root shapes in ArticulationView with fixed base (newton-physics#1639)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Use model collision methods and remove `create_collision_pipeline` from examples (newton-physics#1648)

Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>

* Fix XPBD apply_joint_forces ignoring child joint transform (newton-physics#1582)

* Adjust SDF API (newton-physics#1644)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Optimize test suite runtime (~18% faster) (newton-physics#1689)

* Remove ensure_nonstatic_links option from importers (newton-physics#1682)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>

* SolverMuJoCo: Add geom_margin support, align thickness default with MuJoCo and schemas (newton-physics#1653)

* refactor: privatize non-public solver internals (newton-physics#1683)

* Fix option parsing with multiple <option> elements from includes (newton-physics#1692)

* Bump warp-lang nightly and newton-usd-schemas (newton-physics#1693)

* Get rid of tkinter dependency (newton-physics#1676)

* Fix SDF example contact buffer overflow (newton-physics#1695)

* Fix implicit biastype for position/velocity actuator shortcuts (newton-physics#1678)

* Fix include processor to respect meshdir/texturedir (newton-physics#1685)

* Reduce cold-cache Warp compile time for geometry modules (newton-physics#1618)

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix xyzw-to-wxyz quaternion conversion in body inertia kernel (newton-physics#1694)

* Rename key to label and add hierarchical labels (newton-physics#1592) (newton-physics#1632)

* Expose geometry SDF helpers on public API (newton-physics#1684)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Improve custom frequency handling from USD, parse MuJoCo actuators and tendons (newton-physics#1510)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Collapse fixed joints with non articulated bodies (newton-physics#1608)

* Fix renaming joint_key -> joint_label (newton-physics#1700)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Bump .python-version from 3.11 to 3.12 (newton-physics#1702)

* Replace CITATION.md with CITATION.cff (newton-physics#1706)

* Respect MJCF contype=conaffinity=0 via collision_group=0 (newton-physics#1703)

* Make ViewerUSD reuse existing USD layers for the same output path (newton-physics#1704)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove dead up-axis conversion from MuJoCo solver (newton-physics#1707)

* Skip IK cube stacking example test (newton-physics#1713)

* Fix global pairs (world=-1) not exported to MuJoCo spec (newton-physics#1705)

* Reduce the memory consumption of hydroelastic contacts (newton-physics#1609)

* Fix flakiness cube stacking (newton-physics#1714)

* Fix collision shapes not toggleable in viewer UI (newton-physics#1715)

* Fix softbody examples table layout in README (newton-physics#1716)

* Standardize sensor APIs: label matching, keyword args, and update() method naming (newton-physics#1665)

* Fix intermittent crash in parallel test runner from Manager proxy race (newton-physics#1721)

* Clean up inertia.py function arguments to match Mesh.create_* API (newton-physics#1719)

* Reduce default test runner verbosity (newton-physics#1723)

* Add menagerie comparison tests for SolverMuJoCo (newton-physics#1720)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Add spatial tendon support for MuJoCo solver (newton-physics#1687)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Expose qfrc_actuator from mujoco (newton-physics#1698)

* Skip non-MODEL custom attributes in finalize validation (newton-physics#1734)

* Resolve inheritrange for position actuators in MJCF parser (newton-physics#1727)

* Support dampratio for position/velocity actuator shortcuts (newton-physics#1722)

* Limit concurrency to 1 (newton-physics#1736)

* Add a helper method for checking applied usd (newton-physics#1731)

* Enhance playback URL handling in ViewerViser (newton-physics#1742)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Removed RenderShapeType (newton-physics#1748)

* Override only MassAPI attributes that have been authored (newton-physics#1688)

* Integration of newton-actuators  (newton-physics#1342)

Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>

* Fix ArticulationView crash with fixed-joint-only articulations (newton-physics#1726)

* Improve retrieval of Jupyter base URL in ViewerViser (newton-physics#1750)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Disable dynamics testing for UR5e and Apollo tests to avoid CI flakiness (newton-physics#1755)

* Margin and Gap rename (newton-physics#1732)

* Vbd Demos Fixing (newton-physics#1740)

* Fix ViewerViser.log_lines method (newton-physics#1764)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Update warp-lang dependency to 1.12.0rc1 (newton-physics#1763)

* Fix fromto capsule/cylinder orientation in MJCF parser (newton-physics#1741)

* fix: multi-world particle BVH indexing (newton-physics#1641)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Clean up unused and internal-only kwargs in SolverMuJoCo (newton-physics#1766)

* Parsing of the mimic joint and contact gap/margin from newton schemas (newton-physics#1690)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>

* API Refactor v2 (newton-physics#1749)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Support explicit geom mass attributes in MJCF (newton-physics#1744)

* Bump flask and werkzeug in lockfile for security (newton-physics#1769)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Split MJCF worldbody root bodies into separate articulations (newton-physics#1754)

* Expose VBD rigid contact forces for solver coupling (newton-physics#1745)

Signed-off-by: JC <jumyungc@nvidia.com>

* Add MJCF ellipsoid geom import and regression test (newton-physics#1772)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Weld equality constraints parsed from mjcf are given Nan as the default value of torquescale. The correct default should be 1.0 (newton-physics#1760)

* Improve picking accuracy and stability (newton-physics#1712)

* Franka cloth demo improvement (newton-physics#1765)

* Support computing sensing object transforms & API cleanup (newton-physics#1759)

* Remove threading workaround (newton-physics#1751)

* [Warp Raytrace] Consolidated ray intersect functions, renamed Options to Config (newton-physics#1767)

* Improve README example gallery for PyPI compatibility (newton-physics#1776)

* Fix issue with mesh in rerun viewer (newton-physics#1768)

* Add PhysxMimicJointAPI parsing to USD importer (newton-physics#1735)

* Move some math functions to Warp (newton-physics#1717)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Add test to ensure MJCF xform argument is relative (newton-physics#1777)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Emit diaginertia instead of fullinertia for diagonal body inertia (newton-physics#1780)

* Change default joint armature from 0.01 to 0 (newton-physics#1782)

* Fix default kp/kv for position and velocity actuators (newton-physics#1786)

* Lock body inertia after explicit MJCF <inertial> element (newton-physics#1784)

* Fix for MJCF actuator custom attributes (newton-physics#1783)

* Bump version to 0.2.3

Prepare the package metadata for the v0.2.3 release tag.

* Fix ViewerRerun rendering of instances from hidden meshes (newton-physics#1788)

* API cleanup (newton-physics#1789)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* BODY actuator target name bypasses body name de-duplication in SolverMuJoCo (newton-physics#1729)

* Use default density for visual geoms in MJCF import (newton-physics#1781)

* Fix GL viewer crash on Wayland (newton-physics#1793)

* Make USD xform parameter control absolute articulation placement (newton-physics#1771)

* Fix CUDA context corruption in SDF implementation (newton-physics#1792)

* Bump mujoco-warp dependency to 3.5.0.2 (newton-physics#1779)

* Fix MuJoCo margin/gap conversion (newton-physics#1785)

* Bump version to 1.1.0.dev0 (newton-physics#1798)

* Missing unittest.main added back to test_import_mjcf.py.  Helps with F5 debugging in VS Code. (newton-physics#1796)

* Improve H1 example (newton-physics#1801)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Fix ViewerViser.set_camera() (newton-physics#1805)

* Rename examples to follow prefix-first naming convention (newton-physics#1802)

* Improve MuJoCo actuator domain randomization (newton-physics#1773)

* Restore in_cup test in hydro example (newton-physics#1775)

* Fix `newton.geometry` imports and change of Mesh maxhullverts global constant

* Adapt to having both margin and gap arrays for each geom/shape

* Fix for newton.geometry API changes in primitive/narrowphase.py

* Fix removal of `BroadPhaseMode` IntEnum and revert to newton-sytle string literals

* WIP: Adapt geometry/unified.py to fix breaking changes to `newton.geometry` API

* First pass of API adjustments

* Patch more gaps (with respect to margin and gap renaming)

* GeoType.SDF was removed - reflect that in Kamino

* Introduce CoM position offsets w.r.t body frame and operations to convert between body CoM state and generic local body-fixed reference frames.

* Add caching of per-entity labels/names/keys in the Model subcontainers

* Remove SDF shape wrapper since it's now internal to mesh handling in CD pipelines

* Fix USD test assets

* Add Newton <--> Kamino joint type conversion operations and per-space default limit constants

* Add some cleanup to geometry and unified CD + UTs

* Add Newton <--> Kamino shape type conversion operations

* Apply new default joint coord limit constants to limits.py

* Adapt foubrar model builder and USD asset to produce the same result in sim example

* Purge "physical" goems and collapse all into a single group, and purge geometry "layers"

* Disable allocation per-joint wrenches by default and make them optional

* Make `Model` a dataclass

* Separate ModelData* containers into own `core/data.py` module

* Fix imports of ModelData

* Rename `Model` as `ModelKamino`

* Rename `ModelData` as `DataKamino`

* Rename `State` as `StateKamino`

* Rename `Control` as `ControlKamino`

* Rename `Limits` as `LimitsKamino`

* Rename `Contacts` as `ContactsKamino`

* Rename `ModelBuilder` as `ModelBuilderKamino`

* Make imports in test utilities relative

* Revise CD meta-data attributes and their computation in GeometryModel and ModelBuilderKamino

* Revise primitive CD pipeline

* Revise unified CD pipeline

* Revise CD front-end interfaces

* Fix UTs and relevant utils for interface changes to CD

* Change to `wp.DeviceLike` to account for upcoming deprecation of `Devicelike`

* Depracate legacy HDF5 data io (will be replaced in the future)

* Fix banned imports at module level

* Modify USD importer to detect articulations and order geoms and joints similarly to how the Newton `parse_usd` function does.

* Add conversion operation from `newton.Model` to `ModelKamino`

* Add data, state and control container conversions

* Add SolverKamino wrapper that fullfils newton integration interface

* Add newton integration examples

* Add SolverKamino to newton solver module imports

* WIP: fix problem with lambda_j being allocated for only kinematic constraints and failing on array copying

* Fix banned git import in benchmark

* Rename *Settings to *Config (#213)

* Rename SolverKaminoSettings -> SolverKaminoConfig

* Rename DualProblemSettings -> DualProblemConfig

* Rename CollisionDetectorSettings -> CollisionDetectorConfig

* Rename PADMMSettings -> PADMMConfig

* Rename ForwardKinematicsSolverSettings -> ForwardKinematicsSolverConfig

* Rename SimulatorSettings -> SimulatorConfig

* Add check for model compatibility in SolverKamino (#209)

* Fix device assignment in sparse CG test on CPU (#216)

* Replace Enum-type config attributes with Literal (#215)

* Replace warmstart mode config param with literal

* Replace contact warmstart mode config param with literal

* Replace rotation correction config param with literal

* Replace penalty update config param with literal

* Replace FK preconditioner option config param with literal

* Add post-init checks for dual/PADMM configs

* Rename FKPreconditionerOptions to FKPreconditionerType

* Remove WorldDescriptor from ModelKamino (#219)

* Add geom index offset array to model info

* Replace access to world description in model

* Remove world descriptor from model

* Fix computation of kinematics residual with sparse Jacobian (#220)

* Migrates `ModelKaminoSize` to it's own module to avoid circular dependency between core/model.py and core/state.py and rename it as `SizeKamino`.

* WIP: Fix SolverKamino wrapper

* Fix circular dependency in conversions.py

* Fix some broken unit tests and WIP to fix fourbar contact conversions and rendering

* Make some conversions @staticmethods instead, because they dont need common class attributes

* Fix declaration of custom state attributes and their conversion to/from newton and kamino

* WIP: Debug model conversion and newton sim examples

* Rename and cleanup start index array of per-world geoms

* Model conversion and newton sim examples now work.

* Make gravity conversion operation re-usable

* Migrates boxes_fourbar builder using newton.ModelBuilder to it's own module to prepare for migration.

* Use gravity conversion utility func in SolverKamino

* Add reusable joint-parameterization conversion utility

* Remove world-descriptor from model converter

* Rename helper converter that handles entity-local transforms

* Add some cleanup to DR Legs, ANYmal D and basic four-bar examples

* Fix module-level imports of additional kamino-specific development dependencies

* Fix module-level imports of additional kamino-specific development dependencies

* Fix erroneous merge conflict.

---------

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Signed-off-by: JC <jumyungc@nvidia.com>
Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: Daniela Hase <116915287+daniela-hase@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>
Co-authored-by: Eric Shi <97630937+shi-eric@users.noreply.github.com>
Co-authored-by: Anka Chen <AnkaChan@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: JC-nvidia <116605903+jumyungc@users.noreply.github.com>
Co-authored-by: Kenny Vilella <kvilella@nvidia.com>
Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>
Co-authored-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Lennart Röstel <65088822+lenroe@users.noreply.github.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: camevor <camevor@nvidia.com>
Co-authored-by: mzamoramora-nvidia <mzamoramora@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alessandro Roncone <alecive87@gmail.com>
Co-authored-by: gdaviet <57617656+gdaviet@users.noreply.github.com>
Co-authored-by: Miles Macklin <mmacklin@nvidia.com>
Co-authored-by: Gordon Yeoman <gyeomannvidia@users.noreply.github.com>
Co-authored-by: Lukasz Wawrzyniak <lwawrzyniak@nvidia.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Lorenzo Terenzi <lorenzoterenzi96@gmail.com>
Co-authored-by: smollerNV <164020096+smollerNV@users.noreply.github.com>
Co-authored-by: twidmer <twidmer@nvidia.com>
Co-authored-by: Christian Schumacher <christian.schumacher@disney.com>
Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>
vastsoun added a commit to vastsoun/newton that referenced this pull request Mar 4, 2026
* [Warp Raytrace] Added device parameter (newton-physics#1544)

* [Warp Raytrace] Added device parameter to previously overlooked call (newton-physics#1545)

* SolverMuJoCo: Fix tolerance clamping in update_solver_options_kernel (newton-physics#1546)

* Change default shape_ke to align with MuJoCo, parse geom solref from MJCF for contact stiffness/damping (newton-physics#1491)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>

* Fix log_shapes broadcasting for length-1 warp arrays (newton-physics#1550)

* Fix XPBD restitution particle index (newton-physics#1557)

* Out-of-Bound memory read in example_diffsim_bear newton-physics#1386 (newton-physics#1533)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add versioned documentation deployment to GitHub Pages (newton-physics#1560)

* Fix broken documentation links after versioned docs deployment (newton-physics#1566)

* VBD New Features (newton-physics#1479)

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* Add banners to membership verification workflow steps (newton-physics#1569)

* Support cable junctions (newton-physics#1519)

Signed-off-by: JC <jumyungc@nvidia.com>

* Rename parameter I to inertia newton-physics#1543 (newton-physics#1551)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix example_robot_anymal_c_walk.py (newton-physics#1574)

* Change everywhere linesearch to iterative (newton-physics#1573)

* Remove standard collision pipeline (newton-physics#1538)

* USD Plumbing MJC solver attributes through resolver and custom attribute framework (newton-physics#1463)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix child shape filtering (newton-physics#1559)

* Fix ViewerRerun ignoring hidden parameter in log_mesh and log_instances (newton-physics#1555)

* Make NxN and SAP broad phase respect filtered pairs (newton-physics#1554)

* Add --quiet flag to examples to suppress Warp messages (newton-physics#1585)

* Defer resolution of MESH_MAXHULLVERT default in importers (newton-physics#1587)

* Fix TypeError when finalizing SDF geometry with device kwarg (newton-physics#1586)

* Make MESH_MAXHULLVERT a static class attribute Mesh.MAX_HULL_VERTICES. (newton-physics#1598)

* Significant non-determinism in unified collision pipeline for anymal_c_walking example newton-physics#1505 (newton-physics#1588)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add test for non-contiguous case (newton-physics#1549)

* Fix nightly Warp CI to resolve pre-release builds (newton-physics#1606)

* Verify default class and value handling (newton-physics#1556)

* SolverMuJoCo: Expand geom_margin to avoid OOB read with heterogeneous worlds (newton-physics#1607)

* Fix bug in control clear method (newton-physics#1602)

* Enable Use of Newton IK in Lab newton-physics#662 (newton-physics#1539)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix import  of non-articulated joints (newton-physics#1535)

* Deduplicate _process_joint_custom_attributes frequency handling (newton-physics#1584)

* Add CI check for stale API docs and fix local build warnings (newton-physics#1570)

* Update Pillow 12.0.0 to 12.1.1 (newton-physics#1612)

* Prepare handling of mimic constraints in Newton (newton-physics#1523)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support floating,  base_joint and parent_body arguments for importers (newton-physics#1498)

* Fix contact buffer memory overestimation (newton-physics#1614)

* Configure banned-module-level-imports for ruff (newton-physics#1583)

* Explicit `Contacts` instantiation with `Model.contacts()` and `CollisionPipeline.contacts()` (newton-physics#1445)

* Fix the quadruped benchmark regression (newton-physics#1615)

* Change default ignore_inertial_definitions from True to False (newton-physics#1537)

* Finalize the Recording API (newton-physics#1600)

* SolverMuJoCo: Fix ccd_iterations default (newton-physics#1631)

* update gitignore to ignore Claude Code sandbox files (newton-physics#1628)

* Add mimic joint support to SolverMuJoCo (newton-physics#1627)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add --no-cache-clear flag to test runner (newton-physics#1629)

* Update MuJoCo and MuJoCo Warp to 3.5.0 release (newton-physics#1633)

* Improve inertia parsing from USD (newton-physics#1605)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Remove standalone .typos.toml in favor of pyproject.toml config (newton-physics#1642)

* Heightfield support newton-physics#1189 (newton-physics#1547)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Example_robot_policy: Replace ValueError with clean error for missing PhysX policy (newton-physics#1636)

Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Avoid unnecessary inflation of the contact reduction voxel aabb (newton-physics#1650)

* Rename num_worlds to world_count (newton-physics#1634)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support parsing autolimits from MJCF (newton-physics#1651)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix particle-shape restitution ignoring body velocity (newton-physics#1273) (newton-physics#1580)

* Add overflow warnings for narrow-phase collision buffers (newton-physics#1643)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Documentation: add units to model/state docstrings (newton-physics#1649)

* fix(viewer): add missing JointType.BALL support to contact line kernel (newton-physics#1640)

* Make terrain mesh visual-only in anymal C walking example (newton-physics#1660)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Fix initialization of collider state in MPM finite difference mode (newton-physics#1652)

* docs: document ModelBuilder.default_shape_cfg (newton-physics#1662)

* Finalize the collision API (newton-physics#1581)

* Remove hardcoded subnet ID from AWS workflow (newton-physics#1664)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Attempt to fix AWS config (newton-physics#1666)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Update AWS workflows to g7e.2xlarge with multi-AZ failover (newton-physics#1669)

* fix(viewer-usd): disambiguate log_points colors for N=3 warp arrays (newton-physics#1661)

* Viewer gl optimizations (newton-physics#1656)

Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* docs: add articulation workflow guidance and regression check (newton-physics#1663)

* fix(examples): propagate IK solution to model state in Franka example (newton-physics#1637)

* fix(deps,docs): bump nbconvert to 7.17.0 and fix ArticulationView doctest (newton-physics#1670)

* Cleanup and improve some example (newton-physics#1625)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Handle zero-mass bodies and flip ensure_nonstatic_links default (newton-physics#1635)

* Additional testing for ArticulationView (newton-physics#1527)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Update warp-lang nightly to 1.12.0.dev20260217 (newton-physics#1677)

* Change default friction coefficients to match MuJoCo (newton-physics#1681)

* Refactor mesh creation functions (newton-physics#1654)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Parse joint frictionloss from MJCF (newton-physics#1680)

* Fix free joint body_pos and add ref/qpos0 support for MuJoCo solver (newton-physics#1645)

* Fix root shapes in ArticulationView with fixed base (newton-physics#1639)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Use model collision methods and remove `create_collision_pipeline` from examples (newton-physics#1648)

Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>

* Fix XPBD apply_joint_forces ignoring child joint transform (newton-physics#1582)

* Adjust SDF API (newton-physics#1644)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Optimize test suite runtime (~18% faster) (newton-physics#1689)

* Remove ensure_nonstatic_links option from importers (newton-physics#1682)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>

* SolverMuJoCo: Add geom_margin support, align thickness default with MuJoCo and schemas (newton-physics#1653)

* refactor: privatize non-public solver internals (newton-physics#1683)

* Fix option parsing with multiple <option> elements from includes (newton-physics#1692)

* Bump warp-lang nightly and newton-usd-schemas (newton-physics#1693)

* Get rid of tkinter dependency (newton-physics#1676)

* Fix SDF example contact buffer overflow (newton-physics#1695)

* Fix implicit biastype for position/velocity actuator shortcuts (newton-physics#1678)

* Fix include processor to respect meshdir/texturedir (newton-physics#1685)

* Reduce cold-cache Warp compile time for geometry modules (newton-physics#1618)

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix xyzw-to-wxyz quaternion conversion in body inertia kernel (newton-physics#1694)

* Rename key to label and add hierarchical labels (newton-physics#1592) (newton-physics#1632)

* Expose geometry SDF helpers on public API (newton-physics#1684)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Improve custom frequency handling from USD, parse MuJoCo actuators and tendons (newton-physics#1510)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Collapse fixed joints with non articulated bodies (newton-physics#1608)

* Fix renaming joint_key -> joint_label (newton-physics#1700)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Bump .python-version from 3.11 to 3.12 (newton-physics#1702)

* Replace CITATION.md with CITATION.cff (newton-physics#1706)

* Respect MJCF contype=conaffinity=0 via collision_group=0 (newton-physics#1703)

* Make ViewerUSD reuse existing USD layers for the same output path (newton-physics#1704)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove dead up-axis conversion from MuJoCo solver (newton-physics#1707)

* Skip IK cube stacking example test (newton-physics#1713)

* Fix global pairs (world=-1) not exported to MuJoCo spec (newton-physics#1705)

* Reduce the memory consumption of hydroelastic contacts (newton-physics#1609)

* Fix flakiness cube stacking (newton-physics#1714)

* Fix collision shapes not toggleable in viewer UI (newton-physics#1715)

* Fix softbody examples table layout in README (newton-physics#1716)

* Standardize sensor APIs: label matching, keyword args, and update() method naming (newton-physics#1665)

* Fix intermittent crash in parallel test runner from Manager proxy race (newton-physics#1721)

* Clean up inertia.py function arguments to match Mesh.create_* API (newton-physics#1719)

* Reduce default test runner verbosity (newton-physics#1723)

* Add menagerie comparison tests for SolverMuJoCo (newton-physics#1720)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Add spatial tendon support for MuJoCo solver (newton-physics#1687)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Expose qfrc_actuator from mujoco (newton-physics#1698)

* Skip non-MODEL custom attributes in finalize validation (newton-physics#1734)

* Resolve inheritrange for position actuators in MJCF parser (newton-physics#1727)

* Support dampratio for position/velocity actuator shortcuts (newton-physics#1722)

* Limit concurrency to 1 (newton-physics#1736)

* Add a helper method for checking applied usd (newton-physics#1731)

* Enhance playback URL handling in ViewerViser (newton-physics#1742)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Removed RenderShapeType (newton-physics#1748)

* Override only MassAPI attributes that have been authored (newton-physics#1688)

* Integration of newton-actuators  (newton-physics#1342)

Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>

* Fix ArticulationView crash with fixed-joint-only articulations (newton-physics#1726)

* Improve retrieval of Jupyter base URL in ViewerViser (newton-physics#1750)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Disable dynamics testing for UR5e and Apollo tests to avoid CI flakiness (newton-physics#1755)

* Margin and Gap rename (newton-physics#1732)

* Vbd Demos Fixing (newton-physics#1740)

* Fix ViewerViser.log_lines method (newton-physics#1764)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Update warp-lang dependency to 1.12.0rc1 (newton-physics#1763)

* Fix fromto capsule/cylinder orientation in MJCF parser (newton-physics#1741)

* fix: multi-world particle BVH indexing (newton-physics#1641)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Clean up unused and internal-only kwargs in SolverMuJoCo (newton-physics#1766)

* Parsing of the mimic joint and contact gap/margin from newton schemas (newton-physics#1690)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>

* API Refactor v2 (newton-physics#1749)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Support explicit geom mass attributes in MJCF (newton-physics#1744)

* Bump flask and werkzeug in lockfile for security (newton-physics#1769)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Split MJCF worldbody root bodies into separate articulations (newton-physics#1754)

* Expose VBD rigid contact forces for solver coupling (newton-physics#1745)

Signed-off-by: JC <jumyungc@nvidia.com>

* Add MJCF ellipsoid geom import and regression test (newton-physics#1772)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Weld equality constraints parsed from mjcf are given Nan as the default value of torquescale. The correct default should be 1.0 (newton-physics#1760)

* Improve picking accuracy and stability (newton-physics#1712)

* Franka cloth demo improvement (newton-physics#1765)

* Support computing sensing object transforms & API cleanup (newton-physics#1759)

* Remove threading workaround (newton-physics#1751)

* [Warp Raytrace] Consolidated ray intersect functions, renamed Options to Config (newton-physics#1767)

* Improve README example gallery for PyPI compatibility (newton-physics#1776)

* Fix issue with mesh in rerun viewer (newton-physics#1768)

* Add PhysxMimicJointAPI parsing to USD importer (newton-physics#1735)

* Move some math functions to Warp (newton-physics#1717)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Add test to ensure MJCF xform argument is relative (newton-physics#1777)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Emit diaginertia instead of fullinertia for diagonal body inertia (newton-physics#1780)

* Change default joint armature from 0.01 to 0 (newton-physics#1782)

* Fix default kp/kv for position and velocity actuators (newton-physics#1786)

* Lock body inertia after explicit MJCF <inertial> element (newton-physics#1784)

* Fix for MJCF actuator custom attributes (newton-physics#1783)

* Bump version to 0.2.3

Prepare the package metadata for the v0.2.3 release tag.

* Fix ViewerRerun rendering of instances from hidden meshes (newton-physics#1788)

* API cleanup (newton-physics#1789)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* BODY actuator target name bypasses body name de-duplication in SolverMuJoCo (newton-physics#1729)

* Use default density for visual geoms in MJCF import (newton-physics#1781)

* Fix GL viewer crash on Wayland (newton-physics#1793)

* Make USD xform parameter control absolute articulation placement (newton-physics#1771)

* Fix CUDA context corruption in SDF implementation (newton-physics#1792)

* Bump mujoco-warp dependency to 3.5.0.2 (newton-physics#1779)

* Fix MuJoCo margin/gap conversion (newton-physics#1785)

* Bump version to 1.1.0.dev0 (newton-physics#1798)

* Missing unittest.main added back to test_import_mjcf.py.  Helps with F5 debugging in VS Code. (newton-physics#1796)

* Improve H1 example (newton-physics#1801)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Fix ViewerViser.set_camera() (newton-physics#1805)

* Rename examples to follow prefix-first naming convention (newton-physics#1802)

* Improve MuJoCo actuator domain randomization (newton-physics#1773)

* Restore in_cup test in hydro example (newton-physics#1775)

* Fix `newton.geometry` imports and change of Mesh maxhullverts global constant

* Adapt to having both margin and gap arrays for each geom/shape

* Fix for newton.geometry API changes in primitive/narrowphase.py

* Fix removal of `BroadPhaseMode` IntEnum and revert to newton-sytle string literals

* WIP: Adapt geometry/unified.py to fix breaking changes to `newton.geometry` API

* First pass of API adjustments

* Patch more gaps (with respect to margin and gap renaming)

* GeoType.SDF was removed - reflect that in Kamino

* Introduce CoM position offsets w.r.t body frame and operations to convert between body CoM state and generic local body-fixed reference frames.

* Add caching of per-entity labels/names/keys in the Model subcontainers

* Remove SDF shape wrapper since it's now internal to mesh handling in CD pipelines

* Fix USD test assets

* Add Newton <--> Kamino joint type conversion operations and per-space default limit constants

* Add some cleanup to geometry and unified CD + UTs

* Add Newton <--> Kamino shape type conversion operations

* Apply new default joint coord limit constants to limits.py

* Adapt foubrar model builder and USD asset to produce the same result in sim example

* Purge "physical" goems and collapse all into a single group, and purge geometry "layers"

* Disable allocation per-joint wrenches by default and make them optional

* Make `Model` a dataclass

* Separate ModelData* containers into own `core/data.py` module

* Fix imports of ModelData

* Rename `Model` as `ModelKamino`

* Rename `ModelData` as `DataKamino`

* Rename `State` as `StateKamino`

* Rename `Control` as `ControlKamino`

* Rename `Limits` as `LimitsKamino`

* Rename `Contacts` as `ContactsKamino`

* Rename `ModelBuilder` as `ModelBuilderKamino`

* Make imports in test utilities relative

* Revise CD meta-data attributes and their computation in GeometryModel and ModelBuilderKamino

* Revise primitive CD pipeline

* Revise unified CD pipeline

* Revise CD front-end interfaces

* Fix UTs and relevant utils for interface changes to CD

* Change to `wp.DeviceLike` to account for upcoming deprecation of `Devicelike`

* Depracate legacy HDF5 data io (will be replaced in the future)

* Fix banned imports at module level

* Modify USD importer to detect articulations and order geoms and joints similarly to how the Newton `parse_usd` function does.

* Add conversion operation from `newton.Model` to `ModelKamino`

* Add data, state and control container conversions

* Add SolverKamino wrapper that fullfils newton integration interface

* Add newton integration examples

* Add SolverKamino to newton solver module imports

* WIP: fix problem with lambda_j being allocated for only kinematic constraints and failing on array copying

* Fix banned git import in benchmark

* Rename *Settings to *Config (#213)

* Rename SolverKaminoSettings -> SolverKaminoConfig

* Rename DualProblemSettings -> DualProblemConfig

* Rename CollisionDetectorSettings -> CollisionDetectorConfig

* Rename PADMMSettings -> PADMMConfig

* Rename ForwardKinematicsSolverSettings -> ForwardKinematicsSolverConfig

* Rename SimulatorSettings -> SimulatorConfig

* Add check for model compatibility in SolverKamino (#209)

* Fix device assignment in sparse CG test on CPU (#216)

* Replace Enum-type config attributes with Literal (#215)

* Replace warmstart mode config param with literal

* Replace contact warmstart mode config param with literal

* Replace rotation correction config param with literal

* Replace penalty update config param with literal

* Replace FK preconditioner option config param with literal

* Add post-init checks for dual/PADMM configs

* Rename FKPreconditionerOptions to FKPreconditionerType

* Remove WorldDescriptor from ModelKamino (#219)

* Add geom index offset array to model info

* Replace access to world description in model

* Remove world descriptor from model

* Fix computation of kinematics residual with sparse Jacobian (#220)

* Migrates `ModelKaminoSize` to it's own module to avoid circular dependency between core/model.py and core/state.py and rename it as `SizeKamino`.

* WIP: Fix SolverKamino wrapper

* Fix circular dependency in conversions.py

* Fix some broken unit tests and WIP to fix fourbar contact conversions and rendering

* Make some conversions @staticmethods instead, because they dont need common class attributes

* Fix declaration of custom state attributes and their conversion to/from newton and kamino

* WIP: Debug model conversion and newton sim examples

* Rename and cleanup start index array of per-world geoms

* Model conversion and newton sim examples now work.

* Make gravity conversion operation re-usable

* Migrates boxes_fourbar builder using newton.ModelBuilder to it's own module to prepare for migration.

* Use gravity conversion utility func in SolverKamino

* Add reusable joint-parameterization conversion utility

* Remove world-descriptor from model converter

* Rename helper converter that handles entity-local transforms

* Add some cleanup to DR Legs, ANYmal D and basic four-bar examples

* Fix module-level imports of additional kamino-specific development dependencies

* Fix module-level imports of additional kamino-specific development dependencies

* Fix erroneous merge conflict.

---------

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Signed-off-by: JC <jumyungc@nvidia.com>
Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: Daniela Hase <116915287+daniela-hase@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>
Co-authored-by: Eric Shi <97630937+shi-eric@users.noreply.github.com>
Co-authored-by: Anka Chen <AnkaChan@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: JC-nvidia <116605903+jumyungc@users.noreply.github.com>
Co-authored-by: Kenny Vilella <kvilella@nvidia.com>
Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>
Co-authored-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Lennart Röstel <65088822+lenroe@users.noreply.github.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: camevor <camevor@nvidia.com>
Co-authored-by: mzamoramora-nvidia <mzamoramora@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alessandro Roncone <alecive87@gmail.com>
Co-authored-by: gdaviet <57617656+gdaviet@users.noreply.github.com>
Co-authored-by: Miles Macklin <mmacklin@nvidia.com>
Co-authored-by: Gordon Yeoman <gyeomannvidia@users.noreply.github.com>
Co-authored-by: Lukasz Wawrzyniak <lwawrzyniak@nvidia.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Lorenzo Terenzi <lorenzoterenzi96@gmail.com>
Co-authored-by: smollerNV <164020096+smollerNV@users.noreply.github.com>
Co-authored-by: twidmer <twidmer@nvidia.com>
Co-authored-by: Christian Schumacher <christian.schumacher@disney.com>
Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>
vastsoun added a commit to vastsoun/newton that referenced this pull request Mar 4, 2026
* [Warp Raytrace] Added device parameter (newton-physics#1544)

* [Warp Raytrace] Added device parameter to previously overlooked call (newton-physics#1545)

* SolverMuJoCo: Fix tolerance clamping in update_solver_options_kernel (newton-physics#1546)

* Change default shape_ke to align with MuJoCo, parse geom solref from MJCF for contact stiffness/damping (newton-physics#1491)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>

* Fix log_shapes broadcasting for length-1 warp arrays (newton-physics#1550)

* Fix XPBD restitution particle index (newton-physics#1557)

* Out-of-Bound memory read in example_diffsim_bear newton-physics#1386 (newton-physics#1533)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add versioned documentation deployment to GitHub Pages (newton-physics#1560)

* Fix broken documentation links after versioned docs deployment (newton-physics#1566)

* VBD New Features (newton-physics#1479)

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* Add banners to membership verification workflow steps (newton-physics#1569)

* Support cable junctions (newton-physics#1519)

Signed-off-by: JC <jumyungc@nvidia.com>

* Rename parameter I to inertia newton-physics#1543 (newton-physics#1551)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix example_robot_anymal_c_walk.py (newton-physics#1574)

* Change everywhere linesearch to iterative (newton-physics#1573)

* Remove standard collision pipeline (newton-physics#1538)

* USD Plumbing MJC solver attributes through resolver and custom attribute framework (newton-physics#1463)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix child shape filtering (newton-physics#1559)

* Fix ViewerRerun ignoring hidden parameter in log_mesh and log_instances (newton-physics#1555)

* Make NxN and SAP broad phase respect filtered pairs (newton-physics#1554)

* Add --quiet flag to examples to suppress Warp messages (newton-physics#1585)

* Defer resolution of MESH_MAXHULLVERT default in importers (newton-physics#1587)

* Fix TypeError when finalizing SDF geometry with device kwarg (newton-physics#1586)

* Make MESH_MAXHULLVERT a static class attribute Mesh.MAX_HULL_VERTICES. (newton-physics#1598)

* Significant non-determinism in unified collision pipeline for anymal_c_walking example newton-physics#1505 (newton-physics#1588)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add test for non-contiguous case (newton-physics#1549)

* Fix nightly Warp CI to resolve pre-release builds (newton-physics#1606)

* Verify default class and value handling (newton-physics#1556)

* SolverMuJoCo: Expand geom_margin to avoid OOB read with heterogeneous worlds (newton-physics#1607)

* Fix bug in control clear method (newton-physics#1602)

* Enable Use of Newton IK in Lab newton-physics#662 (newton-physics#1539)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix import  of non-articulated joints (newton-physics#1535)

* Deduplicate _process_joint_custom_attributes frequency handling (newton-physics#1584)

* Add CI check for stale API docs and fix local build warnings (newton-physics#1570)

* Update Pillow 12.0.0 to 12.1.1 (newton-physics#1612)

* Prepare handling of mimic constraints in Newton (newton-physics#1523)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support floating,  base_joint and parent_body arguments for importers (newton-physics#1498)

* Fix contact buffer memory overestimation (newton-physics#1614)

* Configure banned-module-level-imports for ruff (newton-physics#1583)

* Explicit `Contacts` instantiation with `Model.contacts()` and `CollisionPipeline.contacts()` (newton-physics#1445)

* Fix the quadruped benchmark regression (newton-physics#1615)

* Change default ignore_inertial_definitions from True to False (newton-physics#1537)

* Finalize the Recording API (newton-physics#1600)

* SolverMuJoCo: Fix ccd_iterations default (newton-physics#1631)

* update gitignore to ignore Claude Code sandbox files (newton-physics#1628)

* Add mimic joint support to SolverMuJoCo (newton-physics#1627)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Add --no-cache-clear flag to test runner (newton-physics#1629)

* Update MuJoCo and MuJoCo Warp to 3.5.0 release (newton-physics#1633)

* Improve inertia parsing from USD (newton-physics#1605)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* Remove standalone .typos.toml in favor of pyproject.toml config (newton-physics#1642)

* Heightfield support newton-physics#1189 (newton-physics#1547)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Example_robot_policy: Replace ValueError with clean error for missing PhysX policy (newton-physics#1636)

Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Avoid unnecessary inflation of the contact reduction voxel aabb (newton-physics#1650)

* Rename num_worlds to world_count (newton-physics#1634)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Support parsing autolimits from MJCF (newton-physics#1651)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Fix particle-shape restitution ignoring body velocity (newton-physics#1273) (newton-physics#1580)

* Add overflow warnings for narrow-phase collision buffers (newton-physics#1643)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Documentation: add units to model/state docstrings (newton-physics#1649)

* fix(viewer): add missing JointType.BALL support to contact line kernel (newton-physics#1640)

* Make terrain mesh visual-only in anymal C walking example (newton-physics#1660)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Fix initialization of collider state in MPM finite difference mode (newton-physics#1652)

* docs: document ModelBuilder.default_shape_cfg (newton-physics#1662)

* Finalize the collision API (newton-physics#1581)

* Remove hardcoded subnet ID from AWS workflow (newton-physics#1664)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Attempt to fix AWS config (newton-physics#1666)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Update AWS workflows to g7e.2xlarge with multi-AZ failover (newton-physics#1669)

* fix(viewer-usd): disambiguate log_points colors for N=3 warp arrays (newton-physics#1661)

* Viewer gl optimizations (newton-physics#1656)

Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* docs: add articulation workflow guidance and regression check (newton-physics#1663)

* fix(examples): propagate IK solution to model state in Franka example (newton-physics#1637)

* fix(deps,docs): bump nbconvert to 7.17.0 and fix ArticulationView doctest (newton-physics#1670)

* Cleanup and improve some example (newton-physics#1625)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Handle zero-mass bodies and flip ensure_nonstatic_links default (newton-physics#1635)

* Additional testing for ArticulationView (newton-physics#1527)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Update warp-lang nightly to 1.12.0.dev20260217 (newton-physics#1677)

* Change default friction coefficients to match MuJoCo (newton-physics#1681)

* Refactor mesh creation functions (newton-physics#1654)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Parse joint frictionloss from MJCF (newton-physics#1680)

* Fix free joint body_pos and add ref/qpos0 support for MuJoCo solver (newton-physics#1645)

* Fix root shapes in ArticulationView with fixed base (newton-physics#1639)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Use model collision methods and remove `create_collision_pipeline` from examples (newton-physics#1648)

Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>

* Fix XPBD apply_joint_forces ignoring child joint transform (newton-physics#1582)

* Adjust SDF API (newton-physics#1644)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Optimize test suite runtime (~18% faster) (newton-physics#1689)

* Remove ensure_nonstatic_links option from importers (newton-physics#1682)

Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>

* SolverMuJoCo: Add geom_margin support, align thickness default with MuJoCo and schemas (newton-physics#1653)

* refactor: privatize non-public solver internals (newton-physics#1683)

* Fix option parsing with multiple <option> elements from includes (newton-physics#1692)

* Bump warp-lang nightly and newton-usd-schemas (newton-physics#1693)

* Get rid of tkinter dependency (newton-physics#1676)

* Fix SDF example contact buffer overflow (newton-physics#1695)

* Fix implicit biastype for position/velocity actuator shortcuts (newton-physics#1678)

* Fix include processor to respect meshdir/texturedir (newton-physics#1685)

* Reduce cold-cache Warp compile time for geometry modules (newton-physics#1618)

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>

* Fix xyzw-to-wxyz quaternion conversion in body inertia kernel (newton-physics#1694)

* Rename key to label and add hierarchical labels (newton-physics#1592) (newton-physics#1632)

* Expose geometry SDF helpers on public API (newton-physics#1684)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Improve custom frequency handling from USD, parse MuJoCo actuators and tendons (newton-physics#1510)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Collapse fixed joints with non articulated bodies (newton-physics#1608)

* Fix renaming joint_key -> joint_label (newton-physics#1700)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>

* Bump .python-version from 3.11 to 3.12 (newton-physics#1702)

* Replace CITATION.md with CITATION.cff (newton-physics#1706)

* Respect MJCF contype=conaffinity=0 via collision_group=0 (newton-physics#1703)

* Make ViewerUSD reuse existing USD layers for the same output path (newton-physics#1704)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove dead up-axis conversion from MuJoCo solver (newton-physics#1707)

* Skip IK cube stacking example test (newton-physics#1713)

* Fix global pairs (world=-1) not exported to MuJoCo spec (newton-physics#1705)

* Reduce the memory consumption of hydroelastic contacts (newton-physics#1609)

* Fix flakiness cube stacking (newton-physics#1714)

* Fix collision shapes not toggleable in viewer UI (newton-physics#1715)

* Fix softbody examples table layout in README (newton-physics#1716)

* Standardize sensor APIs: label matching, keyword args, and update() method naming (newton-physics#1665)

* Fix intermittent crash in parallel test runner from Manager proxy race (newton-physics#1721)

* Clean up inertia.py function arguments to match Mesh.create_* API (newton-physics#1719)

* Reduce default test runner verbosity (newton-physics#1723)

* Add menagerie comparison tests for SolverMuJoCo (newton-physics#1720)

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>

* Add spatial tendon support for MuJoCo solver (newton-physics#1687)

Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>

* Expose qfrc_actuator from mujoco (newton-physics#1698)

* Skip non-MODEL custom attributes in finalize validation (newton-physics#1734)

* Resolve inheritrange for position actuators in MJCF parser (newton-physics#1727)

* Support dampratio for position/velocity actuator shortcuts (newton-physics#1722)

* Limit concurrency to 1 (newton-physics#1736)

* Add a helper method for checking applied usd (newton-physics#1731)

* Enhance playback URL handling in ViewerViser (newton-physics#1742)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Removed RenderShapeType (newton-physics#1748)

* Override only MassAPI attributes that have been authored (newton-physics#1688)

* Integration of newton-actuators  (newton-physics#1342)

Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>

* Fix ArticulationView crash with fixed-joint-only articulations (newton-physics#1726)

* Improve retrieval of Jupyter base URL in ViewerViser (newton-physics#1750)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Disable dynamics testing for UR5e and Apollo tests to avoid CI flakiness (newton-physics#1755)

* Margin and Gap rename (newton-physics#1732)

* Vbd Demos Fixing (newton-physics#1740)

* Fix ViewerViser.log_lines method (newton-physics#1764)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Update warp-lang dependency to 1.12.0rc1 (newton-physics#1763)

* Fix fromto capsule/cylinder orientation in MJCF parser (newton-physics#1741)

* fix: multi-world particle BVH indexing (newton-physics#1641)

Co-authored-by: Eric Heiden <eheiden@nvidia.com>

* Clean up unused and internal-only kwargs in SolverMuJoCo (newton-physics#1766)

* Parsing of the mimic joint and contact gap/margin from newton schemas (newton-physics#1690)

Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>

* API Refactor v2 (newton-physics#1749)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Support explicit geom mass attributes in MJCF (newton-physics#1744)

* Bump flask and werkzeug in lockfile for security (newton-physics#1769)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Split MJCF worldbody root bodies into separate articulations (newton-physics#1754)

* Expose VBD rigid contact forces for solver coupling (newton-physics#1745)

Signed-off-by: JC <jumyungc@nvidia.com>

* Add MJCF ellipsoid geom import and regression test (newton-physics#1772)

Co-authored-by: Cursor <cursoragent@cursor.com>

* Weld equality constraints parsed from mjcf are given Nan as the default value of torquescale. The correct default should be 1.0 (newton-physics#1760)

* Improve picking accuracy and stability (newton-physics#1712)

* Franka cloth demo improvement (newton-physics#1765)

* Support computing sensing object transforms & API cleanup (newton-physics#1759)

* Remove threading workaround (newton-physics#1751)

* [Warp Raytrace] Consolidated ray intersect functions, renamed Options to Config (newton-physics#1767)

* Improve README example gallery for PyPI compatibility (newton-physics#1776)

* Fix issue with mesh in rerun viewer (newton-physics#1768)

* Add PhysxMimicJointAPI parsing to USD importer (newton-physics#1735)

* Move some math functions to Warp (newton-physics#1717)

Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Add test to ensure MJCF xform argument is relative (newton-physics#1777)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Emit diaginertia instead of fullinertia for diagonal body inertia (newton-physics#1780)

* Change default joint armature from 0.01 to 0 (newton-physics#1782)

* Fix default kp/kv for position and velocity actuators (newton-physics#1786)

* Lock body inertia after explicit MJCF <inertial> element (newton-physics#1784)

* Fix for MJCF actuator custom attributes (newton-physics#1783)

* Bump version to 0.2.3

Prepare the package metadata for the v0.2.3 release tag.

* Fix ViewerRerun rendering of instances from hidden meshes (newton-physics#1788)

* API cleanup (newton-physics#1789)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* BODY actuator target name bypasses body name de-duplication in SolverMuJoCo (newton-physics#1729)

* Use default density for visual geoms in MJCF import (newton-physics#1781)

* Fix GL viewer crash on Wayland (newton-physics#1793)

* Make USD xform parameter control absolute articulation placement (newton-physics#1771)

* Fix CUDA context corruption in SDF implementation (newton-physics#1792)

* Bump mujoco-warp dependency to 3.5.0.2 (newton-physics#1779)

* Fix MuJoCo margin/gap conversion (newton-physics#1785)

* Bump version to 1.1.0.dev0 (newton-physics#1798)

* Missing unittest.main added back to test_import_mjcf.py.  Helps with F5 debugging in VS Code. (newton-physics#1796)

* Improve H1 example (newton-physics#1801)

Signed-off-by: Eric Heiden <eric-heiden@outlook.com>

* Fix ViewerViser.set_camera() (newton-physics#1805)

* Rename examples to follow prefix-first naming convention (newton-physics#1802)

* Improve MuJoCo actuator domain randomization (newton-physics#1773)

* Restore in_cup test in hydro example (newton-physics#1775)

* Fix `newton.geometry` imports and change of Mesh maxhullverts global constant

* Adapt to having both margin and gap arrays for each geom/shape

* Fix for newton.geometry API changes in primitive/narrowphase.py

* Fix removal of `BroadPhaseMode` IntEnum and revert to newton-sytle string literals

* WIP: Adapt geometry/unified.py to fix breaking changes to `newton.geometry` API

* First pass of API adjustments

* Patch more gaps (with respect to margin and gap renaming)

* GeoType.SDF was removed - reflect that in Kamino

* Introduce CoM position offsets w.r.t body frame and operations to convert between body CoM state and generic local body-fixed reference frames.

* Add caching of per-entity labels/names/keys in the Model subcontainers

* Remove SDF shape wrapper since it's now internal to mesh handling in CD pipelines

* Fix USD test assets

* Add Newton <--> Kamino joint type conversion operations and per-space default limit constants

* Add some cleanup to geometry and unified CD + UTs

* Add Newton <--> Kamino shape type conversion operations

* Apply new default joint coord limit constants to limits.py

* Adapt foubrar model builder and USD asset to produce the same result in sim example

* Purge "physical" goems and collapse all into a single group, and purge geometry "layers"

* Disable allocation per-joint wrenches by default and make them optional

* Make `Model` a dataclass

* Separate ModelData* containers into own `core/data.py` module

* Fix imports of ModelData

* Rename `Model` as `ModelKamino`

* Rename `ModelData` as `DataKamino`

* Rename `State` as `StateKamino`

* Rename `Control` as `ControlKamino`

* Rename `Limits` as `LimitsKamino`

* Rename `Contacts` as `ContactsKamino`

* Rename `ModelBuilder` as `ModelBuilderKamino`

* Make imports in test utilities relative

* Revise CD meta-data attributes and their computation in GeometryModel and ModelBuilderKamino

* Revise primitive CD pipeline

* Revise unified CD pipeline

* Revise CD front-end interfaces

* Fix UTs and relevant utils for interface changes to CD

* Change to `wp.DeviceLike` to account for upcoming deprecation of `Devicelike`

* Depracate legacy HDF5 data io (will be replaced in the future)

* Fix banned imports at module level

* Modify USD importer to detect articulations and order geoms and joints similarly to how the Newton `parse_usd` function does.

* Add conversion operation from `newton.Model` to `ModelKamino`

* Add data, state and control container conversions

* Add SolverKamino wrapper that fullfils newton integration interface

* Add newton integration examples

* Add SolverKamino to newton solver module imports

* WIP: fix problem with lambda_j being allocated for only kinematic constraints and failing on array copying

* Fix banned git import in benchmark

* Rename *Settings to *Config (#213)

* Rename SolverKaminoSettings -> SolverKaminoConfig

* Rename DualProblemSettings -> DualProblemConfig

* Rename CollisionDetectorSettings -> CollisionDetectorConfig

* Rename PADMMSettings -> PADMMConfig

* Rename ForwardKinematicsSolverSettings -> ForwardKinematicsSolverConfig

* Rename SimulatorSettings -> SimulatorConfig

* Add check for model compatibility in SolverKamino (#209)

* Fix device assignment in sparse CG test on CPU (#216)

* Replace Enum-type config attributes with Literal (#215)

* Replace warmstart mode config param with literal

* Replace contact warmstart mode config param with literal

* Replace rotation correction config param with literal

* Replace penalty update config param with literal

* Replace FK preconditioner option config param with literal

* Add post-init checks for dual/PADMM configs

* Rename FKPreconditionerOptions to FKPreconditionerType

* Remove WorldDescriptor from ModelKamino (#219)

* Add geom index offset array to model info

* Replace access to world description in model

* Remove world descriptor from model

* Fix computation of kinematics residual with sparse Jacobian (#220)

* Migrates `ModelKaminoSize` to it's own module to avoid circular dependency between core/model.py and core/state.py and rename it as `SizeKamino`.

* WIP: Fix SolverKamino wrapper

* Fix circular dependency in conversions.py

* Fix some broken unit tests and WIP to fix fourbar contact conversions and rendering

* Make some conversions @staticmethods instead, because they dont need common class attributes

* Fix declaration of custom state attributes and their conversion to/from newton and kamino

* WIP: Debug model conversion and newton sim examples

* Rename and cleanup start index array of per-world geoms

* Model conversion and newton sim examples now work.

* Make gravity conversion operation re-usable

* Migrates boxes_fourbar builder using newton.ModelBuilder to it's own module to prepare for migration.

* Use gravity conversion utility func in SolverKamino

* Add reusable joint-parameterization conversion utility

* Remove world-descriptor from model converter

* Rename helper converter that handles entity-local transforms

* Add some cleanup to DR Legs, ANYmal D and basic four-bar examples

* Fix module-level imports of additional kamino-specific development dependencies

* Fix module-level imports of additional kamino-specific development dependencies

* Fix erroneous merge conflict.

---------

Signed-off-by: Alain Denzler <adenzler@nvidia.com>
Signed-off-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Signed-off-by: JC <jumyungc@nvidia.com>
Signed-off-by: Milad Rakhsha <mrakhsha@nvidia.com>
Signed-off-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Signed-off-by: Eric Heiden <eric-heiden@outlook.com>
Signed-off-by: Eric Heiden <eheiden@nvidia.com>
Signed-off-by: Miles Macklin <mmacklin@nvidia.com>
Signed-off-by: adenzler-nvidia <adenzler@nvidia.com>
Signed-off-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: Daniela Hase <116915287+daniela-hase@users.noreply.github.com>
Co-authored-by: adenzler-nvidia <adenzler@nvidia.com>
Co-authored-by: Viktor Reutskyy <33062116+vreutskyy@users.noreply.github.com>
Co-authored-by: Eric Shi <97630937+shi-eric@users.noreply.github.com>
Co-authored-by: Anka Chen <AnkaChan@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: JC-nvidia <116605903+jumyungc@users.noreply.github.com>
Co-authored-by: Kenny Vilella <kvilella@nvidia.com>
Co-authored-by: nvtw <110816143+nvtw@users.noreply.github.com>
Co-authored-by: Milad-Rakhsha-NV <167464435+Milad-Rakhsha-NV@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Lennart Röstel <65088822+lenroe@users.noreply.github.com>
Co-authored-by: Eric Heiden <eheiden@nvidia.com>
Co-authored-by: jvonmuralt <jvonmuralt@nvidia.com>
Co-authored-by: camevor <camevor@nvidia.com>
Co-authored-by: mzamoramora-nvidia <mzamoramora@nvidia.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alessandro Roncone <alecive87@gmail.com>
Co-authored-by: gdaviet <57617656+gdaviet@users.noreply.github.com>
Co-authored-by: Miles Macklin <mmacklin@nvidia.com>
Co-authored-by: Gordon Yeoman <gyeomannvidia@users.noreply.github.com>
Co-authored-by: Lukasz Wawrzyniak <lwawrzyniak@nvidia.com>
Co-authored-by: Eric Heiden <eric-heiden@outlook.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Viktor Reutskyy <vreutskyy@nvidia.com>
Co-authored-by: Lorenzo Terenzi <lorenzoterenzi96@gmail.com>
Co-authored-by: smollerNV <164020096+smollerNV@users.noreply.github.com>
Co-authored-by: twidmer <twidmer@nvidia.com>
Co-authored-by: Christian Schumacher <christian.schumacher@disney.com>
Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>
vidurv-nvidia pushed a commit to vidurv-nvidia/newton that referenced this pull request Mar 6, 2026
…1875)

# Description

There was a lot of code duplication happening inside the `Articulation`
class. This MR takes a step towards untangling some of the confusion
that gets caused by default and non-default data attributes inside the
class.

The MR includes the following changes:

* Removes operations where we set the data to "torch.zeros" and in the
next function assign them the value from PhysX. This made the code
bulkier and complex for no reason.
* Adds docstring clarifications to make it clear what is what. The
default values are now whatever the user configures from their
configuration of the articulation class.
* Updates the `soft_joint_pos_limits` when the user writes the joint pos
limits to the simulator.
* Renames parameters for a consistent nomenclature:
* ``joint_velocity_limits`` → ``joint_vel_limits`` (to match attribute
``joint_vel`` and ``joint_vel_limits``)
* ``joint_limits`` → ``joint_pos_limits`` (to match attribute
``joint_pos`` and ``soft_joint_pos_limits``)
  * ``default_joint_limits`` → ``default_joint_pos_limits``
* ``write_joint_limits_to_sim`` → ``write_joint_position_limit_to_sim``
  * ``joint_friction`` → ``joint_friction_coeff``
  * ``default_joint_friction`` → ``default_joint_friction_coeff``
* ``write_joint_friction_to_sim`` →
``write_joint_friction_coefficient_to_sim``
  * ``fixed_tendon_limit`` → ``fixed_tendon_pos_limits``
  * ``default_fixed_tendon_limit`` → ``default_fixed_tendon_pos_limits``
  * ``set_fixed_tendon_limit`` → ``set_fixed_tendon_position_limit``

Fixes newton-physics#1583, newton-physics#1904

## Type of change

- Bug fix (non-breaking change which fixes an issue)
- Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- This change requires a documentation update

## Checklist

- [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with
`./isaaclab.sh --format`
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] I have updated the changelog and the corresponding version in the
extension's `config/extension.toml` file
- [x] I have added my name to the `CONTRIBUTORS.md` or my name already
exists there

---------

Signed-off-by: Mayank Mittal <12863862+Mayankm96@users.noreply.github.com>
Co-authored-by: James Tigue <166445701+jtigue-bdai@users.noreply.github.com>
mmacklin pushed a commit to mmacklin/newton that referenced this pull request Apr 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Define banned-module-level-imports in pyproject.toml for ruff

2 participants