jaxsim 0.4.3.dev18__tar.gz → 0.4.3.dev31__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/PKG-INFO +1 -1
  2. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/__init__.py +5 -0
  3. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/_version.py +2 -2
  4. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/data.py +10 -3
  5. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/model.py +12 -1
  6. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/rod/parser.py +18 -14
  7. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim.egg-info/PKG-INFO +1 -1
  8. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/conftest.py +25 -0
  9. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.devcontainer/Dockerfile +0 -0
  10. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.devcontainer/devcontainer.json +0 -0
  11. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.gitattributes +0 -0
  12. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.github/CODEOWNERS +0 -0
  13. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.github/workflows/ci_cd.yml +0 -0
  14. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.github/workflows/read_the_docs.yml +0 -0
  15. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.github/workflows/update_pixi_lockfile.yml +0 -0
  16. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.gitignore +0 -0
  17. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.pre-commit-config.yaml +0 -0
  18. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/.readthedocs.yaml +0 -0
  19. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/CONTRIBUTING.md +0 -0
  20. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/LICENSE +0 -0
  21. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/README.md +0 -0
  22. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/Makefile +0 -0
  23. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/conf.py +0 -0
  24. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/examples.rst +0 -0
  25. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/guide/install.rst +0 -0
  26. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/index.rst +0 -0
  27. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/make.bat +0 -0
  28. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/api.rst +0 -0
  29. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/integrators.rst +0 -0
  30. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/math.rst +0 -0
  31. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/mujoco.rst +0 -0
  32. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/parsers.rst +0 -0
  33. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/rbda.rst +0 -0
  34. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/typing.rst +0 -0
  35. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/docs/modules/utils.rst +0 -0
  36. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/environment.yml +0 -0
  37. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/.gitattributes +0 -0
  38. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/.gitignore +0 -0
  39. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/PD_controller.ipynb +0 -0
  40. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/Parallel_computing.ipynb +0 -0
  41. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/README.md +0 -0
  42. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/examples/assets/cartpole.urdf +0 -0
  43. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/pixi.lock +0 -0
  44. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/pyproject.toml +0 -0
  45. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/setup.cfg +0 -0
  46. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/setup.py +0 -0
  47. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/__init__.py +0 -0
  48. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/com.py +0 -0
  49. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/common.py +0 -0
  50. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/contact.py +0 -0
  51. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/frame.py +0 -0
  52. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/joint.py +0 -0
  53. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  54. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/link.py +0 -0
  55. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/ode.py +0 -0
  56. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/ode_data.py +0 -0
  57. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/api/references.py +0 -0
  58. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/exceptions.py +0 -0
  59. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/integrators/__init__.py +0 -0
  60. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/integrators/common.py +0 -0
  61. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/integrators/fixed_step.py +0 -0
  62. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/integrators/variable_step.py +0 -0
  63. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/logging.py +0 -0
  64. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/__init__.py +0 -0
  65. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/adjoint.py +0 -0
  66. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/cross.py +0 -0
  67. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/inertia.py +0 -0
  68. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/joint_model.py +0 -0
  69. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/quaternion.py +0 -0
  70. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/rotation.py +0 -0
  71. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/skew.py +0 -0
  72. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/math/transform.py +0 -0
  73. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/mujoco/__init__.py +0 -0
  74. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/mujoco/__main__.py +0 -0
  75. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/mujoco/loaders.py +0 -0
  76. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/mujoco/model.py +0 -0
  77. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/mujoco/visualizer.py +0 -0
  78. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/__init__.py +0 -0
  79. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  80. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  81. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  82. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/descriptions/link.py +0 -0
  83. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/descriptions/model.py +0 -0
  84. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  85. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/rod/__init__.py +0 -0
  86. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/parsers/rod/utils.py +0 -0
  87. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/__init__.py +0 -0
  88. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/aba.py +0 -0
  89. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/collidable_points.py +0 -0
  90. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  91. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/contacts/common.py +0 -0
  92. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/contacts/rigid.py +0 -0
  93. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/contacts/soft.py +0 -0
  94. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/crba.py +0 -0
  95. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  96. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/jacobian.py +0 -0
  97. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/rnea.py +0 -0
  98. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/rbda/utils.py +0 -0
  99. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/terrain/__init__.py +0 -0
  100. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/terrain/terrain.py +0 -0
  101. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/typing.py +0 -0
  102. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/utils/__init__.py +0 -0
  103. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  104. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/utils/tracing.py +0 -0
  105. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim/utils/wrappers.py +0 -0
  106. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  107. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  108. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim.egg-info/requires.txt +0 -0
  109. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/src/jaxsim.egg-info/top_level.txt +0 -0
  110. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/__init__.py +0 -0
  111. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_com.py +0 -0
  112. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_contact.py +0 -0
  113. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_data.py +0 -0
  114. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_frame.py +0 -0
  115. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_joint.py +0 -0
  116. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_link.py +0 -0
  117. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_api_model.py +0 -0
  118. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_automatic_differentiation.py +0 -0
  119. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_contact.py +0 -0
  120. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_exceptions.py +0 -0
  121. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_pytree.py +0 -0
  122. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/test_simulations.py +0 -0
  123. {jaxsim-0.4.3.dev18 → jaxsim-0.4.3.dev31}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev18
