
    h                     j    S SK Jr  S SKJr  S SKrS SKJr  S SKJ	r	J
r
  S SKJrJrJr   " S S\5      rg)	    )deepcopy)UnionN)spaces)is_image_spaceis_image_space_channels_first)VecEnvVecEnvStepReturnVecEnvWrapperc                   ^  ^  \ rS rSrSrSS\S\4U 4S jjjr\SS\	R                  S\S\	R                  4S	 jj5       r\S
\R                  S\R                  4S j5       rS\\R                  \4   S\\R                  \4   4S jrS\4S jrS\\R                  \4   4S jrSS jrSrU =r$ )VecTransposeImage   z
Re-order channels, from HxWxC to CxHxW.
It is required for PyTorch convolution layers.

:param venv:
:param skip: Skip this wrapper if needed as we rely on heuristic to apply it or not,
    which may result in unwanted behavior, see GH issue #671.
venvskipc                 $  > [        UR                  5      (       d0  [        UR                  [        R                  5      (       d   S5       eX l        U(       a  [        TU ]  U5        g [        UR                  [        R                  5      (       a  / U l        [        UR                  5      nUR                  R                  5        Hq  u  pE[        U5      (       d  M  U R                  R                  U5        [        U[        R                  5      (       d   eU R                  XT5      UR                  U'   Ms     OF[        UR                  [        R                  5      (       d   eU R                  UR                  5      n[        TU ]  XS9  g )NzFThe observation space must be an image or dictionary observation space)observation_space)r   r   
isinstancer   Dictr   super__init__image_space_keysr   itemsappendBoxtranspose_space)selfr   r   r   keyspace	__class__s         h/home/james-whalen/.local/lib/python3.13/site-packages/stable_baselines3/common/vec_env/vec_transpose.pyr   VecTransposeImage.__init__   s@   d4455""FKK:
 :
 	TS	T 
 	GT"d,,fkk::$&D! ()?)? @/66<<>
!%(())005%eVZZ8888484H4H4T%,,S1 ? d44fjjAAAA $ 4 4T5K5K LC    r   r   returnc                     [        U 5      (       d   S5       e[        U 5      (       a   SU S35       eU R                  u  p#nXBU4n[        R                  " SSXPR
                  S9$ )z
Transpose an observation space (re-order channels).

:param observation_space:
:param key: In case of dictionary space, the key of the observation space.
:return:
z&The observation space must be an imagezThe observation space z( must follow the channel last conventionr      )lowhighshapedtype)r   r   r'   r   r   r(   )r   r   heightwidthchannels	new_shapes         r   r   !VecTransposeImage.transpose_space.   s     /00Z2ZZ00
 
 	R#C5(PQ	R 
 #4"9"9xu-	zzacBYBYZZr!   imagec                     [        U R                  5      S:X  a  [        R                  " U S5      $ [        R                  " U S5      $ )zT
Transpose an image or batch of images (re-order channels).

:param image:
:return:
   )   r      )r   r0   r2   r1   )lenr'   np	transpose)r.   s    r   transpose_image!VecTransposeImage.transpose_image@   s7     u{{q <<y11||E<00r!   observationsc                     U R                   (       a  U$ [        U[        5      (       a5  [        U5      nU R                   H  nU R                  X   5      X'   M     U$ U R                  U5      nU$ )zk
Transpose (if needed) and return new observations.

:param observations:
:return: Transposed observations
)r   r   dictr   r   r6   )r   r8   ks      r   transpose_observations(VecTransposeImage.transpose_observationsL   sl     99lD))#L1L**"&"6"6|"G +   //=Lr!   c                 6   U R                   R                  5       u  pp4[        U5       H3  u  pVU(       d  M  SXE   ;   d  M  U R                  XE   S   5      XE   S'   M5     [	        U[
        R                  [        45      (       d   eU R                  U5      X#U4$ )Nterminal_observation)r   	step_wait	enumerater<   r   r4   ndarrayr:   )r   r8   rewardsdonesinfosidxdones          r   r@   VecTransposeImage.step_wait`   s    .2ii.A.A.C+u #5)IC%3595P5PQVQ[\rQs5t
12	 * ,T(:;;;;**<8'%OOr!   c                     U R                   R                  5       n[        U[        R                  [
        45      (       d   eU R                  U5      $ )z
Reset all environments
)r   resetr   r4   rB   r:   r<   )r   r8   s     r   rJ   VecTransposeImage.resetm   sA     yy(,T(:;;;;**<88r!   c                 8    U R                   R                  5         g )N)r   close)r   s    r   rM   VecTransposeImage.closeu   s    		r!   )r   r   )F) )r"   N)__name__
__module____qualname____firstlineno____doc__r   boolr   staticmethodr   r   strr   r4   rB   r6   r   r:   r<   r	   r@   rJ   rM   __static_attributes____classcell__)r   s   @r   r   r      s    DV D4 D D2 [6:: [C [ [ [" 	1rzz 	1bjj 	1 	15T9I3J uUWU_U_aeUeOf (P+ P9uRZZ-. 9 r!   r   )copyr   typingr   numpyr4   	gymnasiumr   &stable_baselines3.common.preprocessingr   r   -stable_baselines3.common.vec_env.base_vec_envr   r	   r
   r    r!   r   <module>ra      s(        ` a ak kr!   