jaxsim 0.4.3.dev155__tar.gz → 0.4.3.dev159__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 (124) hide show
  1. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/PKG-INFO +1 -1
  2. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/_version.py +2 -2
  3. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/contact.py +0 -1
  4. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/common.py +8 -2
  5. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/relaxed_rigid.py +52 -22
  6. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/rigid.py +55 -9
  7. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/PKG-INFO +1 -1
  8. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.devcontainer/Dockerfile +0 -0
  9. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.devcontainer/devcontainer.json +0 -0
  10. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.gitattributes +0 -0
  11. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/CODEOWNERS +0 -0
  12. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/ci_cd.yml +0 -0
  13. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/read_the_docs.yml +0 -0
  14. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/update_pixi_lockfile.yml +0 -0
  15. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.gitignore +0 -0
  16. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.pre-commit-config.yaml +0 -0
  17. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.readthedocs.yaml +0 -0
  18. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/CONTRIBUTING.md +0 -0
  19. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/LICENSE +0 -0
  20. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/README.md +0 -0
  21. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/Makefile +0 -0
  22. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/conf.py +0 -0
  23. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/examples.rst +0 -0
  24. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/guide/install.rst +0 -0
  25. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/index.rst +0 -0
  26. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/make.bat +0 -0
  27. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/api.rst +0 -0
  28. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/integrators.rst +0 -0
  29. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/math.rst +0 -0
  30. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/mujoco.rst +0 -0
  31. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/parsers.rst +0 -0
  32. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/rbda.rst +0 -0
  33. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/typing.rst +0 -0
  34. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/utils.rst +0 -0
  35. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/environment.yml +0 -0
  36. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/.gitattributes +0 -0
  37. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/.gitignore +0 -0
  38. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/PD_controller.ipynb +0 -0
  39. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/Parallel_computing.ipynb +0 -0
  40. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/README.md +0 -0
  41. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/assets/cartpole.urdf +0 -0
  42. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/pixi.lock +0 -0
  43. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/pyproject.toml +0 -0
  44. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/setup.cfg +0 -0
  45. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/setup.py +0 -0
  46. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/__init__.py +0 -0
  47. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/__init__.py +0 -0
  48. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/com.py +0 -0
  49. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/common.py +0 -0
  50. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/data.py +0 -0
  51. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/frame.py +0 -0
  52. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/joint.py +0 -0
  53. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  54. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/link.py +0 -0
  55. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/model.py +0 -0
  56. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/ode.py +0 -0
  57. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/ode_data.py +0 -0
  58. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/references.py +0 -0
  59. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/exceptions.py +0 -0
  60. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/__init__.py +0 -0
  61. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/common.py +0 -0
  62. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/fixed_step.py +0 -0
  63. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/variable_step.py +0 -0
  64. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/logging.py +0 -0
  65. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/__init__.py +0 -0
  66. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/adjoint.py +0 -0
  67. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/cross.py +0 -0
  68. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/inertia.py +0 -0
  69. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/joint_model.py +0 -0
  70. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/quaternion.py +0 -0
  71. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/rotation.py +0 -0
  72. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/skew.py +0 -0
  73. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/transform.py +0 -0
  74. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/__init__.py +0 -0
  75. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/__main__.py +0 -0
  76. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/loaders.py +0 -0
  77. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/model.py +0 -0
  78. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/visualizer.py +0 -0
  79. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/__init__.py +0 -0
  80. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  81. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  82. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  83. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/link.py +0 -0
  84. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/model.py +0 -0
  85. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  86. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/__init__.py +0 -0
  87. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/parser.py +0 -0
  88. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/utils.py +0 -0
  89. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/__init__.py +0 -0
  90. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/aba.py +0 -0
  91. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/collidable_points.py +0 -0
  92. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  93. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/soft.py +0 -0
  94. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/crba.py +0 -0
  95. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  96. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/jacobian.py +0 -0
  97. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/rnea.py +0 -0
  98. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/utils.py +0 -0
  99. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/terrain/__init__.py +0 -0
  100. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/terrain/terrain.py +0 -0
  101. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/typing.py +0 -0
  102. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/__init__.py +0 -0
  103. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  104. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/tracing.py +0 -0
  105. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/wrappers.py +0 -0
  106. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  107. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  108. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/requires.txt +0 -0
  109. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/top_level.txt +0 -0
  110. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/__init__.py +0 -0
  111. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/conftest.py +0 -0
  112. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_com.py +0 -0
  113. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_contact.py +0 -0
  114. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_data.py +0 -0
  115. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_frame.py +0 -0
  116. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_joint.py +0 -0
  117. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_link.py +0 -0
  118. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_model.py +0 -0
  119. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_automatic_differentiation.py +0 -0
  120. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_contact.py +0 -0
  121. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_exceptions.py +0 -0
  122. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_pytree.py +0 -0
  123. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_simulations.py +0 -0
  124. {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/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.dev155
3
+ Version: 0.4.3.dev159
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>
@@ -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.dev155'
16
- __version_tuple__ = version_tuple = (0, 4, 3, 'dev155')
15
+ __version__ = version = '0.4.3.dev159'
16
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev159')
@@ -188,7 +188,6 @@ def collidable_point_dynamics(
188
188
  data=data,
189
189
  link_forces=link_forces,
190
190
  joint_force_references=joint_force_references,
191
- solver_tol=1e-3,
192
191
  )
193
192
 
194
193
  aux_data = dict()
@@ -17,6 +17,12 @@ except ImportError:
17
17
  class ContactsParams(JaxsimDataclass):
18
18
  """
19
19
  Abstract class representing the parameters of a contact model.
20
+
21
+ Note:
22
+ This class is supposed to store only the tunable parameters of the contact
23
+ model, i.e. all those parameters that can be changed during runtime.
24
+ If the contact model has also static parameters, they should be stored
25
+ in the corresponding `ContactModel` class.
20
26
  """
21
27
 
22
28
  @classmethod
@@ -47,7 +53,7 @@ class ContactModel(JaxsimDataclass):
47
53
 
48
54
  Attributes:
49
55
  parameters: The parameters of the contact model.
50
- terrain: The terrain model.
56
+ terrain: The considered terrain.
51
57
  """
52
58
 
53
59
  parameters: ContactsParams
@@ -85,7 +91,7 @@ class ContactModel(JaxsimDataclass):
85
91
  Compute the contact forces.
86
92
 
87
93
  Args:
88
- model: The model to consider.
94
+ model: The robot model considered by the contact model.
89
95
  data: The data of the considered model.
90
96
 
91
97
  Returns:
@@ -78,16 +78,6 @@ class RelaxedRigidContactsParams(ContactsParams):
78
78
  default_factory=lambda: jnp.array(0.5, dtype=float)
79
79
  )
80
80
 
81
- # Maximum number of iterations
82
- max_iterations: jtp.Int = dataclasses.field(
83
- default_factory=lambda: jnp.array(50, dtype=int)
84
- )
85
-
86
- # Solver tolerance
87
- tolerance: jtp.Float = dataclasses.field(
88
- default_factory=lambda: jnp.array(1e-6, dtype=float)
89
- )
90
-
91
81
  def __hash__(self) -> int:
92
82
  from jaxsim.utils.wrappers import HashedNumpyArray
93
83
 
@@ -103,8 +93,6 @@ class RelaxedRigidContactsParams(ContactsParams):
103
93
  HashedNumpyArray(self.stiffness),
104
94
  HashedNumpyArray(self.damping),
105
95
  HashedNumpyArray(self.mu),
106
- HashedNumpyArray(self.max_iterations),
107
- HashedNumpyArray(self.tolerance),
108
96
  )
109
97
  )
110
98
 
@@ -125,8 +113,6 @@ class RelaxedRigidContactsParams(ContactsParams):
125
113
  stiffness: jtp.FloatLike | None = None,
126
114
  damping: jtp.FloatLike | None = None,
127
115
  mu: jtp.FloatLike | None = None,
128
- max_iterations: jtp.IntLike | None = None,
129
- tolerance: jtp.FloatLike | None = None,
130
116
  ) -> Self:
131
117
  """Create a `RelaxedRigidContactsParams` instance"""
132
118
 
@@ -152,8 +138,6 @@ class RelaxedRigidContactsParams(ContactsParams):
152
138
  and jnp.all(self.midpoint >= 0.0)
153
139
  and jnp.all(self.power >= 0.0)
154
140
  and jnp.all(self.mu >= 0.0)
155
- and jnp.all(self.max_iterations > 0)
156
- and jnp.all(self.tolerance > 0.0)
157
141
  )
158
142
 
159
143
 
@@ -169,11 +153,30 @@ class RelaxedRigidContacts(ContactModel):
169
153
  default_factory=FlatTerrain.build
170
154
  )
171
155
 
156
+ _solver_options_keys: jax_dataclasses.Static[tuple[str, ...]] = dataclasses.field(
157
+ default=("tol", "maxiter", "memory_size"), kw_only=True
158
+ )
159
+ _solver_options_values: jax_dataclasses.Static[tuple[Any, ...]] = dataclasses.field(
160
+ default=(1e-6, 50, 10), kw_only=True
161
+ )
162
+
163
+ @property
164
+ def solver_options(self) -> dict[str, Any]:
165
+
166
+ return dict(
167
+ zip(
168
+ self._solver_options_keys,
169
+ self._solver_options_values,
170
+ strict=True,
171
+ )
172
+ )
173
+
172
174
  @classmethod
173
175
  def build(
174
176
  cls: type[Self],
175
177
  parameters: RelaxedRigidContactsParams | None = None,
176
178
  terrain: Terrain | None = None,
179
+ solver_options: dict[str, Any] | None = None,
177
180
  **kwargs,
178
181
  ) -> Self:
179
182
  """
@@ -182,6 +185,7 @@ class RelaxedRigidContacts(ContactModel):
182
185
  Args:
183
186
  parameters: The parameters of the rigid contacts model.
184
187
  terrain: The considered terrain.
188
+ solver_options: The options to pass to the L-BFGS solver.
185
189
 
186
190
  Returns:
187
191
  The `RelaxedRigidContacts` instance.
@@ -190,11 +194,31 @@ class RelaxedRigidContacts(ContactModel):
190
194
  if len(kwargs) != 0:
191
195
  logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
192
196
 
197
+ # Get the default solver options.
198
+ default_solver_options = dict(
199
+ zip(cls._solver_options_keys, cls._solver_options_values, strict=True)
200
+ )
201
+
202
+ # Create the solver options to set by combining the default solver options
203
+ # with the user-provided solver options.
204
+ solver_options = default_solver_options | (solver_options or {})
205
+
206
+ # Make sure that the solver options are hashable.
207
+ # We need to check this because the solver options are static.
208
+ try:
209
+ hash(tuple(solver_options.values()))
210
+ except TypeError as exc:
211
+ raise ValueError(
212
+ "The values of the solver options must be hashable."
213
+ ) from exc
214
+
193
215
  return cls(
194
216
  parameters=(
195
217
  parameters or cls.__dataclass_fields__["parameters"].default_factory()
196
218
  ),
197
219
  terrain=terrain or cls.__dataclass_fields__["terrain"].default_factory(),
220
+ _solver_options_keys=tuple(solver_options.keys()),
221
+ _solver_options_values=tuple(solver_options.values()),
198
222
  )
199
223
 
200
224
  @jax.jit
@@ -357,17 +381,23 @@ class RelaxedRigidContacts(ContactModel):
357
381
  + D[:, jnp.newaxis] * velocity
358
382
  ).flatten()
