Skip to content

Explicit Contacts instantiation with Model.contacts() and CollisionPipeline.contacts()#1445

Merged
camevor merged 19 commits into
newton-physics:mainfrom
camevor:model-contacts-method
Feb 13, 2026
Merged

Explicit Contacts instantiation with Model.contacts() and CollisionPipeline.contacts()#1445
camevor merged 19 commits into
newton-physics:mainfrom
camevor:model-contacts-method

Conversation

@camevor

@camevor camevor commented Jan 23, 2026

Copy link
Copy Markdown
Member

Description

Motivation: Currently, Model.collide(state) combines two concerns: allocating a Contacts buffer and performing collision detection. This creates friction for use cases where predictable memory allocation and ownership is desired.

Changes

This PR introduces model.contacts() for allocating the Contacts object and and modifies model.collide() to only perform collision detection . Contacts is now explicitly owned by the user, matching the State and Control pattern.

  # Before
  contacts = model.collide(state)

  # After
  contacts = model.contacts()        # allocate once
  model.collide(state, contacts)      # detect (reuses buffer)

For advanced use cases and customizing collision detection options, collision pipelines can be used directly:

  # Before
  pipeline = CollisionPipeline.from_model(model, ...)
  contacts = model.collide(state, collision_pipeline=pipeline)

  # After
  pipeline = CollisionPipeline(model, ...)
  contacts = pipeline.contacts()
  pipeline.collide(state, contacts)

The examples helper newton.examples.create_collision_pipeline() now accepts **kwargs forwarded to CollisionPipeline, replacing the dedicated broad_phase_mode parameter.

Newton Migration Guide

Please ensure the migration guide for warp.sim users is up-to-date with the changes made in this PR.

  • The migration guide in docs/migration.rst is up-to date

Before your PR is "Ready for review"

  • Necessary tests have been added and new examples are tested (see newton/tests/test_examples.py)
  • Documentation is up-to-date
  • Code passes formatting and linting checks with pre-commit run -a

Summary by CodeRabbit

  • New Features

    • Added Model.contacts() and CollisionPipeline.contacts() methods to allocate reusable collision contact buffers.
    • Collision pipeline now automatically derives configuration from the model.
  • Breaking Changes

    • Collision handling shifted to two-step workflow: allocate contacts first via contacts(), then populate via collide(state, contacts).
    • Removed CollisionPipeline.from_model(); use the constructor directly instead.

@coderabbitai

coderabbitai Bot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Refactored collision API from single-call model where model.collide(state) returns contacts to a two-step workflow: model.contacts() allocates a Contacts buffer, then model.collide(state, contacts) populates it in-place. Updated CollisionPipeline constructor, removed factory methods, and migrated all examples and tests accordingly.

Changes

Cohort / File(s) Summary
Core Collision Pipeline API
newton/_src/sim/collide.py, newton/_src/sim/model.py
Refactored CollisionPipeline constructor to accept model directly; added public contacts() method; updated collide(state, contacts) signature to accept explicit contacts parameter for in-place population. Removed factory-method pattern in favor of direct constructor usage.
Helper Utilities
newton/_src/sim/builder.py, newton/examples/__init__.py, newton/_src/solvers/vbd/solver_vbd.py
Updated collision handling patterns to initialize contacts via model.contacts() or pipeline.contacts() and call collide(state, contacts) instead of model.collide(state) returning new contacts.
Example Code - Basic
newton/examples/basic/example_basic_*.py
Updated collision initialization from model.collide(state) to model.contacts() for initial setup; replaced per-step model.collide(state) with pipeline.collide(state, contacts) or model.collide(state, contacts) using pre-allocated buffer.
Example Code - Cable
newton/examples/cable/example_cable_*.py
Consistent refactoring: obtain initial contacts via collision_pipeline.contacts() and update per-step with collision_pipeline.collide(state, contacts) instead of model-based collision calls.
Example Code - Cloth
newton/examples/cloth/example_cloth_*.py
Refactored collision pipeline creation from CollisionPipeline.from_model(...) to direct constructor; replaced model.collide with pipeline-based contact retrieval and collision updates.
Example Code - Other
newton/examples/contacts/example_sdf.py, newton/examples/diffsim/example_diffsim_*.py, newton/examples/ik/example_ik_cube_stacking.py, newton/examples/mpm/example_mpm_twoway_coupling.py, newton/examples/robot/example_robot_*.py, newton/examples/selection/example_selection_*.py, newton/examples/sensors/example_sensor_imu.py, newton/examples/softbody/example_softbody_hanging.py, newton/examples/multiphysics/example_*.py
Updated collision workflows across diverse examples to use new two-step API: initialize contacts via accessor method and pass to collide for in-place updates.
Tests - Collision & Pipeline
newton/tests/test_collision_cloth.py, newton/tests/test_collision_pipeline.py, newton/tests/test_cloth.py
Refactored tests to initialize CollisionPipeline via direct constructor; replaced contact allocation/updates to use pipeline.contacts() and pipeline.collide(state, contacts).
Tests - Core Functionality
newton/tests/test_cable.py, newton/tests/test_hydroelastic.py, newton/tests/test_rigid_contact.py, newton/tests/test_sdf_compute.py, newton/tests/test_solver_xpbd.py, newton/tests/test_mujoco_solver.py, newton/tests/test_* (other collision-related tests)
Updated test collision flows to obtain persistent contacts buffer via model.contacts() or pipeline.contacts() and reuse across substeps/iterations with collide(state, contacts) pattern.
Documentation
docs/concepts/collisions.rst, docs/tutorials/00_introduction.ipynb, docs/migration.rst
Updated API examples and narrative to reflect new two-step workflow; removed references to CollisionPipeline.from_model(); added migration guide section documenting old vs. new collision API patterns.
Minor Updates
newton/_src/sim/contacts.py
Updated documentation reference to point to Model.contacts() or CollisionPipeline.contacts() instead of Model.collide() for extended contact attribute access.

