Jump to content

Connect Leeroopedia MCP: Equip your AI agents to search best practices, build plans, verify code, diagnose failures, and look up hyperparameter defaults.

Implementation:Google deepmind Mujoco Engine Solver

From Leeroopedia
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

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

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment