o
    "j(                     @   s   d dl m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
mZ d dlmZmZ dd	lmZmZmZmZ G d
d dZeG dd dZdd Zdd Zdd Zdd Zdd ZeG dd dZeG dd deZeG dd deZdS )    )cached_propertyN)	amp_state)	framework)convert_dtype)UniqueNameGeneratorguard)flattenis_sequence   )Cache	Singletonmap_if_extendmeta_strc                   @   sP   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )MetaInfoc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S N)namepersistabletypeplaceshapedtypestop_gradient)selfr   r   r   r   r   r   r    r   Z/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/sot/infer_meta.py__init__   s   
zMetaInfo.__init__c                 C   s   t | tjjrd}| j}tj| j }n	| j}| j}| j}t	 }|tj
kr1|d ur1|d dkr1tj}tt| j|| j||| j| jS )NzOpResult@NoNamer   float16)
isinstancepaddlepirOpResultr   r   Zpaddle_type_to_proto_typer   r   r   r   Zfloat32r   listr   r   r   r   )Ztensorr   r   r   Zcurrent_amp_stater   r   r   from_tensor*   s*   
zMetaInfo.from_tensorc                 C   s
   d| j v S )zH
        if -1 in shape, return True
        else: return False
        )r   r   r   r   r   is_dynamic_shapeG   s   
zMetaInfo.is_dynamic_shapec                 C   s   t jj| j| j| jdS )N)r   r   )r   static	InputSpecr   r   r   r$   r   r   r   to_input_specN   s   zMetaInfo.to_input_specc                 C   s   d| j  d| j d| j dS )N(z, )r   r   r   r$   r   r   r   	guard_strS   s   zMetaInfo.guard_strc                 C   s   t | j| j| jS r   )r   r   r   r   r$   r   r   r   __repr__V   s   zMetaInfo.__repr__c                 C   s$   | j |j ko| j|jko| j|jkS r   r+   )r   metar   r   r   __eq__Y   s
   