Sequence Diagram(s)

sequenceDiagram
    actor Client
    participant Model
    participant Pipeline
    participant State
    participant Contacts

    rect rgba(100, 149, 237, 0.5)
    note over Client,Contacts: Old API (Single Call)
    Client->>Model: collide(state, pipeline)
    Model->>Pipeline: collide(state)
    Pipeline->>Contacts: allocate & populate
    Model-->>Client: return Contacts
    end

    rect rgba(144, 238, 144, 0.5)
    note over Client,Contacts: New API (Two-Step Workflow)
    Client->>Model: contacts()
    Model->>Pipeline: contacts()
    Pipeline->>Contacts: allocate
    Pipeline-->>Model: return Contacts
    Model-->>Client: return Contacts

    Client->>State: update
    Client->>Model: collide(state, contacts)
    Model->>Pipeline: collide(state, contacts)
    Pipeline->>Contacts: populate in-place
    Pipeline-->>Model: (void)
    Model-->>Client: (void)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

api, collision, refactor

Suggested reviewers

  • eric-heiden
  • adenzler-nvidia
  • mmacklin
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and specifically describes the main API change: introducing explicit Contacts instantiation through new Model.contacts() and CollisionPipeline.contacts() methods, which is the primary focus of this PR.

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

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

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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 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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
newton/_src/sim/collide_unified.py (1)

653-655: Unconditional None assignment to struct fields will cause AttributeError when per_contact_shape_properties is False.

When per_contact_shape_properties=False (non-hydroelastic pipelines), contacts.rigid_contact_stiffness, contacts.rigid_contact_damping, and contacts.rigid_contact_friction are None (contacts.py:90-92). These are unconditionally assigned to writer_data.out_stiffness, writer_data.out_damping, and writer_data.out_friction (lines 653-655).

The write_contact function at line 166 calls writer_data.out_stiffness.shape[0], which will raise AttributeError since None has no shape attribute. The launch_custom_write at line 658 is unconditional, so this code path always executes.

The struct comment (line 63-64) states these should be "empty arrays if not enabled," but the code assigns None instead. Assign wp.zeros(rigid_contact_max, dtype=wp.float32) when per_contact_shape_properties=False, or conditionally assign only when enabled.

🤖 Fix all issues with AI agents
In `@newton/_src/sim/collide_unified.py`:
- Around line 525-542: The contacts method currently ignores its model parameter
and uses self.device which can lead to device mismatches; update contacts(self,
model: Model) to construct Contacts with device=model.device (i.e., change
device=self.device to device=model.device) so it aligns with
CollisionPipeline.contacts and the provided Model, leaving the signature and
other args (rigid_contact_max, soft_contact_max, requires_grad,
per_contact_shape_properties=self.narrow_phase.sdf_hydroelastic...) unchanged;
alternatively, if self.device must be authoritative, add an explicit validation
that model.device == self.device and raise/handle a clear error—prefer the
model.device change for consistency.

In `@newton/_src/sim/collide.py`:
- Around line 219-221: After clearing contacts, validate that the provided
contacts buffer matches the pipeline's expected shape and device to avoid
out-of-bounds kernel writes: compute the expected shape using the pipeline
parameters (e.g., rigid_contact_max and number of bodies/contacts used by the
kernel) and check contacts.shape, contacts.dtype and device (if GPU) against
those expectations; if mismatched (too small, wrong ndim, wrong dtype or
device), raise a clear ValueError explaining the expected vs actual (include
rigid_contact_max and related params). Add this check immediately after
contacts.clear() in the function that prepares/launches the collision kernels
(the block containing contacts.clear()), so kernels are never launched with
incompatible buffers.

