o
    "Õjì  ã                   @   sF   g Z d d„ Zdd„ Zdd„ Zdd„ ZG dd	„ d	ƒZG d
d„ deƒZdS )c                    sz   t | ƒ‰ ‡ fdd„tˆ ƒD ƒ}dgˆ  }t| ƒD ] \}}t| ƒD ]\}}| |¡r7d|| |< ||  d7  < q q||fS )Nc                    s   g | ]}d gˆ  ‘qS )é    © ©Ú.0Ú_©Únsizer   úp/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/fleet/base/strategy_compiler.pyÚ
<listcomp>   ó    z create_graph.<locals>.<listcomp>r   é   )ÚlenÚrangeÚ	enumerateZ_can_update)Úoptimizer_listÚedgeÚindegreeÚiÚoptÚjZ	opt_innerr   r   r   Úcreate_graph   s   

€ýr   c                 C   s¦   t |ƒ}dg| }t|ƒD ]C}d}||k r)|| dkr)|d7 }||k r)|| dks||k s1J dƒ‚|||< d||< t|ƒD ]}| | | dkrO||  d8  < q=q|S )Néÿÿÿÿr   r   z0The combination of meta optimizers contains ring©r   r   )r   r   r   Ztopor   r   Úkr   r   r   Ú	topo_sort    s    
ÿ€þr   c                    sŠ  t | ƒ‰ d}ddg}‡ fdd„tˆ ƒD ƒ}tˆ ƒD ]*}tˆ ƒD ]#}| | | dkrB|g|| |< | | | |krB| | | }||g}qqtˆ ƒD ]f}tˆ ƒD ]_}tˆ ƒD ]X}| | | dkr_qT| | | dkso| | | dkrpqT| | | | | | | | |  k r¬| | | | | |  | | |< || | || |  || |< | | | }||g}qTqNqH|dkr¶dgS |d g||d  |d   S )Nr   c                    s   g | ]}d d„ t ˆ ƒD ƒ‘qS )c                 S   s   g | ]}g ‘qS r   r   r   r   r   r   r	   7   s    z$floyd.<locals>.<listcomp>.<listcomp>)r   r   r   r   r   r	   7   s    zfloyd.<locals>.<listcomp>r   r   r   )r   Úmax_lenZmax_edgeÚmax_pathr   r   r   r   r   r   Úfloyd2   s>   €ú	 $  €òÿr   c                 C   sz   t | ƒdkrd S t| ƒ\}}t||ƒ t|ƒ}g }|D ]	}| | | ¡ qt|d d… ƒD ]\}}| ||d  ¡ q-|S )Nr   r   r   )r   r   r   r   Úappendr   Z_update_inner_optimizer)r   r   r   r   Ú	candidateÚidxr   r   r   r   Úmaximum_path_len_algoZ   s   
r    c                   @   s   e Zd Zdd„ ZdS )ÚStrategyCompilerBasec                 C   s   d S ©Nr   ©Úselfr   r   r   Ú__init__l   s   zStrategyCompilerBase.__init__N)Ú__name__Ú
__module__Ú__qualname__r%   r   r   r   r   r!   k   s    r!   c                       sJ   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Z	 dd„ Z	‡  Z
S )ÚStrategyCompilera‰  
    StrategyCompiler is responsible for meta optimizers combination
    Generally, a user can define serveral distributed strategies that
    can generate serveral meta optimizer. The combination of these
    meta optimizers should have the right order to apply the optimizers'
    minimize function.
    This class is responsible for the executable distributed optimizer
    generation.
    c                    s2   t ƒ  ¡  g | _g | _d | _d | _g | _g | _d S r"   )Úsuperr%   Ú_meta_optimizersÚ_graph_optimizersZ_valid_optimizer_listÚ_user_defined_strategyÚ_meta_optimizer_candidatesÚ_graph_optimizer_candidatesr#   ©Ú	__class__r   r   r%   {   s   

zStrategyCompiler.__init__c                 C   s   | j S r"   ©r+   r#   r   r   r   Ú_get_applied_meta_optimizer„   s   z,StrategyCompiler._get_applied_meta_optimizerc                 C   ó   dd„ | j D ƒS )Nc                 S   ó   g | ]}t |ƒj‘qS r   ©Útyper&   ©r   r   r   r   r   r	   ˆ   r
   z;StrategyCompiler._get_applied_meta_list.<locals>.<listcomp>r2   r#   r   r   r   Ú_get_applied_meta_list‡   ó   z'StrategyCompiler._get_applied_meta_listc                 C   r4   )Nc                 S   r5   r   r6   r8   r   r   r   r	   ‹   r
   z<StrategyCompiler._get_applied_graph_list.<locals>.<listcomp>)r,   r#   r   r   r   Ú_get_applied_graph_listŠ   r:   z(StrategyCompiler._get_applied_graph_listc           
      C   s„   dd l }| |¡}g }| jD ]}d}| jD ]}|jj|jjkr#d} nq|s+| |¡ q|D ]}	|	 |¡ q.|D ]}	|	 |¡ q8|S )Nr   FT)ÚcopyÚdeepcopyr.   r+   r1   r&   r   Z_disable_strategy)
r$   Zdist_strategyZcan_not_apply_optimizer_listr<   Zvalid_strategyZinvalid_optimizersr   Zis_validÚvalidr   r   r   r   Ú_get_valid_strategy   s$   


þ
€z$StrategyCompiler._get_valid_strategyc                 C   sà   || _ || _|| _t|ƒdkrt|ƒdkr|d fS t|ƒ}t|ƒ}|d u r'g n|| _|d u r0g n|| _|d u r9d n|d }	|d u rCd n|d }
|d u sO|d u rS|	|
fS d}|D ]}|D ]}|jj|j	v rfd}q[qW|sld }
|	|
fS )Nr   TF)
r-   r.   r/   r   r    r+   r,   r1   r&   Zmeta_optimizers_black_list)r$   ZlossZ
role_makerZ	optimizerZuser_defined_strategyZmeta_optimizer_listZgraph_optimizer_listZmeta_optimizersZgraph_optimizersZreturn_metaZreturn_graphZneed_graph_optZ	graph_optZprogram_optr   r   r   Úgenerate_optimizer¬   s:   	ÿÿÿÿÿ€ûz#StrategyCompiler.generate_optimizer)r&   r'   r(   Ú__doc__r%   r3   r9   r;   r?   r@   Ú__classcell__r   r   r0   r   r)   p   s    
	r)   N)Ú__all__r   r   r   r    r!   r)   r   r   r   r   Ú<module>   s   (