From b9fe7c3ac2931cbcd91f7c3436c4329b188f7502 Mon Sep 17 00:00:00 2001 From: Jonathan Coletti Date: Thu, 30 Apr 2026 10:51:49 -0400 Subject: [PATCH 1/6] Fix Taxi-v3 deprecation in tests (gymnasium 1.3.0 compatibility) --- docs/misc/changelog.md | 1 + tests/test_spaces.py | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/misc/changelog.md b/docs/misc/changelog.md index f417da89fd..4524db927a 100644 --- a/docs/misc/changelog.md +++ b/docs/misc/changelog.md @@ -20,6 +20,7 @@ ### [SBX] (SB3 + Jax) ### Deprecations: +- Fixed deprecated Taxi-v3 from gymnasium 1.3.0 ### Others: diff --git a/tests/test_spaces.py b/tests/test_spaces.py index d6a178668d..a3000af25d 100644 --- a/tests/test_spaces.py +++ b/tests/test_spaces.py @@ -123,7 +123,8 @@ def test_sde_multi_dim(): @pytest.mark.parametrize("model_class", [A2C, PPO, DQN]) @pytest.mark.parametrize("env", ["Taxi-v3"]) def test_discrete_obs_space(model_class, env): - env = make_vec_env(env, n_envs=2, seed=0) + + env = _make_env_safe(env, n_envs=2, seed=0) kwargs = {} if model_class == DQN: kwargs = dict(buffer_size=1000, learning_starts=100) @@ -173,3 +174,17 @@ def test_multidim_binary_not_supported(): env = DummyEnv(BOX_SPACE_FLOAT32, spaces.MultiBinary([2, 3])) with pytest.raises(AssertionError, match=r"Multi-dimensional MultiBinary\(.*\) action space is not supported"): A2C("MlpPolicy", env) + + +def _make_env_safe(env_id, **kwargs): + try: + return make_vec_env(env_id, **kwargs) + except gym.error.DeprecatedEnv: + # map deprecated to new (better extendability for this) + fallback_map = { + # as of gymnasium 1.3.0 Taxi-v3 is deprecated + "Taxi-v3": "Taxi-v4", + } + if env_id in fallback_map: + return make_vec_env(fallback_map[env_id], **kwargs) + raise From f123fd0f7ca096b698f498890ec5c28e350bb661 Mon Sep 17 00:00:00 2001 From: Jonathan Coletti <88168630+JonathanColetti@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:10:00 -0400 Subject: [PATCH 2/6] Update changelog with bug fixes Removed it from deprecations --- docs/misc/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/misc/changelog.md b/docs/misc/changelog.md index 4524db927a..d58c42090f 100644 --- a/docs/misc/changelog.md +++ b/docs/misc/changelog.md @@ -12,6 +12,7 @@ ### New Features: ### Bug Fixes: +- Fixed deprecated error Taxi-v3 from gymnasium v1.3.0 in tests ### [SB3-Contrib] @@ -20,7 +21,6 @@ ### [SBX] (SB3 + Jax) ### Deprecations: -- Fixed deprecated Taxi-v3 from gymnasium 1.3.0 ### Others: From 6c618909d7431e2410609fe609450949c8950201 Mon Sep 17 00:00:00 2001 From: Antonin RAFFIN Date: Sat, 2 May 2026 10:25:35 +0200 Subject: [PATCH 3/6] Fix mypy error with newer pytorch --- stable_baselines3/common/logger.py | 1 + 1 file changed, 1 insertion(+) diff --git a/stable_baselines3/common/logger.py b/stable_baselines3/common/logger.py index c2797be30c..88fcf56145 100644 --- a/stable_baselines3/common/logger.py +++ b/stable_baselines3/common/logger.py @@ -428,6 +428,7 @@ def write(self, key_values: dict[str, Any], key_excluded: dict[str, tuple[str, . self.writer.add_image(key, value.image, step, dataformats=value.dataformats) if isinstance(value, HParam): + assert self.writer.file_writer is not None # we don't use `self.writer.add_hparams` to have control over the log_dir experiment, session_start_info, session_end_info = hparams(value.hparam_dict, metric_dict=value.metric_dict) self.writer.file_writer.add_summary(experiment) From f5cc14b06eb3a89b8bc6f1ccece37a960fb273ad Mon Sep 17 00:00:00 2001 From: Antonin RAFFIN Date: Sat, 2 May 2026 10:37:10 +0200 Subject: [PATCH 4/6] Update warnings filters --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b26d86ec92..89c48bdc59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,17 +39,18 @@ exclude = """(?x)( env = ["PYTHONHASHSEED=0"] filterwarnings = [ + # multiprocessing and fork method + "ignore:This process.*is multi-threaded, use of fork\\(\\).*may lead to deadlocks:DeprecationWarning:multiprocessing.popen_fork.py", # A2C/PPO on GPU "ignore:You are trying to run (PPO|A2C) on the GPU", # Tensorboard warnings "ignore::DeprecationWarning:tensorboard", # Gymnasium warnings "ignore::UserWarning:gymnasium", + # Taxi-v3 and CliffWalking-v0 + "ignore::DeprecationWarning:gymnasium.envs.registration", # tqdm warning about rich being experimental "ignore:rich is experimental", - # Pygame warnings about pkg_resources - "ignore:pkg_resources is deprecated", - "ignore:Deprecated call to `pkg_resources", ] markers = [ "expensive: marks tests as expensive (deselect with '-m \"not expensive\"')", From 260e31ed0603df69d557178f8fe8abdd12c42ee3 Mon Sep 17 00:00:00 2001 From: Antonin RAFFIN Date: Sat, 2 May 2026 10:59:32 +0200 Subject: [PATCH 5/6] Update warning filter --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 89c48bdc59..ae67ce9593 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,8 +39,8 @@ exclude = """(?x)( env = ["PYTHONHASHSEED=0"] filterwarnings = [ - # multiprocessing and fork method - "ignore:This process.*is multi-threaded, use of fork\\(\\).*may lead to deadlocks:DeprecationWarning:multiprocessing.popen_fork.py", + # multiprocessing and fork method, use of fork may lead to deadlocks + "ignore::DeprecationWarning:multiprocessing.popen_fork", # A2C/PPO on GPU "ignore:You are trying to run (PPO|A2C) on the GPU", # Tensorboard warnings From f48134bcb8e2b511df7eee0a7eb1f9a05d93336d Mon Sep 17 00:00:00 2001 From: Antonin RAFFIN Date: Sat, 2 May 2026 11:27:47 +0200 Subject: [PATCH 6/6] Optimize test_features_extractor_target_net --- tests/test_cnn.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/test_cnn.py b/tests/test_cnn.py index 6ddf8a44fd..e10e4093a6 100644 --- a/tests/test_cnn.py +++ b/tests/test_cnn.py @@ -133,12 +133,19 @@ def test_features_extractor_target_net(model_class, share_features_extractor): if model_class == DQN and share_features_extractor: pytest.skip() - env = FakeImageEnv(screen_height=40, screen_width=40, n_channels=1, discrete=model_class not in {SAC, TD3}) + env = FakeImageEnv(screen_height=36, screen_width=36, n_channels=1, discrete=model_class not in {SAC, TD3}) # Avoid memory error when using replay buffer # Reduce the size of the features - kwargs = dict(buffer_size=250, learning_starts=100, policy_kwargs=dict(features_extractor_kwargs=dict(features_dim=32))) + kwargs = dict( + buffer_size=100, + learning_starts=50, + policy_kwargs=dict(features_extractor_kwargs=dict(features_dim=8)), + learning_rate=1e-3, + ) if model_class != DQN: kwargs["policy_kwargs"]["share_features_extractor"] = share_features_extractor + else: + kwargs["target_update_interval"] = 10 # No delay for TD3 (changes when the actor and polyak update take place) if model_class == TD3: @@ -172,7 +179,7 @@ def test_features_extractor_target_net(model_class, share_features_extractor): if model_class == TD3: params_should_match(model.actor.parameters(), model.actor_target.parameters()) - model.learn(200) + model.learn(100) # Critic and target should differ params_should_differ(model.critic.parameters(), model.critic_target.parameters())