Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
50c6564
Teleop benchmark (#3269)
nvtw Jul 21, 2026
90bc2a7
[Kamino] notify shape property updates (#3577)
rubengrandia Jul 21, 2026
3fe35e6
Remove redundant math functions in Kamino (#3583)
Guirec-Maloisel Jul 21, 2026
709da0c
Use analytic primitive SDFs for hydro texture generation (#3305)
han-xudong Jul 21, 2026
200f195
Update PADMM test tolerances (#3586)
chschuma-disney Jul 21, 2026
ce603b3
Require docstrings for test methods (#3581)
eric-heiden Jul 21, 2026
288fc9a
Add rebuildable sparse implicit MPM grids (#3412)
maxkra15 Jul 21, 2026
3e06925
Add NVTX Scope for SensorTiledCamera rendering (#3590)
daniela-hase Jul 21, 2026
0b45703
Fix Featherstone ball joint damping (#3299)
han-xudong Jul 21, 2026
215c2ca
Create optional xforms argument for replicate function (#3599)
StafaH Jul 22, 2026
38429fc
Fix spurious Kamino floating-base reset warning (#3563)
adenzler-nvidia Jul 22, 2026
391c0f8
Validate ArticulationView masks before kernel launches (#3455)
han-xudong Jul 22, 2026
ac6d562
Update Menagerie pin for Robotiq masses (#3555)
devshahofficial Jul 22, 2026
a051c39
Surface additional simulation benchmark metrics (#3566)
vreutskyy Jul 22, 2026
621275c
Fix batched MuJoCo site poses (#3389)
adenzler-nvidia Jul 22, 2026
3177670
Add compiled regex support to label selection (#3584)
mzamoramora-nvidia Jul 22, 2026
1ea8c1c
Enforce output checks for more examples (#3527)
adenzler-nvidia Jul 22, 2026
add2c97
Dedupe USD single-DOF joint resolution (#3323)
adenzler-nvidia Jul 22, 2026
1daa772
Fix explicit mass on MJCF mesh geoms (#3595)
eric-heiden Jul 22, 2026
2928f5a
Fix USD axial visual scaling (#3368)
adenzler-nvidia Jul 22, 2026
84c0ec8
Reject inconsistent batched particle arrays (#3458)
han-xudong Jul 22, 2026
72559ba
Gate benchmark CI on runtime metrics (#3604)
vreutskyy Jul 22, 2026
7fedcaa
Update vulnerable locked dependencies (#3603)
adenzler-nvidia Jul 22, 2026
4a6e036
Load solver backends lazily to speed up `import newton` (#3601)
eric-heiden Jul 22, 2026
e8d9327
Add a `joint_dof_mask` argument to `newton.ik.IKSolver`. (#3488)
lyd405121 Jul 22, 2026
b36798a
Fix USD site import traversal (#3367)
adenzler-nvidia Jul 22, 2026
c139dc4
Split VBD cable stretch/shear and bend/twist constraints (#3122)
jumyungc Jul 22, 2026
fda8c48
Split mesh subsets on binding structure, not material vocabulary (#3351)
ooctipus Jul 22, 2026
f562c39
DVI solver for Kamino (#3570)
nvtw Jul 23, 2026
e20fca2
Add Kamino restitution verification (#3588)
rubengrandia Jul 23, 2026
38c44be
Use stock solver iterations in MuJoCo benchmarks (#3575)
adenzler-nvidia Jul 23, 2026
c63d32c
[Kamino] Simplify Kamino gravity to alias Newton vectors (#3606)
rubengrandia Jul 23, 2026
bcd5dc9
Add ball joint damping helper support (#3298)
han-xudong Jul 23, 2026
9e85e57
[Kamino] Fix Kamino preserve reset for COM-offset bodies (#3605)
rubengrandia Jul 23, 2026
980071a
[Kamino] Propagate model changes to the Kamino FK solver (#3602)
rubengrandia Jul 23, 2026
e477e36
Fix hollow shell thickness validation (#3310)
han-xudong Jul 23, 2026
6de960a
[Kamino] Fix broken Model conversion unit tests (#3585)
vastsoun Jul 23, 2026
3138037
Fix Kamino documentation for mixed vector quantity convention (#3612)
chschuma-disney Jul 23, 2026
ff9b71d
Bump jupyterlab to 4.6.2 in lock file (#3611)
adenzler-nvidia Jul 23, 2026
cde70e2
Isolated multi-world implicit MPM (#3411)
maxkra15 Jul 24, 2026
77b846e
Remove symbols deprecated in 1.3.0 (#3619)
adenzler-nvidia Jul 24, 2026
d9139fe
Fix misplaced MeshAdjacency changelog entries (#3618)
adenzler-nvidia Jul 24, 2026
cd58c5d
Remove deprecated SDF compatibility attributes (#3622)
adenzler-nvidia Jul 24, 2026
93363a3
Miscellaneous small fixes in Kamino (#3616)
Guirec-Maloisel Jul 24, 2026
60c3b84
Validate shape configuration values (#3311)
han-xudong Jul 24, 2026
d30b585
Type 32-bit sentinel constants as uint32 for kernel codegen (#3638)
adenzler-nvidia Jul 24, 2026
19f8e33
Fail closed for AWS approval gates (#3640)
shi-eric Jul 24, 2026
92f63c8
Fix corner-case kamino out of bound accesses (#3641)
Guirec-Maloisel Jul 24, 2026
e0d390c
Create heightfield from wp.Mesh (#3624)
StafaH Jul 24, 2026
1199861
Fix USD texture import: packaged .usdz, material subsets, base-color …
andrewkaufman Jul 24, 2026
b8bccd8
Add option to include collision geometry into the shape BVH (#3634)
StafaH Jul 24, 2026
d7581b7
Fix MJCF primitive material colors (#3631)
han-xudong Jul 24, 2026
9db21eb
Common rigid body contact examples (#3177)
jumyungc Jul 25, 2026
402d8ea
Extend CPU graph capture coverage (#3501)
c0d1f1ed Jul 25, 2026
c487bc8
[Kamino] Deduplicate FK constraint kernels (#3614)
rubengrandia Jul 27, 2026
cabea00
Performance improvements for Kamino's direct solvers (#3610)
nvtw Jul 27, 2026
4d6ca9b
Fix contact residual metric (#3666)
rubengrandia Jul 27, 2026
bfe8c31
[Kamino] Skip unused material updates (#3677)
rubengrandia Jul 27, 2026
c455e15
Disable implicit VBD Dahl-friction defaults (#3636)
adenzler-nvidia Jul 27, 2026
de2d06f
Honor MJCF geom inertia selection (#3596)
eric-heiden Jul 27, 2026
bd44951
Add Show Ground visualization toggle to the viewer (#3626)
andrewkaufman Jul 27, 2026
d124e5b
Remove redundant wp.static wrappers and fix a uint32 overflow (#3657)
shi-eric Jul 28, 2026
9b0fcbf
Move VBD contact geometry to pipeline (#3652)
jumyungc Jul 28, 2026
0827c76
Fix USD collider mass aggregation (#3594)
eric-heiden Jul 28, 2026
6f1453b
Startup Optimization: hydro-elastics, mesh creation, builder merge, a…
StafaH Jul 28, 2026
f094b85
Fix small-angle revolute joint reconstruction (#3706)
felixmey Jul 28, 2026
e9aabe7
Load static USD visual shapes by default (#3694)
eric-heiden Jul 28, 2026
92ae945
Decide USD collider visibility from purpose, and keep the render mesh…
andrewkaufman Jul 28, 2026
9166491
Break the viewer shape count into visual and collision (#3711)
andrewkaufman Jul 29, 2026
831076f
Speedup material USD loading with clustering alg (#3710)
StafaH Jul 29, 2026
70765c1
Fix PR author auto-assignment (#3708)
jcarius-nv Jul 29, 2026
825f0c9
Warn on mirrored (negative-determinant) rigid body transforms in USD …
jieseattle Jul 29, 2026
0a3e9e1
Update Kamino Jacobians to Newton free joint wrench convention (#3707)
chschuma-disney Jul 29, 2026
1c681ac
Bump mujoco-warp to 3.10.0.3 (#3635)
adenzler-nvidia Jul 29, 2026
1f675f2
Map contact kf to MuJoCo solreffriction for elliptic cones (#3580)
adenzler-nvidia Jul 29, 2026
67313ba
Restrict release build permissions (#3648)
shi-eric Jul 29, 2026
930ef2d
Read newton:mimicCoef0 as degrees for angular mimic followers (#3728)
andrewkaufman Jul 29, 2026
36b2ddf
Fix SolverVBD over-allocating soft-contact buffers in multi-world mod…
mmichelis Jul 30, 2026
8edb225
Resolve initialization order by using Newton CollisionPipeline capaci…
rubengrandia Jul 30, 2026
30cdd17
Fix kernel launch dim for contact conversion
rubengrandia Jul 30, 2026
dd362a1
Fix capacity estimation for pairs with planes.
rubengrandia Jul 30, 2026
d6e1e37
fix doc string around max_contacts_per_world
rubengrandia Jul 30, 2026
f2748ca
Fix contact capacity computation in the Kamino detector
rubengrandia Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/aws_gpu_benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ jobs:
with:
ref: ${{ inputs.ref }}
fetch-depth: 0
persist-credentials: false

- name: Install system dependencies
run: |
Expand All @@ -137,12 +138,16 @@ jobs:

- name: Run Benchmarks
run: |
# Gate this PR job on directly measured runtimes only.
uvx --with virtualenv asv continuous \
--launch-method spawn \
--interleave-rounds \
--append-samples \
--no-only-changed \
-e -b Fast \
-e \
-b 'Fast\w*\.time_' \
-b 'Fast(?!NewtonOverhead)\w*\.track_simulate(\(|$)' \
-b 'Fast\w*\.track_(mean|p95)_\w*(time|ms)(\(|$)' \
${{ inputs.base_ref }} \
${{ inputs.ref }}
continue-on-error: true
Expand Down
15 changes: 10 additions & 5 deletions .github/workflows/pr_auto_assign_creator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,16 @@ jobs:
}

try {
await github.rest.issues.checkUserCanBeAssigned({
owner,
repo,
assignee: author,
});
// PR participants may be assignable without repository-wide access.
await github.request(
'GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}',
{
owner,
repo,
issue_number: pr.number,
assignee: author,
}
);
} catch (error) {
if (error.status === 404) {
core.warning(
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/pr_target_aws_gpu_benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,17 @@ jobs:
needs:
- check-author-membership
- require-approval
if: github.repository == 'newton-physics/newton' && (!cancelled())
if: >-
github.repository == 'newton-physics/newton' &&
!cancelled() &&
needs.check-author-membership.result == 'success' &&
(
needs.require-approval.result == 'success' ||
(
needs.require-approval.result == 'skipped' &&
needs.check-author-membership.outputs.membership_status == 'CONFIRMED_MEMBER'
)
)
uses: ./.github/workflows/aws_gpu_benchmarks.yml
with:
ref: ${{ github.event.pull_request.head.sha }}
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/pr_target_aws_gpu_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,17 @@ jobs:
needs:
- check-author-membership
- require-approval
if: github.repository == 'newton-physics/newton' && (!cancelled())
if: >-
github.repository == 'newton-physics/newton' &&
!cancelled() &&
needs.check-author-membership.result == 'success' &&
(
needs.require-approval.result == 'success' ||
(
needs.require-approval.result == 'skipped' &&
needs.check-author-membership.outputs.membership_status == 'CONFIRMED_MEMBER'
)
)
uses: ./.github/workflows/aws_gpu_tests.yml
with:
ref: ${{ github.event.pull_request.head.sha }}
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@fa2e9d605c4eeb9fcad4c99c224cee0c6c7f3594 # v2.16.0
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ uv run --extra dev --extra torch-cu12 -m newton.tests # with Py

### Testing guidelines

- Give every test function or method a docstring using triple double quotes (`"""..."""`). Start with a concise one-line summary in imperative mood that states what the test verifies. For a particularly complex test, add a body that elaborates on the tested behavior, separated from the summary by a blank line following Google-style docstring conventions.
- Never call `wp.synchronize()` or `wp.synchronize_device()` right before `.numpy()` on a Warp array. This is redundant as `.numpy()` performs a synchronous device-to-host copy that completes all outstanding work.

```bash
Expand Down
79 changes: 75 additions & 4 deletions CHANGELOG.md

Large diffs are not rendered by default.

32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,9 @@ If you run the examples from a source checkout with uv, use
</a>
</td>
<td align="center" width="33%">
<a href="https://github.com/newton-physics/newton/blob/main/newton/examples/cable/example_cable_plectoneme.py">
<img width="320" src="https://raw.githubusercontent.com/newton-physics/newton/main/docs/images/examples/example_cable_plectoneme.jpg" alt="Cable Plectoneme">
</a>
</td>
</tr>
<tr>
Expand All @@ -293,6 +296,7 @@ If you run the examples from a source checkout with uv, use
<code>python -m newton.examples cable_cross_slide_table</code>
</td>
<td align="center" width="33%">
<code>python -m newton.examples cable_plectoneme</code>
</td>
</tr>
<tr>
Expand Down Expand Up @@ -749,6 +753,9 @@ If you run the examples from a source checkout with uv, use
</a>
</td>
<td align="center" width="33%">
<a href="https://github.com/newton-physics/newton/blob/main/newton/examples/contacts/example_newton_cradle.py">
<img width="320" src="https://raw.githubusercontent.com/newton-physics/newton/main/docs/images/examples/example_newton_cradle.jpg" alt="Newton Cradle">
</a>
</td>
</tr>
<tr>
Expand All @@ -758,6 +765,31 @@ If you run the examples from a source checkout with uv, use
<td align="center" width="33%">
<code>python -m newton.examples contacts_rj45_plug</code>
</td>
<td align="center" width="33%">
<code>python -m newton.examples newton_cradle</code>
</td>
</tr>
<tr>
<td align="center" width="33%">
<a href="https://github.com/newton-physics/newton/blob/main/newton/examples/contacts/example_balance_bird.py">
<img width="320" src="https://raw.githubusercontent.com/newton-physics/newton/main/docs/images/examples/example_balance_bird.jpg" alt="Balance Bird">
</a>
</td>
<td align="center" width="33%">
<a href="https://github.com/newton-physics/newton/blob/main/newton/examples/contacts/example_domino_spiral.py">
<img width="320" src="https://raw.githubusercontent.com/newton-physics/newton/main/docs/images/examples/example_domino_spiral.jpg" alt="Domino Spiral">
</a>
</td>
<td align="center" width="33%">
</td>
</tr>
<tr>
<td align="center" width="33%">
<code>python -m newton.examples balance_bird</code>
</td>
<td align="center" width="33%">
<code>python -m newton.examples domino_spiral</code>
</td>
<td align="center" width="33%">
</td>
</tr>
Expand Down
2 changes: 1 addition & 1 deletion asv.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"build_command": ["python -m build --wheel -o {build_cache_dir} {build_dir}"],
"install_command": [
"in-dir={env_dir} python -m pip install {wheel_file}[dev] --extra-index-url=https://pypi.nvidia.com/",
"in-dir={env_dir} python -m pip install {wheel_file}[sim] warp-lang==1.16.0.dev20260716 mujoco==3.10.0 mujoco-warp==3.10.0.2 --extra-index-url=https://pypi.nvidia.com/",
"in-dir={env_dir} python -m pip install {wheel_file}[sim] warp-lang==1.16.0.dev20260716 mujoco==3.10.0 mujoco-warp==3.10.0.3 --extra-index-url=https://pypi.nvidia.com/",
"python -m pip install torch==2.10.0+cu130 --index-url https://download.pytorch.org/whl/cu130"
]
}
33 changes: 12 additions & 21 deletions asv/benchmarks/benchmark_kamino.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@

import newton

if __package__:
from .benchmark_metrics import validate_simulation_state
else:
from benchmark_metrics import validate_simulation_state

_NUM_ACTIONS = 12
_OBS_DIM = 94
_MIN_STANDING_HEIGHT = 0.20
Expand Down Expand Up @@ -435,37 +440,23 @@ def step(self):
self.sim_time += self.frame_dt

def test_final(self):
state_values = {}
for name in ("joint_q", "body_q", "body_qd"):
values = getattr(self.state_0, name).numpy()
if not np.isfinite(values).all():
raise RuntimeError(f"Simulation produced non-finite values in state.{name}")
state_values[name] = values

body_count = self.model.body_count // self.world_count
body_qd = state_values["body_qd"].reshape(self.world_count, body_count, 6)
max_linear_speed = np.linalg.norm(body_qd[:, :, :3], axis=-1).max()
max_angular_speed = np.linalg.norm(body_qd[:, :, 3:], axis=-1).max()
if max_linear_speed > _MAX_BODY_LINEAR_SPEED:
raise RuntimeError(
f"Maximum body linear speed is {max_linear_speed:.3f} m/s, exceeding {_MAX_BODY_LINEAR_SPEED:.1f} m/s"
)
if max_angular_speed > _MAX_BODY_ANGULAR_SPEED:
raise RuntimeError(
f"Maximum body angular speed is {max_angular_speed:.3f} rad/s, "
f"exceeding {_MAX_BODY_ANGULAR_SPEED:.1f} rad/s"
)
validate_simulation_state(
self.state_0,
max_linear_speed=_MAX_BODY_LINEAR_SPEED,
max_angular_speed=_MAX_BODY_ANGULAR_SPEED,
)

if self.policy_controller is None:
return

body_count = self.model.body_count // self.world_count
body_labels = [label.rsplit("/", 1)[-1] for label in self.model.body_label[:body_count]]
try:
pelvis_index = body_labels.index("pelvis")
except ValueError as e:
raise RuntimeError("DR Legs model has no pelvis root body") from e

body_q = state_values["body_q"].reshape(self.world_count, body_count, 7)[:, pelvis_index]
body_q = self.state_0.body_q.numpy().reshape(self.world_count, body_count, 7)[:, pelvis_index]
body_com = self.model.body_com.numpy().reshape(self.world_count, body_count, 3)[:, pelvis_index]
quat_vector = body_q[:, 3:6]
twice_cross = 2.0 * np.cross(quat_vector, body_com)
Expand Down
Loading
Loading