359
383
 
360
- # Compute the 3D linear force in C[W] frame
384
+ # Get the solver options.
385
+ solver_options = self.solver_options
386
+
387
+ # Extract the options corresponding to the convergence criteria.
388
+ # All the remaining options are passed to the solver.
389
+ tol = solver_options.pop("tol")
390
+ maxiter = solver_options.pop("maxiter")
391
+
392
+ # Compute the 3D linear force in C[W] frame.
361
393
  CW_f_Ci, _ = run_optimization(
362
394
  init_params=init_params,
363
395
  A=A,
364
396
  b=b,
365
- maxiter=self.parameters.max_iterations,
366
- opt=optax.lbfgs(
367
- memory_size=10,
368
- ),
397
+ maxiter=maxiter,
398
+ opt=optax.lbfgs(**solver_options),
369
399
  fun=objective,
370
- tol=self.parameters.tolerance,
400
+ tol=tol,
371
401
  )
372
402
 
373
403
  CW_f_Ci = CW_f_Ci.reshape((-1, 3))
@@ -91,11 +91,35 @@ class RigidContacts(ContactModel):
91
91
  default_factory=FlatTerrain.build
92
92
  )
93
93
 
94
+ regularization_delassus: jax_dataclasses.Static[float] = dataclasses.field(
95
+ default=1e-6, kw_only=True
96
+ )
97
+
98
+ _solver_options_keys: jax_dataclasses.Static[tuple[str, ...]] = dataclasses.field(
99
+ default=("solver_tol",), kw_only=True
100
+ )
101
+ _solver_options_values: jax_dataclasses.Static[tuple[Any, ...]] = dataclasses.field(
102
+ default=(1e-3,), kw_only=True
103
+ )
104
+
105
+ @property
106
+ def solver_options(self) -> dict[str, Any]:
107
+
108
+ return dict(
109
+ zip(
110
+ self._solver_options_keys,
111
+ self._solver_options_values,
112
+ strict=True,
113
+ )
114
+ )
115
+
94
116
  @classmethod
