Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
2e0d86e
Sync warp env's viewport check with stable env's API
hujc7 May 5, 2026
5fb7327
Alias warp manager term cfgs to stable
hujc7 May 5, 2026
e842ea0
Add WarpFrontend bridge: '--manager=warp' on any stable task
hujc7 May 5, 2026
1cab702
Add changelog and apply ruff formatting for warp bridge
hujc7 May 5, 2026
4876327
Refactor warp bridge into pluggable rule pipeline; rename to --frontend
hujc7 May 5, 2026
0a9f2cd
Fix presets=newton injection for stable manager-based tasks
hujc7 May 5, 2026
d558741
Refactor warp bridge into a frontend framework package
hujc7 May 6, 2026
8934fe6
Tighten frontend framework against review findings
hujc7 May 6, 2026
67050a8
Tighten frontend framework against second review pass
hujc7 May 6, 2026
429794d
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 May 19, 2026
e2cb744
Replace frontend rule pipeline with single adapter function
hujc7 May 19, 2026
bd27af4
Simplify frontend cfg walker and unify term-cfg type contract
hujc7 May 26, 2026
21e8bba
Compress changelog fragment + add per-package fragments
hujc7 May 26, 2026
b932897
Sync warp envs to stable visualizer / has_gui API
hujc7 May 26, 2026
7767831
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 May 27, 2026
0f34475
Rename CLI preset hint to newton_mjwarp
hujc7 May 27, 2026
7b63d3e
Merge remote-tracking branch 'origin/develop' into jichuanh/warp-mana…
hujc7 Jun 4, 2026
1a66c3d
Self-adapt stable cfg inside warp env construction
hujc7 Jun 4, 2026
40db07a
Mirror core/ layout in tasks_experimental; reuse stable cfgs
hujc7 Jun 4, 2026
8177587
Limit warp cfg adaptation to warp-managed term groups + coverage test
hujc7 Jun 5, 2026
28033c8
Match consolidated cartpole IDs: drop -v0 from warp cartpole tasks
hujc7 Jun 5, 2026
87a03b7
Add warp twins: cartpole survival_success_rate, body_incoming_wrench
hujc7 Jun 5, 2026
3c8a8ae
Swap action-term class_type in warp adaptation; fix cartpole agents
hujc7 Jun 5, 2026
d587a49
Treat events as warp-managed; make survival_success_rate graph-safe
hujc7 Jun 5, 2026
d33a9bd
Merge origin/develop into jichuanh/warp-manager-bridge
hujc7 Jun 9, 2026
855588f
Align warp env ids with develop torch names after cleanup renames
hujc7 Jun 9, 2026
21de16e
Merge origin/develop into Warp frontend bridge
hujc7 Jul 4, 2026
cd77326
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-ma…
hujc7 Jul 16, 2026
b634127
Register --frontend in the shared RL training CLI
hujc7 Jul 16, 2026
826779f
Report success-rate metric from the Warp Cartpole reward twin
hujc7 Jul 16, 2026
ac01de7
Resolve warp MDP twins through registered task routes
hujc7 Jul 16, 2026
cd45040
Replace duplicated warp task configs with stable-cfg reuse
hujc7 Jul 16, 2026
910baee
Share stable cfgs with direct warp envs via warp_entry_point
hujc7 Jul 16, 2026
9e2d4c8
Tidy frontend CLI helper and warp env cleanups
hujc7 Jul 16, 2026
132112c
Mirror the stable core task layout in the experimental package
hujc7 Jul 16, 2026
5129070
Encapsulate the warp frontend machinery in a class
hujc7 Jul 16, 2026
e1066c2
Make the warp frontend module warp-only
hujc7 Jul 16, 2026
8694427
Resolve warp twins by package mirror instead of a registry
hujc7 Jul 16, 2026
b510d31
Run velocity tasks on warp via the frontend; drop the last variants
hujc7 Jul 16, 2026
ad86948
Annotate frontend and fix stale benchmark docs
hujc7 Jul 17, 2026
fc37fa6
Fold Allegro warp reorient into the stable registration
hujc7 Jul 17, 2026
1216df9
Make Warp frontend mask-first
hujc7 Jul 19, 2026
f8180c9
Keep Newton actuators opt-in
hujc7 Jul 19, 2026
ffa8a73
Skip empty eager reset pipelines
hujc7 Jul 19, 2026
b3707f4
Clarify reset optimization stages
hujc7 Jul 19, 2026
89a25f1
Refine Warp frontend reset paths
hujc7 Jul 20, 2026
dc738c3
Pin terrain origin ProxyArray buffers
hujc7 Jul 20, 2026
6952c08
Simplify terrain Warp origin views
hujc7 Jul 20, 2026
54c483e
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-fr…
hujc7 Jul 20, 2026
6f19326
Simplify Warp frontend execution
hujc7 Jul 20, 2026
a3bba1d
Tighten mask boundaries and changelog accuracy
hujc7 Jul 21, 2026
43b2ec1
Address review: capture-preserving stages and Warp-native naming
hujc7 Jul 21, 2026
c1bf394
Add warp-native height_scan and NullCommand twins
hujc7 Jul 21, 2026
41cf601
Merge commit 'fc37fa65ad9' into jichuanh/warp-frontend-cleanup
hujc7 Jul 21, 2026
54a3c5f
Swap command term classes to warp twins in the bridge
hujc7 Jul 21, 2026
bb4e29a
Reroute test imports to the restructured task packages
hujc7 Jul 21, 2026
466decc
Document all Warp kernels in the experimental manager stack
hujc7 Jul 21, 2026
3333e2a
Route play entrypoints through the frontend factory
hujc7 Jul 22, 2026
923b88c
Address second review: fixes, structural sync gate, capturability API
hujc7 Jul 22, 2026
e8a2198
Convert observation noise cfgs to warp twins in the bridge
hujc7 Jul 22, 2026
daa14b3
Adapt curriculum terms opportunistically in the warp frontend
hujc7 Jul 22, 2026
6c051f6
Merge commit 'e8a21985443' into jichuanh/warp-frontend-cleanup
hujc7 Jul 22, 2026
35c652b
Merge the curriculum conversion pins into one parametrized test
hujc7 Jul 22, 2026
63deac5
Merge remote-tracking branch 'upstream/develop' into jichuanh/warp-ma…
hujc7 Jul 22, 2026
2c9b2af
Align warp environments doc with the merged catalog
hujc7 Jul 22, 2026
4360622
Merge branch 'jichuanh/warp-manager-bridge' into jichuanh/warp-fronte…
hujc7 Jul 22, 2026
7473430
Back terrain and scene origin buffers with ProxyArray
hujc7 Jul 23, 2026
33eac2e
Document rough-terrain velocity coverage on the warp frontend
hujc7 Jul 23, 2026
c971364
Pin rough velocity tasks in the frontend conversion sweep
hujc7 Jul 23, 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
35 changes: 35 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,3 +322,38 @@ To debug Warp kernel behavior:
1. **Write a standalone reproduction script** and run it directly with `./isaaclab.sh -p -c "..."` or `./isaaclab.sh -p script.py`. This keeps stdout visible and avoids the test framework entirely.
2. **Use high-precision format strings** for floating-point debugging (e.g., `wp.printf("val=%.15e\n", x)`) — the default `%f` format hides values smaller than ~1e-6 that can still affect control flow.
3. **Remove all `wp.printf` calls before committing.**

