Use less brittle search to determine whether an MJX field is a data or meta pytree node. Use correct type annotation for geom_convex_* fields in mjx.Model.

PiperOrigin-RevId: 607096855
Change-Id: I2e14b9b63e676b4ac3ec2a12aa07316e1d019a79
This commit is contained in:
Erik Frey
2024-02-14 13:57:03 -08:00
committed by Copybara-Service
parent 80a986c0f5
commit d561995c03
2 changed files with 17 additions and 12 deletions
+12 -7
View File
@@ -18,13 +18,23 @@ import copy
import dataclasses import dataclasses
import typing import typing
from typing import Any, Dict, Optional, Sequence, TypeVar from typing import Any, Dict, Optional, Sequence, TypeVar, Union
import jax import jax
import numpy as np import numpy as np
_T = TypeVar('_T') _T = TypeVar('_T')
def _jax_in_args(typ) -> bool:
if typ is jax.Array:
return True
if dataclasses.is_dataclass(typ):
return any(_jax_in_args(f.type) for f in dataclasses.fields(typ))
if typing.get_origin(typ) in (list, dict, Union, set):
return any(_jax_in_args(t) for t in typing.get_args(typ))
return False
def dataclass(clz: _T) -> _T: def dataclass(clz: _T) -> _T:
"""Wraps a dataclass with metadata for which fields are pytrees. """Wraps a dataclass with metadata for which fields are pytrees.
@@ -41,12 +51,7 @@ def dataclass(clz: _T) -> _T:
data_clz = dataclasses.dataclass(frozen=True)(clz) data_clz = dataclasses.dataclass(frozen=True)(clz)
meta_fields, data_fields = [], [] meta_fields, data_fields = [], []
for field in dataclasses.fields(data_clz): for field in dataclasses.fields(data_clz):
if any(( if _jax_in_args(field.type):
field.type is jax.Array,
dataclasses.is_dataclass(field.type),
jax.Array in typing.get_args(field.type),
any(dataclasses.is_dataclass(a) for a in typing.get_args(field.type)),
)):
data_fields.append(field) data_fields.append(field)
else: else:
meta_fields.append(field) meta_fields.append(field)
+5 -5
View File
@@ -15,7 +15,7 @@
"""Base types used in MJX.""" """Base types used in MJX."""
import enum import enum
from typing import Sequence from typing import List, Optional
import jax import jax
import jax.numpy as jp import jax.numpy as jp
@@ -498,10 +498,10 @@ class Model(PyTreeNode):
pair_dim: np.ndarray pair_dim: np.ndarray
pair_geom1: np.ndarray pair_geom1: np.ndarray
pair_geom2: np.ndarray pair_geom2: np.ndarray
geom_convex_face: Sequence[jax.Array] geom_convex_face: List[Optional[jax.Array]]
geom_convex_vert: Sequence[jax.Array] geom_convex_vert: List[Optional[jax.Array]]
geom_convex_edge: Sequence[jax.Array] geom_convex_edge: List[Optional[jax.Array]]
geom_convex_facenormal: Sequence[jax.Array] geom_convex_facenormal: List[Optional[jax.Array]]
pair_solref: jax.Array pair_solref: jax.Array
pair_solreffriction: jax.Array pair_solreffriction: jax.Array
pair_solimp: jax.Array pair_solimp: jax.Array