o
    "jI                     @  sZ  d dl mZ d dlZd dlZd dl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mZmZmZmZ d dl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mZmZm Z  d
dl!m"Z"m#Z#m$Z$ edZ%G dd dee% Z&G dd dZ'da(G dd dZ)e
dd Z*dd Z+e&G dd dZ,dd Z-dd Z.dd Z/d d! Z0d"d# Z1d$d% Z2d&d' Z3d(d) Z4d*d+ Z5d,d- Z6d.d/ Z7d0d1 Z8G d2d3 d3Z9d4d5 Z:d6d7 Z;d8d9 Z<dWd<d=Z=dXdCdDZ>dXdEdFZ?dGdH Z@e&G dIdJ dJZAe&G dKdL dLZBdMdN ZCG dOdP dPee% ZDG dQdR dReZEG dSdT dTZFe&G dUdV dVZGdS )Y    )annotationsN)OrderedDict)contextmanager)Enum)AnyGenericIterableIteratorTypeVar)WeakValueDictionary)Program)flattenmap_structure   )ENV_CLEAN_CODEENV_COST_MODELENV_SOT_LOG_LEVELENV_STRICT_MODE)break_graph_setpaddle_api_listpaddle_api_module_prefixTc                   @  s    e Zd Zd
ddZdddZd	S )	Singletonclstype[T]c                 C  s   || _ i | _d S N_clsZ	_instance)selfr    r   [/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/sot/utils/utils.py__init__2      
zSingleton.__init__returnr   c                 C  s(   | j | jvr|   | j| j < | j| j  S r   r   r   r   r   r    __call__6   s   zSingleton.__call__N)r   r   )r#   r   )__name__
__module____qualname__r!   r%   r   r   r   r    r   1   s    
r   c                   @  s&   e Zd Zdd Zdd Zdd	d
ZdS )NameGeneratorc                 C  s   d| _ || _d S Nr   )counterprefix)r   r,   r   r   r    r!   =   r"   zNameGenerator.__init__c                 C  s"   | j t| j }|  jd7  _|S Nr   )r,   strr+   r   namer   r   r    nextA   s   zNameGenerator.nextr0   r.   r#   boolc                 C  s   | | jS r   )
startswithr,   r/   r   r   r    
match_nameF      zNameGenerator.match_nameN)r0   r.   r#   r2   )r&   r'   r(   r!   r1   r4   r   r   r   r    r)   <   s    r)   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )TmpNameRecordsc                 C  s   t dd| _t | _d S )NZ	_sot_tmp_)r,   )r)   name_generatorr   tmp_names_recordr$   r   r   r    r!   N   s   zTmpNameRecords.__init__c                 C  
   | j  S r   )r7   r1   r$   r   r   r    	next_nameR   s   
zTmpNameRecords.next_namec                 C  s*   || j v r
| j | S |  }|| j |< |S r   )r8   r:   )r   exprtmp_namer   r   r    add_tmp_varU   s
   


zTmpNameRecords.add_tmp_varN)r&   r'   r(   r!   r:   r=   r   r   r   r    r6   M   s    r6   c                  c  s    t } t a d V  | a d S r   )_tmp_name_recordsr6   )oldr   r   r    tmp_name_guard^   s
   r@   c                   C  s   t S r   )r>   r   r   r   r    current_tmp_name_recordsg   s   rA   c                   @  s   e Zd ZdddZdd ZdS )	ResumeFnNameFactoryr#   Nonec                 C  s   t d| _d S )NZresume_)r)   genr$   r   r   r    r!   n   s   zResumeFnNameFactory.__init__c                 C  s   | j  }|S r   )rD   r1   r/   r   r   r    r1   q   s   