95
117
  def build(
96
118
  cls: type[Self],
97
119
  parameters: RigidContactsParams | None = None,
98
120
  terrain: Terrain | None = None,
121
+ regularization_delassus: jtp.FloatLike | None = None,
122
+ solver_options: dict[str, Any] | None = None,
99
123
  **kwargs,
100
124
  ) -> Self:
101
125
  """
@@ -104,6 +128,9 @@ class RigidContacts(ContactModel):
104
128
  Args:
105
129
  parameters: The parameters of the rigid contacts model.
106
130
  terrain: The considered terrain.
131
+ regularization_delassus:
132
+ The regularization term to add to the diagonal of the Delassus matrix.
133
+ solver_options: The options to pass to the QP solver.
107
134
 
108
135
  Returns:
109
136
  The `RigidContacts` instance.
@@ -112,11 +139,35 @@ class RigidContacts(ContactModel):
112
139
  if len(kwargs) != 0:
113
140
  logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
114
141
 
142
+ # Get the default solver options.
143
+ default_solver_options = dict(
144
+ zip(cls._solver_options_keys, cls._solver_options_values, strict=True)
145
+ )
146
+
147
+ # Create the solver options to set by combining the default solver options
148
+ # with the user-provided solver options.
149
+ solver_options = default_solver_options | (solver_options or {})
150
+
151
+ # Make sure that the solver options are hashable.
152
+ # We need to check this because the solver options are static.
153
+ try:
154
+ hash(tuple(solver_options.values()))
155
+ except TypeError as exc:
156
+ raise ValueError(
157
+ "The values of the solver options must be hashable."
158
+ ) from exc
159
+
115
160
  return cls(
116
161
  parameters=(
117
162
  parameters or cls.__dataclass_fields__["parameters"].default_factory()
118
163
  ),
119
164
  terrain=terrain or cls.__dataclass_fields__["terrain"].default_factory(),
165
+ regularization_delassus=float(
166
+ regularization_delassus
167
+ or cls.__dataclass_fields__["regularization_delassus"].default
168
+ ),
169
+ _solver_options_keys=tuple(solver_options.keys()),
170
+ _solver_options_values=tuple(solver_options.values()),
120
171
  )
121
172
 
122
173
  @staticmethod
@@ -230,8 +281,6 @@ class RigidContacts(ContactModel):
230
281
  *,
231
282
  link_forces: jtp.MatrixLike | None = None,
232
283
  joint_force_references: jtp.VectorLike | None = None,
233
- regularization_term: jtp.FloatLike = 1e-6,
234
- solver_tol: jtp.FloatLike = 1e-3,
235
284
  ) -> tuple[jtp.Vector, tuple[Any, ...]]:
236
285
  """
