Skip to content

Commit b59b07f

Browse files
mmossgcopybara-github
authored andcommitted
Add Python 3.15 to the build versions and promote 3.14 to canonical.
PiperOrigin-RevId: 970386992 Change-Id: I017e96cb81b7d02f33c5710d713df3e9014f00be
1 parent eb18d77 commit b59b07f

8 files changed

Lines changed: 93 additions & 72 deletions

File tree

doc/changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ General
1111
- The :ref:`.mjz <MJZArchives>` encoder now writes the root file as ``model.xml`` in the archive as this is less
1212
susceptible to breakage due to file renaming.
1313

14+
- Added support for Python 3.15 (GIL and Free-Threading).
15+
1416
Samples
1517
^^^^^^^
1618

mjx/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ classifiers = [
2222
"Programming Language :: Python :: 3.12",
2323
"Programming Language :: Python :: 3.13",
2424
"Programming Language :: Python :: 3.14",
25+
"Programming Language :: Python :: 3.15",
2526
"Topic :: Scientific/Engineering",
2627
]
2728
requires-python = ">=3.10"

mjx/requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,9 @@ fsspec==2024.10.0 \
150150
--hash=sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871
151151
importlib-resources==6.4.5 \
152152
--hash=sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717
153-
typing_extensions==4.12.2 \
154-
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d
153+
typing_extensions==4.16.0 \
154+
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
155+
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
155156
zipp==3.21.0 \
156157
--hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931
157158

python/build_requirements.txt

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ numpy==2.4.4; python_version >= '3.13' \
2222
--hash=sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d \
2323
--hash=sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e \
2424
--hash=sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a \
25+
--hash=sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0 \
2526
--hash=sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113 \
2627
--hash=sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103 \
2728
--hash=sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93 \
@@ -113,8 +114,9 @@ fsspec==2024.10.0 \
113114
--hash=sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871
114115
importlib-resources==6.4.5 \
115116
--hash=sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717
116-
typing_extensions==4.12.2 \
117-
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d
117+
typing_extensions==4.16.0 \
118+
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
119+
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
118120
zipp==3.21.0 \
119121
--hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931
120122

@@ -129,24 +131,26 @@ pluggy==1.5.0 \
129131
--hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669
130132