zResumeFnNameFactory.nextN)r#   rC   )r&   r'   r(   r!   r1   r   r   r   r    rB   l   s    
rB   c                 G  s&   t  }| |krt|ddi d S d S )Nend )r   getprint)levelargs	cur_levelr   r   r    logv   s   rL   c                 C  s   t  }| |kr|  d S d S r   )r   rG   )rI   fnrK   r   r   r    log_do|   s   
rN   c                 G  s*   t  }| |krt|j| dd d S d S )NrF   )rE   )r   rG   rH   format)rI   r.   rJ   rK   r   r   r    
log_format   s   rP   c                       fdd}|S )Nc               	     sP   t jjd }zz	 | i |}W n    W t jj| |S t jj| w r   )paddleZ	frameworkcoreZset_eval_frame)rJ   kwargsZold_cbretvalfuncr   r    no_eval_frame_func   s   z)no_eval_frame.<locals>.no_eval_frame_funcr   )rW   rX   r   rV   r    no_eval_frame   s   
rY   c                 C  s>   t | tjjr	dS t| drdS t| rdS t| p| tv S )NF__self__)	
isinstancerR   nnZLayerhasattrinspectisclassin_paddle_moduler   rV   r   r   r    is_paddle_api   s   
ra   c                 C  sT   t jg}| |v r
dS t| tjrdS ttD ]\}}|| u r't|tr' dS qdS NTF)	weakrefrefr[   typesBuiltinFunctionTyper^   
getmembersbuiltinstype)rM   Zspecial_builtin_fnsmember_namememberr   r   r    is_builtin_fn   s   rl   c                 C  s   t | dr9| j}|d u rdS tdd|d t | dr"tdd| jd tdd tD ]}||r8tdd	  d
S q)tdd dS )Nr'   F   z&find paddle function with __module__: 
r&   z&                     with __name__  : z&                     with results   : z True
Tz False
)r]   r'   rL   r&   r   r3   )rW   Z
module_strr,   r   r   r    r`      s"   






r`   c                 C  s   | t v S r   )r   rV   r   r   r    is_break_graph_api      ro   c                   s     fdd}t |g|R  S )Nc                    s   |  r|  S  |  S r   r   rJ   false_fnpredtrue_fnr   r    replace   s   zmap_if.<locals>.replace)r   )rt   ru   rs   
structuresrv   r   rr   r    map_if   s   rx   c                 c  s>    t | D ]}t|tr|jV  |jV  |jV  q|V  qd S r   )r   r[   slicestartstopstep)	structureitemr   r   r    flatten_extend   s   

r   c                   s,   fdd} fdd}t | || dS )z8support extended structures like slice and SliceVariablec                   s   t | trdS  | S )NT)r[   ry   )xrt   r   r    wrapped_pred   s   
z#map_if_extend.<locals>.wrapped_predc                   s8   t | tr| j| j| jg}t| }t| S | S r   )r[   ry   rz   r{   r|   map_if_extend)r   lrr   r   r    wrapped_true_fn   s
   
z&map_if_extend.<locals>.wrapped_true_fn)rt   ru   rs   )rx   )r}   rt   ru   rs   r   r   r   rr   r    r      s
   r   c                   s$    fdd}t tt|g|R  S )Nc                    s    |  rdS dS Nr   r   r   rq   r   r   r    is_true   s   zcount_if.<locals>.is_true)sumr   r   )rt   rw   r   r   r   r    count_if   s   r   c                   @  s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )CacheFc                 C  s   |si | _ nt | _ d| _d S r*   )cacher   hit_num)r   Zweakr   r   r    r!      s   
zCache.__init__c                 O  sv   | j |i |}|d u r| j|i |S || jv r,tdd|d |  jd7  _| j| S | j|i |}|| j|< |S )Nrm   zcache hit: rn   r   )key_fnvalue_fnr   rL   r   )r   rJ   rT   	cache_keyvaluer   r   r    r%      s   


zCache.__call__c                 C  s   | j   d| _d S r*   )r   clearr   r$   r   r   r    r   	  s   

