Implementation:Google deepmind Mujoco Engine Solver
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Constraint Solving, Optimization |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Implements all constraint solvers for MuJoCo: PGS, NoSlip, CG (conjugate gradient), and Newton, including island-aware variants.
Description
engine_solver.c contains the full suite of constraint solvers that resolve contact and joint limit forces in MuJoCo simulations. The PGS (Projected Gauss-Seidel) solver iterates over constraints individually, projecting forces onto friction cones. The NoSlip solver post-processes friction to eliminate numerical slip. The CG (Conjugate Gradient) and Newton solvers are primal methods that minimize a cost function over constraint forces using line search with Wolfe conditions, with Newton additionally computing and factorizing a Hessian matrix. All primal solvers support island-based decomposition for parallel solving. The file includes utilities for solver statistics tracking, dual-to-primal mapping, AR matrix diagonal extraction, block extraction, residual computation, and cost change evaluation. The Newton solver features incremental Hessian updates and cone-aware modifications.
Usage
Called during the forward dynamics constraint projection step. The solver type is selected via m->opt.solver (PGS, CG, or Newton). Island-aware variants (mj_solCG_island, mj_solNewton_island) are called when island decomposition is active.
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_solver.c
- Lines: 1-1992
Key Functions
// Projected Gauss-Seidel solver
void mj_solPGS(const mjModel* m, mjData* d, int maxiter);
// NoSlip post-processing solver
void mj_solNoSlip(const mjModel* m, mjData* d, int maxiter);
// Conjugate Gradient solver (primal)
void mj_solCG(const mjModel* m, mjData* d, int maxiter);
void mj_solCG_island(const mjModel* m, mjData* d, int island, int maxiter);
// Newton solver (primal)
void mj_solNewton(const mjModel* m, mjData* d, int maxiter);
void mj_solNewton_island(const mjModel* m, mjData* d, int island, int maxiter);
// internal primal solver (shared by CG and Newton)
static void mj_solPrimal(const mjModel* m, mjData* d, int island,
int maxiter, int flg_Newton);
// primal solver components
static void PrimalPointers(const mjModel* m, const mjData* d,
mjPrimalContext* ctx, int island);
static void PrimalAllocate(mjData* d, mjPrimalContext* ctx, int flg_Newton);
static void PrimalPrepare(mjPrimalContext* ctx);
static void PrimalEval(mjPrimalContext* ctx, mjPrimalPnt* p);
static mjtNum PrimalSearch(mjPrimalContext* ctx, mjtNum tolerance,
mjtNum ls_iterations);
// Newton-specific Hessian operations
static void MakeHessian(mjData* d, mjPrimalContext* ctx);
static void FactorizeHessian(mjData* d, mjPrimalContext* ctx, int flg_recompute);
static void HessianCone(mjData* d, mjPrimalContext* ctx);
static void HessianIncremental(mjData* d, mjPrimalContext* ctx, const int* oldstate);
Import
#include "engine/engine_solver.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| m | const mjModel* | Yes | Physics model with solver parameters |
| d | mjData* | Yes | Simulation state with constraint data |
| maxiter | int | Yes | Maximum solver iterations |
| island | int | Yes (island variants) | Island index to solve |
Outputs
| Name | Type | Description |
|---|---|---|
| d->efc_force | mjtNum* | Constraint forces (dual space) |
| d->qfrc_constraint | mjtNum* | Constraint forces mapped to joint space |
| d->qacc | mjtNum* | Constrained acceleration in joint space |
| d->solver | mjSolverStat[] | Per-iteration solver statistics |
| d->solver_niter | int[] | Number of solver iterations per island |