131133
# sysid optional-dependency direct deps
134+
# TODO: Remove python_version < '3.15' restrictions when upstream packages
135+
# (e.g. scipy, matplotlib, etc.) publish Python 3.15 binary wheels to PyPI.
132136
colorama==0.4.6 \
133137
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
134138
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
135-
imageio==2.37.2 \
139+
imageio==2.37.2; python_version < '3.15' \
136140
--hash=sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a \
137141
--hash=sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b
138-
imageio-ffmpeg==0.6.0 \
142+
imageio-ffmpeg==0.6.0; python_version < '3.15' \
139143
--hash=sha256:02fa47c83703c37df6bfe4896aab339013f62bf02c5ebf2dce6da56af04ffc0a \
140144
--hash=sha256:196faa79366b4a82f95c0f4053191d2013f4714a715780f0ad2a68ff37483cc2 \
141145
--hash=sha256:1d47bebd83d2c5fc770720d211855f208af8a596c82d17730aa51e815cdee6dc \
142146
--hash=sha256:9d2baaf867088508d4a3458e61eeb30e945c4ad8016025545f66c4b5aaef0a61 \
143147
--hash=sha256:b1ae3173414b5fc5f538a726c4e48ea97edc0d2cdc11f103afee655c463fa742 \
144148
--hash=sha256:c7e46fcec401dd990405049d2e2f475e2b397779df2519b544b8aab515195282 \
145149
--hash=sha256:e2556bed8e005564a9f925bb7afa4002d82770d6b08825078b7697ab88ba1755
146-
jinja2==3.1.6 \
150+
jinja2==3.1.6; python_version < '3.15' \
147151
--hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \
148152
--hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
149-
matplotlib==3.10.8 \
153+
matplotlib==3.10.8; python_version < '3.15' \
150154
--hash=sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7 \
151155
--hash=sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a \
152156
--hash=sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f \
@@ -202,10 +206,10 @@ matplotlib==3.10.8 \
202206
--hash=sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8 \
203207
--hash=sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a \
204208
--hash=sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7
205-
plotly==6.5.2 \
209+
plotly==6.5.2; python_version < '3.15' \
206210
--hash=sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393 \
207211
--hash=sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4
208-
pyyaml==6.0.3 \
212+
pyyaml==6.0.3; python_version < '3.15' \
209213
--hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \
210214
--hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \
211215
--hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \
@@ -289,7 +293,7 @@ scipy==1.15.3; python_version == '3.10' \
289293
--hash=sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e \
290294
--hash=sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c \
291295
--hash=sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13
292-
scipy==1.17.0; python_version >= '3.11' \
296+
scipy==1.17.0; python_version >= '3.11' and python_version < '3.15' \
293297
--hash=sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73 \
294298
--hash=sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff \
295299
--hash=sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8 \
@@ -367,7 +371,7 @@ contourpy==1.3.2; python_version == '3.10' \
367371
--hash=sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2 \
368372
--hash=sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0 \
369373
--hash=sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a
370-
contourpy==1.3.3; python_version >= '3.11' \
374+
contourpy==1.3.3; python_version >= '3.11' and python_version < '3.15' \
371375
--hash=sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69 \
372376
--hash=sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc \
373377
--hash=sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880 \
@@ -440,10 +444,10 @@ contourpy==1.3.3; python_version >= '3.11' \
440444
--hash=sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff \
441445
--hash=sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9 \
442446
--hash=sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a
443-
cycler==0.12.1 \
447+
cycler==0.12.1; python_version < '3.15' \
444448
--hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \
445449
--hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c
446-
fonttools==4.61.1 \
450+
fonttools==4.61.1; python_version < '3.15' \
447451
--hash=sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87 \
448452
--hash=sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796 \
449453
--hash=sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75 \
@@ -494,7 +498,7 @@ fonttools==4.61.1 \
494498
--hash=sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c \
495499
--hash=sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7 \
496500
--hash=sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd
497-
kiwisolver==1.4.9 \
501+
kiwisolver==1.4.9; python_version < '3.15' \
498502
--hash=sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c \
499503
--hash=sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7 \
500504
--hash=sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21 \
@@ -596,7 +600,7 @@ kiwisolver==1.4.9 \
596600
--hash=sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f \
597601
--hash=sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1 \
598602
--hash=sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220
599-
markupsafe==3.0.3 \
603+
markupsafe==3.0.3; python_version < '3.15' \
600604
--hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \
601605
--hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \
602606
--hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \
@@ -686,10 +690,10 @@ markupsafe==3.0.3 \
686690
--hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \
687691
--hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \
688692
--hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50
689-
narwhals==2.16.0 \
693+
narwhals==2.16.0; python_version < '3.15' \
690694
--hash=sha256:155bb45132b370941ba0396d123cf9ed192bf25f39c4cea726f2da422ca4e145 \
691695
--hash=sha256:846f1fd7093ac69d63526e50732033e86c30ea0026a44d9b23991010c7d1485d
692-
pillow==12.2.0 \
696+
pillow==12.2.0; python_version < '3.15' \
693697
--hash=sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9 \
694698
--hash=sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5 \
695699
--hash=sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987 \
@@ -783,7 +787,7 @@ pillow==12.2.0 \
783787
--hash=sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5
784788
# imageio
785789
# matplotlib
786-
psutil==7.2.2 \
790+
psutil==7.2.2; python_version < '3.15' \
787791
--hash=sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372 \
788792
--hash=sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 \
789793
--hash=sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841 \
@@ -805,13 +809,13 @@ psutil==7.2.2 \
805809
--hash=sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 \
806810
--hash=sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00 \
807811
--hash=sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8
808-
pyparsing==3.3.2 \
812+
pyparsing==3.3.2; python_version < '3.15' \
809813
--hash=sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d \
810814
--hash=sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc
811-
python-dateutil==2.9.0.post0 \
815+
python-dateutil==2.9.0.post0; python_version < '3.15' \
812816
--hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \
813817
--hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427
814-
six==1.17.0 \
818+
six==1.17.0; python_version < '3.15' \
815819
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
816820
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
817821
Pygments==2.20.0 \

python/make_sdist_requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ pyproject_hooks==1.2.0 \
1818
--hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913
1919
tomli==2.1.0; python_version < '3.11' \
2020
--hash=sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391
21-
typing-extensions==4.12.2 \
22-
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d
21+
typing-extensions==4.16.0 \
22+
--hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
23+
--hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5
2324
zipp==3.21.0 \
2425
--hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931