In `@newton/_src/sim/model.py`:
- Line 482: The attribute self._collision_pipeline is annotated with
CollisionPipeline but that name isn't imported at module level (only inside
contacts()), causing F821; add a typing-only import block using "if
TYPE_CHECKING:" near the top of the module and import CollisionPipeline there
(also import TYPE_CHECKING from typing), so the name is available for static
type checkers without importing at runtime; update the imports to include
TYPE_CHECKING and move or add "from ... import CollisionPipeline" inside that
TYPE_CHECKING block and keep contacts()'s runtime import as-is.
🧹 Nitpick comments (2)
newton/_src/sim/model.py (2)

713-731: Consider raising an error or warning when incompatible parameters are passed.

The TODO comments indicate incomplete validation logic. When a collision_pipeline is provided but the caller also passes parameters like rigid_contact_max_per_pair or soft_contact_max, these parameters are silently ignored (except for soft_contact_margin and edge_sdf_iter which are updated).

This could lead to confusing behavior where users expect their parameters to take effect but they don't.

Suggested approach
if collision_pipeline is not None:
    self._collision_pipeline = collision_pipeline
    # Warn or raise if buffer-sizing params were passed
    if rigid_contact_max_per_pair is not None or soft_contact_max is not None:
        import warnings
        warnings.warn(
            "rigid_contact_max_per_pair and soft_contact_max are ignored when "
            "collision_pipeline is provided; the pipeline's existing buffer sizes are used.",
            UserWarning,
            stacklevel=2,
        )
    # update any additional parameters
    self._collision_pipeline.soft_contact_margin = soft_contact_margin
    self._collision_pipeline.edge_sdf_iter = edge_sdf_iter

738-752: Type hint for collision_pipeline parameter should include CollisionPipelineUnified.

The collision_pipeline parameter accepts both CollisionPipeline and CollisionPipelineUnified (as shown in the example), but the type hint only mentions CollisionPipeline. Consider using a union type or a protocol/base class.

Also, the error message at line 750 could be more actionable by mentioning both pipeline types.

Proposed fix

Update the type hint to accept both pipeline types (requires additional TYPE_CHECKING import):

+if TYPE_CHECKING:
+    from .collide import CollisionPipeline
+    from .collide_unified import CollisionPipelineUnified

-    def collide(self, state: State, contacts: Contacts, collision_pipeline: CollisionPipeline | None = None):
+    def collide(self, state: State, contacts: Contacts, collision_pipeline: CollisionPipeline | CollisionPipelineUnified | None = None):

Comment thread newton/_src/sim/collide_unified.py Outdated
Comment thread newton/_src/sim/collide.py Outdated
Comment thread newton/_src/sim/model.py
@nvtw

nvtw commented Jan 23, 2026

Copy link
Copy Markdown
Member

I like the proposal. Allocating at a well defined point upfront sounds more intuitive than lazy initialization in some methods (which might not be obvious).

@adenzler-nvidia

Copy link
Copy Markdown
Member

I'm also pro. This also helps catching OOM issues before users start simulating, which I think is a good thing to have because it allows potentially recovering without crashing the application.

@camevor camevor force-pushed the model-contacts-method branch 2 times, most recently from 24aeb2a to 84e8c99 Compare January 30, 2026 16:02
@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

@camevor camevor force-pushed the model-contacts-method branch from 84e8c99 to b47941c Compare February 2, 2026 08:53

@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: 3

🤖 Fix all issues with AI agents
In `@newton/_src/sim/collide.py`:
- Around line 35-60: The new public enum CollisionPipelineType was added but not
exported via the module's __all__; update the module-level __all__ list (the one
currently declaring exported names) to include "CollisionPipelineType" so it is
re-exported through the public API. Locate the __all__ definition in this file
and append the string "CollisionPipelineType" to that list, ensuring spelling
and casing match the enum name exactly.

In `@newton/_src/sim/model.py`:
- Around line 737-747: The docstring example incorrectly calls
Model.state(contacts=contacts); update the example to use the real API by
removing the contacts keyword argument and calling Model.state() (e.g., state =
model.state()) before passing the contacts into model.collide(state, contacts);
ensure the sequence still shows builder.finalize(),
model.collision_pipeline(...), contacts = model.contacts(), state =
model.state(), and model.collide(state, contacts) so the example matches the
actual Model.state, Model.contacts, and Model.collide signatures.
- Around line 824-835: The code path that creates a default pipeline when
collision_pipeline is None ignores the rigid_contact_max_per_pair argument from
contacts(); update the call to self.collision_pipeline(...) in the elif branch
to pass rigid_contact_max_per_pair through (using the same parameter name) so
the new collision pipeline is configured consistently; locate the creation logic
around collision_pipeline and modify the self.collision_pipeline(...) invocation
to include rigid_contact_max_per_pair along with soft_contact_max,
soft_contact_margin, edge_sdf_iter, and requires_grad.
🧹 Nitpick comments (2)
newton/_src/sim/model.py (2)

749-750: Remove unused noqa directives.

The # noqa: PLC0415 directives are flagged as unused because PLC0415 (import-outside-top-level) is not enabled in the linter configuration.

Proposed fix
-        from .collide import CollisionPipeline, CollisionPipelineType  # noqa: PLC0415
-        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified  # noqa: PLC0415
+        from .collide import CollisionPipeline, CollisionPipelineType
+        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified

769-772: Consider using a custom exception class for unsupported parameter combinations.

The error message for rigid_contact_max_per_pair with the unified pipeline is long. Per TRY003, consider using a custom exception or shortening the message.

Comment thread newton/_src/sim/collide.py Outdated
Comment thread newton/_src/sim/model.py Outdated
Comment thread newton/_src/sim/model.py Outdated

@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: 1

🤖 Fix all issues with AI agents
In `@newton/_src/sim/model.py`:
- Around line 701-710: The type annotations in collision_pipeline (symbols:
CollisionPipelineType, BroadPhaseMode, CollisionPipeline) reference names that
are only imported inside the function body, causing F821; to fix, add a
typing-only import block near the module imports: import TYPE_CHECKING from
typing and inside if TYPE_CHECKING: import CollisionPipeline and
CollisionPipelineType from .collide and BroadPhaseMode from .collide_unified so
those names are available for static type checkers while keeping runtime imports
unchanged; update or remove the in-function imports if duplicated.
🧹 Nitpick comments (1)
newton/_src/sim/model.py (1)

749-750: Unused noqa directives.

The # noqa: PLC0415 comments are flagged as unused because this rule is not enabled. These can be removed for cleaner code.

Proposed fix
-        from .collide import CollisionPipeline, CollisionPipelineType  # noqa: PLC0415
-        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified  # noqa: PLC0415
+        from .collide import CollisionPipeline, CollisionPipelineType
+        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified

Comment thread newton/_src/sim/model.py Outdated
@codecov

codecov Bot commented Feb 2, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.77778% with 1 line in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
newton/_src/sim/model.py 92.30% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@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: 1

🤖 Fix all issues with AI agents
In `@newton/_src/sim/model.py`:
- Around line 718-720: The docstring for the parameter collision_pipeline_type
incorrectly claims the default is CollisionPipelineType.UNIFIED while the
implementation defaults to CollisionPipelineType.STANDARD; update the docstring
text to state the default is CollisionPipelineType.STANDARD (or alternatively
change the default value in the function/class signature where
collision_pipeline_type is defined to CollisionPipelineType.UNIFIED if STANDARD
is wrong) so the documented default and the implementation (the
collision_pipeline_type parameter and its default in model.py) are consistent.
🧹 Nitpick comments (1)
newton/_src/sim/model.py (1)

749-750: Remove unused noqa directives.

The # noqa: PLC0415 comments are flagged as unused since PLC0415 is not enabled in Ruff.

Proposed fix
-        from .collide import CollisionPipeline, CollisionPipelineType  # noqa: PLC0415
-        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified  # noqa: PLC0415
+        from .collide import CollisionPipeline, CollisionPipelineType
+        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified

Comment thread newton/_src/sim/model.py Outdated

@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: 1

🤖 Fix all issues with AI agents
In `@newton/_src/sim/model.py`:
- Around line 825-839: The cached collision pipeline is reused without applying
the supplied soft_contact_margin and edge_sdf_iter when collision_pipeline is
None and self._collision_pipeline already exists; update the cached pipeline's
parameters instead of silently ignoring them by setting
self._collision_pipeline.soft_contact_margin = soft_contact_margin and
self._collision_pipeline.edge_sdf_iter = edge_sdf_iter (and any other pipeline
fields updated by collide()) before calling
self._collision_pipeline.contacts(self), mirroring the behaviour in collide();
alternatively, if you prefer not to change runtime state, add a clear docstring
note on collision_pipeline/contacts that these parameters only apply when
creating a new pipeline.
🧹 Nitpick comments (1)
newton/_src/sim/model.py (1)

749-750: Remove unused noqa directives.

Ruff reports that # noqa: PLC0415 is unused on these lines. The directive can be removed for cleaner code.

Proposed fix
-        from .collide import CollisionPipeline, CollisionPipelineType  # noqa: PLC0415
-        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified  # noqa: PLC0415
+        from .collide import CollisionPipeline, CollisionPipelineType
+        from .collide_unified import BroadPhaseMode, CollisionPipelineUnified

Comment thread newton/_src/sim/model.py Outdated
@camevor camevor force-pushed the model-contacts-method branch from 3ab5773 to e6fbf9b Compare February 5, 2026 23:55

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
newton/_src/solvers/vbd/solver_vbd.py (1)

1375-1377: ⚠️ Potential issue | 🟡 Minor

contacts accessed without None guard when particles are present.

The step() docstring (line 1119) states that passing contacts=None skips rigid contact handling. However, solve_particle_iteration unconditionally accesses contacts.soft_contact_particle and related attributes (lines 1435, 1472) when model.particle_count > 0, which will raise AttributeError if contacts is None. Both the self-contact branch (line 1413+) and no-self-contact branch (line 1459+) launch kernels that pass these contact inputs without checking.

