§
    Ÿ²Åj“  ã                   ó,  — d dl Z d dlmZ d dlmZ d dlmZmZmZ  e j	        e
¦  «        Zg d¢Zdedefd„Ze j        fdedefd	„Z	 	 dd
edee         dee         fd„Zdeeegef         dee         fd„Zdedefd„Zdedefd„Z G d„ d¦  «        ZdS )é    N©Úwraps©Úunwrap)ÚCallableÚListÚOptional)ÚPassManagerÚinplace_wrapperÚlog_hookÚ	loop_passÚ this_before_that_pass_constraintÚ"these_before_those_pass_constraintÚfnÚreturnc                 ó<   ‡ — t          ‰ ¦  «        ˆ fd„¦   «         }|S )zò
    Convenience wrapper for passes which modify an object inplace. This
    wrapper makes them return the modified object instead.

    Args:
        fn (Callable[Object, Any])

    Returns:
        wrapped_fn (Callable[Object, Object])
    c                 ó   •—  ‰| ¦  «         | S ©N© )Úgmr   s    €úMC:\Projects\Historical\venv\Lib\site-packages\torch/fx/passes/pass_manager.pyÚ
wrapped_fnz#inplace_wrapper.<locals>.wrapped_fn"   s   ø€ à
ˆˆ2‰ŒˆØˆ	ó    r   )r   r   s   ` r   r   r      s6   ø€ õ ˆ2�Y„Yðð ð ð ñ „Yðð Ðr   c                 ó@   ‡ ‡— t          ‰ ¦  «        ˆ ˆfd„¦   «         }|S )aƒ  
    Logs callable output.

    This is useful for logging output of passes. Note inplace_wrapper replaces
    the pass output with the modified object. If we want to log the original
    output, apply this wrapper before inplace_wrapper.


    ```
    def my_pass(d: Dict) -> bool:
        changed = False
        if "foo" in d:
            d["foo"] = "bar"
            changed = True
        return changed


    pm = PassManager(passes=[inplace_wrapper(log_hook(my_pass))])
    ```

    Args:
        fn (Callable[Type1, Type2])
        level: logging level (e.g. logging.INFO)

    Returns:
        wrapped_fn (Callable[Type1, Type2])
    c                 óX   •—  ‰| ¦  «        }t                                ‰d‰|¦  «         |S )NzRan pass %s	 Return value: %s)ÚloggerÚlog)r   Úvalr   Úlevels     €€r   r   zlog_hook.<locals>.wrapped_fnG   s.   ø€ àˆb�‰fŒfˆÝ�
Š
�5Ð:¸BÀÑDÔDÐDØˆ
r   r   )r   r   r   s   `` r   r   r   *   s<   øø€ õ: ˆ2�Y„Yðð ð ð ð ñ „Yðð
 Ðr   Ú	base_passÚn_iterÚ	predicatec                 ój   ‡ ‡‡— ‰du‰duz  s
J d¦   «         ‚t          ‰ ¦  «        ˆ ˆˆfd„¦   «         }|S )aW  
    Convenience wrapper for passes which need to be applied multiple times.

    Exactly one of `n_iter`or `predicate` must be specified.

    Args:
        base_pass (Callable[Object, Object]): pass to be applied in loop
        n_iter (int, optional): number of times to loop pass
        predicate (Callable[Object, bool], optional):

    Nz8Exactly one of `n_iter`or `predicate` must be specified.c                 óÌ   •— | }‰�$‰dk    rt          ‰¦  «        D ]} ‰|¦  «        }Œn:‰�" ‰|¦  «        r ‰|¦  «        } ‰|¦  «        °nt          d‰› d‰› d�¦  «        ‚|S )Nr   z3loop_pass must be given positive int n_iter (given z) xor predicate (given ú))ÚrangeÚRuntimeError)ÚsourceÚoutputÚ_r    r!   r"   s      €€€r   Únew_passzloop_pass.<locals>.new_passd   s¼   ø€ àˆØÐ &¨1¢* *Ý˜6‘]”]ð +ð +�Ø"˜ 6Ñ*Ô*��ð+àÐ"Ø�)˜FÑ#Ô#ð +Ø"˜ 6Ñ*Ô*�ð �)˜FÑ#Ô#ð +øõ ð?Øð?ð ?Ø2;ð?ð ?ð ?ñô ð ð ˆr   r   )r    r!   r"   r+   s   ``` r   r   r   P   s{   øøø€ ð  ˜$ÐØ˜Ðñð Bð BàAñBô Bð õ ˆ9ÑÔðð ð ð ð ð ñ Ôðð €Or   Ú
constraintÚpassesc                 óÌ   — t          |¦  «        D ]S\  }}t          ||dz   d …         ¦  «        D ]3\  }} | ||¦  «        rŒt          d|› d|› d|› d|› d|› d|› d�¦  «        ‚ŒTd S )	Né   z,pass schedule constraint violated. Expected z before z but found z
 at index z and z	 at indexz in pass list.)Ú	enumerater'   )r,   r-   ÚiÚaÚjÚbs         r   Ú"_validate_pass_schedule_constraintr5   {   sÔ   € õ ˜&Ñ!Ô!ð ð ‰ˆˆ1Ý˜f Q¨¡U W WœoÑ.Ô.ð 	ð 	‰DˆAˆqØˆz˜!˜QÑÔð ØÝð¸qð ð È!ð ð Øðð Ø+,ðð Ø34ðð Ø?@ðð ð ñô ð ð	ðð r   ÚthisÚthatc                 ó4   ‡ ‡— dt           dt           fˆˆ fd„}|S )zd
    Defines a partial order ('depends on' function) where `this` must occur
    before `that`.
    r2   r4   c                 ó   •— | ‰k    p|‰k    S r   r   )r2   r4   r7   r6   s     €€r   Ú