python/mujoco/sysid/__init__.py

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,44 +14,49 @@
1414
# ==============================================================================
1515
"""System identification toolbox."""
1616

17-
from mujoco.sysid._src import model_modifier as model_modifier
18-
from mujoco.sysid._src import parameter as parameter
19-
from mujoco.sysid._src import signal_modifier as signal_modifier
20-
from mujoco.sysid._src.io import save_results as save_results
21-
from mujoco.sysid._src.model_modifier import apply_body_inertia as apply_body_inertia
22-
from mujoco.sysid._src.model_modifier import apply_dgain as apply_dgain
23-
from mujoco.sysid._src.model_modifier import apply_param_modifiers as apply_param_modifiers
24-
from mujoco.sysid._src.model_modifier import apply_param_modifiers_spec as apply_param_modifiers_spec
25-
from mujoco.sysid._src.model_modifier import apply_pdgain as apply_pdgain
26-
from mujoco.sysid._src.model_modifier import apply_pgain as apply_pgain
27-
from mujoco.sysid._src.model_modifier import body_inertia_param as body_inertia_param
28-
from mujoco.sysid._src.model_modifier import remove_visuals as remove_visuals
29-
from mujoco.sysid._src.optimize import calculate_intervals as calculate_intervals
30-
from mujoco.sysid._src.optimize import optimize as optimize
31-
from mujoco.sysid._src.parameter import InertiaType as InertiaType
32-
from mujoco.sysid._src.parameter import Parameter as Parameter
33-
from mujoco.sysid._src.parameter import ParameterDict as ParameterDict
34-
from mujoco.sysid._src.plotting import render_rollout as render_rollout
35-
from mujoco.sysid._src.residual import build_residual_fn as build_residual_fn
36-
from mujoco.sysid._src.residual import BuildModelFn as BuildModelFn
37-
from mujoco.sysid._src.residual import construct_ts_from_defaults as construct_ts_from_defaults
38-
from mujoco.sysid._src.residual import CustomRolloutFn as CustomRolloutFn
39-
from mujoco.sysid._src.residual import model_residual as model_residual
40-
from mujoco.sysid._src.residual import ModifyResidualFn as ModifyResidualFn
41-
from mujoco.sysid._src.residual import residual as residual
42-
from mujoco.sysid._src.signal_modifier import apply_bias as apply_bias
43-
from mujoco.sysid._src.signal_modifier import apply_delay as apply_delay
44-
from mujoco.sysid._src.signal_modifier import apply_delayed_ts_window as apply_delayed_ts_window
45-
from mujoco.sysid._src.signal_modifier import apply_gain as apply_gain
46-
from mujoco.sysid._src.signal_modifier import apply_resample_and_delay as apply_resample_and_delay
47-
from mujoco.sysid._src.signal_modifier import get_sensor_indices as get_sensor_indices
48-
from mujoco.sysid._src.signal_modifier import normalize_residual as normalize_residual
49-
from mujoco.sysid._src.signal_modifier import weighted_diff as weighted_diff
50-
from mujoco.sysid._src.signal_transform import SignalTransform as SignalTransform
51-
from mujoco.sysid._src.timeseries import SignalType as SignalType
52-
from mujoco.sysid._src.timeseries import TimeSeries as TimeSeries
53-
from mujoco.sysid._src.trajectory import create_initial_state as create_initial_state
54-
from mujoco.sysid._src.trajectory import ModelSequences as ModelSequences
55-
from mujoco.sysid._src.trajectory import sysid_rollout as sysid_rollout
56-
from mujoco.sysid._src.trajectory import SystemTrajectory as SystemTrajectory
57-
from mujoco.sysid.report.defaults import default_report as default_report
17+
# sysid is an optional dependency (mujoco[sysid]). Gracefully handle missing
18+
# optional dependencies (e.g. when installed without extras or on Python 3.15).
19+
try:
20+
from mujoco.sysid._src import model_modifier as model_modifier
21+
from mujoco.sysid._src import parameter as parameter
22+
from mujoco.sysid._src import signal_modifier as signal_modifier
23+
from mujoco.sysid._src.io import save_results as save_results
24+
from mujoco.sysid._src.model_modifier import apply_body_inertia as apply_body_inertia
25+
from mujoco.sysid._src.model_modifier import apply_dgain as apply_dgain
26+
from mujoco.sysid._src.model_modifier import apply_param_modifiers as apply_param_modifiers
27+
from mujoco.sysid._src.model_modifier import apply_param_modifiers_spec as apply_param_modifiers_spec
28+
from mujoco.sysid._src.model_modifier import apply_pdgain as apply_pdgain
29+
from mujoco.sysid._src.model_modifier import apply_pgain as apply_pgain
30+
from mujoco.sysid._src.model_modifier import body_inertia_param as body_inertia_param
31+
from mujoco.sysid._src.model_modifier import remove_visuals as remove_visuals
32+
from mujoco.sysid._src.optimize import calculate_intervals as calculate_intervals
33+
from mujoco.sysid._src.optimize import optimize as optimize
34+
from mujoco.sysid._src.parameter import InertiaType as InertiaType
35+
from mujoco.sysid._src.parameter import Parameter as Parameter
36+
from mujoco.sysid._src.parameter import ParameterDict as ParameterDict
37+
from mujoco.sysid._src.plotting import render_rollout as render_rollout
38+
from mujoco.sysid._src.residual import build_residual_fn as build_residual_fn
39+
from mujoco.sysid._src.residual import BuildModelFn as BuildModelFn
40+
from mujoco.sysid._src.residual import construct_ts_from_defaults as construct_ts_from_defaults
41+
from mujoco.sysid._src.residual import CustomRolloutFn as CustomRolloutFn
42+
from mujoco.sysid._src.residual import model_residual as model_residual
43+
from mujoco.sysid._src.residual import ModifyResidualFn as ModifyResidualFn
44+
from mujoco.sysid._src.residual import residual as residual
45+
from mujoco.sysid._src.signal_modifier import apply_bias as apply_bias
46+
from mujoco.sysid._src.signal_modifier import apply_delay as apply_delay
47+
from mujoco.sysid._src.signal_modifier import apply_delayed_ts_window as apply_delayed_ts_window
48+
from mujoco.sysid._src.signal_modifier import apply_gain as apply_gain
49+
from mujoco.sysid._src.signal_modifier import apply_resample_and_delay as apply_resample_and_delay
50+
from mujoco.sysid._src.signal_modifier import get_sensor_indices as get_sensor_indices
51+
from mujoco.sysid._src.signal_modifier import normalize_residual as normalize_residual
52+
from mujoco.sysid._src.signal_modifier import weighted_diff as weighted_diff
53+
from mujoco.sysid._src.signal_transform import SignalTransform as SignalTransform
54+
from mujoco.sysid._src.timeseries import SignalType as SignalType
55+
from mujoco.sysid._src.timeseries import TimeSeries as TimeSeries
56+
from mujoco.sysid._src.trajectory import create_initial_state as create_initial_state
57+
from mujoco.sysid._src.trajectory import ModelSequences as ModelSequences
58+
from mujoco.sysid._src.trajectory import sysid_rollout as sysid_rollout
59+
from mujoco.sysid._src.trajectory import SystemTrajectory as SystemTrajectory
60+
from mujoco.sysid.report.defaults import default_report as default_report
61+
except ModuleNotFoundError:
62+
pass

