Solver backends#

All backends implement Solver and minimise the same weighted least-squares task cost. Pick based on step semantics and whether you need hard limits.

Quick reference#

Name

make_solver

Use when

DLS

"dls"

Real-time velocity IK (Mink-style differential step); default

LM

"lm"

Few Newton-style steps on q per control tick

L-BFGS

"lbfgs"

Multi-iteration reach with quasi-Newton

Constrained

"constrained"

Hard limits via box / general-inequality ADMM (Mink QP equivalent)

Only ConstrainedSolver has supports_limits = True. Cost-only backends (DLS / LM / L-BFGS) ignore limits= if passed explicitly.

Damped least squares (default)#

solver = mw.make_solver(cfg, "dls", damping=1e-12)
v = solver.solve(tasks, dt=0.01)
cfg.integrate_inplace(v, dt)

DLSSolver is also exposed as mink_warp.IKSolver.

Levenberg–Marquardt#

solver = mw.LMSolver(cfg)
solver.solve_and_integrate(tasks, dt=0.01, iterations=5)

Advances q on device; returns equivalent tangent velocity.

L-BFGS#

solver = mw.LBFGSSolver(cfg, history=10)
solver.solve_and_integrate(tasks, dt=0.01, iterations=20)

Hard limits (constrained)#

Mink-compatible shortcut — auto-builds ConstrainedSolver:

from mink_warp.limits import ConfigurationLimit, VelocityLimit

v = mw.solve_ik(cfg, tasks, dt=0.01, limits=None)  # default joint limit
v = mw.solve_ik(
    cfg, tasks, dt=0.01,
    limits=[ConfigurationLimit(model), VelocityLimit(model, 3.0)],
)

Explicit solver (tuning admm_iters, use_inequalities, etc.):

solver = mw.ConstrainedSolver(cfg, limits=[ConfigurationLimit(model)])
v = solver.solve(tasks, dt=0.01)

limits=[] disables hard limits (regularized DLS inside the constrained backend).

Full guide: Constrained IK (hard limits).

Functional shortcuts#

v = mw.solve_ik(cfg, tasks, dt)                    # unconstrained DLS
q = mw.solve_ik_iterations(cfg, tasks, dt, iterations=10)

See Solvers for the full API.