zCache.clearc                 O     t  r   NotImplementedErrorr   rJ   rT   r   r   r    r        zCache.key_fnc                 O  r   r   r   r   r   r   r    r     r   zCache.value_fnN)F)r&   r'   r(   r!   r%   r   r   r   r   r   r   r    r      s    
r   c                   rQ   )Nc                    s4   t   } | i |}t   }|| }td| |S )NzExecute time:)timerH   )rJ   rT   
start_timeresultZend_timeZexecution_timerV   r   r    wrapper  s   
zexecute_time.<locals>.wrapperr   )rW   r   r   rV   r    execute_time  s   r   c                 C  s   d|  d| d| dS )Nz(shape: z	, dtype: z, stop_gradient: )r   )shapeZdtypeZstop_gradientr   r   r    meta_str      r   c                   C     t  S r   )r   rG   r   r   r   r    is_strict_mode$  rp   r   r#   r2   c                   C  r   r   )r   rG   r   r   r   r    is_clean_code(  rp   r   li	list[Any]r~   r   intc                 C  s   dd | D  t|S )Nc                 S     g | ]}t |qS r   id.0itr   r   r    
<listcomp>-      z)list_find_index_by_id.<locals>.<listcomp>)indexr   r   r~   r   r   r    list_find_index_by_id,  r   r   c                 C  s   t |dd | D v S )Nc                 S  r   r   r   r   r   r   r    r   1  r   z&list_contain_by_id.<locals>.<listcomp>r   r   r   r   r    list_contain_by_id0  s   r   c                 C  s   t | j|S r   )getattr	__class__)objr0   r   r   r    get_unbound_method4  s   r   c                   @  sx   e Zd ZU ded< ded< ded< ded< dd	 Zd
d Zdd Zdd ZdddZdd Z	dd Z
dd Zdd ZdS )GraphLoggerr   	graph_numop_numzlist[Program]graphsz$list[paddle.base.framework.Operator]opsc                 C  s   |    d S r   )r   r$   r   r   r    r!   @  r5   zGraphLogger.__init__c                 C  s   d| _ d| _g | _g | _d S r*   )r   r   r   r   r$   r   r   r    r   C  s   
zGraphLogger.clearc                 C     | j S r   )r   r$   r   r   r    get_graph_numI  r   zGraphLogger.get_graph_numc                 C  r   r   )r   r$   r   r   r    
get_op_numL  r   zGraphLogger.get_op_numprogramr   c                 C  sT   |  j d7  _ | j| d}| jD ]}|  jd7  _|d7 }q| j| d S r   )r   r   appendZglobal_blockr   r   )r   r   Z
sub_op_numopr   r   r    add_subgraphO  s   
zGraphLogger.add_subgraphc                 C  sP   t t| jD ]}|d |d| d| j|   || j|   qd S )Nz6------------------------------------------------------z	subgraph z	, OpNum: )rangelenr   r   r   )r   strsir   r   r    add_subgprah_infoY  s   zGraphLogger.add_subgprah_infoc                   s^   g  d  d     d    td fdd  d dS )Nz6---------------- PaddleSOT graph info ----------------zSubgraphNum: zOpNum: rm   c                     s
     S r   )r   r   r   r   r   r    <lambda>i  s   
 z%GraphLogger.__str__.<locals>.<lambda>rn   )r   r   r   rN   joinr$   r   r   r    __str__b  s   


zGraphLogger.__str__c                 C  s   |   S r   )r   r$   r   r   r    __repr__n  rp   zGraphLogger.__repr__c                 C  s   t |  d S r   )rH   r$   r   r   r    
print_infoq  r5   zGraphLogger.print_infoN)r   r   )r&   r'   r(   __annotations__r!   r   r   r   r   r   r   r   r   r   r   r   r    r   9  s   
 

	r   c                   @  s   e Zd ZdS )SotUndefinedVarN)r&   r'   r(   r   r   r   r    r   u  s    r   c              
   C  s6   zt |  W dS  ty } zW Y d }~dS d }~ww rb   )hash	TypeError)r   er   r   r    hashablez  s   r   c                   @  s   e Zd ZU dZded< d/d0ddZd1ddZd2ddZd3ddZd2ddZ	d3ddZ
d2ddZd3ddZd4ddZd4dd Zd5d"d#Zd6d%d&Zd7d'd(Zd8d*d+Zd9d-d.ZdS ):
OrderedSetz6
    A set that preserves the order of insertion.
    zdict[T, None]_dataNitemsIterable[T] | Nonec                 C  s"   |durt || _dS i | _dS )z
        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> s
            OrderedSet(1, 2, 3)
            >>> s = OrderedSet()
            >>> s
            OrderedSet()
        N)dictfromkeysr   )r   r   r   r   r    r!     s   "
zOrderedSet.__init__r#   Iterator[T]c                 C  
   t | jS )z
        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> for item in s:
            ...     print(item)
            1
            2
            3
        )iterr   r$   r   r   r    __iter__     

