o
    "j(                     @   s   d dl mZmZ d dlmZ G dd dZG dd dZG dd deZd	d
 Z	i fddZ
G dd deZdd Zdd Zdd Zdd Zddgie_i e_g de_eedd eejejge_dd Zdd ZG d d! d!Zd"S )#    )ABCabstractmethod)_apply_passc                   @   sB   e Zd Zdd Zdd ZdddZedd	 Zd
d Zdd Z	dS )PassContextc                 C   s   g | _ i | _d S N)_applied_passes_attrsself r   d/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/passes/pass_base.py__init__   s   
zPassContext.__init__c                 C   s   || j |< d S r   r   r
   keyvaluer   r   r   set_attr      zPassContext.set_attrNc                 C      | j ||S r   r   getr
   r   defaultr   r   r   get_attr   r   zPassContext.get_attrc                 C      | j S r   r   r	   r   r   r   passes      zPassContext.passesc                 C   s   | j | d S r   )r   append)r
   pass_objr   r   r   	_add_pass#   s   zPassContext._add_passc                 C   s   | j d= d S )Nr   r	   r   r   r   	_pop_pass&   s   zPassContext._pop_passr   )
__name__
__module____qualname__r   r   r   propertyr   r    r"   r   r   r   r   r      s    

r   c                   @   s    e Zd ZdZdZdZdZdZdS )PassTyper               N)r#   r$   r%   UNKNOWNZCOMM_OPTZCALC_OPTZPARALLEL_OPT
FUSION_OPTr   r   r   r   r'   *   s    r'   c                   @   s   e Zd Zi Zg Zi Zi Zg ZdZe	dd Z
dd Zdd Zddd	Zed
d Zedd Zdd Zdd ZdddZdd Zedd ZdS )PassBaseNc                 C   s   t |tsJ |tj| < d S r   )
issubclassr.   _REGISTERED_PASSES)	pass_name
pass_classr   r   r   	_register<   s   zPassBase._registerc                 C   s
   i | _ d S r   r   r	   r   r   r   r   A   s   
zPassBase.__init__c                 C   s   || j |< | S r   r   r   r   r   r   r   D   s   
zPassBase.set_attrc                 C   r   r   r   r   r   r   r   r   H   r   zPassBase.get_attrc                 C      d S r   r   r	   r   r   r   _check_selfK      zPassBase._check_selfc                 C   r4   r   r   r
   
other_passr   r   r   _check_conflictO   r6   zPassBase._check_conflictc                 C   s   t jS r   )r'   r,   r	   r   r   r   _typeS   s   zPassBase._typec                    s$     ot fddtjD S )Nc                 3   s    | ]}| V  qd S r   r   ).0rr8   r
   r   r   	<genexpr>W   s    

zBPassBase._check_conflict_including_common_rules.<locals>.<genexpr>)r9   allr.   _COMMON_RULESr7   r   r=   r   &_check_conflict_including_common_rulesV   s   z/PassBase._check_conflict_including_common_rulesc                    s   |d u rt  }  s|S t fdd|jD s|S t|ts"J t|ts)J t|t|ks3J  ||| |  |S )Nc                 3       | ]}  |V  qd S r   rA   r;   pr	   r   r   r>   b   
    
z!PassBase.apply.<locals>.<genexpr>)	r   r5   r?   r   
isinstancelistlen_apply_implr    )r
   main_programsstartup_programscontextr   r	   r   apply[   s   
zPassBase.applyc                 C   s&   t ||D ]\}}| ||| qd S r   )zip_apply_single_impl)r
   rK   rL   rM   main_programstartup_programr   r   r   rJ   o   s
   zPassBase._apply_implc                 C   r4   r   r   r
   rQ   rR   rM   r   r   r   rP   u   r6   zPassBase._apply_single_implr   )r#   r$   r%   r0   r@   _BEFORE_WHITE_LISTS_DICT_AFTER_WHITE_LISTS_DICT_PASS_PROCESS_ORDER_LISTnamestaticmethodr3   r   r   r   r   r5   r9   r:   rA   rN   rJ   rP   r   r   r   r   r.   2   s,    




r.   c                    s    fdd}|S )Nc                    s   t  |   | _| S r   )r.   r3   rW   )clsrW   r   r   impl{   s   zregister_pass.<locals>.implr   )rW   r[   r   rZ   r   register_passz   s   r\   c                 C   sL   t j| }|d usJ d|  d| }| D ]
\}}||| q|S )NPass z is not registered)r.   r0   r   itemsr   )rW   Z
pass_attrsr2   r   kvr   r   r   new_pass   s   ra   c                       sL   e Zd Z fddZedd Zedd Zdd Zd	d
 Zdd Z	  Z
S )CPPPassWrapperc                    s   t    d S r   )superr   r	   	__class__r   r   r      r   zCPPPassWrapper.__init__c                 C   s   t  r   )NotImplementedErrorr	   r   r   r   cpp_name   r   zCPPPassWrapper.cpp_namec                 C   s   i S r   r   r	   r   r   r   cpp_attr_types   r6   zCPPPassWrapper.cpp_attr_typesc                 C      dS NTr   r	   r   r   r   r5         zCPPPassWrapper._check_selfc                 C   ri   rj   r   r7   r   r   r   r9      rk   zCPPPassWrapper._check_conflictc                 C   s   t ||| j| j| j d S r   )_apply_cpp_passrg   r   rh   rS   r   r   r   rP      s   z!CPPPassWrapper._apply_single_impl)r#   r$   r%   r   r&   rg   rh   r5   r9   rP   __classcell__r   r   rd   r   rb      s    

