MJX (impl='warp'): nconmax -> naconmax
PiperOrigin-RevId: 915407157 Change-Id: Ie43c06164d6d942c2a4bb60b3d09fcb5c4c87a35
This commit is contained in:
committed by
Copybara-Service
parent
9c372fbbea
commit
072125c49c
@@ -59,6 +59,9 @@ General
|
|||||||
Negative ``margin`` values are now permitted (corresponding to ``gap > margin`` under the old semantics). The
|
Negative ``margin`` values are now permitted (corresponding to ``gap > margin`` under the old semantics). The
|
||||||
constraint ``margin + gap >= 0`` should be maintained to ensure valid collision detection.
|
constraint ``margin + gap >= 0`` should be maintained to ensure valid collision detection.
|
||||||
|
|
||||||
|
- MJX: Removed the deprecated ``nconmax`` argument from ``mjx.make_data`` and ``mjx.put_data`` in favor of
|
||||||
|
``naconmax``.
|
||||||
|
|
||||||
Version 3.8.1 (May 11, 2026)
|
Version 3.8.1 (May 11, 2026)
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -828,7 +828,6 @@ def make_data(
|
|||||||
device: Optional[jax.Device] = None,
|
device: Optional[jax.Device] = None,
|
||||||
impl: Optional[Union[str, types.Impl]] = None,
|
impl: Optional[Union[str, types.Impl]] = None,
|
||||||
_full_compat: bool = False, # pylint: disable=invalid-name
|
_full_compat: bool = False, # pylint: disable=invalid-name
|
||||||
nconmax: Optional[int] = None,
|
|
||||||
naconmax: Optional[int] = None,
|
naconmax: Optional[int] = None,
|
||||||
naccdmax: Optional[int] = None,
|
naccdmax: Optional[int] = None,
|
||||||
njmax: Optional[int] = None,
|
njmax: Optional[int] = None,
|
||||||
@@ -840,15 +839,10 @@ def make_data(
|
|||||||
m: the model to use
|
m: the model to use
|
||||||
device: which device to use - if unspecified picks the default device
|
device: which device to use - if unspecified picks the default device
|
||||||
impl: implementation to use ('jax', 'warp')
|
impl: implementation to use ('jax', 'warp')
|
||||||
nconmax: maximum number of contacts to allocate for warp across all worlds
|
|
||||||
Since the number of worlds is **not** pre-defined in JAX, we use the
|
|
||||||
`nconmax` argument to set the upper bound for the number of contacts
|
|
||||||
across all worlds. In MuJoCo Warp, the analgous field is called
|
|
||||||
`naconmax`.
|
|
||||||
naconmax: maximum number of contacts to allocate for warp across all worlds
|
naconmax: maximum number of contacts to allocate for warp across all worlds
|
||||||
Since the number of worlds is **not** pre-defined in JAX, we use the
|
Since the number of worlds is **not** pre-defined in JAX, we use the
|
||||||
`naconmax` argument to set the upper bound for the number of contacts
|
`naconmax` argument to set the upper bound for the number of contacts
|
||||||
across all worlds, rather than the `nconmax` argument from MuJoCo Warp.
|
across all worlds.
|
||||||
naccdmax: maximum number of contacts for GJK collision detection across all
|
naccdmax: maximum number of contacts for GJK collision detection across all
|
||||||
worlds. Since the number of worlds is **not** pre-defined in JAX, we use the
|
worlds. Since the number of worlds is **not** pre-defined in JAX, we use the
|
||||||
`naccdmax` argument to set the upper bound for the number of contacts
|
`naccdmax` argument to set the upper bound for the number of contacts
|
||||||
@@ -864,14 +858,7 @@ def make_data(
|
|||||||
Raises:
|
Raises:
|
||||||
ValueError: if the model's impl does not match the make_data impl
|
ValueError: if the model's impl does not match the make_data impl
|
||||||
NotImplementedError: if the impl is not implemented yet
|
NotImplementedError: if the impl is not implemented yet
|
||||||
DeprecationWarning: if nconmax is used
|
|
||||||
"""
|
"""
|
||||||
if nconmax is not None:
|
|
||||||
warnings.warn(
|
|
||||||
'nconmax will be deprecated in mujoco-mjx>=3.5. Use naconmax instead.',
|
|
||||||
DeprecationWarning,
|
|
||||||
stacklevel=2,
|
|
||||||
)
|
|
||||||
|
|
||||||
impl, device = _resolve_impl_and_device(impl, device)
|
impl, device = _resolve_impl_and_device(impl, device)
|
||||||
|
|
||||||
@@ -886,7 +873,6 @@ def make_data(
|
|||||||
return _make_data_cpp(m, device, keepalive_refs=keepalive_refs)
|
return _make_data_cpp(m, device, keepalive_refs=keepalive_refs)
|
||||||
elif impl == types.Impl.WARP:
|
elif impl == types.Impl.WARP:
|
||||||
_check_warp_installed()
|
_check_warp_installed()
|
||||||
naconmax = nconmax if naconmax is None else naconmax
|
|
||||||
return _make_data_warp(m, device, naconmax, naccdmax, njmax)
|
return _make_data_warp(m, device, naconmax, naccdmax, njmax)
|
||||||
|
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
@@ -1187,7 +1173,6 @@ def put_data(
|
|||||||
d: mujoco.MjData,
|
d: mujoco.MjData,
|
||||||
device: Optional[jax.Device] = None,
|
device: Optional[jax.Device] = None,
|
||||||
impl: Optional[Union[str, types.Impl]] = None,
|
impl: Optional[Union[str, types.Impl]] = None,
|
||||||
nconmax: Optional[int] = None,
|
|
||||||
naconmax: Optional[int] = None,
|
naconmax: Optional[int] = None,
|
||||||
njmax: Optional[int] = None,
|
njmax: Optional[int] = None,
|
||||||
dummy_arg_for_batching: Optional[jax.Array] = None,
|
dummy_arg_for_batching: Optional[jax.Array] = None,
|
||||||
@@ -1200,11 +1185,10 @@ def put_data(
|
|||||||
d: the data to put on device
|
d: the data to put on device
|
||||||
device: which device to use - if unspecified picks the default device
|
device: which device to use - if unspecified picks the default device
|
||||||
impl: implementation to use ('jax', 'warp')
|
impl: implementation to use ('jax', 'warp')
|
||||||
nconmax: maximum number of contacts to allocate for warp
|
|
||||||
naconmax: maximum number of contacts to allocate for warp across all worlds
|
naconmax: maximum number of contacts to allocate for warp across all worlds
|
||||||
Since the number of worlds is **not** pre-defined in JAX, we use the
|
Since the number of worlds is **not** pre-defined in JAX, we use the
|
||||||
`naconmax` argument to set the upper bound for the number of contacts
|
`naconmax` argument to set the upper bound for the number of contacts
|
||||||
across all worlds, rather than the `nconmax` argument from MuJoCo Warp.
|
across all worlds.
|
||||||
njmax: maximum number of constraints to allocate for warp
|
njmax: maximum number of constraints to allocate for warp
|
||||||
dummy_arg_for_batching: dummy argument to use for batching in cpp
|
dummy_arg_for_batching: dummy argument to use for batching in cpp
|
||||||
implementation
|
implementation
|
||||||
@@ -1213,14 +1197,7 @@ def put_data(
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
an mjx.Data placed on device
|
an mjx.Data placed on device
|
||||||
DeprecationWarning: if nconmax is used
|
|
||||||
"""
|
"""
|
||||||
if nconmax is not None:
|
|
||||||
warnings.warn(
|
|
||||||
'nconmax will be deprecated in mujoco-mjx>=3.5. Use naconmax instead.',
|
|
||||||
DeprecationWarning,
|
|
||||||
stacklevel=2,
|
|
||||||
)
|
|
||||||
|
|
||||||
impl, device = _resolve_impl_and_device(impl, device)
|
impl, device = _resolve_impl_and_device(impl, device)
|
||||||
if impl == types.Impl.JAX:
|
if impl == types.Impl.JAX:
|
||||||
@@ -1235,7 +1212,6 @@ def put_data(
|
|||||||
)
|
)
|
||||||
elif impl == types.Impl.WARP:
|
elif impl == types.Impl.WARP:
|
||||||
_check_warp_installed()
|
_check_warp_installed()
|
||||||
naconmax = nconmax if naconmax is None else naconmax
|
|
||||||
return _put_data_warp(m, d, device, naconmax, njmax)
|
return _put_data_warp(m, d, device, naconmax, njmax)
|
||||||
|
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ class DataIOTest(parameterized.TestCase):
|
|||||||
if not mjx_io.has_cuda_gpu_device():
|
if not mjx_io.has_cuda_gpu_device():
|
||||||
self.skipTest('No CUDA GPU device.')
|
self.skipTest('No CUDA GPU device.')
|
||||||
m = mujoco.MjModel.from_xml_string(_MULTIPLE_CONVEX_OBJECTS)
|
m = mujoco.MjModel.from_xml_string(_MULTIPLE_CONVEX_OBJECTS)
|
||||||
d = mjx.make_data(m, impl='warp', nconmax=9, njmax=23)
|
d = mjx.make_data(m, impl='warp', naconmax=9, njmax=23)
|
||||||
self.assertEqual(d._impl.contact__dist.shape[0], 9)
|
self.assertEqual(d._impl.contact__dist.shape[0], 9)
|
||||||
self.assertEqual(d._impl.efc__pos.shape[0], 23)
|
self.assertEqual(d._impl.efc__pos.shape[0], 23)
|
||||||
|
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ def _check_leading_dim(
|
|||||||
path: jax.tree_util.KeyPath,
|
path: jax.tree_util.KeyPath,
|
||||||
leaf: Any,
|
leaf: Any,
|
||||||
expected_batch_dim: int,
|
expected_batch_dim: int,
|
||||||
expected_nconmax: int,
|
expected_naconmax: int,
|
||||||
expected_njmax: int,
|
expected_njmax: int,
|
||||||
):
|
):
|
||||||
"""Asserts that the batch dimension of a leaf node matches the expected batch dimension."""
|
"""Asserts that the batch dimension of a leaf node matches the expected batch dimension."""
|
||||||
@@ -345,11 +345,11 @@ def _check_leading_dim(
|
|||||||
if (
|
if (
|
||||||
not has_batch_dim
|
not has_batch_dim
|
||||||
and attr.startswith('contact__')
|
and attr.startswith('contact__')
|
||||||
and leaf.shape[0] != expected_nconmax
|
and leaf.shape[0] != expected_naconmax
|
||||||
):
|
):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f'Leaf node leading dim ({leaf.shape[0]}) does not match nconmax'
|
f'Leaf node leading dim ({leaf.shape[0]}) does not match naconmax'
|
||||||
f' ({expected_nconmax}) for field {attr}.'
|
f' ({expected_naconmax}) for field {attr}.'
|
||||||
)
|
)
|
||||||
if (
|
if (
|
||||||
not has_batch_dim
|
not has_batch_dim
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ def assert_attr_eq(a, b, attr):
|
|||||||
|
|
||||||
|
|
||||||
def make_data(
|
def make_data(
|
||||||
m: mujoco.MjModel, worldid: int, nconmax: int = 1_000, njmax: int = 200
|
m: mujoco.MjModel, worldid: int, naconmax: int = 1_000, njmax: int = 200
|
||||||
):
|
):
|
||||||
"""Make data for a given worldid using keyframes when available."""
|
"""Make data for a given worldid using keyframes when available."""
|
||||||
dx = mjx.make_data(m, impl='warp', nconmax=nconmax, njmax=njmax)
|
dx = mjx.make_data(m, impl='warp', naconmax=naconmax, njmax=njmax)
|
||||||
|
|
||||||
rng = jax.random.PRNGKey(worldid)
|
rng = jax.random.PRNGKey(worldid)
|
||||||
rng, key = jax.random.split(rng)
|
rng, key = jax.random.split(rng)
|
||||||
|
|||||||
Reference in New Issue
Block a user