3
+ Version: 0.4.3.dev31
4
4
  Summary: A differentiable physics engine and multibody dynamics library for control and robot learning.
5
5
  Author-email: Diego Ferigo <dgferigo@gmail.com>
6
6
  Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
@@ -20,6 +20,11 @@ def _jnp_options() -> None:
20
20
  if jnp.empty(0, dtype=float).dtype != jnp.empty(0, dtype=np.float64).dtype:
21
21
  logging.warning("Failed to enable 64bit precision in JAX")
22
22
 
23
+ else:
24
+ logging.warning(
25
+ "Using 32bit precision in JaxSim is still experimental, please avoid to use variable step integrators."
26
+ )
27
+
23
28
 
24
29
  def _np_options() -> None:
25
30
  import numpy as np
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.4.3.dev18'
16
- __version_tuple__ = version_tuple = (0, 4, 3, 'dev18')
15
+ __version__ = version = '0.4.3.dev31'
16
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev31')
@@ -39,7 +39,9 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
39
39
  contacts_params: jaxsim.rbda.ContactsParams = dataclasses.field(repr=False)
40
40
 
41
41
  time_ns: jtp.Int = dataclasses.field(
42
- default_factory=lambda: jnp.array(0, dtype=jnp.uint64)
42
+ default_factory=lambda: jnp.array(
43
+ 0, dtype=jnp.uint64 if jax.config.read("jax_enable_x64") else jnp.uint32
44
+ ),
43
45
  )
44
46
 
45
47
  def __hash__(self) -> int:
@@ -172,9 +174,14 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
172
174
  )
173
175
 
174
176
  time_ns = (
175
- jnp.array(time * 1e9, dtype=jnp.uint64)
177
+ jnp.array(
178
+ time * 1e9,
179
+ dtype=jnp.uint64 if jax.config.read("jax_enable_x64") else jnp.uint32,
180
+ )
176
181
  if time is not None
177
- else jnp.array(0, dtype=jnp.uint64)
182
+ else jnp.array(
183
+ 0, dtype=jnp.uint64 if jax.config.read("jax_enable_x64") else jnp.uint32
184
+ )
178
185
  )
179
186
 
180
187
  if isinstance(model.contact_model, SoftContacts):
@@ -1931,11 +1931,22 @@ def step(
1931
1931
  ),
1932
1932
  )
1933
1933
 
1934
+ tf_ns = t0_ns + jnp.array(dt * 1e9, dtype=t0_ns.dtype)
1935
+ tf_ns = jnp.where(tf_ns >= t0_ns, tf_ns, jnp.array(0, dtype=t0_ns.dtype))
1936
+
1937
+ jax.lax.cond(
1938
+ pred=tf_ns >= t0_ns,
1939
+ true_fun=lambda: jax.debug.print(
1940
+ "The simulation time overflowed, resetting simulation time to 0."
1941
+ ),
1942
+ false_fun=lambda: None,
1943
+ )
1944
+
1934
1945
  data_tf = (
1935
1946
  # Store the new state of the model and the new time.
1936
1947
  data.replace(
1937
1948
  state=state_tf,
1938
- time_ns=t0_ns + jnp.array(dt * 1e9).astype(jnp.uint64),
1949
+ time_ns=tf_ns,
1939
1950
  )
1940
1951
  )
1941
1952
 