zOrderedSet.__iter__otherOrderedSet[T]c                 C  s   t t| t| S )a7  
        Union two sets.

        Args:
            other: Another set to be unioned.

        Returns:
            The union of two sets.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 | s2
            OrderedSet(1, 2, 3, 4)
        )r   listr   r   r   r   r    __or__  s   zOrderedSet.__or__c                 C  s   | j t| | S )a  
        Union two sets in place.

        Args:
            other: Another set to be unioned.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 |= s2
            >>> s1
            OrderedSet(1, 2, 3, 4)
        )r   updater   r   r   r   r   r    __ior__  s   zOrderedSet.__ior__c                      t  fdd| D S )a@  
        Intersect two sets.

        Args:
            other: Another set to be intersected.

        Returns:
            The intersection of two sets.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 & s2
            OrderedSet(2, 3)
        c                   s   g | ]}| v r|qS r   r   r   r~   r   r   r    r         z&OrderedSet.__and__.<locals>.<listcomp>r   r   r   r   r    __and__     zOrderedSet.__and__c                       fdd| D | _ | S )a!  
        Intersect two sets in place.

        Args:
            other: Another set to be intersected.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 &= s2
            >>> s1
            OrderedSet(2, 3)
        c                   s   i | ]	}| v r|d qS r   r   r   r   r   r    
<dictcomp>      z'OrderedSet.__iand__.<locals>.<dictcomp>r   r   r   r   r    __iand__     zOrderedSet.__iand__c                   r   )a:  
        Subtract two sets.

        Args:
            other: Another set to be subtracted.

        Returns:
            The subtraction of two sets.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 - s2
            OrderedSet(1)
        c                   s   g | ]}| vr|qS r   r   r   r   r   r    r     r   z&OrderedSet.__sub__.<locals>.<listcomp>r   r   r   r   r    __sub__  r   zOrderedSet.__sub__c                   r   )a  
        Subtract two sets in place.

        Args:
            other: Another set to be subtracted.

        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([2, 3, 4])
            >>> s1 -= s2
            >>> s1
            OrderedSet(1)
        c                   s   i | ]	}| vr|d qS r   r   r   r   r   r    r     r   z'OrderedSet.__isub__.<locals>.<dictcomp>r   r   r   r   r    __isub__  r   zOrderedSet.__isub__r~   r   c                 C  s   | j | dS )z
        Add an item to the set.

        Args:
            item: The item to be added.

        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> s.add(4)
            >>> s
            OrderedSet(1, 2, 3, 4)
        N)r   
setdefaultr   r~   r   r   r    add
  s   zOrderedSet.addc                 C  s   | j |= dS )z
        Remove an item from the set.

        Args:
            item: The item to be removed.

        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> s.remove(2)
            >>> s
            OrderedSet(1, 3)
        Nr   r   r   r   r    remove  s   zOrderedSet.remover2   c                 C  s
   || j v S )z
        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> 1 in s
            True
            >>> 4 in s
            False
        r   r   r   r   r    __contains__(  s   
	zOrderedSet.__contains__r   c                 C  r   )zj
        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> len(s)
            3
        )r   r   r$   r   r   r    __len__3  s   
zOrderedSet.__len__c                 C  r   )z
        Examples:
            >>> s = OrderedSet([1, 2, 3])
            >>> bool(s)
            True
            >>> s = OrderedSet()
            >>> bool(s)
            False
        )r2   r   r$   r   r   r    __bool__<  r   zOrderedSet.__bool__objectc                 C  s   t |tstS t| t|kS )z
        Examples:
            >>> s1 = OrderedSet([1, 2, 3])
            >>> s2 = OrderedSet([1, 2, 3])
            >>> s1 == s2
            True
            >>> s3 = OrderedSet([3, 2, 1])
            >>> s1 == s3
            False
        )r[   r   NotImplementedr   r   r   r   r    __eq__H  s   
zOrderedSet.__eq__r.   c                 C  s   d tt| j}d| dS )Nz, zOrderedSet(r   )r   mapreprr   )r   Z	data_reprr   r   r    r   W  s   zOrderedSet.__repr__r   )r   r   )r#   r   )r   r   r#   r   )r   r   )r~   r   )r~   r   r#   r2   )r#   r   r#   r2   )r   r   r#   r2   )r#   r.   )r&   r'   r(   __doc__r   r!   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r     s$   
 











	
r   c                   @  s   e Zd ZdZdZdZdS )	StepStater         N)r&   r'   r(   COLLECT_INFORUN_SOTRUN_DYNr   r   r   r    r  \  s    r  c                   @  sL   e Zd ZdZdZdZdZdZdZdd Z	dd	 Z
d
d Zdd Zdd ZdS )StepInfo
   rm   2   g?   c                 C  s8   d| _ t r