### Warp mask-first boundaries

Boolean environment masks are the canonical selection in Warp-first code; host-side
mask-to-ID compaction (`nonzero()` on device data) is a GPU-to-host synchronization
with a data-dependent shape, which both stalls the pipeline and permanently
disqualifies the containing code path from CUDA graph capture.

1. **Syncs only inside named, sanctioned boundary helpers.** Host syncs
(`nonzero`, `argwhere`, `item`, `cpu`, `tolist`, `numpy`) on the mask-native
path live in small single-purpose functions listed in
`SANCTIONED_BOUNDARIES` of
`source/isaaclab_experimental/test/utils/test_mask_boundary_gate.py` — no
inline marker comments. The gate scans the experimental production tree in
full and `*mask*`-named functions in core/Newton; the list is exact, so
adding or removing a boundary is a conscious, reviewable test change.
Legitimate boundaries are host consumers: recorders, legacy compatibility
fallbacks, checkpoint/restore, and empty-reset predicates.
2. **Runtime backstop: `ISAACLAB_SYNC_DEBUG=1`.** Warp stages then execute under
`torch.cuda.set_sync_debug_mode("error")` (see `WarpGraphCache`), so a hidden
sync in any term — including future ones — raises at the exact call site.
Zero cost when the variable is unset.
3. **Capturability is annotated with `@WarpCapturable(False, reason=...)`** (the
single decorator form; works on term functions and class terms). Every
opt-out is pinned by the inventory test next to the gate. Unannotated terms
default to capturable and are covered by the runtime backstop.
4. **Mask-native Torch means elementwise masked ops.** Use `masked_fill_` or
`torch.where`; boolean advanced indexing (`buf[:, mask] = 0`) gathers indices
with a data-dependent allocation and is not capture-safe.
5. **Dual reset APIs.** Keep the ID-based `reset(env_ids)` signature untouched and
add a sibling `reset_mask(env_mask)`; the base-class fallback compacts (a
sanctioned boundary), mask-native implementations override it. Backends whose
assets accept but ignore `env_mask` (classic PhysX, a develop-era condition)
are a documented hazard on `InteractiveScene.reset`, not guarded machinery —
the warp env only drives Newton scenes.
Original file line number Diff line number Diff line change
Expand Up @@ -31,52 +31,59 @@ Available Environments
Direct Warp Environments
^^^^^^^^^^^^^^^^^^^^^^^^