@@ -223,7 +223,7 @@ def extract_model_data(
223
223
  child=links_dict[j.child],
224
224
  jtype=utils.joint_to_joint_type(joint=j),
225
225
  axis=(
226
- np.array(j.axis.xyz.xyz)
226
+ np.array(j.axis.xyz.xyz, dtype=float)
227
227
  if j.axis is not None
228
228
  and j.axis.xyz is not None
229
229
  and j.axis.xyz.xyz is not None
@@ -232,39 +232,43 @@ def extract_model_data(
232
232
  pose=j.pose.transform() if j.pose is not None else np.eye(4),
233
233
  initial_position=0.0,
234
234
  position_limit=(
235
- (
236
- float(j.axis.limit.lower)
237
- if j.axis is not None and j.axis.limit is not None
238
- else np.finfo(float).min
235
+ float(
236
+ j.axis.limit.lower
237
+ if j.axis is not None
238
+ and j.axis.limit is not None
239
+ and j.axis.limit.lower is not None
240
+ else jnp.finfo(float).min
239
241
  ),
240
- (
241
- float(j.axis.limit.upper)
242
- if j.axis is not None and j.axis.limit is not None
243
- else np.finfo(float).max
242
+ float(
243
+ j.axis.limit.upper
244
+ if j.axis is not None
245
+ and j.axis.limit is not None
246
+ and j.axis.limit.upper is not None
247
+ else jnp.finfo(float).max
244
248
  ),
245
249
  ),
246
- friction_static=(
250
+ friction_static=float(
247
251
  j.axis.dynamics.friction
248
252
  if j.axis is not None
249
253
  and j.axis.dynamics is not None
250
254
  and j.axis.dynamics.friction is not None
251
255
  else 0.0
252
256
  ),
253
- friction_viscous=(
257
+ friction_viscous=float(
254
258
  j.axis.dynamics.damping
255
259
  if j.axis is not None
256
260
  and j.axis.dynamics is not None
257
261
  and j.axis.dynamics.damping is not None
258
262
  else 0.0
259
263
  ),
260
- position_limit_damper=(
264
+ position_limit_damper=float(
261
265
  j.axis.limit.dissipation
262
266
  if j.axis is not None
263
267
  and j.axis.limit is not None
264
268
  and j.axis.limit.dissipation is not None
265
269
  else 0.0
266
270
  ),
267
- position_limit_spring=(
271
+ position_limit_spring=float(
268
272
  j.axis.limit.stiffness
269
273
  if j.axis is not None
270
274
  and j.axis.limit is not None
@@ -273,7 +277,7 @@ def extract_model_data(
273
277
  ),
274
278
  )
275
279
  for j in sdf_model.joints()
276
- if j.type in {"revolute", "prismatic", "fixed"}
280
+ if j.type in {"revolute", "continuous", "prismatic", "fixed"}
277
281
  and j.parent != "world"
278
282
  and j.child in links_dict.keys()
279
283
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev18
3
+ Version: 0.4.3.dev31
4
4
  Summary: A differentiable physics engine and multibody dynamics library for control and robot learning.
5
5
  Author-email: Diego Ferigo <dgferigo@gmail.com>
6
6
  Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
@@ -386,3 +386,28 @@ def jaxsim_models_fixed_base(request) -> pathlib.Path | str:
386
386
 
387
387
  model_name: str = request.param
388
388
  return get_jaxsim_model_fixture(model_name=model_name, request=request)
389
+
390
+
391
+ @pytest.fixture(scope="function")
392
+ def set_jax_32bit(monkeypatch):
393
+ """
394
+ Fixture that temporarily sets JAX precision to 32-bit for the duration of the test.
395
+ """
396
+
397
+ del globals()["jaxsim"]
398
+ del globals()["js"]
399
+
400
+ # Temporarily disable x64
401
+ monkeypatch.setenv("JAX_ENABLE_X64", "0")
402
+
403
+
404
+ @pytest.fixture(scope="function")
405
+ def jaxsim_model_box_32bit(set_jax_32bit, request) -> js.model.JaxSimModel:
406
+ """
407
+ Fixture providing the JaxSim model of a box with 32-bit precision.
408
+
409
+ Returns:
410
+ The JaxSim model of a box with 32-bit precision.
411
+ """
412
+
413
+ return get_jaxsim_model_fixture(model_name="box", request=request)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes