mjbatch-uni
mjbatch-uni is a Python library for running thousands of MuJoCo simulations in parallel on CPU.
Features include:
- C++ thread pool execution, with the GIL released;
- Live array access to simulation state and controls across the batch, with
bindfor MjData fields; - Per-simulation model parameters, with
expandfor MjModel fields andset_constto recompute derived constants. - Same-layout compiler-coherent mesh variants, with
VariantPack.from_specs()andBatch.from_variant_pack(). - Explicit topology-affine groups, with
ModelAffineBatchrouting global ids to incompatible layouts. - Batched queries beyond stepping: site Jacobians with
jac_siteand heightfield sampling withsample_hfield(world/yaw grid alignment); query ops return caller-allocated results without refreshing the bound views. - Per-substep control from Python with
step(..., callback=...). - Opt-in split substeps with fresh position/velocity sensor views for body wrench control.
- Optional per-worker CPU pinning on Linux, with
cpu_idsbinding pool workeritocpu_ids[i].
For example:
import mujoco, numpy as np
from mjbatch import Batch
model = mujoco.MjModel.from_xml_path("scene.xml")
batch = Batch(model, num_sims=4096) # threads default to every logical CPU
qpos, ctrl = batch.bind("qpos"), batch.bind("ctrl")
batch.expand("geom_friction")[:, :, 0] = np.random.uniform(0.4, 1.2, (4096, 1))
for _ in range(1000):
ctrl[:] = policy(qpos) # your controller, all 4096 at once
batch.step() # step them in parallel; qpos updates in place
Callbacks can also consume tracked sensors at the exact state they are controlling. With
Euler, substep_sensor_copyout=(start, stop) splits each substep at mj_step1 /
mj_step2, copies the declared sensor columns into a fourth callback view, and applies
ctrl plus bound inputs such as xfrc_applied to that substep:
xfrc = batch.bind("xfrc_applied")
def control(k, state, ctrl, sensor):
ctrl[:] = impedance(sensor) # position/velocity sensors match state
xfrc[:, body_id] = wrench(sensor)
batch.step(callback=control, substep_sensor_copyout=(sensor_start, sensor_stop))
Acceleration-stage sensors and contact forces are not available before mj_step2 and may
be stale in that view. The default callback path and all outputs are unchanged unless the
optional range is passed.
After a normal step() with forward=False, selected position- and velocity-stage sensor
columns can be refreshed from the final integration state without a full mj_forward:
batch.refresh_sensor_range(ids, (sensor_start, sensor_stop))
The refresh runs in native worker threads, copies only the requested columns into the bound
sensordata view, and leaves acceleration-stage sensors (including contact forces) and all
other bound fields unchanged. Disjoint ranges can be refreshed in one dispatch with
refresh_sensor_ranges(ids, (start0, stop0, start1, stop1, ...)).
Model randomization and variants
expand(field) returns a live (num_sims, ...) view of a non-asset MjModel field.
Rows are applied before each selected simulation runs. model_field_specs() describes
the shape, dtype, writability, and recompute dependency of every field. Declare the
fields being written to model_update; like mjlab event terms, mjbatch computes the
strongest recompute level and runs one conservative stock-MuJoCo mj_setConst pass.
from mjbatch import RecomputeLevel
assert batch.model_field_specs()["body_mass"].recompute == RecomputeLevel.SET_CONST
with batch.model_update("body_mass", "geom_friction", ids=reset_envs):
batch.expand("body_mass")[reset_envs, body_id] *= 1.1
batch.expand("geom_friction")[reset_envs, :, 0] = friction_samples
For mesh-only differences, VariantPack.from_specs() independently compiles each
source spec, pools and deduplicates meshes, aligns named geom slots, disables missing
optional slots, and scatters compiler-derived geometry and inertia fields.
Batch.from_variant_pack() applies its fixed assignment and initial recompute.
from mjbatch import Batch, VariantPack
pack = VariantPack.from_specs([tool_spec_0, tool_spec_1, tool_spec_2])
batch = Batch.from_variant_pack(pack, num_sims, np.arange(num_sims) % 3)
Truly incompatible topologies are not silently padded. Put each one in its own Batch
and route fixed global assignments through ModelAffineBatch. State and field views
remain on each TopologyGroup; global history is rejected.
from mjbatch import ModelAffineBatch
sharded = ModelAffineBatch([batch_a, batch_b], names=["one_joint", "two_joint"])
sharded.step(np.array([0, 3, 4]))
state_a, state_b = sharded["one_joint"].state, sharded["two_joint"].state
Reproducible cold-start, RSS, stepping, and model-field-update measurements:
uv run python benchmarks/topology_groups.py --num-sims 512 --threads 4
sample_hfield samples a shared heightfield at XY offsets around a body origin,
returning the world z of the sampled surface. alignment="yaw" rotates the
sampling grid by the frame body's yaw about world z, so a per-sim geom_quat
rotates each simulation's scan pattern.
Examples
We showcase a range of applications built using mjbatch: RL, MPC, SysID, and hardware
co-design. Each example is a self-contained, performant implementation. For instance, the Go1
RL controller learns to walk in under a minute on a five-year-old M1 laptop.
|
|
|
| A two-pole cart swung upright with iLQR | A cart-pole swing-up controller using predictive sampling |
|
|
|
| A G1 humanoid tracking a reference backflip with receding-horizon iLQR | A Go1 quadruped joystick controller trained with PPO |
|
|
|
| CEM jointly optimizes a robot arm's proportions, gears, and controls | Damped Gauss–Newton fits a Rizon arm's inertial parameters to synthetic motion data |
Run with uv run examples/<file>.py; some need uv sync --group examples. The ones that open
a window need a display; --headless runs the solver without one.
License
Apache-2.0.
Metadata
Release files for mjbatch-uni 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mjbatch_uni-0.2.2.tar.gz | 41.6 kB | Details |
Built distributions (wheels)
Total release size: 2.2 MB
Release files / mjbatch_uni-0.2.2.tar.gz
| Download URL | mjbatch_uni-0.2.2.tar.gz |
|---|---|
| Size | 41.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
62c914225a746a92e00a91ae8d94f42cc655067e4e014767e76c4ef32ff8870e
|
|
BLAKE2b-256 checksum How to use checksums |
b5e30acde43d12de0967dbf56d391559c0dc2e72f7f89519454b2ed1b0368ec2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | mjbatch_uni-0.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 192.9 kB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0537df69ff04a67cd8b22421937e874f941639e15db76c419aaecff38b996f4f
|
|
BLAKE2b-256 checksum How to use checksums |
8e7331e1243d5c57ec480d05d90e409ac6674fad6d68f60a7a930c344320abdd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | mjbatch_uni-0.2.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 182.1 kB |
| Tags | CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
8953d0a9aec4a774d22eb00271e84e0ddf153e81419e6fb22cef02147b6b7959
|
|
BLAKE2b-256 checksum How to use checksums |
63e7fc1238d7f9087e27a9d87e15791984f911caa761331b81ebd651f22ed2ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | mjbatch_uni-0.2.2-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 155.0 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5ab5495f9e1a14b96997bbfe1c902f3aad979fbfd44a494f122b4f784440a2bf
|
|
BLAKE2b-256 checksum How to use checksums |
9c11dc30bd72ecab70f10bf688a2f70d1e51d61b1e797f446d9e3b93ed818420
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | mjbatch_uni-0.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 192.9 kB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ef86120853b9ae2b05ca29cc4cdd639a87f117abb0307a3f8ad171dbabd29257
|
|
BLAKE2b-256 checksum How to use checksums |
426aa546d76e492cc0a553356688bd916955e5ab4a9f13a4bc28566b99f6abe6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | mjbatch_uni-0.2.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 182.1 kB |
| Tags | CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
d04d8de6f680e4a1f9579358738e52cf6bc335a06e039134634972ed89e32355
|
|
BLAKE2b-256 checksum How to use checksums |
591748af1538e64df42c78b3cc2d6da6dd991d077c6499b03d7da34ae83caf7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | mjbatch_uni-0.2.2-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 155.0 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5d4176dcc75db1e513ebf6444a7504b5680f728847774a8d59e120fdbe3abb97
|
|
BLAKE2b-256 checksum How to use checksums |
18bfd2308d61eddfe82e2b90d9d0028c75b3be9f441372bf141869d477172693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | mjbatch_uni-0.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 193.3 kB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
e5711ccbd2a460f051b2d14b13167f4f622cd73ea8982c1c85765d66424e3056
|
|
BLAKE2b-256 checksum How to use checksums |
cd553ee03f254451c56b2428dc6c1cda134b6acafd3db5ec056db1d41deb6925
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | mjbatch_uni-0.2.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 183.0 kB |
| Tags | CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
a9e8a4bff5f387182fee9b366b4af8bae96fd7682b21862a31d4b7cb8d90d301
|
|
BLAKE2b-256 checksum How to use checksums |
ec4f5bc7ffbce1c537e123e7a6ef12f8bfbf87b2b6231bca09f1ca1dae742750
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | mjbatch_uni-0.2.2-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 155.7 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
904b4eace0425bfc03cfc3aeadec62e31f552e0d3a6d46b7213566ba2f24d82f
|
|
BLAKE2b-256 checksum How to use checksums |
800a37ffe0e0ab58186716d1fd2a8191e92235dd62b5ff9d0a856f004015e7e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | mjbatch_uni-0.2.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 193.7 kB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
629bd47c0b58aa71357ff67743bf3e8df14f8dfb829ee1a690c1fb5feac28002
|
|
BLAKE2b-256 checksum How to use checksums |
53eb90de4c0ab9adf9b81ca1e05c983775e8b91451a3490780b9b1d1fba515dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
| Download URL | mjbatch_uni-0.2.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 183.4 kB |
| Tags | CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
97989832c97376545b74a0212e8b12582ecd0aed217a7fa980f719950ad05ec2
|
|
BLAKE2b-256 checksum How to use checksums |
0eba638aba3ab6eae70ba01488e3160a81561cc3dd79783dfd799721c16d859f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / mjbatch_uni-0.2.2-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | mjbatch_uni-0.2.2-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 156.0 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
63a247df9cbb5e7b8e083aaa2148f00568d4fbb6880fba0bfe8d87acddda242d
|
|
BLAKE2b-256 checksum How to use checksums |
4417e1d9eda54a6ab8736180ae7f00c63c7e7c8bc3e85611868127211e493912
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency log