Use semantic versioning.

PiperOrigin-RevId: 869102767
Change-Id: I8b01b9343289d4ad7d15bcc3634a28e661308a90
This commit is contained in:
Yuval Tassa
2026-02-12 02:10:49 -08:00
committed by Copybara-Service
parent a8cf4e012d
commit c54f1fe380
7 changed files with 95 additions and 12 deletions
+6
View File
@@ -98,6 +98,12 @@ Note that Pre-built Linux wheels target `manylinux2014`, see
information such as building the bindings from source, see the [Python bindings]
section of the documentation.
## Versioning
We aim to release MuJoCo in the first week of each month. Our versioning
standards changed to modified Semantic Versioning in 3.5.0,
see [versioning](VERSIONING.md) for details.
## Contributing
We welcome community engagement: questions, requests for help, bug reports and
+75
View File
@@ -0,0 +1,75 @@
# MuJoCo Versioning
MuJoCo uses custom semantic versioning from 3.5.0 onwards, see below.
### The problem with Semantic Versioning
The common definition of traditional [Semantic Versioning](https://semver.org/)
is
```
1. MAJOR: breaking changes
2. MINOR: new features
3. PATCH: bug fixes
```
With strict adherence to this definition, most MuJoCo releases are `MAJOR`. This
is because MuJoCo has a very large API surface, especially when considering
[MJCF](https://mujoco.readthedocs.io/en/stable/XMLreference.html) and the
related
[mjSpec](https://mujoco.readthedocs.io/en/stable/programming/modeledit.html)
API. Furthermore, the numerical properties of physics state integration mean
that despite being deterministic, numerical reproducibility across versions is
almost guaranteed to
[not hold](https://mujoco.readthedocs.io/en/stable/computation/index.html#reproducibility).
## From 3.5.0 semantic versioning
From 3.5.0 onwards MuJoCo uses well-defined versioning with the following
semantics.
### MuJoCo versioning semantics
```
1. SUPERMAJOR: breaking changes and/or significant new features
2. MAJOR: breaking changes, possibly new features
3. MINOR_OR_PATCH: new features or bug fixes
```
`MINOR_OR_PATCH` guarantees API backward compatibility, but may or may not
introduce new features; to find out, read the
[changelog](https://mujoco.readthedocs.io/en/stable/changelog.html), which will
detail the nature of the changes. The changelog will also detail pure
ABI-breaking changes, for example removing an unused attribute from a public
struct. Such changes are considered MINOR. As explained
[here](https://mujoco.readthedocs.io/en/stable/computation/index.html#reproducibility),
numerical reproducibility is *never* guaranteed.
Additionally:
- `mj_versionString()` works as before, returning e.g. `"4.2.1"`.
- `mj_version()` works as before, returning an integer. The corresponding
header constant `mjVERSION_HEADER` is calculated from the components as:
```
mjVERSION = (SUPERMAJOR * 1e6) + (MAJOR * 1e3) + MINOR_OR_PATCH
```
For example, 4.2.1 would be `4002001`.
## Prior to 3.5.0 no semantics
Until 3.5.0, versioning was a sequence of increasing numbers with no
well-defined semantic, with the exception of major versions introducing
significant new features, like
[3.0.0](https://mujoco.readthedocs.io/en/stable/changelog.html#version-3-0-0-october-18-2023)'s
introduction of the JAX-based
[MJX](https://mujoco.readthedocs.io/en/stable/mjx.html) branch. Additionally:
- The function
[`const char* mj_versionString()`](https://mujoco.readthedocs.io/en/stable/APIreference/APIfunctions.html#mj-versionstring)
returns the version in the form of a string, for example `"3.2.7"`.
- The function
[`int mj_version()`](https://mujoco.readthedocs.io/en/stable/APIreference/APIfunctions.html#mj-version)
returns an integer equal to the version digits concatenated,
for example for "3.2.7" we'd have `mjVERSION = 327`.
+6 -5
View File
@@ -527,11 +527,12 @@ shown in the table below. Their names are in the format ``mjKEY_XXX``. They corr
- Maximum number of UI rectangles.
Defined in `mjui.h <https://github.com/google-deepmind/mujoco/blob/main/include/mujoco/mjui.h>`_.
* - ``mjVERSION_HEADER``
- 350
- The version of the MuJoCo headers; changes with every release. This is an integer equal to 100x the software
version, so 210 corresponds to version 2.1. Defined in mujoco.h. The API function :ref:`mj_version` returns a
number with the same meaning but for the compiled library.
- 3005000
- The version of the MuJoCo headers. This is an integer calculated from the version string "S.M.P"
using the formula ``(S * 1e6) + (M * 1e3) + P``. For example, version 4.2.1 is represented as 4002001.
Defined in mujoco.h. The API function :ref:`mj_version` returns a number with the same meaning
but for the compiled library. See
`VERSIONING.md <https://github.com/google-deepmind/mujoco/blob/main/VERSIONING.md>`__ for details.
.. _Macros:
+5 -4
View File
@@ -191,7 +191,7 @@ Versions and compatibility
MuJoCo has been used extensively since 2010 and is quite mature (even though our version numbering scheme is quite
conservative). Nevertheless it remains under active development, and we have many exciting ideas for new features and
are also making changes based on user feedback. This leads to unavoidable changes in both the modeling language in the
are also making changes based on user feedback. This leads to unavoidable changes in both the modeling language and the
API. While we encourage users to upgrade to the latest version, we recognize that this is not always feasible,
especially when other developers release software that relies on MuJoCo. Therefore we have introduced simple
mechanisms to help avoid version conflicts, as follows.
@@ -206,13 +206,14 @@ the symbol :ref:`mjVERSION_HEADER <glNumeric>` and the library provides the func
.. code-block:: C
// recommended version check
if (mjVERSION_HEADER!=mj_version())
if (mjVERSION_HEADER != mj_version())
complain();
Note that only the main header defines this symbol. We assume that the collection of headers released with each software
version will stay together and will not be mixed between versions. To avoid complications with floating-point
comparisons, the above symbol and function use integers that are 100x the version number, so for example in software
version 2.1 the symbol mjVERSION_HEADER is defined as 210.
comparisons, the above symbol and function use integers rather than floating-point numbers. See
`VERSIONING.md <https://github.com/google-deepmind/mujoco/blob/main/VERSIONING.md>`__ for the encoding formula and
version semantics.
.. _inNaming:
+1 -1
View File
@@ -16,7 +16,7 @@
#define MUJOCO_MUJOCO_H_
// header version; should match the library version as returned by mj_version()
#define mjVERSION_HEADER 350
#define mjVERSION_HEADER 3005000
// needed to define size_t, fabs and log10
#include <stdlib.h>
+1 -1
View File
@@ -43,7 +43,7 @@
//-------------------------- Constants -------------------------------------------------------------
#define mjVERSION 350
#define mjVERSION 3005000
#define mjVERSIONSTRING "3.5.0"
// names of disable flags
+1 -1
View File
@@ -112,7 +112,7 @@ public const int mjMAXLINEPNT = 1001;
public const int mjMAXPLANEGRID = 200;
public const bool THIRD_PARTY_MUJOCO_MJXMACRO_H_ = true;
public const bool THIRD_PARTY_MUJOCO_MUJOCO_H_ = true;
public const int mjVERSION_HEADER = 350;
public const int mjVERSION_HEADER = 3005000;
// ------------------------------------Enums------------------------------------