Mink API parity#
mink-warp mirrors Mink [Mink] where it helps
porting examples and tests. The implementation differs: Mink solves a QP on CPU
with qpsolvers; mink-warp assembles normal equations on GPU and uses Warp
linear solvers.
What matches#
Mink |
mink-warp |
|---|---|
|
|
|
|
|
|
|
|
|
|
Custom |
|
|
|
|
|
Residual form \(H = W^T W\), \(c = -W^T e\) |
Same stacking in |
What differs#
Batching. Every buffer is leading-dimension nworld. Targets are
wp.array (nworld, …) or broadcast from a single pose.
Device types. Hot-path arrays are wp.array. Use .numpy(),
to_wp(), or *_numpy / *_se3 helpers at boundaries.
Solvers. Mink selects a QP backend ("daqp", etc.). mink-warp uses
DLSSolver by default; LM / L-BFGS / constrained
backends are GPU-native (see Solver backends).
Limits. Mink enforces hard limits inside the QP (G Δq ≤ h). mink-warp offers:
Soft:
JointLimitTask(least-squares penalty)Hard:
ConfigurationLimit,VelocityLimit,CollisionAvoidanceLimit,LinearInequalityLimitviaConstrainedSolverorsolve_ik(..., limits=…)
Box limits use a fast box-ADMM path; general rows use reduced OSQP-ADMM
(see Constrained IK (hard limits)). solve_ik(..., limits=None) matches
Mink’s default ConfigurationLimit.
Integration. Both use MuJoCo’s position integrator semantics; mink-warp
routes through mjwarp and uses out-of-place qpos writes for CUDA graphs.
Porting checklist#
Replace
Configuration(model)withConfiguration(model, nworld=B).Upload targets once:
task.set_target(wp.array(...))or set from configuration.Replace
solve_ik(..., "daqp")withsolve_ik(...)(unconstrained) orsolve_ik(..., limits=None)(Mink default joint limit).Keep
integrate_inplacein the loop unless usingsolve_and_integrate.Run parity tests:
uv run pytest tests/ -k mink(requiresminkextra).