Implementation:Google deepmind Mujoco Engine Inline
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Linear Algebra, Performance Optimization |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Provides high-performance inlined vector and quaternion math functions optimized for the MuJoCo physics engine hotpath.
Description
engine_inline.h contains private, statically inlined mathematical utility functions prefixed with mji_ that serve as performance-optimized replacements for the public mju_ math functions. The key optimization comes from the use of the C restrict qualifier, which guarantees no pointer aliasing and enables the compiler to produce more efficient assembly output with fewer memory copies. These functions cover 3D vector operations (copy, scale, add, subtract, normalize), 3x3 matrix-vector multiplication, quaternion operations (normalize, rotate, multiply, integrate), and 6D spatial vector operations.
Usage
These functions are included internally by other engine source files on the performance-critical hotpath. They should be used sparingly and only where the restrict guarantee provides measurable performance benefits, to prevent future bugs due to aliasing assumptions.
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_inline.h
- Lines: 1-464
Key Functions
// 3D vector operations
static inline void mji_copy3(mjtNum* restrict res, const mjtNum *vec);
static inline void mji_scl3(mjtNum* restrict res, const mjtNum vec[3], mjtNum scl);
static inline void mji_add3(mjtNum* restrict res, const mjtNum vec1[3], const mjtNum vec2[3]);
static inline void mji_sub3(mjtNum* restrict res, const mjtNum vec1[3], const mjtNum vec2[3]);
static inline void mji_addTo3(mjtNum* restrict res, const mjtNum vec[3]);
static inline void mji_subFrom3(mjtNum* restrict res, const mjtNum vec[3]);
static inline void mji_addToScl3(mjtNum* restrict res, const mjtNum vec[3], mjtNum scl);
static inline mjtNum mji__normalize3(mjtNum vec[3]);
// 3x3 matrix operations
static inline void mji_mulMatVec3(mjtNum* restrict res, const mjtNum mat[9], const mjtNum vec[3]);
static inline void mji_mulMatTVec3(mjtNum* restrict res, const mjtNum mat[9], const mjtNum vec[3]);
static inline void mji_mulMatMat3(mjtNum* restrict res, const mjtNum mat1[9], const mjtNum mat2[9]);
static inline void mji_mulMatTMat3(mjtNum* restrict res, const mjtNum mat1[9], const mjtNum mat2[9]);
// quaternion operations
static inline void mji_copy4(mjtNum* restrict res, const mjtNum data[4]);
static inline void mji_rotVecQuat(mjtNum* restrict res, const mjtNum vec[3], const mjtNum quat[4]);
static inline void mji_negQuat(mjtNum* restrict res, const mjtNum quat[4]);
static inline void mji_mulQuat(mjtNum* restrict res, const mjtNum qa[4], const mjtNum qb[4]);
static inline void mji_mat2Quat(mjtNum* restrict quat, const mjtNum mat[9]);
static inline void mji_quatIntegrate(mjtNum* restrict quat, const mjtNum vel[3], mjtNum scale);
// spatial vector operations
static inline void mji_cross(mjtNum* restrict res, const mjtNum a[3], const mjtNum b[3]);
static inline void mji_crossMotion(mjtNum* restrict res, const mjtNum vel[6], const mjtNum v[6]);
static inline void mji_crossForce(mjtNum* restrict res, const mjtNum vel[6], const mjtNum f[6]);
static inline mjtNum mji_dot6(const mjtNum vec1[6], const mjtNum vec2[6]);
static inline void mji_copy6(mjtNum* restrict res, const mjtNum *vec);
static inline void mji_copy9(mjtNum* restrict res, const mjtNum data[9]);
Import
#include "engine/engine_inline.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| vec / vec1 / vec2 | const mjtNum* | Yes | Input vector(s) of size 3, 4, or 6 |
| mat / mat1 / mat2 | const mjtNum[9] | Varies | 3x3 rotation matrix |
| quat / qa / qb | const mjtNum[4] | Varies | Unit quaternion(s) |
| scl / scale | mjtNum | Varies | Scalar multiplier or integration step |
Outputs
| Name | Type | Description |
|---|---|---|
| res | mjtNum* restrict | Result vector (size depends on function: 3, 4, 6, or 9) |
| return value | mjtNum | Norm before normalization (for normalize functions) |