With the new API where Contacts is explicitly user-allocated, users are more likely to encounter this runtime error. Other methods in this file (initialize_rigid_bodies, solve_rigid_body_iteration, finalize_rigid_bodies) already use if contacts is not None: guards. Add a similar guard to both particle contact accumulation branches, or restructure to skip body-particle contact forces when contacts is None.

newton/tests/test_collision_cloth.py (1)

835-835: ⚠️ Potential issue | 🔴 Critical

Bug: test_avbd_particle_ground_penalty_grows still uses the old single-arg model.collide() API.

Line 835 calls contacts = model.collide(state_in) but the new Model.collide() signature (see newton/_src/sim/model.py, lines 852-872) requires two positional arguments (state, contacts) and no longer returns a Contacts object. This will raise a TypeError at runtime.

🐛 Proposed fix
-        contacts = model.collide(state_in)
+        contacts = model.contacts()
+        model.collide(state_in, contacts)
newton/examples/__init__.py (1)

404-447: ⚠️ Potential issue | 🟡 Minor

Stale docstring: function no longer returns None for the standard pipeline.

Lines 406–407 and 416 still say the function "returns None for standard pipeline," but Line 447 now returns newton.CollisionPipeline(model). Callers relying on the docstring (e.g., if pipeline is None) would be misled.

📝 Suggested docstring fix
-    This helper function creates either a CollisionPipelineUnified or returns None for the
-    standard CollisionPipeline (which is created implicitly by model.contacts()).
+    This helper function creates either a CollisionPipelineUnified or a standard
+    CollisionPipeline, depending on the selected pipeline type.
     Returns:
-        CollisionPipelineUnified instance if unified pipeline is selected, None for standard pipeline
+        CollisionPipelineUnified or CollisionPipeline instance, depending on the selected pipeline type.
newton/_src/sim/collide.py (1)

70-83: ⚠️ Potential issue | 🟠 Major

rigid_contact_max is None when rigid_contact_max_per_pair=0 is passed explicitly.

If a caller explicitly passes rigid_contact_max_per_pair=0, the if rigid_contact_max_per_pair is None branch on Line 76 is skipped (since 0 is not None), leaving rigid_contact_max = None. Then on Line 80, the second condition rigid_contact_max_per_pair == 0 is True, so self.rigid_contact_max = None. This will crash at Line 87 (wp.empty(None, ...)).

Per the docstring, 0 means "no limit" — so this path should fall back to model.rigid_contact_max.

Proposed fix
         self.model = model
         self.shape_count = model.shape_count
         self.shape_pairs_filtered = model.shape_contact_pairs
         self.shape_pairs_max = len(self.shape_pairs_filtered)

         rigid_contact_max = None
-        if rigid_contact_max_per_pair is None:
+        if rigid_contact_max_per_pair is None or rigid_contact_max_per_pair == 0:
             rigid_contact_max = model.rigid_contact_max
             rigid_contact_max_per_pair = 0
         self.rigid_contact_max_per_pair = rigid_contact_max_per_pair
         if rigid_contact_max is not None or rigid_contact_max_per_pair == 0:
             self.rigid_contact_max = rigid_contact_max
         else:
             self.rigid_contact_max = self.shape_pairs_max * rigid_contact_max_per_pair
🤖 Fix all issues with AI agents
In `@docs/tutorials/00_introduction.ipynb`:
- Around line 249-252: The comment "Perform initial collision detection" is
misleading because model.contacts() only allocates and returns an empty Contacts
buffer; update the comment to reflect that it is allocating/creating the
Contacts object (e.g., "Allocate contacts buffer" or "Create empty Contacts
buffer") and, if helpful, note that actual collision detection is performed by
model.collide(state_0, contacts) later; adjust the comment near the
model.contacts() call to reference model.contacts() and model.collide(state_0,
contacts).

In `@newton/_src/sim/collide_unified.py`:
- Around line 329-343: The __init__ signature of CollideUnified currently
includes an unused parameter iterate_mesh_vertices; remove iterate_mesh_vertices
from the CollideUnified.__init__ parameter list and any related default mentions
(e.g., in docstrings or type hints) so the constructor only accepts the actually
used parameters (reduce_contacts, rigid_contact_max, soft_contact_max,
soft_contact_margin, requires_grad, broad_phase_mode, shape_pairs_filtered,
sap_sort_type, sdf_hydroelastic_config); then update any call sites or tests
that pass iterate_mesh_vertices to stop supplying it (or remove the argument),
and adjust any documentation/comments referencing iterate_mesh_vertices to avoid
stale API surface.

In `@newton/_src/sim/collide.py`:
- Around line 72-73: In __init__, guard against model.shape_contact_pairs being
None before taking its length: set self.shape_pairs_filtered =
model.shape_contact_pairs or an empty sequence (consistent with collide()'s
guard), then set self.shape_pairs_max = len(self.shape_pairs_filtered); this
ensures __init__ handles unfinalized or manually built models safely — update
the __init__ block referencing self.shape_pairs_filtered, self.shape_pairs_max,
and model.shape_contact_pairs accordingly.

In `@newton/_src/sim/model.py`:
- Around line 867-871: The error message raised when self._collision_pipeline is
None should be updated to correct grammar and show the true collide signature:
reference Model.contacts() or call your collision pipeline directly as
CollisionPipeline.collide(state, contacts) (note the required state parameter).
Edit the ValueError text in the block that checks self._collision_pipeline to
include the corrected phrasing and exact signature (state, contacts) so callers
know to pass the simulation state first.

In `@newton/examples/diffsim/example_diffsim_ball.py`:
- Around line 114-119: The example sets
self.collision_pipeline.soft_contact_margin = 10.0 but then calls
self.collision_pipeline.collide(self.states[0], self.contacts) which passes the
default soft_contact_margin (0.01) so the instance attribute is ignored; fix by
passing the intended margin explicitly when calling collide (e.g., provide
soft_contact_margin=self.collision_pipeline.soft_contact_margin) in
example_diffsim_ball's collide call (and mirror the same change in
example_diffsim_bear where collide is called) so the runtime uses the 10.0
margin.
🧹 Nitpick comments (6)
newton/examples/selection/example_selection_materials.py (1)

