Source code for unisim.backend.mjwarp.state_commit
"""Prepared host transactions for the single MJWarp native state barrier."""
from __future__ import annotations
from dataclasses import dataclass, field
import numpy as np
[docs]
@dataclass(frozen=True)
class ModelUpdates:
fields: dict[str, np.ndarray] = field(default_factory=dict)
# 2: set_const; 1: set_const_0; 0: no derived-constant refresh.
refresh: int = 0
actuator_fields: dict[str, np.ndarray] = field(default_factory=dict)
[docs]
@dataclass(frozen=True)
class StateCommitPlan:
rows: np.ndarray
qpos: np.ndarray
qvel: np.ndarray
mocap_pos: np.ndarray
mocap_quat: np.ndarray
channels: dict[str, np.ndarray]
staged_wrenches: np.ndarray
time: np.ndarray
reset_world: bool = False
entity_names: tuple[str, ...] | None = None
model_updates: ModelUpdates = field(default_factory=ModelUpdates)
allow_scratch: bool = False
[docs]
def float_values(name: str, values: np.ndarray, shape: tuple[int, ...]) -> np.ndarray:
"""Own finite representable float32 state/model rows before native writes."""
raw = np.asarray(values)
if raw.shape != shape:
raise ValueError(f"{name} must have shape {shape}, got {raw.shape}")
if raw.dtype.kind not in "fi" or not np.isfinite(raw).all():
raise ValueError(f"{name} must contain finite real values")
limit = np.finfo(np.float32).max
if np.any(raw > limit) or np.any(raw < -limit):
raise ValueError(f"{name} must contain finite float32 values")
return raw.astype(np.float32, copy=True)