zMetaInfo.__eq__c                 C   s   t t| j| j| jfS r   )hashtupler   r   r   r$   r   r   r   __hash__`   s   zMetaInfo.__hash__N)__name__
__module____qualname__r   staticmethodr"   r%   r(   r,   r-   r/   r2   r   r   r   r   r      s    
r   c                   @   s   e Zd ZdZdd Zdd Zedd Zedd	 Z	ed
d Z
edd Zedd Zedd Zedd Zdd Zdd Zdd ZdS )VariableCreatorz
    We use the static graph Variable to infer the meta information of Tensor.
    This singleton class is used to create Variable for infer meta.
    c                 C   s   t d| _d S )NZinfer_meta_variable_)r   var_name_generatorr$   r   r   r   r   k   s   zVariableCreator.__init__c                 C   s0   |j  d|j }|jD ]	}|d| 7 }q|S )N_)r   r   r   )r   r.   r   lr   r   r   gen_namer   s   
zVariableCreator.gen_namec                 C   s   t j r| jS | jS r   )r   r   use_pir_apipir_var_cachelegacy_var_cacher$   r   r   r   	var_cachex   s   
zVariableCreator.var_cachec                 C      i S r   r   r$   r   r   r   r>         z VariableCreator.legacy_var_cachec                 C   r@   r   r   r$   r   r   r   r=      rA   zVariableCreator.pir_var_cachec                 C      t j t j fS r   r   r&   ZProgramr$   r   r   r   legacy_programs   s   zVariableCreator.legacy_programsc                 C   rB   r   rC   r$   r   r   r   pir_programs   s   zVariableCreator.pir_programsc                 C   s    t jj r| jd S | jd S )Nr   )r   baser   r<   rE   rD   r$   r   r   r   main_program   s   

zVariableCreator.main_programc                 C   s   t j r
| jd S | jd S )Nr
   )r   r   r<   rE   rD   r$   r   r   r   startup_program   s   


zVariableCreator.startup_programc                 C   s   t j r4t j| j| j t jjj| 	||j
t|jd}|j|_W d    n1 s.w   Y  n| j j|j
|j|jd}t|t jrLJ d|S )N)r   r   r   r+   z$Expect a Variable, but got a Tensor.)r   r   r<   r&   program_guardrG   rH   inputdatar;   r   r   r   r   Zglobal_block
create_varr   Tensor)r   r.   varr   r   r   rL      s.   



zVariableCreator.create_varc                 C   s.   |  |}|| jvr| || j|< | j| S r   )r;   r?   rL   )r   r.   Zvar_feature_namer   r   r   get_variable   s   


zVariableCreator.get_variablec              
   O   s   t jjd i t| jG t|t|}}t j| j	| j
% t|tr7t|d ||dd  i |}n||i |}W d    n1 sHw   Y  W d    n1 sWw   Y  W d    t|S W d    t|S 1 ssw   Y  t|S )Nr   r
   )r   rF   r   Z_dygraph_guardUniqueNameGuardr8   convert_meta_to_variabler&   rI   rG   rH   r   strgetattrconvert_variable_to_meta_info)r   funcargskwargsoutr   r   r   
infer_meta   s.   
"(zVariableCreator.infer_metaN)r3   r4   r5   __doc__r   r;   propertyr?   r   r>   r=   rD   rE   rG   rH   rL   rO   rY   r   r   r   r   r7   d   s*    






r7   c                 C      t | dd dd dd dS )Nc                 S   
   t | tS r   r   r   xr   r   r   <lambda>      
 z*convert_meta_to_variable.<locals>.<lambda>c                 S   s   t  | S r   )r7   rO   r_   r   r   r   ra      s    c                 S      | S r   r   r_   r   r   r   ra          predZtrue_fnZfalse_fnr   rV   r   r   r   rQ      s   rQ   c                 C   r\   )Nc                 S   r]   r   r^   r_   r   r   r   ra      rb   z,convert_meta_to_input_spec.<locals>.<lambda>c                 S   s   |   S r   )r(   r_   r   r   r   ra      s    c                 S   s   t | tjrtjj| S | S r   )r   r   rM   r&   r'   r"   r_   r   r   r   ra      s   
re   rg   rh   r   r   r   convert_meta_to_input_spec   s   ri   c                    s<   t jj s
t jjnt jj t|  fdddd dd dS )Nc                    s
   t |  S r   )r   r_   Zstatic_variable_typer   r   ra      rb   z/convert_variable_to_meta_info.<locals>.<lambda>c                 S   s
   t | S r   r   r"   r_   r   r   r   ra      rb   c                 S   rc   r   r   r_   r   r   r   ra      rd   re   )	r   rF   r   r<   r&   Variabler   r    r   rh   r   rj   r   rT      s   


rT   c                 O   s8   t  | }|r||i |S t j| g|R i |S r   )SpecialInferMetaget_infermeta_fnr7   rY   )rU   rV   rW   fnr   r   r   rY      s   rY   c                 O   sz   t | tjjsJ d|  dtjj| dd} t||f\}}| jj|i |\}}|	tj
t|j}| j  |S )NzExpect a Layer, but got .T)Z
full_graph)r   r   nnZLayerZjitZ	to_staticri   forwardZget_concrete_programZ_restore_oututilsr   rT   outputsrollback)layerrV   rW   Zargs_Zkwargs_Zconcrete_programZpartial_program_layerrX   r   r   r   infer_meta_for_layer   s$   

rw   c                   @   s6   e Zd ZdZdd Zdd Z						dd	d
ZdS )rm   z
    There are some functions that cannot be inferred directly through static graph,
    and need to be implemented manually. This class is used to implement infer meta
    for these functions.
    c                 C   s   d S r   r   r$   r   r   r   r     s   zSpecialInferMeta.__init__c                 C   s&   z|j }t| d| W S    Y d S )NZ
infermeta_)r3   rS   )r   ro   funcnamer   r   r   rn     s   z!SpecialInferMeta.get_infermeta_fnNFTc	           	      C   s   t |s|g}|S r   )r	   )	r   rt   ZinputsZgrad_outputsZretain_graphZcreate_graphZonly_inputsZallow_unusedZno_grad_varsr   r   r   infermeta_grad#  s   zSpecialInferMeta.infermeta_grad)NNFTFN)r3   r4   r5   rZ   r   rn   ry   r   r   r   r   rm     s    rm   c                   @      e Zd Zdd Zdd ZdS )InferMetaCachec              
   O   sV   zt |tt|t| tt|f}W |S  ty* } zW Y d }~d S d }~ww r   )r0   r1   r   keys	Exception)r   rU   rV   rW   retvaler   r   r   key_fn5  s   



zInferMetaCache.key_fnc                 O      t |g|R i |S r   )rY   )r   rU   rV   rW   r   r   r   value_fnE     zInferMetaCache.value_fnNr3   r4   r5   r   r   r   r   r   r   r{   3  s    r{   c                   @   rz   )LayerInferMetaCachec              
   O   sr   dd |j ddD }zt|t|tt|t| tt|f}W |S  ty8 } zW Y d }~d S d }~ww )Nc                 S   s   g | ]}t |qS r   rk   ).0r`   r   r   r   
<listcomp>L  s    z.LayerInferMetaCache.key_fn.<locals>.<listcomp>T)Zinclude_sublayers)
parametersr0   r1   r   r|   r}   )r   rv   rV   rW   paramsr~   r   r   r   r   r   K  s"   



zLayerInferMetaCache.key_fnc                 O   r   r   )rw   )r   rv   rV   rW   r   r   r   r   ^  r   zLayerInferMetaCache.value_fnNr   r   r   r   r   r   I  s    r   )	functoolsr   r   Zpaddle.amp.auto_castr   Zpaddle.baser   Zpaddle.base.data_feederr   Zpaddle.base.unique_namer   r   rP   Zpaddle.utilsr   r	   rs   r   r   r   r   r   r7   rQ   ri   rT   rY   rw   rm   r{   r   r   r   r   r   <module>   s,   Fk	"