167-179: Contacts are recomputed every substep — verify this is intentional.

The collide() call is inside the substep loop (line 168). In other Newton examples (e.g., example_sdf.py), the established pattern is to compute contacts once per frame before the substep loop and reuse them for all substeps. Currently this is a no-op since the solver is MuJoCo (contacts is None), but if the solver is ever swapped to a non-MuJoCo one, this would recompute collisions every substep.

If per-substep collision is intentional here, a brief comment explaining why would help. Otherwise, consider hoisting the collide call above the loop:

Suggested diff
 def simulate(self):
+    if self.contacts is not None:
+        self.model.collide(self.state_0, self.contacts)
+
     for _ in range(self.sim_substeps):
         self.state_0.clear_forces()
 
         # apply forces to the model for picking, wind, etc
         self.viewer.apply_forces(self.state_0)
 
-        # explicit collisions needed without MuJoCo solver
-        if self.contacts is not None:
-            self.model.collide(self.state_0, self.contacts)
-
         self.solver.step(self.state_0, self.state_1, self.control, self.contacts, self.sim_dt)
         self.state_0, self.state_1 = self.state_1, self.state_0

Based on learnings: "In Newton example code, computing contacts once per frame and reusing them across all substeps is an intentional design choice."

newton/examples/sensors/example_sensor_imu.py (1)

121-121: Inconsistent API path compared to other examples in this PR.

This example uses self.model.contacts() (model-centric, lazy default pipeline) while the other updated examples in this PR use self.collision_pipeline.contacts() with an explicit pipeline created via newton.examples.create_collision_pipeline(self.model, args). As a result, this example won't respect --collision-pipeline or --broad-phase-mode CLI arguments.

Consider aligning with the pipeline-centric pattern for consistency:

Suggested change
+        self.collision_pipeline = newton.examples.create_collision_pipeline(self.model, args)
-        self.contacts = self.model.contacts()
+        self.contacts = self.collision_pipeline.contacts()

Note: the __init__ signature would need an args=None parameter, and the collide call in simulate would need to use self.collision_pipeline.collide(...).

newton/examples/contacts/example_sdf.py (1)

296-302: Remove or document the commented-out collide call.

Line 302 is a commented-out collision_pipeline.collide(...) inside the substep loop, while Line 297 performs the collide once before the loop (the intentional once-per-frame pattern). The dead comment should be removed to keep the code clean.

🧹 Remove commented-out line
     def simulate(self):
         self.collision_pipeline.collide(self.state_0, self.contacts)
         for _ in range(self.sim_substeps):
             self.state_0.clear_forces()
 
             self.viewer.apply_forces(self.state_0)
-            # self.collision_pipeline.collide(self.state_0, self.contacts)
             self.solver.step(self.state_0, self.state_1, self.control, self.contacts, self.sim_dt)
 
             self.state_0, self.state_1 = self.state_1, self.state_0
newton/_src/sim/collide_unified.py (1)

479-504: soft_contact_margin None-guard is unreachable given typed default.

Line 504: soft_contact_margin if soft_contact_margin is not None else self.soft_contact_margin — the parameter is typed as float with default 0.01, so it can never be None through normal usage. The same pattern exists in collide.py Line 146. Either widen the type to float | None = None to let callers explicitly request the pipeline default, or drop the None guard.

Option A: Allow None to mean "use pipeline default"
     def collide(
         self,
         state: State,
         contacts: Contacts,
         *,
-        soft_contact_margin: float = 0.01,
+        soft_contact_margin: float | None = None,
     ):
Option B: Remove the dead None guard
-        soft_contact_margin = soft_contact_margin if soft_contact_margin is not None else self.soft_contact_margin
newton/_src/sim/collide.py (2)

