Ë
    f^(h�  ã                   ó  — d dl Z d dlmZ d dlmZ d dl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y)é    N©Úwraps©Úunwrap)ÚCallableÚ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    €úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/fx/passes/pass_manager.pyÚ
wrapped_fnz#inplace_wrapper.<locals>.wrapped_fn"   s   ø€ á
ˆ2ŒØˆ	ó    r   )r   r   s   ` r   r
   r
      s#   ø€ ô ˆ2ƒYóó ðð Ðr   c                 ó2   ‡ ‡— 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                 óH   •—  ‰| «      }t         j                  ‰d‰|«       |S )NzRan pass %s	 Return value: %s)ÚloggerÚlog)r   Úvalr   Úlevels     €€r   r   zlog_hook.<locals>.wrapped_fnG   s$   ø€ á�‹fˆÜ�
‰
�5Ð:¸BÀÔDØˆ
r   r   )r   r   r   s   `` r   r   r   *   s#   ù€ ô: ˆ2ƒYôó ðð
 Ðr   Ú	base_passÚn_iterÚ	predicatec                 óV   ‡ ‡‡— ‰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kD  rt        ‰«      D ]
  } ‰|«      }Œ |S ‰� ‰|«      r ‰|«      } ‰|«      rŒ|S t        d‰› d‰› d�«      ‚)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Õ#ð ˆô	 ØEØ�(Ð1°)°¸Að?óð r   r   )r   r    r!   r*   s   ``` r   r   r   P   sN   ú€ ð  ˜$ÐØ˜Ðòð BàAóBð ô ˆ9Óõó ðð €Or   Ú
constraintÚpassesc                 óª   — t        |«      D ]E  \  }}t        ||dz   d  «      D ],  \  }} | ||«      rŒt        d|› d|› d|› d|› d|› d|› d�«      ‚ ŒG y )	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_constraintr4   {   s‰   € ô ˜&Ó!ò ‰ˆˆ1Ü˜f Q¨¡U W˜oÓ.ò 	‰DˆAˆqÙ˜!˜QÔØÜØ>¸q¸cÀÈ!ÈØ˜a˜S 
¨1¨#¨U°1°#°Y¸q¸cð Bðóð ñ	ñr   ÚthisÚthatc                 ó0   ‡ ‡— dt         dt         fˆˆ fd„}|S )zd
    Defines a partial order ('depends on' function) where `this` must occur
    before `that`.
    r1   r3   c                 ó   •— | ‰k7  xs |‰k7  S r   r   )r1   r3   r6   r5   s     €€r   Ú
depends_onz4this_before_that_pass_constraint.<locals>.depends_on�   s   ø€ Ø�D‰yÒ%˜A ™IÐ%r   ©r   )r5   r6   r9   s   `` r   r   r   ‰   s   ù€ ð&”hð &¤8ö &ð Ðr   ÚtheseÚthosec                 ó0   ‡ ‡— 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]
    r1   r3   c                 ó@   •— t        | «      ‰k7  xs t        |«      ‰k7  S r   r   )r1   r3   r;   r<   s     €€r   r9   z6these_before_those_pass_constraint.<locals>.depends_on¬   s    ø€ Ü�a‹y˜EÑ!Ò7¤V¨A£Y°%Ñ%7Ð7r   r:   )r;   r<   r9   s   `` r   r   r   •   s   ù€ ð.8”hð 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y)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                 ó0   — |xs g | _         |xs g | _        y r   )r,   r@   )Úselfr,   r@   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                   j                  |«       d| _        y ©NF)r,   ÚappendrA   )rC   rI   s     r   Úadd_passzPassManager.add_passÔ   s   € Ø�‰×Ñ˜5Ô!Øˆ�r   c                 óH   — | j                   j                  |«       d| _        y rK   )r@   rL   rA   ©rC   r+   s     r   Úadd_constraintzPassManager.add_constraintØ   s   € Ø×Ñ×Ñ 
Ô+Øˆ�r   Ú_passesc                 ó€   — |€y | j                   D �cg c]  }|j                  |vsŒ|‘Œ }}|| _         d| _        y c c}w rK   )r,   Ú__name__rA   )rC   rQ   ÚpsÚpasses_lefts       r   Úremove_passzPassManager.remove_passÜ   s@   € Øˆ?ØØ$(§K¡KÖN˜b°2·;±;ÀgÒ3M’rÐNˆÐNØ!ˆŒØˆ�ùò Os   ’;¦;c                 ó¾   — g }| j                   D ]>  }|j                  |j                  k(  r|j                  |«       Œ.|j                  |«       Œ@ || _         d| _        y rK   )r,   rS   rL   rA   )rC   Ú_targetÚ_replacementrU   rT   s        r   Úreplace_passzPassManager.replace_passã   sX   € ØˆØ—+‘+ò 	'ˆBØ�{‰{˜g×.Ñ.Ò.Ø×"Ñ" <Õ0à×"Ñ" 2Õ&ð		'ð
 "ˆŒØˆ�r   c                 óz   — | j                   ry| j                  D ]  }t        || j                  «       Œ d| _         y)z“
        Validates that current pass schedule defined by `self.passes` is valid
        according to all constraints in `self.constraints`
        NT)rA   r@   r4   r,   rO   s     r   ÚvalidatezPassManager.validateí   s:   € ð
 �?Š?ØØ×*Ñ*ò 	HˆJÜ.¨z¸4¿;¹;ÕGð	Hàˆ�r   c                 ó\   — | j                  «        |}| j                  D ]
  } ||«      }Œ |S r   )r\   r,   )rC   r'   ÚoutrI   s       r   Ú__call__zPassManager.__call__ø   s1   € Ø�‰ŒØˆØ—[‘[ò 	ˆEÙ˜“*‰Cð	àˆ
r   ©NN)rS   Ú
__module__Ú__qualname__Ú__doc__Úlistr   Ú__annotations__rA   ÚboolrD   ÚclassmethodrH   rM   rP   ÚstrrV   rZ   r\   r_   r   r   r   r	   r	   ²   sx   … ñð �‰NÓØ�h‘ÓØ€J�Óð Øó-ð ñó ðð
 ˜hó  ò ð  4¨¡9ó  ò ò	ór   r	   r`   )ÚloggingÚ	functoolsr   Úinspectr   Útypingr   r   Ú	getLoggerrS   r   Ú__all__r
   ÚINFOr   Úintr   rf   rd   r4   r   r   r	   r   r   r   ú<module>rq      sç   ðã Ý Ý ß %ð 
ˆ×	Ñ	˜8Ó	$€ò€ð˜ð  Xó ð( ")§¡ñ #�ð #°(ó #ðP !Ø$(ñ$Øð$à�S‰Mð$ð ˜Ñ!ó$ðVØ˜( HÐ-¨tÐ3Ñ4ðØ>BÀ8¹nóð	¨8ð 	¸8ó 	ð¨hð ¸xó ÷:Kò Kr   