python/mujoco/sysid/tests/conftest.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,21 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414
# ==============================================================================
15-
"""Shared fixtures for mujoco.sysid tests."""
16-
17-
import mujoco
18-
from mujoco.sysid._src import parameter
19-
from mujoco.sysid._src import timeseries
20-
from mujoco.sysid._src.model_modifier import _infer_inertial
21-
import numpy as np
2215
import pytest
2316

17+
# TODO: Remove when all upstream sysid packages (e.g. matplotlib) release Python 3.15 wheels.
18+
try:
19+
import colorama # pylint: disable=unused-import
20+
import scipy # pylint: disable=unused-import
21+
22+
import mujoco
23+
from mujoco.sysid._src import parameter
24+
from mujoco.sysid._src import timeseries
25+
from mujoco.sysid._src.model_modifier import _infer_inertial
26+
import numpy as np
27+
except ImportError:
28+
collect_ignore_glob = ["test_*.py"]
29+
2430
# ---------------------------------------------------------------------------
2531
# Inline model XML strings — no external file dependencies
2632
# ---------------------------------------------------------------------------

python/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ classifiers = [
2222
"Programming Language :: Python :: 3.12",
2323
"Programming Language :: Python :: 3.13",
2424
"Programming Language :: Python :: 3.14",
25+
"Programming Language :: Python :: 3.15",
2526
"Topic :: Scientific/Engineering",
2627
]
2728
dependencies = [

0 commit comments

Comments
 (0)