119-148: Same None-guard issue on soft_contact_margin and edge_sdf_iter as in collide_unified.py.

Lines 146-147 check for None, but both parameters are typed with non-None defaults (float = 0.01, int = 10). Either widen the types to float | None = None / int | None = None to allow callers to request the pipeline default, or remove the dead guards. This keeps the two pipeline implementations consistent.


139-142: Consider adding contacts buffer validation (same concern as unified pipeline).

Unlike collide_unified.py which has a TODO for this, collide.py has no comment or check either. If a Contacts buffer sized differently (e.g., from a different pipeline or model) is passed in, kernels could write out of bounds. A simple dimension check after contacts.clear() would prevent subtle GPU memory corruption.

Comment thread docs/tutorials/00_introduction.ipynb Outdated
Comment thread newton/_src/sim/collide_unified.py Outdated
Comment thread newton/_src/sim/collide.py Outdated
Comment thread newton/_src/sim/model.py
Comment thread newton/examples/diffsim/example_diffsim_ball.py Outdated
nvtw
nvtw previously approved these changes Feb 11, 2026

@nvtw nvtw 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 to me but maybe also wait for other opinions.

I saw a few locations where the user now needs to be more careful:
When differentiability for contacts is enabled, the user now needs to allocate fresh contacts. But it's good that this is more explicit.
Seems like model.contacts() must be called before model.collide()? Once you know it it's clear. I assume proper error messages will inform you about the order if you do it wrong the first time.

@camevor

camevor commented Feb 11, 2026

Copy link
Copy Markdown
Member Author

Thanks @nvtw!

When differentiability for contacts is enabled, the user now needs to allocate fresh contacts. But it's good that this is more explicit.

Yes, since no Contacts object is cached anymore, the internal re-allocation is no longer meaningful.

Seems like model.contacts() must be called before model.collide()? Once you know it it's clear. I assume proper error messages will inform you about the order if you do it wrong the first time.

Yes, there is an error message if that is not done. But since model.collide(state, contacts) now accepts a Contacts object, this requirement is quite obvious.

Comment thread newton/_src/sim/collide.py Outdated

Copilot AI 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.

Pull request overview

This PR refactors Newton’s collision API to separate contacts buffer allocation from collision detection, enabling predictable allocation/ownership and reuse of contact buffers across simulation steps (similar to the existing State/Control pattern).

Changes:

  • Added Model.contacts() and CollisionPipeline.contacts() for explicit Contacts allocation, and updated Model.collide(...) / CollisionPipeline.collide(...) to populate an existing buffer.
  • Removed CollisionPipeline.from_model() usage across tests/examples/docs in favor of direct CollisionPipeline(model, ...) construction.
  • Updated docs/tutorials/migration guide and many tests/examples to the new two-step collision workflow.

Reviewed changes