- ``Isaac-Cartpole-Direct-Warp-v0`` — Cartpole balance
- ``Isaac-Ant-Direct-Warp-v0`` — Ant locomotion
- ``Isaac-Humanoid-Direct-Warp-v0`` — Humanoid locomotion
- ``Isaac-Reorient-Cube-Allegro-Direct-Warp-v0`` — Allegro hand cube reorient


Manager-Based Warp Environments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Classic**

- ``Isaac-Cartpole-Warp-v0``
- ``Isaac-Ant-Warp-v0``
- ``Isaac-Humanoid-Warp-v0``

**Locomotion (Flat)**

- ``Isaac-Velocity-Flat-AnymalB-Warp-v0``
- ``Isaac-Velocity-Flat-AnymalC-Warp-v0``
- ``Isaac-Velocity-Flat-AnymalD-Warp-v0``
- ``Isaac-Velocity-Flat-Cassie-Warp-v0``
- ``Isaac-Velocity-Flat-G1-Warp-v0``
- ``Isaac-Velocity-Flat-G1-Warp-v1``
- ``Isaac-Velocity-Flat-H1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeA1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeGo1-Warp-v0``
- ``Isaac-Velocity-Flat-UnitreeGo2-Warp-v0``

**Manipulation**

- ``Isaac-Reach-Franka-Warp-v0``
- ``Isaac-Reach-UR10-Warp-v0``
Direct tasks share the stable task configuration: the stable registration
declares its warp implementation through the ``warp_entry_point`` kwarg
(mirroring ``env_cfg_entry_point``), and ``--frontend warp`` swaps only the
environment class. Stable tasks with a declared warp implementation:

- ``Isaac-Cartpole-Direct`` — Cartpole balance
- ``Isaac-Ant-Direct`` — Ant locomotion
- ``Isaac-Humanoid-Direct`` — Humanoid locomotion
- ``Isaac-Reorient-Cube-Allegro-Direct`` — Allegro hand cube reorient


Manager-Based Warp Execution (``--frontend warp``)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Manager-based tasks do not need a parallel warp registration: the shared RL
CLI exposes ``--frontend {torch,warp}``, and ``--frontend warp`` adapts the
*stable* task configuration onto the warp runtime at build time (swapping each
MDP term for its warp twin). Select the Newton solver explicitly with
``presets=newton_mjwarp``. Stable tasks with full twin coverage:

- ``Isaac-Cartpole``
- ``Isaac-Ant``
- ``Isaac-Humanoid``
- ``Isaac-Reach-Franka``, ``Isaac-Reach-UR10``
- ``Isaac-Velocity-Flat-AnymalD``, ``-Cassie``, ``-G1``, ``-H1``, ``-UnitreeGo2``
(and their ``-Play`` variants)
- ``Isaac-Velocity-Rough-AnymalD``, ``-Cassie``, ``-G1``, ``-H1``, ``-UnitreeGo2``
(and their ``-Play`` variants) — the terrain-levels curriculum runs as a
Warp-native update on the :class:`~isaaclab.terrains.TerrainImporter` Warp
origin views

A missing twin is a hard error listing the affected terms, so a partially
covered task fails at build time rather than silently changing behavior.
``Isaac-Velocity-Rough-Digit`` is the one rough task not yet covered: its
``desired_contacts`` reward term has no Warp twin.


Quick Start
~~~~~~~~~~~

.. code-block:: bash

# Direct workflow
# Direct workflow: stable task, warp env implementation
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Cartpole-Direct-Warp-v0 --num_envs 4096
--task Isaac-Cartpole-Direct --frontend warp presets=newton_mjwarp --num_envs 4096

