o
    ci                      @   s   d dl mZmZmZ d dlZd dlZd dlmZ d dl	m
Z
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mZ d d
lmZ d dlmZ d dlmZ e \ZZZeG dd deZ dS )    )BoxDiscreteMultiDiscreteN)ModelCatalog)ModelV2restore_original_dimensions)normc_initializer)	TFModelV2)get_filter_config)SampleBatch)OldAPIStackoverride)try_import_tf)flatten_space)one_hotc                       s@   e Zd ZdZ fddZeedd Zeedd Z  Z	S )ComplexInputNetworka  TFModelV2 concat'ing CNN outputs to flat input(s), followed by FC(s).

    Note: This model should be used for complex (Dict or Tuple) observation
    spaces that have one or more image components.

    The data flow is as follows:

    `obs` (e.g. Tuple[img0, img1, discrete0]) -> `CNN0 + CNN1 + ONE-HOT`
    `CNN0 + CNN1 + ONE-HOT` -> concat all flat outputs -> `out`
    `out` -> (optional) FC-stack -> `out2`
    `out2` -> action (logits) and vaulue heads.
    c              
      s  t |dr|jn|| _|dr| jn|| _t | j|||| t| j| _i | _i | _	i | _
i | _d}t| jD ]\}}t|jdkrzt|trzd|v rR|d nt|j|dg d}	tj||d |	dd	|d
| j|< |t| j| j7 }q:t|ttfrt|tr|j}
nt|j}
|d |dg d}	tjtdd|
ftj|d |	dd|d
| j	|< |t| j	| j7 }q:tt|j}
|d |dg d}	tjtdd|
ftj|d |	dd|d
| j|< |
| j
|< |t| j| j7 }q:|dg |ddd}tjttdtd|ftjd| j d |ddd| _!d | _"d | _#|r]t$j%j&'| j!jf}t$j%j&j(|d t)ddd|}t$j%j&j(dd t)ddd|}t$j%j*+|||g| _"d S | j!j| _d S ) Noriginal_space_disable_preprocessor_apir      conv_filtersconv_activation)r   r   post_fcnet_hiddenstfzcnn_{})num_outputsmodel_config	frameworknamefcnet_hiddensfcnet_activation)r   r   r   g      g      ?z
one_hot_{}z
flatten_{}r   post_fcnet_activationrelu)r   r   z-infinf)shapedtypepost_fc_stack)r   r   g{Gz?logits)
activationkernel_initializerr      	value_out),hasattrr   getprocessed_obs_spacesuper__init__r   flattened_input_spacecnnsr   flatten_dimsflatten	enumeratelenr"   
isinstancer   r
   r   get_model_v2formatintr   r   r   nnpsumnvecfloat32prodfloataction_spacer$   logits_and_value_model
_value_outr   keraslayersInputDenser   modelsModel)self	obs_spacer@   r   r   r   concat_sizei	componentconfigsizepost_fc_stack_configconcat_layerlogits_layervalue_layer	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/ray/rllib/models/tf/complex_input_net.pyr.   #   s   





zComplexInputNetwork.__init__c                 C   sx  t j|v rd|v r|t j }nt|t j | jdd}g }tt|D ]k\}}|| jv r@| j| t t j|i\}}	|| q#|| j	v rmd|j
jv rWt jt	|| j| i}
nt j|i}
| j	| t |
\}}	|| q#| j| t t jtt|d| j| gtji\}}	|| q#tj|dd}| t t j|i\}}	| js|g fS | |\}}t|dg| _|g fS )Nobs_flatr   )	tensorlibr8   r(   )axis)r   OBSr   r,   r3   treer2   r0   appendr   r#   r   r/   r   castreshaper1   r=   concatr$   rA   rB   )rI   
input_dictstateseq_lensorig_obsoutsrL   rM   cnn_out_
one_hot_inone_hot_outnn_outoutr%   valuesrV   rV   rW   forward   sH   




zComplexInputNetwork.forwardc                 C   s   | j S )N)rB   )rI   rV   rV   rW   value_function   s   z"ComplexInputNetwork.value_function)
__name__
__module____qualname____doc__r.   r   r   rn   ro   __classcell__rV   rV   rT   rW   r      s    {
2r   )!gymnasium.spacesr   r   r   numpyr:   r]   ray.rllib.models.catalogr   ray.rllib.models.modelv2r   r   ray.rllib.models.tf.miscr   ray.rllib.models.tf.tf_modelv2r	   ray.rllib.models.utilsr
   ray.rllib.policy.sample_batchr   ray.rllib.utils.annotationsr   r   ray.rllib.utils.frameworkr   "ray.rllib.utils.spaces.space_utilsr   ray.rllib.utils.tf_utilsr   tf1r   tfvr   rV   rV   rV   rW   <module>   s     