o
    ciU                     @   s   d dl Zd dlmZmZmZmZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ ed	d
G dd deZdS )    N)AnyDictListOptional)ConnectorV2)Columns)RLModule)override)EpisodeType)	PublicAPIalpha)	stabilityc                       s   e Zd ZdZeedejdejdejfddZ		ddd	d	d
de	ej de	ej de
dedef
 fddZeeddddedeeef dee de	e de	e defddZdd Z  ZS )_FrameStackingzCA connector piece that stacks the previous n observations into one.input_observation_spaceinput_action_spacereturnc                 C   sB   | j ri }|j D ]\}}| |||< q
tj|S | |S )N)_multi_agentspacesitems_convert_individual_spacegymr   )selfr   r   retagent_id	obs_space r   ^/home/ubuntu/.local/lib/python3.10/site-packages/ray/rllib/connectors/common/frame_stacking.py"recompute_output_observation_space   s   
z1_FrameStacking.recompute_output_observation_spaceN   F)
num_framesmulti_agentas_learner_connectorr   r    r!   c                   s.   t  jd||d| || _|| _|| _dS )a  Initializes a _FrameStackingConnector instance.

        Args:
            num_frames: The number of observation frames to stack up (into a single
                observation) for the RLModule's forward pass.
            multi_agent: Whether this is a connector operating on a multi-agent
                observation space mapping AgentIDs to individual agents' observations.
            as_learner_connector: Whether this connector is part of a Learner connector
                pipeline, as opposed to an env-to-module pipeline.
        )r   r   Nr   )super__init__r   r   _as_learner_connector)r   r   r   r   r    r!   kwargs	__class__r   r   r#   "   s   
z_FrameStacking.__init__)exploreshared_data	rl_modulebatchepisodesr(   r)   c                   s    j r7 j|ddD ]*}|f fdd	} j|tjt||jt j	 d t
|dddt
||d	 q
|S  |D ](}|jrCJ |jt j	 d dd
}	tjdd g|	R  }
 j|tj|
|d q<|S )NF)agents_that_stepped_onlyc                    sb   t j| dd} t| jf| jdd   }| jd f| j }t jt jjj	| ||dg dd
 S )Naxisr   r   )shapestrides)r         r   )axes)npsqueezelenr   r1   r2   	transposelibstride_tricks
as_stridedcopy)s_sa_episode	new_shapenew_stridesr   r   r   _map_fnQ   s   z(_FrameStacking.__call__.<locals>._map_fnr   Tg        )indicesneg_index_as_lookbackfill)r+   columnitems_to_add	num_itemssingle_agent_episode)rD   rF   c                  W   s   t j| ddS )Nr3   r/   )r6   concatenate)r>   r   r   r   <lambda>   s    z)_FrameStacking.__call__.<locals>.<lambda>)r+   rG   item_to_addrJ   )r$   single_agent_episode_iteratoradd_n_batch_itemsr   OBStreemap_structureget_observationsslicer   r8   is_numpyadd_batch_item)r   r*   r+   r,   r(   r)   r%   
sa_episoderC   	obs_stackstacked_obsr   rB   r   __call__@   sL   
%
z_FrameStacking.__call__c                 C   sx   t |tjjsJ ||jd dksJ |tjjtj|j| jddtj|j	| jddt
|jd d | jg |jdS )Nr.   r   )repeatsr0   )lowhighr1   dtype)
isinstancer   r   Boxr1   r6   repeatr\   r   r]   listr^   )r   r   r   r   r   r      s   z(_FrameStacking._convert_individual_space)NN)__name__
__module____qualname____doc__r	   r   r   Spacer   r   intboolr#   r   r   strr   r   r
   dictrZ   r   __classcell__r   r   r&   r   r      sX    
	Jr   )numpyr6   typingr   r   r   r   	gymnasiumr   rQ   !ray.rllib.connectors.connector_v2r   ray.rllib.core.columnsr   "ray.rllib.core.rl_module.rl_moduler   ray.rllib.utils.annotationsr	   ray.rllib.utils.typingr
   ray.util.annotationsr   r   r   r   r   r   <module>   s    