237
286
  Compute the contact forces.
@@ -244,10 +293,6 @@ class RigidContacts(ContactModel):
244
293
  expressed in the same representation of data.
245
294
  joint_force_references:
246
295
  Optional `(n_joints,)` vector of joint forces.
247
- regularization_term:
248
- The regularization term to add to the diagonal of the Delassus
249
- matrix for better numerical conditioning.
250
- solver_tol: The convergence tolerance to consider in the QP solver.
251
296
 
252
297
  Returns:
253
298
  A tuple containing the contact forces.
@@ -296,10 +341,11 @@ class RigidContacts(ContactModel):
296
341
  terrain_height=terrain_height,
297
342
  )
298
343
 
344
+ # Compute the Delassus matrix.
299
345
  delassus_matrix = RigidContacts._delassus_matrix(M=M, J_WC=J_WC)
300
346
 
301
- # Add regularization for better numerical conditioning
302
- delassus_matrix = delassus_matrix + regularization_term * jnp.eye(
347
+ # Add regularization for better numerical conditioning.
348
+ delassus_matrix = delassus_matrix + self.regularization_delassus * jnp.eye(
303
349
  delassus_matrix.shape[0]
304
350
  )
305
351
 
@@ -359,7 +405,7 @@ class RigidContacts(ContactModel):
359
405
 
360
406
  # Solve the optimization problem
361
407
  solution, *_ = qpax.solve_qp(
362
- Q=Q, q=q, A=A, b=b, G=G, h=h_bounds, solver_tol=solver_tol
408
+ Q=Q, q=q, A=A, b=b, G=G, h=h_bounds, **self.solver_options
363
409
  )
364
410
 
365
411
  f_C_lin = solution.reshape(-1, 3)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev155
3
+ Version: 0.4.3.dev159
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>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes