Implementation:Google deepmind Mujoco Engine Util Blas
| Knowledge Sources | |
|---|---|
| Domains | Physics Simulation, Linear Algebra |
| Last Updated | 2026-02-15 04:00 GMT |
Overview
Implements BLAS-like (Basic Linear Algebra Subprograms) utility functions for MuJoCo's physics engine, providing optimized vector and matrix operations on fixed-size and variable-size arrays.
Description
This file provides the core numerical linear algebra routines used throughout MuJoCo, including 3D vector operations (zero, copy, scale, add, subtract, dot product, cross product, normalize), 4D quaternion operations, general n-dimensional vector operations, and dense matrix-vector and matrix-matrix multiplication. The implementation includes optional AVX SIMD optimizations when compiled with platform SIMD support for double-precision floating point. All functions operate on mjtNum arrays, which may be either double or single precision depending on compile-time configuration.
Usage
These functions are invoked extensively throughout the MuJoCo engine wherever vector and matrix arithmetic is required, including kinematics, dynamics, contact resolution, and visualization computations.
Code Reference
Source Location
- Repository: Google_deepmind_Mujoco
- File: src/engine/engine_util_blas.c
- Lines: 1-943
Key Functions
// 3D vector operations
void mju_zero3(mjtNum res[3]);
int mju_equal3(const mjtNum vec1[3], const mjtNum vec2[3]);
void mju_copy3(mjtNum res[3], const mjtNum vec[3]);
void mju_copy9(mjtNum res[9], const mjtNum mat[9]);
void mju_scl3(mjtNum res[3], const mjtNum vec[3], mjtNum scl);
void mju_add3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3]);
void mju_sub3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3]);
mjtNum mju_normalize3(mjtNum vec[3]);
mjtNum mju_dot3(const mjtNum vec1[3], const mjtNum vec2[3]);
// General vector operations
void mju_zero(mjtNum* res, int n);
void mju_copy(mjtNum* res, const mjtNum* vec, int n);
mjtNum mju_dot(const mjtNum* vec1, const mjtNum* vec2, int n);
mjtNum mju_norm(const mjtNum* res, int n);
// Matrix operations
void mju_mulMatVec(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int nr, int nc);
void mju_mulMatTVec(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int nr, int nc);
void mju_mulMatMat(mjtNum* res, const mjtNum* mat1, const mjtNum* mat2, int r1, int c1, int c2);
void mju_sqrMatTD(mjtNum* res, const mjtNum* mat, const mjtNum* diag, int nr, int nc);
Import
#include "engine/engine_util_blas.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| vec, vec1, vec2 | mjtNum* | Yes | Input vectors of specified dimension |
| mat, mat1, mat2 | mjtNum* | Yes | Input matrices stored in row-major order |
| n, nr, nc | int | Yes | Dimensions of vectors or matrices |
| scl | mjtNum | No | Scalar multiplier for scaling operations |
Outputs
| Name | Type | Description |
|---|---|---|
| res | mjtNum* | Result vector or matrix, written in-place |
| return value | mjtNum | Scalar result for dot product, norm, or normalize operations |