# Manager-based workflow
# Manager-based workflow: stable task on the warp runtime
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Velocity-Flat-AnymalC-Warp-v0 --num_envs 4096
--task Isaac-Cartpole --frontend warp presets=newton_mjwarp --num_envs 4096

# Manager-based workflow: velocity task on the warp runtime
./isaaclab.sh train --rl_library rsl_rl \
--task Isaac-Velocity-Flat-AnymalD --frontend warp presets=newton_mjwarp --num_envs 4096

All RL libraries with warp-compatible wrappers are supported: RSL-RL, RL Games, SKRL, and
Stable-Baselines3.
Expand Down Expand Up @@ -143,16 +150,6 @@ both running on the Newton physics backend. Measured over 300 iterations with 40
- 11,458
- 7,813
- -31.83%
* - AnymalB
- Manager
- 29,188
- 21,781
- -25.38%
* - AnymalC
- Manager
- 30,938
- 22,228
- -28.15%
* - AnymalD
- Manager
- 32,294
Expand All @@ -173,17 +170,7 @@ both running on the Newton physics backend. Measured over 300 iterations with 40
- 22,202
- 15,864
- -28.55%
* - A1
- Manager
- 15,257
- 9,907
- -35.07%
* - Go1
- Manager
- 16,515
- 11,869
- -28.13%
* - Go2
* - UnitreeGo2
- Manager
- 15,221
- 9,966
Expand All @@ -200,7 +187,7 @@ overhead. Reading the table above:
- **Manager-based classic RL** (Cartpole, Ant) — biggest gains (-52% to -54%). Many small
reward / observation terms with low compute per term, so per-launch CPU overhead dominated
the stable baseline.
- **Manager-based locomotion** (Anymal, G1, H1, Cassie, Unitree) — consistent -25% to -38%
- **Manager-based locomotion** (AnymalD, G1, H1, Cassie, UnitreeGo2) — consistent -21% to -38%
range. The MDP has more terms but the underlying physics step is heavier, so the relative
Python savings shrink.
- **Direct workflow** — gains scale with how much the env's step body was Python (Ant -51%,
Expand Down Expand Up @@ -228,7 +215,7 @@ specific to warp envs; for Newton physics limitations see :doc:`supported-featur
``class_type`` fields resolve to ``isaaclab_physx.*`` classes that depend on
``omni.physics.tensors`` (a Kit module the warp runtime does not initialise), and several
warp APIs (env-mask reset, CUDA graph capture) require the Newton articulation. Configure
the cfg with a Newton physics block (or ``physics=newton_mjwarp``).
the cfg with a Newton physics block (or ``presets=newton_mjwarp``).

**MDP coverage**

Expand Down Expand Up @@ -266,33 +253,40 @@ to estimate the gain for your own task before committing to a migration.

**Single-task A/B**

Run the same stable task id twice, differing only in ``--frontend``. Pass
``presets=newton_mjwarp`` to *both* runs so the physics backend is identical and the
measured difference isolates the frontend (manager pipeline + CUDA graph capture):

.. code-block:: bash

# Stable variant
# Torch frontend (stable managers)
uv run isaaclab benchmark training \
--rl_library rsl_rl \
--task <Task-Name>-v0 \
--task <Task-Name> \
--num_envs 4096 \
--max_iterations 500 \
--benchmark_formatter summary \
--output_path benchmarks/stable
--output_path benchmarks/torch \
presets=newton_mjwarp

# Warp variant — same task with -Warp- suffix
# Warp frontend (warp managers, CUDA-graph captured) — same task id
uv run isaaclab benchmark training \
--rl_library rsl_rl \
--task <Task-Name>-Warp-v0 \
--task <Task-Name> \
--frontend warp \
--num_envs 4096 \
--max_iterations 500 \
--benchmark_formatter summary \
--output_path benchmarks/warp
--output_path benchmarks/warp \
presets=newton_mjwarp

The ``summary`` formatter prints step time (min / mean / max) and total throughput. Compare
"step time" between the two runs to estimate the gain per env step.

**Sweep across all available tasks**

Run ``isaaclab benchmark training`` for each task in the stable set (cartpole, ant, humanoid,
locomotion, manipulation) and again with the ``-Warp-`` suffixed task ids, then diff the two output
locomotion, manipulation) and again with ``--frontend warp``, then diff the two output
directories.

**What to look at in the output**
Expand Down
Loading
Loading