depends_onz4this_before_that_pass_constraint.<locals>.depends_on�   s   ø€ Ø�DŠyÐ%˜A šIÐ%r   ©r   )r6   r7   r:   s   `` r   r   r   ‰   s=   øø€ ð&•hð &¥8ð &ð &ð &ð &ð &ð &ð &ð Ðr   ÚtheseÚthosec                 ó4   ‡ ‡— dt           dt           fˆ ˆfd„}|S )aQ  
    Defines a partial order ('depends on' function) where `these` must occur
    before `those`. Where the inputs are 'unwrapped' before comparison.

    For example, the following pass list and constraint list would be invalid.
    ```
    passes = [
        loop_pass(pass_b, 3),
        loop_pass(pass_a, 5),
    ]

    constraints = [these_before_those_pass_constraint(pass_a, pass_b)]
    ```

    Args:
        these (Callable): pass which should occur first
        those (Callable): pass which should occur later

    Returns:
        depends_on (Callable[[Object, Object], bool]
    r2   r4   c                 óP   •— t          | ¦  «        ‰k    pt          |¦  «        ‰k    S r   r   )r2   r4   r<   r=   s     €€r   r:   z6these_before_those_pass_constraint.<locals>.depends_on¬   s$   ø€ Ý�a‰yŒy˜EÒ!Ð7¥V¨A¡Y¤Y°%Ò%7Ð7r   r;   )r<   r=   r:   s   `` r   r   r   •   s=   øø€ ð.8•hð 8¥8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð Ðr   c                   ó¬   — e Zd ZU dZee         ed<   ee         ed<   dZeed<   	 	 dd„Z	e
d„ ¦   «         Zd	efd
„Zd„ Zdee         fd„Zd„ Zd„ Zd„ ZdS )r
   aT  
    Construct a PassManager.

    Collects passes and constraints. This defines the pass schedule, manages
    pass constraints and pass execution.

    Args:
        passes (Optional[List[Callable]]): list of passes. A pass is a
            callable which modifies an object and returns modified object
        constraint (Optional[List[Callable]]): list of constraints. A
            constraint is a callable which takes two passes (A, B) and returns
            True if A depends on B and False otherwise. See implementation of
            `this_before_that_pass_constraint` for example.
    r-   ÚconstraintsFÚ
_validatedNc                 ó*   — |pg | _         |pg | _        d S r   )r-   rA   )Úselfr-   rA   s      r   Ú__init__zPassManager.__init__Æ   s"   € ð
 �l ˆŒØ&Ð,¨"ˆÔÐÐr   c                 ó$   — t          |¦  «        }|S r   )r
   )Úclsr-   Úpms      r   Úbuild_from_passlistzPassManager.build_from_passlistÎ   s   € å˜Ñ Ô ˆàˆ	r   Ú_passc                 óH   — | j                              |¦  «         d| _        d S ©NF)r-   ÚappendrB   )rD   rJ   s     r   Úadd_passzPassManager.add_passÔ   s#   € ØŒ×Ò˜5Ñ!Ô!Ð!ØˆŒˆˆr   c                 óH   — | j                              |¦  «         d| _        d S rL   )rA   rM   rB   ©rD   r,   s     r   Úadd_constraintzPassManager.add_constraintØ   s$   € ØÔ×Ò 