tjntj| _g | _d| _g | _	d| _
d S )Nr   )
step_countr   rG   r  r  r  statedyn_time_costsavg_dyn_timesot_time_costssot_stepr$   r   r   r    r!   m  s   
zStepInfo.__init__c                 C  s>   | j | t| j | jkrt| j | j d  | _d S d S r   )r  r   r   REQUIRED_DYN_INFOSnpmeanUSED_DYN_INFOSr  )r   	time_costr   r   r    add_dynamic_time_infoy  s   
zStepInfo.add_dynamic_time_infoc                 C  s   | j | t| j | jkret| j }tdd| d| j d || jk r5tdd| d tj	| _
d S | j| jksFt| j | | jk rUtdd| d tj| _
d S tdd| d | j   d S d S )	Nr   z[Cost Model] sot: z, dyn: rn   z [Cost Model] Switch to RUN_SOT: z 
z [Cost Model] Switch to RUN_DYN: z[Cost Model] Decision delayed: )r  r   r   REQUIRED_SOT_INFOSr  r  rL   r  r  r  r  r  COLLECT_INFO_MAX_STEPZstdCV_BOUNDARYr  r   )r   r  current_codeZavg_sot_timer   r   r    add_sot_time_info  s"   
zStepInfo.add_sot_time_infoc                 C  s   | j | jk S r   )r  BACK_TRACE_STEPSr$   r   r   r    need_back_trace  r5   zStepInfo.need_back_tracec                 C  s   t | j| jk S r   )r   r  r  r$   r   r   r    need_dynamic_info  s   zStepInfo.need_dynamic_infoN)r&   r'   r(   r  r  r  r  r  r  r!   r  r  r  r   r   r   r   r    r  b  s    r  c                   @  s\   e Zd Zdd Zedd Zdd Zdd Zed	d
 Z	edd Z
edd Zdd ZdS )StepInfoManagerc                 C  s   i | _ d | _d | _d S r   )step_recordr  current_step_infor$   r   r   r    r!     s   
zStepInfoManager.__init__c                 c  s    z8| j }| j}|| _ || jvrt | j|< | j| | _| j jd7  _tdd| j d d V  W || _ || _d S || _ || _w )Nr   r  z.[Cost Model] New step start, current state is rn   )r  r#  r"  r  r  rL   current_state)r   codeZold_codeZold_infor   r   r    
step_guard  s$   

zStepInfoManager.step_guardc                 C  s   | j  jd7  _d S r-   )r#  r  r$   r   r   r    r    s   zStepInfoManager.sot_stepc                O  sr   | j  rt }||i |}t | }| j | |S t }||i |}t | }| j || j |S r   )r#  r   r   perf_counterr  r  r  )r   Zimpl_dynamicZimpl_sotrJ   rT   r   Zoutsr  r   r   r    collect_info  s   
zStepInfoManager.collect_infoc                 C  r9   r   )r#  r  r$   r   r   r    r    s   
zStepInfoManager.need_back_tracec                 C     | j jS r   )r#  r  r$   r   r   r    current_step     zStepInfoManager.current_stepc                 C  r)  r   )r#  r  r$   r   r   r    r$    r+  zStepInfoManager.current_statec                 C  s   | j   d | _d| _d S )Nr  )r"  r   r  r*  r$   r   r   r    r     s   

zStepInfoManager.clearN)r&   r'   r(   r!   r   r&  r  r(  propertyr  r*  r$  r   r   r   r   r    r!    s    



r!  r   )r   r   r~   r   r#   r   )H
__future__r   rh   r^   r   re   rc   collectionsr   
contextlibr   enumr   typingr   r   r   r	   r
   r   numpyr  rR   Zpaddle.frameworkr   Zpaddle.utilsr   r   Zenvsr   r   r   r   Zpaddle_api_configr   r   r   r   r   r)   r>   r6   r@   rA   rB   rL   rN   rP   rY   ra   rl   r`   ro   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r   r   r   r    <module>   st   
		
	


; [: