o
    Meø  ã                   @   s:   d dl mZ ddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )é    ©ÚOrderedDictNc                 C   s<   |d u rt ƒ }nt|t ƒsJ ‚| D ]
}||vrd||< q|S )NT)r   Ú
isinstance)Úlist_objZordered_dictÚobj© r   úTD:\Projects\ConvertPro\env\Lib\site-packages\paddle/distributed/passes/pass_utils.pyÚlist_to_ordered_dict   s   €r	   c                 C   s\   t ƒ }g }|  ¡ jD ]!}|jD ]}||vr| |¡ | |¡ q|jD ]}| |¡ q#q
|S ©N)ÚsetÚglobal_blockÚopsÚinput_arg_namesÚappendÚaddÚoutput_arg_names)ÚprogramZvisited_varsÚ
input_varsÚopÚin_var_nameÚout_var_namer   r   r   Úget_inputs_of_program   s   


€
ÿr   c                 C   s.   t ƒ }|  ¡ jD ]}t|j|ƒ qt| ¡ ƒS r
   )r   r   r   r	   r   ÚlistÚkeys)r   Úoutput_varsr   r   r   r   Úget_outputs_of_program-   s   r   c                 C   sZ  t |  ¡ jƒ}|dk r||7 }|dkr||k sJ ‚|dk r!||7 }|dkr)||ks-J |ƒ‚||k s3J ‚|  ¡ } t|d |d dƒD ]}|  ¡ j|dd qAt|d ddƒD ]}|  ¡ j|dd qU|  ¡  tƒ }|  ¡ jD ]}|jD ]}| 	|¡ qr|j
D ]}| 	|¡ q}qmg }	|  ¡ jD ]}
|
|vr˜|	 |
¡ q|	D ]}
|  ¡ j|
dd q›|  ¡  | S )Nr   é   éÿÿÿÿF)Zsync)Úlenr   r   ÚcloneÚrangeZ
_remove_opZ_sync_with_cppr   r   r   r   Úvarsr   Z_remove_var)r   Zstart_op_idxZ
end_op_idxÚop_numÚidxZ
valid_varsr   r   r   Zvars_to_removeÚvarr   r   r   Úprune_program4   s<   

ÿ
€r%   c                    s|  |sJ dƒ‚t |  ¡ jƒ‰ ˆ dksJ dƒ‚‡ fdd„|D ƒ}|d dkr)dg| }|d ˆ kr4| ˆ ¡ tt |ƒd ƒD ]}|| ||d  k sLJ dƒ‚q<g }tt |ƒd ƒD ]}t| || ||d  ƒ}| |¡ qWt |ƒ}d	d„ |D ƒ}d
d„ |D ƒ}dd„ t|ƒD ƒ}|d |d< td|ƒD ] }	||	 D ]}
tt|	ƒƒD ]}|
|| v r¯d|| |
<  nqŸq—q‘dd„ |D ƒ}|||fS )aˆ  
    Split the program by op_indices. 

    For examples, a program has 100 ops, and op_indices = [25, 60].
    Then the program is splitted into 3 parts, containing 25, 35 and 40
    ops respectively.  

    The return values are a tuple with 3 elements: the splitted program
    list, the input var names of each splitted program, and the output
    var names of each splitted program.
    zop_indices cannot be emptyr   zprogram cannot be emptyc                    s    g | ]}|d kr
|n|ˆ  ‘qS )r   r   )Ú.0r#   ©r"   r   r   Ú
<listcomp>g   s     z!split_program.<locals>.<listcomp>r   r   z"op_indices must be strictly sortedc                 S   s   g | ]}t |ƒ‘qS r   )r   ©r&   Úpr   r   r   r(   x   s    c                 S   s   g | ]}t t|ƒƒ‘qS r   )r	   r   r)   r   r   r   r(   y   s    
ÿÿc                 S   s   g | ]}t ƒ ‘qS r   r   )r&   Ú_r   r   r   r(   }   s    Tc                 S   s   g | ]}t | ¡ ƒ‘qS r   )r   r   )r&   Úitemr   r   r   r(   …   s    )r   r   r   r   r    r%   Úreversed)r   Z
op_indicesr#   Zsplitted_programsZ	new_splitZ	num_splitr   r   Zvalid_output_varsÚir   Újr   r'   r   Úsplit_programW   sH   

ÿÿþþ€þ
r0   r
   )Úcollectionsr   r	   r   r   r%   r0   r   r   r   r   Ú<module>   s   
#