rb   c                 C   s$   |   tjkr|  tjkrdS dS )NFT)r:   r'   r-   pass_before
pass_afterr   r   r   _fusion_opt_last_rule   s   rq   c                 C   s0   |   tjkr|  tjkrt| t|k S dS rj   )r:   r'   r-   _get_list_indexrn   r   r   r   _fusion_opt_list_rule   s   rs   c                    s   dd }t  }|| | ||| i  |D ]}t   |< q|  D ]\}}|D ]	} | | q'q!| D ]\}}|D ]	} | | q<q6 fdd}|S )Nc                 S   sX   |   D ]%\}}|| t|ttfsJ |D ]}t|ttfs#J || qqd S r   )r^   addrG   rH   tuplebytesstr)Zwhite_lists_dictresultr_   r`   r1   r   r   r   collect_pass_names   s   
z<_make_rule_from_white_lists_dict.<locals>.collect_pass_namesc                    s,     | j}|d u s|j vrdS |j|v S rj   )r   rW   )ro   rp   Zall_passes_afterZcompatible_pass_dictr   r   rule   s
   

z._make_rule_from_white_lists_dict.<locals>.rule)setr^   rt   )Zbefore_white_lists_dictZafter_white_lists_dictry   Zall_pass_namesr1   r_   r`   r{   r   rz   r    _make_rule_from_white_lists_dict   s"   


r}   c                 C   s,   | j tjv sJ d| j  dtj| j S )Nr]   z# is not in _PASS_PROCESS_ORDER_LIST)rW   r.   rV   index)Zin_passr   r   r   rr      s   rr   Zfuse_gradient_mergeZfuse_all_reduce)Zfuse_relu_depthwise_convZfuse_bn_add_actZfuse_bn_actZfused_attentionZfused_feedforwardZfuse_gemm_epilogueZ
fuse_adamwZfuse_optimizerc                 C   s   t | t |kS r   )typern   r   r   r   <lambda>  s    r   c           	      C   s  t | }d g| }d g| }g }d}t|D ]]}d g| ||< d g| ||< t|D ]H}t| | | ts7J | | | sJ||| |< g || |< q*| | | du sTJ d|| |< ||g|| |< || | |k rrd}|| | }q*qt|D ]}t|D ]}t|D ]~}|| | || | || |  kr|| | || |  || |< || | r|| | d |ksJ nq|| | r|| | d |ksJ nq|| | r|| | || | dd   ng || |< || | |k r|| | }|| | }qq~qx|r
|S dgS )Nr   Tr!   r(   )rI   rangerG   bool)	edgesnpathsdistsZmin_pathZmin_distijr_   r   r   r   _find_longest_path  sR   

& .
r   c           	         s   dd D sg S }g |D ] t  fdd|jD r$  qs)g S t}g }t|D ]
}|d g|  q3t|D ]}t|D ]}| | || |< qHqBt|}fdd|D S )Nc                 S   s   g | ]}|  r|qS r   )r5   rD   r   r   r   
<listcomp>>  s    z(_solve_pass_conflict.<locals>.<listcomp>c                 3   rB   r   rC   )r;   Z	applied_p)rE   r   r   r>   E  rF   z'_solve_pass_conflict.<locals>.<genexpr>c                    s   g | ]} | qS r   r   )r;   idxr   r   r   r   Z  s    )r?   r   r   rI   r   rA   r   )	r   rM   Z
old_passesr   Zadjacent_matrix_r   r   Zlongest_pathr   )rE   r   r   _solve_pass_conflict=  s6   

r   c                   @   sB   e Zd ZdddZdd Zedd Zed	d
 Zedd ZdS )PassManagerNTc                 C   s6   |d u rt  }|| _|rt||| _d S t|| _d S r   )r   _contextr   _passesrH   )r
   r   rM   Zauto_solve_conflictr   r   r   r   ^  s   zPassManager.__init__c                 C   s*   | j }| jD ]	}||||}q|| _ |S r   )r   r   rN   )r
   rK   rL   rM   rE   r   r   r   rN   h  s
   
zPassManager.applyc                 C   r   r   )r   r	   r   r   r   rM   o  r   zPassManager.contextc                 C   s   dd | j D S )Nc                 S   s   g | ]}|j qS r   rZ   rD   r   r   r   r   u  s    z%PassManager.names.<locals>.<listcomp>r   r	   r   r   r   namess  s   zPassManager.namesc                 C   s
   t | jS r   )ru   r   r	   r   r   r   r   w  s   
zPassManager.passesrj   )	r#   r$   r%   r   rN   r&   rM   r   r   r   r   r   r   r   ]  s    



r   N)abcr   r   Zpaddle.frameworkr   rl   r   r'   r.   r\   ra   rb   rq   rs   r}   rr   rT   rU   rV   r@   r   r   r   r   r   r   r   <module>   s4   H		

(

. 