Skip to content

Selection API v2 - #186

Merged
nvlukasz merged 2 commits into
newton-physics:mainfrom
nvlukasz:selection-api-refactor
Jul 2, 2025
Merged

Selection API v2#186
nvlukasz merged 2 commits into
newton-physics:mainfrom
nvlukasz:selection-api-refactor

Conversation

@nvlukasz

@nvlukasz nvlukasz commented May 30, 2025

Copy link
Copy Markdown
Member

Description

This PR supersedes the first PR (#119).

Attribute API

The attribute API is similar to the previous version, e.g.:

joint_transforms = view.get_attribute("joint_q", state)
joint_velocities = view.get_attribute("joint_qd", state)
...
view.set_attribute("joint_q", state, joint_transforms)
view.set_attribute("joint_qd", state, joint_velocities)

This is a flexible approach that makes it easy to incorporate custom attributes by name without the need to add new API entry points.

By default, the attribute API always includes all joints, links, and DOFs. This allows users familiar with the Newton model to work efficiently with the underlying data.

Joint and Link Filtering

We now allow filtering joints and links to give users more control over articulation views, e.g.:

ArticulationView(..., include_joints=["hip_*", "ankle_*"], exclude_links=["*left*"])

With this foundation in place, it should be easy to add support for different joint/link ordering like BFS or DFS (in a subsequent PR).

Helper API

For spiritual compatibility with the legacy tensor API and to simplify working with different root joint types, we offer a few convenience methods like this:

view.get_root_transforms(state)
view.get_root_velocities(state)

For floating-base articulations, the root transforms are part of "joint_q". For fixed-base articulations, the root transforms are set through "joint_X_p". The helper methods take care of this so that users don't need to maintain different code paths for different root joint types.

The legacy tensor API didn't have the concept of root joints. Articulations had the same number of DOFs regardless of whether they had a fixed or floating base. We can mimic that behaviour by filtering out free joints like this:

ArticulationView(..., exclude_joint_types=[newton.JOINT_FREE])

This will exclude the free joint data from all attributes, making the number of DOFs the same regardless of whether the articulation has a fixed or floating base. Note that set_root_transforms() and set_root_velocities() will still use "joint_q" and "joint_qd" under the hood for floating-base articulations, but get_attribute("joint_q") and get_attribute("joint_qd") will NOT include the root free joint since it's filtered out.

# filter out free joints
view = ArticulationView(model, "ant", exclude_joint_types=[newton.JOINT_FREE])

view.get_root_transforms(state)  # gets root transforms from joint_q[:, :7]
view.get_dof_positions(state)    # gets DOF positions from joint_q[:, 7:]

view.get_root_velocities(state)  # gets root velocities from joint_qd[:, :6]
view.get_dof_velocities(state)   # gets DOF velocities from joint_qd[:, 6:]

# The leading free DOFs are not included with any attributes (filtered out)
view.get_attribute("joint_limit_lower", model)
view.get_attribute("joint_armature", model)
...

# same with DOF forces etc.
dof_forces = 5.0 - 10.0 * torch.rand((self.num_envs, self.ants.joint_dof_count))
self.ants.set_dof_forces(control, dof_forces)

Zero Copy Semantics

It's possible to work with this API in zero-copy mode:

# get strided alias to the state attribute
joint_positions = view.get_attribute("joint_q", state)
# launch a kernel that modifies the state in-place
wp.launch(update_transforms, ..., outputs=[joint_positions])

It's even possible to do this zero-copy modification in PyTorch. The attributes returned by the API are always strided arrays (not indexed arrays), so PyTorch read and write the data directly.

It's technically not necessary to call a setter, because the data are already written to the right place. But for the sake of consistency, it is required to call the setter:

view.set_attribute("joint_q", state, joint_transforms)

There are two reasons for this:

  1. In some cases, modifying an attribute may require notifying the solver. The setter will send this notification if needed.
  2. Joint and link filtering (or reordering) may present the joints, DOFs, or links in non-contiguous order. This can be solved using indexed arrays in Warp, but tensor-based frameworks like PyTorch need staging buffers where a swizzled copy of the data is held. In that case, we don't have zero-copy access, so a setter is required to copy the data to the right place.

So as a general rule, calling a setter is required if an attribute is modified. The are built-in optimizations that will avoid copying data if the values were written to the attribute in-place. So zero-copy is achievable even if we call setters.

Examples

There are a few examples that show what the APIs look like in action (newton/examples/example_selection_*).

Newton Migration Guide

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

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

Before your PR is "Ready for review"

  • All commits are signed-off to indicate that your contribution adheres to the Developer Certificate of Origin requirements
  • I understand that GitHub does not perform any GPU testing of this pull request
  • Necessary tests have been added
  • Documentation is up-to-date
  • Code passes formatting and linting checks with pre-commit run -a

@nvlukasz nvlukasz mentioned this pull request May 30, 2025
6 tasks
Comment thread newton/utils/selection.py Outdated
Comment thread newton/utils/selection.py Outdated
Comment thread newton/utils/selection.py
Comment thread newton/utils/selection.py Outdated
Comment thread newton/utils/selection.py Outdated
Comment thread newton/utils/selection.py Outdated
@nvlukasz
nvlukasz marked this pull request as ready for review June 12, 2025 18:32
Comment thread newton/utils/selection.py Outdated
Comment thread newton/utils/selection.py
Comment thread newton/sim/model.py Outdated
@nvlukasz
nvlukasz force-pushed the selection-api-refactor branch from 362fdc9 to ff16b10 Compare July 2, 2025 20:15
Signed-off-by: Lukasz Wawrzyniak <lwawrzyniak@nvidia.com>

Ruff
@nvlukasz
nvlukasz force-pushed the selection-api-refactor branch from ff16b10 to 6a4f8eb Compare July 2, 2025 20:24
@nvlukasz
nvlukasz merged commit 3d8b4f5 into newton-physics:main Jul 2, 2025
6 checks passed
eric-heiden pushed a commit to eric-heiden/newton that referenced this pull request Jan 28, 2026
First draft of the selection API with examples
vidurv-nvidia pushed a commit to vidurv-nvidia/newton that referenced this pull request Mar 6, 2026
newton-physics#1164)

# Description

This MR adds configuration classes that allow spawning different assets
at the resolved prim paths. For instance, for the prim path expression
"/World/envs/env_.*/Object", these configuration instances allow
spawning a different type of prim at individual path locations.

Fixes newton-physics#186

## Type of change

- New feature (non-breaking change which adds functionality)

## Checklist

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

---------

Signed-off-by: Mayank Mittal <12863862+Mayankm96@users.noreply.github.com>
Co-authored-by: David Hoeller <dhoeller@nvidia.com>
vidurv-nvidia pushed a commit to vidurv-nvidia/newton that referenced this pull request Mar 6, 2026
# Description

This PR cleans up settings applied in the app files and aligns them with
settings in Isaac Sim 4.5. In addition, new livestream versions and
documentation are updated to reflected changes in Isaac Sim 4.5.

## Type of change

<!-- As you go through the list, delete the ones that are not
applicable. -->

- Bug fix (non-breaking change which fixes an issue)
- This change requires a documentation update

## Checklist

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

<!--
As you go through the checklist above, you can mark something as done by
putting an x character in it

For example,
- [x] I have done this task
- [ ] I have not done this task
-->
mmacklin pushed a commit to mmacklin/newton that referenced this pull request Mar 11, 2026
* Add small docstring format fix in core.joints

* Add boilerplate for sparse linear operator

* Add experimental prototype implementation of sparse system jacobians

* Add revisions to linalg/sparse.py according to PR feedback and add some initial unit tests

* Add some fixes to rough prototype of sparse Jacobians and prepare for adding respective unit tests

* Completes initial prototype of BSM matrix and BlockDType utility type, with corresponding UTs

* Add block sparse matrix-vector multiplication operator

This adds operators to compute different versions of a matrix-vector
product for `BlockSparseMatrices`, plugging into
`BlockSparseLinearOperators`.

* Add tests for block sparse matrix-vector multiplication

This adds tests for three different types of block sparse matrices:
- Fully dense matrices, using different block sizes.
- Sparse matrices, using different block sizes.
- Jacobian-like sparse matrices, using 1x6 blocks.

* Fix generics in block sparse matrix-vector multiplication

This fixes an issue with the block sparse matrix-vector product routines
hard-coding a `float32` dtype for some arrays. The routines now use the
block type's dtype instead.

* Add global max dims to block sparse matrix

This introduces a host-side variable to store the maximum dimension a matrix can have, so that kernels can be launched to iterate over the matrix dimensions.

* Add matrix mask for block sparse matrix operations

This adds a `matrix_mask`, similar to a `world_mask`, for block sparse
matrix operations. Matrix-vector operations for matrices that are masked
out are now no longer performed.

As a side effect, the scaling kernel of the generalized matrix-vector
product now skips all entries of the vector that are inactive. It is
questionable if this has any effect on the runtime, but was done to
ensure that inactive entries are not modified.

* Remove dtype specification from sparse matvec launchers

* Flatten constraint_full_to_red_map

* Add symbolic assembly of FK jacobian

* Add kernels and routine to assemble sparse FK jacobian

* Add unit test to validate FK sparse jacobian assembly

* Fix extra argument in function call in jacobians.py

* Move row_start, col_start from sparse operator to sparse matrix class

* Update bsm.finalize() function to take max_dims and initialize more

In particular, all known dimensions and offsets are computed and set into the device arrays

* Update sparse unit tests

* Update bsm.numpy() to move data from device only once

The current implementation was moving the entire data for every matrix in the stack, and then using only a slice

* Clarify constant vs variable arrays in BSM class

* Update signature of sparse blas routines

Take now directly a BlockSparseMatrices instead of a BlockSparseLinearOperator, and take the mask as the last argument

* Revert changes to jacobians.py to avoid future merge conflicts

* Rename dense Jacobian kernels

* Add generic BatchedLinearOperator for conjugate solvers

* Complete sparse Jacobian routines

* Add tests for sparse Jacobian allocation and construction

This adds tests to check the allocation for sparse Jacobians, and the construction of the Jacobians, comparing them to their dense counterparts.

* Sparse conjugate solvers

* Update CG solver to use int mask, and allow passing mask and dims later

* Sparse discovery

* Split sparse in two files to allow default init of sparse operator

* Add 2d version of sparse blas, expecting 2d arrays for vector stacks

* Use sparse Jacobian for matrix-vector products in FK

* Update CG solver to use int mask, and allow passing mask and dims later

* Finish sparsification of FK and add a setting to pick dense or sparse

* Refine preconditioning, iterations and tolerance of CG in FK solver

* Adapt to changes in CG branch

* Clean up and documentation pass

* Add some more placeholders and design sketch for the block-sparse Delassus operator.

* Add placeholder for optional pre-computation op

* Extend container test helpers for sparse Jacobians

This extends the `make_containers()` and `update_containers()` to also
work for the case of sparse Jacobians.

* Add matrix extraction routine for matrix-free Delassus operator

This adds a routine that computes the matrix representation of the
matrix-free Delassus operator by querying the operator with one-hot
vectors.

* Fix dtype for block sparse matrix `numpy()` result

This fixes the dtype of the resulting numpy matrices, which had not been
converted from a warp type to a numpy type.

* Initialize temp arrays with zeros

* Remove debug code

* Add docstrings

* Add blockwise Jacobi preconditioner as option to FK solver

* Refine adaptive CG tolerance heuristic and enable it by default

* Add block sparse matrix-free Delassus operator

This completes the implementation of the block sparse matrix-free
Delassus operator that represents the Delassus matrix implicitly.

The operator supports:
- Basic matrix-vector multiplication.
- General matrix-vector multiplication (gemv).
- Regularization with a diagonal matrix added to the (implicit) Delassus
  matrix.
- Preconditioning with a diagonal matrix that is applied to both sides
  of the Delassus matrix.
- Extraction of the diagonal of the (implicit) Delassus matrix.

* Add tests for block sparse matrix-free Delassus operator

The tests check that:
- The Delassus operator data structure is properly allocated.
- The implicitly represented matrix matches the actual Delassus matrix.
- The matrix-vector products produce the same result as the reference
  using dense matrices.
- The diagonal extraction matches the reference using dense matrices.

* Add generic BatchedLinearOperator for conjugate solvers

* Sparse conjugate solvers

* Update CG solver to use int mask, and allow passing mask and dims later

* Sparse discovery

* Initialize temp arrays with zeros

* Remove debug code

* Add docstrings

* Merge blas_2d.py into blas.py

* Restore default behavior on main branch

FK solver using sparsity is currently slower as semi-sparse LLT version, which remains the default

* Initialize default operators in BSM constructor

* Extend extraction routines for tests for sparse Delassus op

* Switch preconditioning and regularization for sparse Delassus op

* Add progress bar fix for outputs with cp1252 encoding

* Add solver, problem info to matrix-free Delassus op

* Add block sparse op wrapper for BatchedLinearOperator

* Add interface properties for sparse linear operator

* Enable sparse data representation for dual problem

* Update PADMM solver for sparse data representation

* Update body wrench computation for sparse representation

* Add sparsity flag to SolverKamino

* Add sparse Jacobian check for solution metrics

* Adapt tests for sparse data representation

* Make tests use sparse data structures by default

* Fix sparse body wrench computation indexing

* Fix active dims for BSM BatchedLinearOperator wrapper

* Move sparse DualProblem preconditioner setup to finalize()

* Move sparse regularization setup to DualProblem

* Add avoid_graph_conditionals

* avoid graph conditionals for admm & in dr legs

* Default to using graph conditionals

* Add SolutionMetrics computation for sparse data

* Fix sparse ADMM solver convergence info computation

* Dev/improve infinity norm kernels (newton-physics#165)

* Use tile API in infnorm residual computation kernels

* Avoid additional accumulator in single-tile case in inf norm kernels

* Fix infinity norm kernel in case ncts = 0 or nu = 0

The latter in particular can happen for examples without limits or contacts

* Fix world check for broadphase tests (newton-physics#166)

This fixes the issue of the broadphase tests occasionally failing due to the non-deterministic result. The ordering of the collisions is not fixed, so the comparison between the actual `wid`s and the expected `wid`s might fail.

The tests now sort the list of expected and actual `wid`s so that the check is deterministic.

* Adaptive Penalty and CPU dot product (newton-physics#148)

* Use adaptive penalty

* Tune Dr. Legs parameters

* Disable adaptive penalty by default

* Clean up

* Adaptive solver tolerance

* Move linear solver tolerance to PADMMData and group penalty with status

* Fix for CPU

* Optimize collision pair candidate computation (newton-physics#167)

This introduces some optimization for the computation of collision pair candidates for multiple worlds in the Kamino ModelBuilder.

The original code was checking whether two bodies were neighbors by going through all joints of all worlds. Since inter-world collisions are not possible anyway, most of this loop is unnecessary if there is more than one world. The optimized version now stores the start and end index of the joints of each world, so that the loop only needs to go over a specific interval of the joints. Additionally, we can skip the loop entirely if we already know that we filter out the collision pair (i.e., if it is a self-collision or the bodies are not collidable).

* CG/CR dot product optimizations (newton-physics#172)

* Simplify CG dot product for small systems needing a single tile

* Make dot product code in CG more compact and fix block_dim in launch

More specifically, use wp.static() instead of a second kernel definition for the single-tile case;
and fix inconsistent block_dim given to kernel launch, using launch_tiled for clarity

* Column-major sparse Jacobian variant (newton-physics#169)

* Change sparse Jacobian block ordering

* Fix sparse matrix numpy() method for overlapping blocks

* Store sparse Jacobian limit/contact NZB offsets

* Add column-major sparse Jacobian variant

* Add column-major sparse Jacobian to Delassus op

* Use sparse Jacobian for dense Delassus matrix assembly (newton-physics#170)

* Add sparse assembly option for dense Delassus matrix

* Add separate sparse Jacobian solver option

* Update Jacobian extraction function for sparsity

* Update Delassus matrix tests

* Matrix-free Delassus operator optimizations (newton-physics#173)

* Fix dual problem sparse Delassus updating scheme

* Make sparse Delassus always use col-major Jacobian

* Precompute matrix products in sparse Delassus op

* Distinguish matvec from gemv in conjugate gradient

The case alpha = 1.0 and beta = 0.0 allows calling a simple matvec instead of a more general gemv in some CG operations, avoiding a scaling kernel for the dual problem

* Fix Delassus unit test referencing fields that have been removed

---------

Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>

* Sparse jacobian assembly improvements (newton-physics#175)

* Add convenience properties to access rows/cols separately in BSM

* Improve assembly of row-major Jacobians

More specifically
- nzb coordinates for joints are precomputed once rather than recomputed at each assembly
- per-joint, per-limit and per-contact nzb offsets are precomputed directly among all nzbs (not among a single world's nzbs)
- the stride between the nzb of the base and follower body was fixed in the limits jacobian assembly function (would be incorrect for multi-dof joints)

* Improve assembly of col-major jacobians

Here as well, we ensure offsets are global, and we precompute nzb coordinates for joints

* Fix unit tests failures due to nzb_row, nzb_col on matrix with 0 rows

The nzb_row, nzb_col etc convenience properties will raise an error when trying to access the ptr field of arrays with zero dimensions
This case was triggered (jacobian with zero rows) by some unit tests for solver metrics

* Improve FK initial guess by transforming reference to match base_q (newton-physics#177)

* Fix CG/CR dot kernel (newton-physics#176)

* Fix CG/CR dot kernel

* Unify CR/CG unit tests with other unit tests

I.e., make these unit tests non verbose by default and use the same main() function as other unit tests

* Propagate fix to infnorm computation kernels

---------

Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>

* Merge branch 'dev/kamino' into dev/kamino-sparse-merge, part 2

* Fix reset to base state and reset example (newton-physics#180)

* Fix reset from base pose to use initial instead of current body poses

Otherwise this is not a reset, just a rigid transformation of the current poses

* Fix reset example to work with graph capture

* Use non-zero base_u in reset example and refine parameters

* Enable joint dynamics for heterogeneous builder

(cherry picked from commit e07780ed08cce8acb9eb7b6aa04e9cd0c95ac4ed)

* Update sparse Jacobian tests to use implicit joint dynamics

(cherry picked from commit be65ba287f26cb52c92685bd308103bae3f736c9)

* Update sparse Jacobian assembly for implicit joint dynamics

(cherry picked from commit d04f3a02231de818d0dcb3f8e4156fb1624cd6a3)

* Fix indexing for sparse Jacobian assembly

(cherry picked from commit 2550044d35f02217683929710609457e3fd3e5cc)

* Add some cleanup to merge and verify that all dense operations still work

(cherry picked from commit aabfac10ae4de4720e8b8c04a9a83fee11de7c8a)

* Fix USD behavior for loading drive dynamics and DR Legs reset example

(cherry picked from commit 7b2791de6ca1dc58858d80fb5883e2aca565ff58)

* Fix warning message when sparsity + linsys solver combo is not correct

(cherry picked from commit 4ffd29d8e2572b0900fc2597588c3a297e0c43e2)

* Update and fix dynamics/wrenches.py

* Revert previous changes to DR Legs example and introduce setting of proper motor armature and damping values according to Dynamixel specs

* WIP: Refactor common test problem scaffolding for UTs and add UTs for dense/sparse wrench computations

* WIP: Refactor common test problem scaffolding

* Remove unnecessary dtype in annotation of dense system jacobian arrays

* Refactor make/extract unit test utilities + verify wrench UTs concretely

* Add some cleanup and fixes to kinematics/jacobians.py, dynamics/wrenches.py and their respective UTs

* Add joint inertia regularization to sparse Delassus operator

* Set default sparse regularization to 0

* Update sparse metrics computation for dynamic constraints

* Add small fixes to Jacobian ops and relevant extraction utils

* Adds critical fix to retrieval of number of dynamic cts of joint descriptors

* WIP: Debug Delassus matrix + armature regularization

* Fix limits jacobian assembly and limits documentation (newton-physics#184)

The joint id in limits is actually w.r.t. the model, and was offset erroneously in the limits jacobian assembly

* Solver configuration benchmark (newton-physics#178)

* Fix warning string format in SolverKamino

* Refactor/fix the linear-solver type-to-string mapping and its inverse

* Complete utils for querying Warp device specs and memory usage

* Initialize the utils.benchmark module

* Add utility joint-space controller that generates randomized generalized control forces

* Define helper functions for generating default solver/sim configs w/ reasonable values based on DR Legs

* Add generator utilities to construct benchmarking problems to be solved

* Add definitions of benchmark metrics containers

* Add utility scaffolding for creating sims given problem defs (i.e. builders etc) and solver/sim settings

* Add main benchmark program executable

* Expand metrics to span problems x configs x steps

* Define benchmark run modes and add data recording ops

* Add collection of all solver and physics metrics + HDF5 saving of all benchmark metrics data

* Add some cleanup, add loading of metrics from HDF5, add git repo info meta-data, and add optional recording of physics metrics

* Add benchmark output: CLI + textfiles + plots

* Add some cleanup and set more appropriate default arguments

* Add small fixes

* Fix truncation issue with large tables

* Fix exporting of large tables so that only summary is also printed to console and per-step metrics only to file

* Change implementation of plots to export PDF instead and create a single legend at the bottom of each figure

* Add missing step-time summary and some cleanup

* Add saving/loading of solver configs to/from HDF5

* Add rendering of solver configs table

* Fix loading of solver configs from HDF5

* Revises the random joint controller class according to PR comments

* Improve plotting output

* Elaborate high-level docstring and rename run modes

* Add some module org cleanup

* Fix small error in title equation

* Fix warning string format in SolverKamino

* Refactor/fix the linear-solver type-to-string mapping and its inverse

* Complete utils for querying Warp device specs and memory usage

* Initialize the utils.benchmark module

* Add utility joint-space controller that generates randomized generalized control forces

* Define helper functions for generating default solver/sim configs w/ reasonable values based on DR Legs

* Add generator utilities to construct benchmarking problems to be solved

* Add definitions of benchmark metrics containers

* Add utility scaffolding for creating sims given problem defs (i.e. builders etc) and solver/sim settings

* Add main benchmark program executable

* Expand metrics to span problems x configs x steps

* Define benchmark run modes and add data recording ops

* Add collection of all solver and physics metrics + HDF5 saving of all benchmark metrics data

* Add some cleanup, add loading of metrics from HDF5, add git repo info meta-data, and add optional recording of physics metrics

* Add benchmark output: CLI + textfiles + plots

* Add some cleanup and set more appropriate default arguments

* Add small fixes

* Fix truncation issue with large tables

* Fix exporting of large tables so that only summary is also printed to console and per-step metrics only to file

* Change implementation of plots to export PDF instead and create a single legend at the bottom of each figure

* Add missing step-time summary and some cleanup

* Add saving/loading of solver configs to/from HDF5

* Add rendering of solver configs table

* Fix loading of solver configs from HDF5

* Revises the random joint controller class according to PR comments

* Improve plotting output

* Elaborate high-level docstring and rename run modes

* Add some module org cleanup

* Fix small error in title equation

* Rework table rendering to allow inhomogeneous subcolumns.

* Add some more cleanup

* Ensure simulator is garbage-collected at the end of each benchmark run

Otherwise, the memory consumption stats are not accurate

* Fix benchmark runner sometimes writing output in the wrong folder

If the user manually renames a folder created by the benchmark (to something more meaningful than the collection date), we cannot rely on the folder name anymore
to select the most recent folder. Additionally, the path to the created hdf5 is now passed directly to the output function at the end of the benchmark.

* Fix redundant call forcing "high" memory consumption measure

---------

Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>

* Move sparse Delassus op update handling into operator (newton-physics#185)

* Investigate issue with sparse/dense body wrench ops + UT refactor (newton-physics#186)

* Investigate issue with sparse/dense body wrench ops. Leaving for later but saving mods to UTs

* Remove skips from CG/CR tests on GPU

* Fix loud unit tests printouts

* Dense Delassus assembly cleanup (newton-physics#192)

* Enable symmetry enforcement for body inertia update

* Align Delassus assembly kernel products for dense/sparse Jacobian

* Clarify comments in sparse Delassus operator

* Fix solver selection for PADMM test

---------

Co-authored-by: Christian Schumacher <christian.schumacher@disney.com>
Co-authored-by: Guirec-Maloisel <25688871+Guirec-Maloisel@users.noreply.github.com>
Co-authored-by: camevor <camevor@nvidia.com>
mmacklin pushed a commit to mmacklin/newton that referenced this pull request Apr 7, 2026
First draft of the selection API with examples
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.

4 participants