o
    ci                     @   s   d dl Z d dlZd dlZd dlmZmZ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mZ e \ZZZeG d	d
 d
eZdS )    N)DictListUnion)log_once)ModelV2)OldAPIStackoverride)deprecation_warning)try_import_tf)ModelConfigDict
TensorTypec                
       s   e Zd ZdZdejjdejjdedede	f
 fddZ
d	ejfd
dZd	ee fddZdee d	dfddZee	dded	eee ee	ef f fddZee	dded	eee ee	ef f fddZedd Z  ZS )	TFModelV2zTF version of ModelV2, which should contain a tf keras Model.

    Note that this class by itself is not a valid model unless you
    implement forward() in a subclass.	obs_spaceaction_spacenum_outputsmodel_confignamec                    s>   t  j|||||dd g | _t rd| _dS t | _dS )a  Initializes a TFModelV2 instance.

        Here is an example implementation for a subclass
        ``MyModelClass(TFModelV2)``::

            def __init__(self, *args, **kwargs):
                super(MyModelClass, self).__init__(*args, **kwargs)
                input_layer = tf.keras.layers.Input(...)
                hidden_layer = tf.keras.layers.Dense(...)(input_layer)
                output_layer = tf.keras.layers.Dense(...)(hidden_layer)
                value_layer = tf.keras.layers.Dense(...)(hidden_layer)
                self.base_model = tf.keras.Model(
                    input_layer, [output_layer, value_layer])
        tf)	frameworkN)super__init__var_listtf1executing_eagerlygraphget_default_graph)selfr   r   r   r   r   	__class__ R/home/ubuntu/.local/lib/python3.10/site-packages/ray/rllib/models/tf/tf_modelv2.pyr      s   
zTFModelV2.__init__returnc                 C   s   | j r| j  S t| S )z2Returns a contextmanager for the current TF graph.)r   
as_defaultr   contextr   r   r   r    r#   9   s   

zTFModelV2.contextc                 C   s   g S )zqReturn the list of update ops for this model.

        For example, this should include any BatchNorm update ops.r   r$   r   r   r    
update_ops@   s   zTFModelV2.update_ops	variablesNc                 C   s$   t dr
tddd | j| dS )z5Register the given list of variables with this model.'deprecated_tfmodelv2_register_variablesTFModelV2.register_variablesF)olderrorN)r   r	   r   extend)r   r&   r   r   r    register_variablesF   s   r(   Fas_dictc                 C   sL   |r| j rdd | j D S | d| jS | j rt| j S t| jdd S )Nc                 S   s   i | ]}|j |qS r   )r   .0vr   r   r    
<dictcomp>S   s    z'TFModelV2.variables.<locals>.<dictcomp> Tr-   )r   _find_sub_modules__dict__listr&   valuesr   r-   r   r   r    r&   L   s   
zTFModelV2.variablesc                 C   s0   |rdd | j dd D S dd |   D S )Nc                 S   s   i | ]
\}}|j r||qS r   	trainable)r/   kr0   r   r   r    r1   d   s
    
z1TFModelV2.trainable_variables.<locals>.<dictcomp>Tr3   c                 S   s   g | ]}|j r|qS r   r9   r.   r   r   r    
<listcomp>g   s    z1TFModelV2.trainable_variables.<locals>.<listcomp>)r&   itemsr8   r   r   r    trainable_variables_   s
   zTFModelV2.trainable_variablesc           	         s*  t |tjjjst |tjr*i }|jD ]}tdd|j	} d | }|||< q|S t |t
r> fdd|jdd D S t |tjrH |iS t |ttfrli }t|D ]\}}t
 d| |}|| qU|S t |tr rw d7  i }| D ]\}}t
 t| |}|| q}|S i S )	N/.c                    s   i | ]\}} d  | |qS )r@   r   )r/   keyvarcurrent_keyr   r    r1   u   s    z/TFModelV2._find_sub_modules.<locals>.<dictcomp>Tr3   z_{}_)
isinstancer   kerasmodelsModelModuler&   resubr   r   r=   Variabletupler6   	enumerater4   formatupdatedictstr)	rD   structretrB   r   rA   ivaluesub_varsr   rC   r    r4   i   s<   




zTFModelV2._find_sub_modules)F)__name__
__module____qualname____doc__gymspacesSpaceintr   rS   r   
contextlibAbstractContextManagerr#   r   r   r%   r,   r   r   boolr   r   r&   r>   staticmethodr4   __classcell__r   r   r   r    r      s@    "	r   )ra   	gymnasiumr]   rK   typingr   r   r   ray.utilr   ray.rllib.models.modelv2r   ray.rllib.utils.annotationsr   r   ray.rllib.utils.deprecationr	   ray.rllib.utils.frameworkr
   ray.rllib.utils.typingr   r   r   r   tfvr   r   r   r   r    <module>   s    