SuperDex vs Newton
Meta released Project SuperDex on 24 August 2026 — a “contact-first physics engine purpose-built for tactile manipulation.” It ships no paper, no benchmark numbers and no comparison to any other engine. This report reads its source, installs its wheels, and measures it against Newton on the same scenes. The headline: SuperDex is a CPU engine that spends a full implicit Newton solve on one high-fidelity scene, where Newton spends cheap substeps on thousands. On a pile of rigid boxes the crossover is at 48 bodies. Also compared against MuJoCo, VBD/AVBD and Kamino, which turn out to occupy four corners of the same design space.
superdex-physics wheels, Python 3.12
Newton 1.5.0.dev0 · Warp 1.15.0.dev20260626 · MuJoCo Warp 3.10.0.2
RTX PRO 6000 Blackwell MIG 1g.24gb (46 SMs) · AMD EPYC 9B45, 192 cores
All numbers measured here, not quoted
Two engines that disagree about what a time step is for.
Newton's bet is that a manipulation policy needs billions of cheap samples, so the unit of work is a substep across thousands of GPU worlds. SuperDex's bet is that a manipulation policy needs samples that are right, so the unit of work is a converged implicit solve of one scene at a 16.7 ms step. Both bets are defensible. They are not the same product, and the benchmark that flatters one buries the other.
LinearSolverType.CUDA_CG exists and throws at runtimeWhat SuperDex genuinely does better
One unified implicit solver for five body types. Rigid, articulated, FEM soft, Kirchhoff rods and thin shells all contribute residual + Jacobian blocks to the same Newton–Raphson system, so a soft fingertip pressing a cloth over a rod is one monolithic solve. Newton reaches comparable coverage only by coupling separate solvers through a lagged proxy or ADMM layer.
Time-step robustness that is real and measurable. Resting penetration is identical to four significant figures from 1 ms to 200 ms. Nothing in Newton's rigid stack behaves like this — contact stiffness, substep count and iteration count all move the answer.
Analytic adjoints through contact. get_step_jacobian and GetContactForceWorldBackward differentiate an implicit contact solve. Newton's differentiable path is SolverSemiImplicit with a frozen contact normal.
Tendons as first-class physics, at three fidelities (elastic rod → spatial tendon → linear transmission), including a McKibben pneumatic-muscle model. Newton has no first-class tendons at all.
What will stop you using it for RL
No GPU, and no batch dimension anywhere in the engine. There is no nenv axis, no batched state tensor. SuperDex Lab gets parallel environments by forking Python processes. Against 679 k env-steps/s on a seventh of one Blackwell, that is not a gap you close with cores.
Threading stops helping at 4 workers and then hurts. On a 192-core machine, 4 worker threads give 1.7×; 16 threads are 2.7× slower than single-threaded. The parallelism is task-graph over islands, not data-parallel over the state vector.
Everything is compliant — there is no hard-constraint path. Joint limits, loop closures, rigid “joints,” pose controllers and contact are all penalty springs. Resting penetration is a designed-in function of load ÷ stiffness, and a stiff contact makes the body float 0.68 mm on the 1 mm detection threshold.
v1.0.0, four days old, no paper, no published numbers, 33 stars. MPC and system-ID are advertised in the README and absent from the code.
SuperDex is four products; only one of them is a physics engine.
The stack
SuperDex Physics — the engine. A C++ library whose internal codename is mochi; superdex_physics.h is a six-line alias shim over mochi_physics.h. Full source ships under Apache-2.0; there are no prebuilt blobs in the tree.
SuperDex Robotics — bot definitions (.superdex_bot JSON), OSC and joint-space PD controllers, a camera sensor, URDF import.
SuperDex Studio — a Filament-based desktop GUI for authoring meshes, prefabs and scenes, plus a SolidWorks/NX CAD exporter.
SuperDex Lab — “early preview” Gymnasium RL harness on Ray RLlib.
Q4 2026: SuperDex Teleop — on-device Quest 3 VR teleoperation in pure C++. This is clearly the point of the whole project; every gallery video was recorded through it.
Newton, for contrast
A Linux Foundation project from Disney Research, Google DeepMind and NVIDIA, built on NVIDIA Warp. GPU-first, OpenUSD-native, and deliberately plural: nine first-party solvers behind one Model/State/Control API, so you pick the physics that fits the scene.
Where SuperDex answers “which solver?” with one, for everything, Newton answers with MuJoCo for articulated robots, VBD for deformables, Kamino for kinematic loops and hard contact, MPM for granular, XPBD for cheap and fast — and an experimental coupling layer to run them together.
That plurality is Newton's real architectural claim, and it is the axis on which the two projects are least comparable.
mochi's headers and from introspecting the installed wheel — not from documentation.It is a variational implicit integrator solved by Newton–Raphson. Not LCP, not PGS, not XPBD, not TGS.
Every physical term — inertia, gravity, stress, contact, constraints, tendons — contributes an objective, residual and d-residual triple to a per-island system of nonlinear equations. One Newton solve per stage advances the step. Introspecting the shipped wheel prints the whole design in one screen:
the solver taxonomy, read out of the installed package>>> from superdex import physics as sp
IntegrationMethod: BACKWARD_EULER (default), BDF2, BDF3,
DIRK22, DIRK23, DIRK33, SYMPLECTIC_DIRK12, SYMPLECTIC_DIRK22
NonLinearSolverType: NEWTON (default), BFGS, SR1
LineSearchType: RESIDUAL_NORM (default), ARMIJO, WOLFE_WEAK, WOLFE_STRONG, ...
PsdProjectionMode: ALWAYS (default), NEVER, IF_FAIL_RETRY, IF_FAIL_ALWAYS
LinearSolverType: AUTO (default), CG, GMRES, MINRES, LDLT, LU, AUGMENTED_CG,
PARALLEL_CG, ASYNC_CG, CUDA_CG, CUDA_GMRES, ...
PreconditionerType: PER_ACTOR (default), AMG, IC0, ILU0, SSOR, BLOCK_JACOBI, ...
LinearToleranceStrategy: EISENSTAT_WALKER2 (default) # inexact-Newton forcing terms
ActorType: RIGID, ARTICULATED, SOFT, SHELL, ROD
SoftMaterialType: NEO_HOOKEAN, ST_VENANT_KIRCHHOFF, ARAP, LINEAR_ELASTIC,
ACTIVE_NEO_HOOKEAN, ACTIVE_SHAPE_TARGETING_ARAP
CoulombFrictionModel: C1_REGULARIZED (default), CINF_REGULARIZED
Three things in that listing are unusual for a robotics engine and worth dwelling on.
Stiff ODE integrators
BDF2/BDF3 and three diagonally-implicit Runge–Kutta schemes, annotated in the headers with their stability class (“L-stable”, “A-stable”). Two are symplectic. No robotics engine ships this menu; this is the vocabulary of stiff FEM, not of game physics.
PSD projection, always on
psd_proj_mode = ALWAYS eigen-clamps the assembled Hessian every iteration. That is the standard trick for making implicit FEM robust to element inversion — and it tells you the contact and constraint terms are energies, not complementarity conditions.
Inexact Newton
Eisenstat–Walker forcing terms adapt the inner Krylov tolerance to the outer residual, so early Newton iterations solve the linear system loosely. Combined with AUGMENTED_CG Krylov recycling and a preconditioner-recycling manager, this is a serious numerical-linear-algebra stack.
The defaults that decide the character of the engine
| Parameter | Default | Consequence |
|---|---|---|
non_linear_solver.max_iter | 4 | Four Newton iterations per stage. This is the real-time budget; convergence is a hope, not a guarantee. |
line_search_max_iter | 4 | Residual-norm line search, cheap. |
linear_solver | AUTO | Direct LDLT below 50 DoFs, CG above. The header admits the threshold “has not been tuned yet.” |
contact.penalty_coefficient | 1e9 Pa/m | Contact is a smoothed penalty spring. Sets resting penetration — see below. |
penalty_threshold_default | 0.001 m | Contact activates 1 mm before touching. Stiff contacts therefore levitate. |
penalty_smoothing_half_distance | 0.005 m | C²-continuous “PolyReLU” instead of a kink at zero gap. |
coulomb_friction_coefficient | 0.5 | Isotropic cone, IPC-style C¹ mollifier, friction_falloff_vel = 0.01 m/s. |
precision | fp32 | fp64 is a separate wheel (superdex-physics-fp64) selected by SUPERDEX_PRECISION=double. |
| gravity | −Y | Physics is Y-up; Robotics and Studio are Z-up. Flagged in comments in both example families. |
limitStiffness. Closed kinematic loops are ArticulatedCycleJointParams with stiffness = 50000. Rigid “joints” between bodies are constraints with stiffness = 1e6. Pose controllers are implicit PD terms baked into the Newton system. Everything is a spring, everything has a saturation, and nothing is exactly enforced. This is a coherent design — a single differentiable energy that a Newton solver can descend — but it is the opposite of Kamino's premise.SuperDex, MuJoCo, VBD/AVBD and Kamino are four different answers to “what is a contact?”
These are not four points on a quality axis. They are four different mathematical objects, and each one buys a property the others cannot express.
| Engine | Contact is… | Solved by | Coordinates | Buys you | Costs you |
|---|---|---|---|---|---|
| SuperDex Physics | a smoothed penalty energy + IPC-mollified Coulomb friction | Newton–Raphson on a variational implicit step (BDF/DIRK), PSD-projected | maximal for rigid, reduced for articulated, nodal for deformables — in one system | huge stable steps; one solve couples rigid+soft+shell+rod; differentiable by construction | CPU only; penetration is designed in; no exact constraints; no batching |
| MuJoCo / MJWarp | a soft convex constraint (regularised, Gauss principle) | Newton or CG on the dual QP over constraint impulses, warm-started | generalized (CRB + RNE) | fastest articulated dynamics on GPU; islands + sleeping; enormous ecosystem | convex-hulled meshes; slip is inherent to the soft model; penetration set by solref |
| VBD / AVBD | a penalty potential, promoted to augmented-Lagrangian for hard slots | vertex-block Gauss–Seidel coordinate descent, graph-coloured, on GPU | vertex positions; 6-DoF blocks for rigid | unconditional stability, monotone energy decrease, arbitrary iteration budget; superb at deformables and huge body counts | information propagates only as fast as iterations × connectivity; not differentiable in Newton |
| Kamino | a nonlinear complementarity problem — Signorini–Coulomb, unconvexified | Proximal-ADMM with Nesterov acceleration, block-Cholesky or matrix-free CR | maximal (independent SE(3) per body) | genuinely hard contact, restitutive impacts, native kinematic loops, heterogeneous worlds | expensive; rigid-only; not differentiable; explicitly beta and “discouraged” |
SuperDex and Kamino are exact opposites
Both landed in 2026, both call themselves contact-focused, and they disagree about the fundamental object. Kamino refuses to convexify or soften: contact is a complementarity condition and the solver's job is to satisfy it. SuperDex refuses to leave the smooth world: contact is a C²-continuous energy and the solver's job is to minimise it.
The consequences are visible in the API. Kamino exposes restitution; SuperDex has no restitution parameter at all and instead ships a fitted rational calibration converting a desired coefficient of restitution into a normal viscous damping coefficient, valid at one impact velocity.
SuperDex and VBD are close cousins
Both minimise the same variational implicit-Euler objective. Both use stable Neo-Hookean energies from Smith et al. 2018 and IPC-smoothed friction. They differ only in how they descend it: VBD does block coordinate descent one vertex at a time (embarrassingly parallel after graph colouring, ideal for a GPU), SuperDex assembles the global Hessian and does a real Newton step with a Krylov solve (better convergence per iteration, needs sparse linear algebra, natural on a CPU).
That single choice — local Gauss–Seidel vs global Newton — is what puts one on a GPU and the other on a CPU.
newton.solvers.SolverKamino, authored by Disney Research (Tsounis et al., arXiv:2603.16536), Proximal-ADMM over an NCP. It is not a VBD variant. Its published result is a walking policy on DR Legs — a biped with six nested kinematic loops — at ~3 600 env-steps/s across 4 096 environments.No GJK, no EPA, no convex decomposition. Surface quadrature points against a signed distance field.
SuperDex's narrow phase is not feature-pair generation. The colliding actor emits sample points — three per boundary triangle by default, configurable up to sixteen — and the collider answers each with an SDF value and gradient. Grepping the whole tree for gjk or epa returns nothing.
Why that matters for dexterous manipulation
MuJoCo convex-hulls every mesh, which is exactly why the gear teeth in the tight-fit insertion study disappeared and the train slipped 100%. SuperDex never needs a convex hull: ColliderType.AUTO maps a mesh on a volumetric actor to SDF, and a shell or rod to POINT_CLOUD. Non-convex contact is the default path, not an escape hatch.
It also means contact count is not a fixed budget. There is no nconmax to overflow, no rigid_contact_max to silently truncate. The contact set is however many quadrature samples are inside the threshold.
What it costs
Grid SDFs must be baked per shape at init — the code warns that it is “expensive” and complains about non-watertight meshes. Contact resolution is tied to mesh tessellation, so a coarse mesh gives coarse contact whether or not the geometry is right.
ColliderType.MESH is marked [Experimental], “Performance is slow”. Self-contact on point clouds is off by default, described in the source as “still highly experimental, not optimized yet, and may severely degrade performance.”
The friction model is IPC's, verbatim
C1_REGULARIZED is the Incremental Potential Contact mollifier — the header cites Li et al. 2020 and reproduces the C¹ interpolant of the unit step. Friction is an isotropic cone, not a pyramid, and it enters the Newton system as an energy with a saturating Hessian. Newton's VBD solver uses the same mollifier, with one difference the Newton source is explicit about:
newton/_src/solvers/vbd/particle_vbd_kernels.py# Different from IPC, we treat the contact normal as constant
# this significantly improves the stability
SuperDex makes the same simplification through explicitNormals, and in fact requires it for differentiable scenes.
On one scene, SuperDex beats a GPU until the scene reaches 48 bodies.
The same experiment in both engines: N unit-density 10 cm boxes stacked in a cube lattice, dropped onto a ground plane, stepped at 16.7 ms, timed after settling. SuperDex single-threaded on one EPYC core; Newton on the GPU slice with the whole step in a captured CUDA graph.
| bodies | SuperDex (CPU, 1 core) | Newton XPBD | Newton MuJoCo | Newton Kamino | SuperDex ÷ XPBD |
|---|---|---|---|---|---|
| 1 | 0.0065 ms | 0.201 ms | 0.250 ms | 0.255 ms | 0.03× |
| 8 | 0.0498 ms | 0.231 ms | 0.520 ms | 2.327 ms | 0.22× |
| 27 | 0.124 ms | 0.280 ms | 1.026 ms | stalled | 0.44× |
| 64 | 0.402 ms | 0.280 ms | 12.13 ms | — | 1.44× |
| 125 | 1.054 ms | 0.283 ms | IndexError | — | 3.73× |
| 216 | 2.392 ms | 0.286 ms | IndexError | — | 8.35× |
SuperDex's cost grows as roughly N1.6 — superlinear, as you would expect from a sparse factorisation and a broad phase that both scale with contact count, and as the AUTO heuristic flips from dense LDLT to CG past 50 DoFs.
SolverMuJoCo costs 12 ms at 64 free bodies — 12× the cost at 27 — and then fails outright at 125 with IndexError: index 19 is out of bounds for axis 0 with size 19 during model conversion. SolverKamino emitted a per-step host-side warning (rigid_contact_max (1000) exceeds model_max_contacts_host (672); contacts will be truncated) that dominated wall-clock and stalled the sweep past 8 bodies. Both are worth filing; neither is a statement about the underlying algorithms.And then the batch axis appears, and the comparison stops being close.
The previous plot is the only regime where SuperDex competes on speed. Newton's design point is not one scene — it is thousands of identical worlds in one kernel launch, which is what an RL rollout actually needs.
The dotted line deserves scepticism, and it is drawn only to be argued with. It assumes 192 independent SuperDex processes scale linearly, which ignores memory bandwidth, and it credits SuperDex with hardware that costs far more than the GPU slice it is being compared against. Even granting all of it, one seventh of a Blackwell running Newton lands within a factor of ~6 of an entire 192-core EPYC running SuperDex — and the GPU number is throttled by a partition, not by the algorithm.
The MuJoCo line is included because it is a useful reminder that solver choice dominates engine choice. On this scene — eight free-floating boxes with no articulation, which is the worst possible shape for a generalized-coordinate engine — SolverMuJoCo manages 863 env-steps/s at 16 worlds, 66× slower than XPBD, before failing outright at 64. Quoting “Newton” a single throughput number is meaningless; quoting SuperDex one is at least well-defined, because it only has one solver.
fork(). HybridVectorEnv is documented as “multiple async workers using AsyncVectorEnv, where each worker runs a SyncVectorEnv containing multiple environments” — N processes × M sequential envs, with a refcounted SceneManager to share scene memory. There is no vectorisation over worlds inside the engine, and given the thread-scaling result below, there may not be an easy path to one.The time-step claim is true. The contact-softness claim is the price.
SuperDex's examples repeat one claim verbatim: “fully-implicit integration, enabling substantially larger stable time steps than explicit or semi-implicit methods … 10–25 ms steps remain robust.” A single box dropped from 1 m and left to settle for 3 s tests it directly.
That is a genuinely strong result and it is the engine's best feature. But the flip side is the number itself: the box rests 0.308 mm inside the floor, and where it rests is a pure function of load ÷ stiffness.
penalty_threshold and a stiff spring never lets it through. At k=1e6 the Newton solver reports Solution explosion detected.penalty_coefficient is a single scalar in Pa/m with an obvious meaning, rather than MuJoCo's solref/solimp five-tuple — and that geom_priority cannot silently discard what you authored. Its disadvantage is that there is no hard-contact escape hatch at all.Determinism
Five identical runs produced bit-identical final positions (0.04969199374318123). Single-threaded and single-scene, so this is the easy case — but it is a clean pass.
Iteration insensitivity
1 → 16 Newton iterations changes resting penetration by 0.5 µm. The solve converges well inside the default budget of 4 for this scene; get_solver_stats() reported 0 iterations at rest.
Where it breaks
At a 500 ms step the box never moved at all. At penalty_coefficient = 1e6 the solver logged an explosion. Both are far outside the advertised envelope, and both fail loudly rather than silently.
Threading helps to four workers, then actively hurts.
SuperDex's only scaling lever is initialize(num_worker_threads=N). The docstring promises that “for scenes with a large number of DoFs … running with multiple threads will improve performance.” On a 192-core EPYC, with 1 899-tet FEM ducks — precisely the high-DoF case the docs point at — it does not hold up.
The mechanism is visible in the source. Parallelism is task-graph over simulation islands, not data-parallel over the state vector: islands are scheduled as concurrent tasks on a Google marl fibre scheduler, collision detection overlaps with articulated-Jacobian updates, and small islands explicitly opt out via island::ShouldRunSingleThreaded. A scene with one duck has one island, so there is nothing to overlap — only threads to synchronise.
num_worker_threads=0. The t-shirt — a self-colliding shell with thousands of point-cloud samples, i.e. genuinely wide work — is the one that asks for -1. The engine authors appear to know exactly where threading pays.The CUDA solvers are in the API and cannot run.
LinearSolverType advertises CUDA_CG, CUDA_GMRES and three experimental cuSPARSE factorisations. Eight .cu files ship in the tree. It is reasonable to read all that as a GPU engine. It is not one.
selecting each linear solver on a 1 899-tet soft-body sceneCUDA_CG FAIL Error: mochi_scene.cpp(423):
CUDA solvers require building with CUDA.
CUDA_GMRES FAIL (same)
EXPERIMENTAL_CUDA_SPARSE_CHOLESKY FAIL (same)
EXPERIMENTAL_CUDA_SPARSE_LDLT FAIL (same)
PARALLEL_CG OK ConvergenceStatus.CONVERGED
CG OK ConvergenceStatus.CONVERGED
And it cannot be fixed by rebuilding from the public source: MOCHI_USE_CUDA defaults to 0, and grepping every CMakeLists.txt and .cmake in the repo for it returns nothing. There is no CMake option, no find_package(CUDAToolkit), no enable_language(CUDA). The CMake preamble sets MOCHI_INTERNAL OFF … FORCE with the comment “Only external builds are supported with CMake” — CUDA is wired up in Meta's internal Buck build, which was not released.
CudaCG, CudaGMRES and sparse factorisations — the inner Krylov step of each Newton iteration. Assembly, collision detection, SDF queries and the outer Newton loop are CPU. That is an accelerated linear-algebra backend, not a GPU simulation architecture, and it would not create a batch dimension. A macOS-ARM target and an AVX2/NEON SIMD layer with hand-written width-specialised kernels confirm where the engineering effort went.One detail cuts the other way and is worth flagging as a hint about intent. The SIMD emulator header says:
mochi_config.h// Emulate 32 16-byte SIMD registers. A common use case for SIMD emulation is NVIDIA GPUs, where
// each thread has access to 255 32-bit registers.
Somebody has thought about running these kernels on a GPU. It has not shipped.
Where SuperDex is ahead: one solver for five body types, and tendons that are actually modelled.
SolverCoupled/SolverCoupledADMM/SolverCoupledProxy layer with a one-step lag. SuperDex's five actor types are monolithically coupled by construction.Continuum coverage in one Newton system
Soft — tetrahedral FEM with six constitutive models, including stable Neo-Hookean (Smith et al. 2018) and two active materials for muscle (Klár et al. 2020 shape targeting).
Shell — discrete triangle shell, 6-node bending stencil, thickness-integrated from 3D isotropic properties. The t-shirt.
Rod — Kirchhoff rods with axial, bending and torsional energy, citing the Columbia discrete-elastic-rods and discrete-viscous-threads formulations. The rope braid.
Soft-skinned — a tet mesh bound to an articulated link, coupled through explicit off-diagonal Hessian blocks. This is how the soft fingertips work, and it is the single most manipulation-relevant capability in the engine.
Reduced-order models — nobody else ships this
mochi_hyper_reduction.cpp, polynomial and neural CROM latent bases, contact-force-informed basis adaptivity (modes selected online by Φᵀ·f_node), and automatic ROM↔FOM switching based on the number of active collision points.
That is a research-grade answer to “how do you afford a deformable fingertip at 1 kHz” and it has no counterpart in Newton, MuJoCo or Isaac. The neural path is gated behind MOCHI_USE_TORCH, which is off by default.
Tendons at three fidelities
A Transmission abstraction maps joint DoFs to a scalar displacement: LinearTransmission (constant moment arm, MuJoCo-style fixed tendon), SpatialTendon (waypoint routing, geometry-derived moment arms), or a full elastic rod. Actuators include a McKibben pneumatic muscle model from Chou & Hannaford. example_tendon_comparison.py runs all three side by side with matched stiffness.
SolverVBD covers cloth, FEM soft bodies, cables and rigid bodies (via AVBD) on the GPU, with stable Neo-Hookean membranes and IPC friction. The published AVBD numbers are startling — 510 000 rigid bodies in 10.3 ms of solver time on an RTX 4090, 51× faster than XPBD on the same scene. What Newton lacks is not deformable capability but monolithic coupling: a soft fingertip on a MuJoCo-driven hand goes through SolverCoupledProxy with a lagged impulse, not through one linear system.SuperDex differentiates through contact analytically. This is the least expected thing in the release.
There is a superdex.physics.diffsim module, and it is not a stub. It implements adjoint differentiation of the implicit step via the implicit function theorem, with an inner adjoint solve and a full set of vector-Jacobian products.
superdex.physics.diffsimmake_scene_differentiable(scene)
prepare_back_propagate(scene, state_new, state_old)
back_propagate(scene)
get_step_jacobian(scene, state_new, state_curr, state_old) -> (jac_curr, jac_old)
# vector-Jacobian products, including through contact:
get_contact_force_world_backward(...)
get_contact_force_from_actor_world_backward(...)
get_articulated_pose_backward(...)
set_articulated_target_pose_backward(...)
set_external_forces_on_dofs_backward(...)
# plus Lie <-> quaternion <-> rotation-vector gradient converters
| SuperDex | Newton | |
|---|---|---|
| Mechanism | Hand-derived analytic Jacobians + adjoint solve (implicit function theorem) | Warp wp.Tape() reverse-mode autodiff over the kernel graph |
| Which solver | The only solver — rigid, articulated and contact terms | SolverSemiImplicit and SolverFeatherstone only, both marked “basic”. MuJoCo, VBD, XPBD, Kamino: not differentiable |
| Through contact? | Yes, with explicitNormals = true required | First-order tangent-plane post-process; narrow phase frozen, normal treated as constant |
| Hessian-vector products | Finite differences, with optional per-Hvp validation | Exact through the tape |
| Framework integration | None — raw VJP callbacks you wire up yourself | Native PyTorch/JAX interop through Warp |
| Not differentiable | Skinning, blending and ROM Jacobians | Particle-particle contacts corrupt gradients in SolverSemiImplicit |
The comparison is genuinely close, and it is the one axis where SuperDex's architecture pays an unambiguous dividend: differentiating an implicit solve is a linear solve you already did, whereas differentiating an explicit substep chain is a tape that grows with substep count. If SHAC-style short-horizon actor-critic on contact-rich manipulation is the goal, SuperDex's formulation is the more principled starting point — on a CPU, for one environment, with finite-difference Hvps.
Imperative scene graph with handles, versus a builder that finalises to device arrays.
SuperDex — mutable scene, live actors
superdexphysics.initialize(num_worker_threads=0)
scene = physics.create_scene("Rigid Bodies Scene")
scene.set_gravity([0, -9.8, 0]) # Y-up!
plane = physics.create_plane_shape(normal=[0,1,0], distance=-1.0)
sphere = physics.load_shape_from_file(
file_path=str(resolve_asset("sphere/icosphere_3subdiv.1.mochi.json")),
bake_scale=[0.2, 0.2, 0.2])
a = scene.create_rigid_actor(
name="sphere", shape=sphere, density=1000.0,
world_from_local=physics.TransformRT(translation=[-0.5, 0.2, 0]),
collider_type=physics.ColliderType.SPHERE)
scene.create_rigid_actor(name="ground", shape=plane, is_static=True)
physics.prefab.add_to_scene(prefab_path=..., root_path=..., scene=scene,
params=physics.prefab.PrefabParams(name="tablePrefab"))
while True:
scene.step(1/60)
T = a.get_root_transform()
f = a.get_contact_force_world()
Actors are live objects with ~140 methods. State snapshot/restore is first-class (capture_state, restore_state, capture_state_to_bytes, is_equal_state) and is what RL resets are built on. Bindings are generated from a C++ reflection system, with 19k lines of .pyi stubs and units in the attribute metadata.
Newton — build once, then it is arrays
newtonquadruped = newton.ModelBuilder()
quadruped.default_joint_cfg.armature = 0.01
quadruped.add_urdf(path, xform=..., floating=True)
scene = newton.ModelBuilder()
scene.replicate(quadruped, world_count=100) # <-- the batch axis
scene.add_ground_plane()
model = scene.finalize() # -> device arrays
solver = newton.solvers.SolverXPBD(model)
state_0, state_1 = model.state(), model.state()
control, contacts = model.control(), model.contacts()
with wp.ScopedCapture() as cap: # whole step in one graph
for _ in range(sim_substeps):
state_0.clear_forces()
model.collide(state_0, contacts)
solver.step(state_0, state_1, control, contacts, sim_dt)
state_0, state_1 = state_1, state_0
graph = cap.graph
for frame in range(N):
wp.capture_launch(graph)
The replicate() call and the graph capture are the two lines that do not exist in SuperDex and cannot easily be added. In exchange, Newton's model is immutable after finalize(), which is a real ergonomic cost for authoring and interactive editing.
Assets
| SuperDex | Newton | |
|---|---|---|
| Native format | Custom JSON + HDF5: .superdex_bot, .mochi_prefab, .mochi_scene, .mochi.h5 | OpenUSD, first-class, with applied physics schemas and a live-stage importer |
| Import | URDF only (runtime + Studio). Exactly one .urdf and one .xml in the whole asset tree, both under test/ | URDF, MJCF, USD — all three on ModelBuilder, accepting paths, URLs or raw strings |
| Robot library | 35 bots: FR3, OpenArm, Robotiq 2F-85, Allegro v5, Dexterity DG5F (±Seed tactile), Wuji Hand 2, Oculus XR hand | Whatever you import; examples ship G1, H1, ANYmal, Franka, Allegro, UR10 |
| Authoring | SuperDex Studio GUI + CAD exporter for SolidWorks/NX — a genuine advantage | Python, or any USD tool |
| Viewers | Remote debugger (examples block until it attaches), Polyscope, UnrealCV bridge | ViewerGL, ViewerRTX, ViewerUSD, ViewerRerun, ViewerViser, ViewerNull |
if physics.debugger.attach(): while physics.debugger.is_attached(): scene.step(dt). Headless, attach() returns false and the example exits having simulated nothing. Every benchmark in this report drives scene.step() directly instead. Assets also need SUPERDEX_ASSETS_PATH set when running from a wheel rather than the source tree.They are not competitors. Pick by whether your bottleneck is samples or fidelity.
If you are training a policy, this changes nothing
SuperDex has no GPU, no batch dimension, and thread scaling that peaks at four workers. Newton at 1 024 worlds on a seventh of a GPU already outruns an optimistic upper bound for SuperDex on 192 CPU cores, and the published MJWarp numbers on a full GPU are two orders of magnitude beyond that. SuperDex Lab is honestly labelled “early preview,” ships three MuJoCo-Gym ports as its benchmark suite, and the MPC and system-ID capabilities in its README do not exist in the code.
If you are simulating one deformable-rich manipulation scene, take it seriously
Soft fingertips monolithically coupled to an articulated hand, non-convex SDF contact with no convex-hulling, spatial tendons with geometry-derived moment arms, Kirchhoff rods, self-colliding shells, and per-node contact forces as a first-class query. That combination does not exist anywhere else in one solver. For tactile-sensor modelling, VR teleoperation and haptics — which is transparently what it was built for — it is well ahead of Newton.
Steal the contact model's ergonomics
One scalar in Pa/m, one detection threshold in metres, one smoothing half-distance in metres, and a documented geometric-mean pair combination rule. Compare with solref/solimp, or with Newton's ke/kd/kf/ka/kh spread across solvers that variously honour or ignore each field. The physics is the same compliant contact; the parameterisation is much easier to reason about, and it is why two independent sweeps here collapsed onto one curve.
The 10–25 ms claim is real and under-sold
Measured invariance holds to 200 ms. If Newton wants that property in a rigid solver it is an argument for the variational-implicit family — which is to say, for pushing AVBD further into the rigid path rather than for another projection scheme.
Watch the contact-first framing, not the benchmark
Meta published no numbers, no paper and no comparison, and shipped a v1.0.0 whose gallery is entirely VR teleoperation. Reading it as a competitor to Isaac Lab or Newton misreads the product. Reading it as the physics tier under a Quest-native dexterous-teleop data-collection pipeline — arriving Q4 2026 — explains every engineering choice in this report, including the CPU one.
Newton's remaining edge, restated fairly
Nine solvers behind one API; batched worlds and CUDA graph capture as native concepts; OpenUSD; MJCF/URDF/USD import; a hard-contact NCP option (Kamino) and a granular option (MPM) that SuperDex has no answer for; tiled camera, contact, IMU and transform sensors; opt-in determinism across five solvers; and a monthly release cadence with a deprecation policy.
Newton's gaps that SuperDex highlights
No first-class tendons or working muscles. Deformable↔rigid coupling is lagged rather than monolithic. Differentiability is confined to two solvers and freezes the contact normal. No reduced-order deformables. And two crashes surfaced by a 200-line benchmark in this report — MuJoCo conversion failing at 125 free bodies, and Kamino's per-step host-side contact warning dominating wall-clock.
Everything here runs from four scripts.
setup# SuperDex — wheels only, no build needed
git clone --branch stable https://github.com/facebookresearch/project_superdex
cd project_superdex && uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python superdex
export SUPERDEX_ASSETS_PATH=$PWD/superdex_physics/assets
# Newton
cd newton && uv sync
the four measurements# 1. single-scene crossover
.venv/bin/python scripts/sdx_bench.py rigid 0 # SuperDex, N = 1..216 bodies
.venv/bin/python scripts/newton_bench.py single # Newton, all solvers, same scene
# 2. batch scaling
.venv/bin/python scripts/newton_bench.py scale # 1..4096 worlds
# 3. accuracy: penetration, time step, determinism
for m in dt penalty mass iters determinism; do
.venv/bin/python scripts/sdx_accuracy.py $m | grep '^{'
done
# 4. thread scaling
for t in 0 2 4 8 16; do .venv/bin/python scripts/sdx_threads.py $t; done
Scripts are in scripts/, raw JSONL in data/. Two cautions if you re-run: run one benchmark process at a time — an early pass with three concurrent processes on the same MIG slice reported XPBD at 4.15 ms where the clean number is 0.237 ms, a 17× error — and filter stdout with grep '^{', because mochi's solver warnings and Warp's module-load messages both go to stdout and will corrupt a JSONL parse.
get_step_jacobian gradients agree with finite differences on a grasp.