
    h                         S SK r S SKJr  S SKJrJrJrJrJr  S SK	r
S SKJr  S SKJrJr  \" S\
R                   \\\
R                   4   5      r " S S\\   5      rg)	    N)Mapping)AnyGenericOptionalTypeVarUnion)spaces)is_image_spaceis_image_space_channels_firstTObsc                   T   \ rS rSrSr SS\S\S\\R                  \R                  4   S\
\\\\\
\   4   4      SS4
S	 jjr\ SS\S\R                  S\
\   S\\\\\S
4   \4   4S jj5       rS\S\4S jrS\S\R*                  S\\\\4      S\\\\\\4      4   4S jrSrg)StackedObservations   a  
Frame stacking wrapper for data.

Dimension to stack over is either first (channels-first) or last (channels-last), which is detected automatically using
``common.preprocessing.is_image_space_channels_first`` if observation is an image space.

:param num_envs: Number of environments
:param n_stack: Number of frames to stack
:param observation_space: Environment observation space
:param channels_order: If "first", stack on first image dimension. If "last", stack on last dimension.
    If None, automatically detect channel to stack over in case of image observation or default to "last".
    For Dict space, channels_order can also be a dictionary.
Nnum_envsn_stackobservation_spacechannels_orderreturnc                 h   X l         X0l        [        U[        R                  5      (       a  [        U[
        5      (       d*  UR                  R                  5        Vs0 s H  oUU_M     nnUR                  R                  5        VVs0 s H  u  pVU[        XXdU   5      _M     snnU l	        [        R                  " U R                  R                  5        VVs0 s H  u  pWXWR                  _M     snn5      U l
        g [        U[        R                  5      (       a  [        U[
        5      (       a  [        S5      eU R                  X#U5      u  U l        U l        U l        U l        [$        R&                  " UR(                  X R"                  S9n[$        R&                  " UR*                  X R"                  S9n	[        R                  " UU	UR,                  S9U l
        [$        R.                  " U/U R                   Q7UR,                  S9U l        g [        SU S35      es  snf s  snnf s  snnf )NzBWhen the observation space is Box, channels_order can't be a dict.axis)lowhighdtype)r   zFStackedObservations only supports Box and Dict as observation spaces. z was provided.)r   r   
isinstancer	   Dictr   keysitemsr   sub_stacked_observationsstacked_observation_spaceBox	TypeErrorcompute_stackingchannels_firststack_dimensionstacked_shaperepeat_axisnprepeatr   r   r   zerosstacked_obs)
selfr   r   r   r   keysubspacesubstack_obsr   r   s
             o/home/james-whalen/.local/lib/python3.13/site-packages/stable_baselines3/common/vec_env/stacked_observations.py__init__StackedObservations.__init__   s    !2'55ng66ARAYAYA^A^A`!aA`#~"5A`!a &7%=%=%C%C%E-%EMC (HUXFYZZ%E-D) .4[[VZVsVsVyVyV{|V{AR<<<V{|.D* )6::66.'22 dee^b^s^sN_[D!5t7I4K[ ))-117AQAQRC99.33WCSCSTD-3ZZ'--.D*
  "xx(GD4F4F(GO`OfOfgDXYjXkkyz 1 "b-
 }s   H#H(H.
.c                     Uc  [        U5      (       a  [        U5      nOSnOUS;   d   S5       eUS:H  nU(       a  SOSnU(       a  SOSn[        UR                  5      nXe==   U -  ss'   X4[	        U5      U4$ )a  
Calculates the parameters in order to stack observations

:param n_stack: Number of observations to stack
:param observation_space: Observation space
:param channels_order: Order of the channels
:return: Tuple of channels_first, stack_dimension, stackedobs, repeat_axis
F>   lastfirstz:`channels_order` must be one of following: 'last', 'first'r5      r   )r
   r   listshapetuple)r   r   r   r$   r%   r'   r&   s          r0   r#   $StackedObservations.compute_stackingC   s     !/00!>?P!Q "'! &  L LL 
 ,w6N  .!2)ar.445"g-"m0DkQQ    observationc                    [        U[        5      (       aA  UR                  5        VVs0 s H#  u  p#X R                  U   R	                  U5      _M%     snn$ SU R
                  S'   U R                  (       a9  XR
                  SS2UR                  U R                     * S2S4'   U R
                  $ XR
                  SUR                  U R                     * S24'   U R
                  $ s  snnf )z
Reset the stacked_obs, add the reset observation to the stack, and return the stack.

:param observation: Reset observation
:return: The stacked reset observation
r   .N)	r   dictr   r   resetr+   r$   r9   r%   )r,   r=   r-   obss       r0   r@   StackedObservations.resetf   s     k4((WbWhWhWjkWj83C66s;AA#FFWjkk !S^Q!2!243G3G!H H JCOP  Q\S;#4#4T5I5I#J"J"LLM ls   *C&observationsdonesinfosc                 z   [        U[        5      (       a  UR                  5        VVs0 s H'  nUU Vs/ s H  nSU;   a
  SUS   U   0O0 PM     sn_M)     nnn0 n0 nUR                  5        H-  u  pIU R                  U   R                  XXd   5      u  Xt'   X'   M/     UR                  5        H:  n[        [        U5      5       H  n
SX:   ;   d  M  X   U
   S   X:   S   U'   M!     M<     Xs4$ UR                  U R                     * n[        R                  " U R                  XR                  S9U l        [        U5       H  u  pU(       d  M  SX:   ;   ai  X:   S   nU R                  (       a  U R                  U
SU2S4   nOU R                  U
SSU24   n[        R                  " X4U R                   S9nXU
   S'   O["        R$                  " S5        SU R                  U
'   M     U R                  (       a  XR                  SS2US2S4'   OXR                  SUS24'   U R                  U4$ s  snf s  snnf )z
Add the observations to the stack and use the dones to update the infos.

:param observations: Observations
:param dones: Dones
:param infos: Infos
:return: Tuple of the stacked observations and the updated infos
terminal_observationr   N.zAVecFrameStack wrapping a VecEnv without terminal_observation infor   )r   r?   r   r   r   updaterangelenr9   r%   r(   rollr+   	enumerater$   concatenater'   warningswarn)r,   rC   rD   rE   r-   info	sub_infosr+   stacked_infosrA   env_idxshiftdoneold_terminalprevious_stacknew_terminals                   r0   rH   StackedObservations.updatew   sg    lD)) (,,.
 /C	  % % TjmqSq+T2H-I#-NOwyy %  /   KM(..07;7T7TUX7Y7`7`admvm{7|4 -"4 1
 %))+$SZ0G-?FSFXY`FabxFy'=>sC  1 , %%##D$8$899774#3#3UAUAUV&u-MGt)U^;#(>2H#IL**)-)9)9'6E63:N)O)-)9)9'3:N)O#%>>>2PW[WgWg#hL=I'N#9:MM"ef,-  ) . /;Q^,,8S%&[)&&Qs   H7H2H72H7)	r$   r   r   r'   r%   r+   r    r&   r   )N)__name__
__module____qualname____firstlineno____doc__intr   r	   r!   r   r   strr   r1   staticmethodr:   boolr#   r   r@   r(   ndarrayr8   r?   r   rH   __static_attributes__ r<   r0   r   r      s5   & MQ%% % !V[[!89	%
 !sGC#4F,G'G!HI% 
%N UY R R)/ REMc] R	tS%S/3.	/ R  RD   $  ":':' zz:' DcN#	:'
 
tT$sCx.))	*:'r<   r   )rN   collections.abcr   typingr   r   r   r   r   numpyr(   	gymnasiumr	   &stable_baselines3.common.preprocessingr
   r   rc   r?   r`   r   r   re   r<   r0   <module>rk      sK     # 9 9   `vrzz4RZZ#89d''$- d'r<   