Ñ+Ô+Ð+ØˆŒˆˆr   Ú_passesc                 óR   ‡— ‰€d S ˆfd„| j         D ¦   «         }|| _         d| _        d S )Nc                 ó&   •— g | ]}|j         ‰v¯|‘ŒS r   )Ú__name__)Ú.0ÚpsrR   s     €r   ú
<listcomp>z+PassManager.remove_pass.<locals>.<listcomp>ß   s%   ø€ ÐNÐNÐN˜b°2´;ÀgÐ3MÐ3M�rÐ3MÐ3MÐ3Mr   F)r-   rB   )rD   rR   Úpasses_lefts    ` r   Úremove_passzPassManager.remove_passÜ   s:   ø€ Øˆ?ØˆFØNÐNÐNÐN D¤KÐNÑNÔNˆØ!ˆŒØˆŒˆˆr   c                 ó°   — g }| j         D ]=}|j        |j        k    r|                     |¦  «         Œ(|                     |¦  «         Œ>|| _         d| _        d S rL   )r-   rU   rM   rB   )rD   Ú_targetÚ_replacementrY   rW   s        r   Úreplace_passzPassManager.replace_passã   sh   € ØˆØ”+ð 	'ð 	'ˆBØŒ{˜gÔ.Ò.Ð.Ø×"Ò" <Ñ0Ô0Ð0Ð0à×"Ò" 2Ñ&Ô&Ð&Ð&Ø!ˆŒØˆŒˆˆr   c                 ód   — | j         rdS | j        D ]}t          || j        ¦  «         Œd| _         dS )z“
        Validates that current pass schedule defined by `self.passes` is valid
        according to all constraints in `self.constraints`
        NT)rB   rA   r5   r-   rP   s     r   ÚvalidatezPassManager.validateí   sG   € ð
 Œ?ð 	ØˆFØÔ*ð 	Hð 	HˆJÝ.¨z¸4¼;ÑGÔGÐGÐGØˆŒˆˆr   c                 ó\   — |                       ¦   «          |}| j        D ]} ||¦  «        }Œ|S r   )r`   r-   )rD   r(   ÚoutrJ   s       r   Ú__call__zPassManager.__call__ø   s9   € Ø�Š‰ŒˆØˆØ”[ð 	ð 	ˆEØ�%˜‘*”*ˆCˆCØˆ
r   ©NN)rU   Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__rB   ÚboolrE   ÚclassmethodrI   rN   rQ   ÚstrrZ   r^   r`   rc   r   r   r   r
   r
   ²   sÿ   € € € € € € ðð ð �ŒNÐÐÑØ�h”ÐÐÑØ€J�ÐÐÑð Øð-ð -ð -ð -ð ðð ñ „[ðð
 ˜hð  ð  ð  ð  ð ð  ð  ð  4¨¤9ð  ð  ð  ð  ð ð  ð  ð	ð 	ð 	ðð ð ð ð r   r
   rd   )ÚloggingÚ	functoolsr   Úinspectr   Útypingr   r   r	   Ú	getLoggerrU   r   Ú__all__r   ÚINFOr   Úintr   ri   r5   r   r   r
   r   r   r   ú<module>rt      sÂ  ðà €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +ð 
ˆÔ	˜8Ñ	$Ô	$€ðð ð €ð˜ð  Xð ð ð ð ð( ")¤ð #ð #�ð #°(ð #ð #ð #ð #ðP !Ø$(ð$ð $Øð$à�SŒMð$ð ˜Ô!ð$ð $ð $ð $ðVØ˜( HÐ-¨tÐ3Ô4ðØ>BÀ8¼nðð ð ð ð	¨8ð 	¸8ð 	ð 	ð 	ð 	ð¨hð ¸xð ð ð ð ð:Kð Kð Kð Kð Kñ Kô Kð Kð Kð Kr   