ValueError: The shape of the spec and the CompositeSpec mismatch during shape resetting: the 1 first dimensions should match but got self['accuracy'].shape=torch.Size([1, 1]) and CompositeSpec.shape=torch.Size([1])

from poke_env import RandomPlayer
from torchrl.envs import GymWrapper
opponent = RandomPlayer(battle_format="gen9randombattle")
train_env = SimpleRLPlayer(
    battle_format="gen9randombattle", opponent=opponent, start_challenging=True
)

base_env = GymWrapper(train_env, device=device)
check_env_specs(train_env)
ValueError                                Traceback (most recent call last)
Cell In[9], line 8
      4 opponent = RandomPlayer(battle_format="gen9randombattle")
      5 train_env = SimpleRLPlayer(
      6     battle_format="gen9randombattle", opponent=opponent, start_challenging=True
      7 )
----> 8 base_env = GymWrapper(train_env, device=device)
      9 check_env_specs(train_env)

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:571, in _AsyncMeta.__call__(cls, *args, **kwargs)
    570 def __call__(cls, *args, **kwargs):
--> 571     instance: GymWrapper = super().__call__(*args, **kwargs)
    573     # before gym 0.22, there was no final_observation
    574     if instance._is_batched:

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\common.py:176, in _EnvPostInit.__call__(cls, *args, **kwargs)
    174 auto_reset = kwargs.pop("auto_reset", False)
    175 auto_reset_replace = kwargs.pop("auto_reset_replace", True)
--> 176 instance: EnvBase = super().__call__(*args, **kwargs)
    177 # we create the done spec by adding a done/terminated entry if one is missing
    178 instance._create_done_specs()

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:782, in GymWrapper.__init__(self, env, categorical_action_encoding, **kwargs)
    780     with set_gym_backend(libname):
    781         kwargs["env"] = env
--> 782         super().__init__(**kwargs)
    783 else:
    784     super().__init__(**kwargs)

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\common.py:3048, in _EnvWrapper.__init__(self, device, batch_size, allow_done_after_reset, *args, **kwargs)
   3046 self._check_kwargs(kwargs)
   3047 self._env = self._build_env(**kwargs)  # writes the self._env attribute
-> 3048 self._make_specs(self._env)  # writes the self._env attribute
   3049 self.is_closed = False
   3050 self._init_env()

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:1010, in GymWrapper._make_specs(self, env, batch_size)
   1004 cur_batch_size = self.batch_size if batch_size is None else torch.Size([])
   1005 action_spec = _gym_to_torchrl_spec_transform(
   1006     env.action_space,
   1007     device=self.device,
   1008     categorical_action_encoding=self._categorical_action_encoding,
   1009 )
-> 1010 observation_spec = _gym_to_torchrl_spec_transform(
   1011     env.observation_space,
   1012     device=self.device,
   1013     categorical_action_encoding=self._categorical_action_encoding,
   1014 )
   1015 if not isinstance(observation_spec, CompositeSpec):
   1016     if self.from_pixels:

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:373, in _gym_to_torchrl_spec_transform(spec, dtype, device, categorical_action_encoding, remap_state_to_observation, batch_size)
    371     return CompositeSpec(spec_out, device=device)
    372 elif isinstance(spec, gym_spaces.dict.Dict):
--> 373     return _gym_to_torchrl_spec_transform(
    374         spec.spaces,
    375         device=device,
    376         categorical_action_encoding=categorical_action_encoding,
    377         remap_state_to_observation=remap_state_to_observation,
    378     )
    379 else:
    380     raise NotImplementedError(
    381         f"spec of type {type(spec).__name__} is currently unaccounted for"
    382     )

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:364, in _gym_to_torchrl_spec_transform(spec, dtype, device, categorical_action_encoding, remap_state_to_observation, batch_size)
    354     if (
    355         remap_state_to_observation
    356         and k == "state"
   (...)
    361         # naming it 'state' will result in envs that have a different name for the state vector
    362         # when queried with and without pixels
    363         key = "observation"
--> 364     spec_out[key] = _gym_to_torchrl_spec_transform(
    365         spec[k],
    366         device=device,
    367         categorical_action_encoding=categorical_action_encoding,
    368         remap_state_to_observation=remap_state_to_observation,
    369     )
    370 # the batch-size must be set later
    371 return CompositeSpec(spec_out, device=device)

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\envs\libs\gym.py:292, in _gym_to_torchrl_spec_transform(spec, dtype, device, categorical_action_encoding, remap_state_to_observation, batch_size)
    290     out = _gym_to_torchrl_spec_transform(space, device=device, dtype=dtype)
    291     out = out.unsqueeze(0)
--> 292     out.make_neg_dim(0)
    293     return out
    294 elif isinstance(spec, gym_spaces.multi_discrete.MultiDiscrete):

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\data\tensor_specs.py:691, in TensorSpec.make_neg_dim(self, dim)
    689 if dim < 0 or dim > self.ndim - 1:
    690     raise ValueError(f"dim={dim} is out of bound for ndim={self.ndim}")
--> 691 self.shape = torch.Size(
    692     [s if i != dim else -1 for i, s in enumerate(self.shape)]
    693 )

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\data\tensor_specs.py:608, in TensorSpec.__setattr__(self, key, value)
    606 if key == "shape":
    607     value = torch.Size(value)
--> 608 super().__setattr__(key, value)

File F:\Holder\ShowdownBot\.venv\Lib\site-packages\torchrl\data\tensor_specs.py:3870, in CompositeSpec.shape(self, value)
   3868     elif spec is not None:
   3869         if spec.shape[: len(value)] != value:
-> 3870             raise ValueError(
   3871                 f"The shape of the spec and the CompositeSpec mismatch during shape resetting: the "
   3872                 f"{self.ndim} first dimensions should match but got self['{key}'].shape={spec.shape} and "
   3873                 f"CompositeSpec.shape={self.shape}."
   3874             )
   3875 self._shape = torch.Size(value)

ValueError: The shape of the spec and the CompositeSpec mismatch during shape resetting: the 1 first dimensions should match but got self['accuracy'].shape=torch.Size([1, 1]) and CompositeSpec.shape=torch.Size([1]).

I receive this error when trying to use poke-env together with torch-rl. I can’t work out how to fix this issue at all, would love some help. SimpleRLPlayer extends OpenAIGymEnv for some context.

This error could be made more explicit!
Can you tell me what would be the specs of your env and how you build them? It looks like there’s a mismatch between the specs and the shape of the “accuracy”