Copilot reviewed 63 out of 63 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
newton/_src/sim/model.py Introduces cached default collision pipeline plus Model.contacts() and new in-place Model.collide(state, contacts) API.
newton/_src/sim/collide.py Refactors CollisionPipeline constructor to take model; adds CollisionPipeline.contacts() and changes collide() to populate provided Contacts.
newton/_src/sim/contacts.py Updates documentation to reference Model.contacts() / CollisionPipeline.contacts() allocation flow.
newton/_src/sim/builder.py Updates embedded usage example to allocate contacts once and reuse it in a loop.
newton/_src/solvers/vbd/solver_vbd.py Updates docstring example to use model.contacts() + in-place model.collide(...).
newton/examples/init.py Updates create_collision_pipeline() helper to accept **kwargs forwarded to CollisionPipeline and constructs pipeline directly.
newton/examples/basic/example_basic_urdf.py Updates example to allocate contacts once and reuse buffer each step.
newton/examples/basic/example_basic_shapes.py Switches to pipeline.contacts() and in-place pipeline.collide(...).
newton/examples/basic/example_basic_pendulum.py Switches to pipeline.contacts() and in-place pipeline.collide(...).
newton/examples/basic/example_basic_joints.py Switches to pipeline.contacts() and in-place pipeline.collide(...).
newton/examples/sensors/example_sensor_imu.py Allocates contacts once via model.contacts() and reuses in-place.
newton/examples/selection/example_selection_multiple.py Allocates contacts once (non-MuJoCo only) and reuses in-place.
newton/examples/selection/example_selection_materials.py Allocates contacts once (non-MuJoCo only) and reuses in-place.
newton/examples/selection/example_selection_articulations.py Allocates contacts once (non-MuJoCo only) and reuses in-place.
newton/examples/robot/example_robot_policy.py Allocates contacts once and moves collision detection to in-place calls during stepping.
newton/examples/robot/example_robot_panda_hydro.py Switches to CollisionPipeline(model, ...), allocates contacts via pipeline, and collides in-place.
newton/examples/robot/example_robot_humanoid.py Switches to pipeline allocation + in-place collision.
newton/examples/robot/example_robot_h1.py Switches to pipeline allocation + in-place collision.
newton/examples/robot/example_robot_g1.py Switches to pipeline allocation + in-place collision.
newton/examples/robot/example_robot_anymal_d.py Switches to pipeline allocation + in-place collision.
newton/examples/robot/example_robot_anymal_c_walk.py Uses pipeline.contacts() and in-place collision when Newton contacts are enabled.
newton/examples/robot/example_robot_allegro_hand.py Allocates contacts once and runs in-place collision per substep.
newton/examples/softbody/example_softbody_hanging.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/multiphysics/example_softbody_dropping_to_cloth.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/multiphysics/example_poker_cards_stacking.py Switches to CollisionPipeline(model, ...), allocates contacts via pipeline, and collides in-place.
newton/examples/multiphysics/example_falling_gift.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/mpm/example_mpm_twoway_coupling.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/ik/example_ik_cube_stacking.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/diffsim/example_diffsim_soft_body.py Allocates fresh contacts per substep (for grad tracking) using pipeline.contacts() + in-place collide.
newton/examples/diffsim/example_diffsim_bear.py Switches to pipeline allocation + in-place collision.
newton/examples/diffsim/example_diffsim_ball.py Switches to pipeline allocation + in-place collision.
newton/examples/contacts/example_sdf.py Switches to CollisionPipeline(model, ...), allocates contacts via pipeline, and collides in-place.
newton/examples/cloth/example_cloth_twist.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cloth/example_cloth_style3d.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cloth/example_cloth_hanging.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cloth/example_cloth_h1.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cloth/example_cloth_franka.py Passes soft_contact_margin via helper, allocates pipeline.contacts(), and collides in-place.
newton/examples/cloth/example_cloth_bending.py Switches to CollisionPipeline(model, ...), allocates contacts via pipeline, and collides in-place.
newton/examples/cable/example_cable_y_junction.py Allocates contacts once via model.contacts() and reuses in-place.
newton/examples/cable/example_cable_twist.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cable/example_cable_pile.py Allocates contacts once via model.contacts() and reuses in-place.
newton/examples/cable/example_cable_helix.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cable/example_cable_fixed_joints.py Allocates contacts once via model.contacts() and reuses in-place.
newton/examples/cable/example_cable_bundle_hysteresis.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cable/example_cable_bend_damping.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cable/example_cable_bend.py Uses pipeline.contacts() and in-place pipeline collision.
newton/examples/cable/example_cable_ball_joints.py Allocates contacts once via model.contacts() and reuses in-place.
newton/tests/test_solver_xpbd.py Updates tests to allocate contacts once and pass into model.collide(...).
newton/tests/test_sites.py Updates test to allocate contacts once and collide in-place.
newton/tests/test_sdf_compute.py Switches to CollisionPipeline(model, ...), allocates pipeline contacts, collides in-place.
newton/tests/test_rigid_contact.py Refactors helper to accept optional contacts and updates tests to reuse allocated contacts.
newton/tests/test_mujoco_solver.py Updates setup and loops to use model.contacts() + in-place model.collide(...).
newton/tests/test_joint_drive.py Updates setup to use model.contacts() + in-place collision.
newton/tests/test_hydroelastic.py Switches to CollisionPipeline(model, ...), allocates pipeline contacts, collides in-place.
newton/tests/test_fixed_tendon.py Updates setup to use model.contacts() + in-place collision.
newton/tests/test_environment_group_collision.py Updates test to allocate contacts once and collide in-place.
newton/tests/test_collision_pipeline.py Refactors tests to use direct CollisionPipeline(model, ...), pipeline.contacts(), and in-place pipeline.collide(...); adds CUDA capture warm-up.
newton/tests/test_collision_cloth.py Updates tests to allocate contacts once and collide in-place.
newton/tests/test_cloth.py Switches to direct CollisionPipeline(model, ...) and uses pipeline.contacts() for reusable contacts buffer.
newton/tests/test_cable.py Updates multiple cable tests to allocate contacts once and collide in-place.
docs/tutorials/00_introduction.ipynb Updates tutorial to allocate contacts once and call model.collide(state, contacts) in the loop.
docs/migration.rst Adds migration guidance for the new two-step collision API for warp.sim users.
docs/concepts/collisions.rst Updates collision concepts doc for explicit contacts allocation and direct pipeline usage.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread newton/_src/sim/model.py Outdated
Comment thread newton/_src/sim/contacts.py Outdated
@camevor camevor enabled auto-merge February 12, 2026 10:03
Comment thread newton/tests/test_collision_pipeline.py
@camevor camevor added this pull request to the merge queue Feb 13, 2026
Merged via the queue into newton-physics:main with commit 6383d5e Feb 13, 2026
22 checks passed
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>
mmacklin pushed a commit to mmacklin/newton that referenced this pull request Apr 7, 2026
@camevor camevor deleted the model-contacts-method branch April 21, 2026 13:27
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.

5 participants