Ë
    ÄÓ^jA  ã                   óX  — d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ  e
d«      Z ed«      Z ed«      Z e j                  e«      Zg d	¢Zd
ee	eef   ef   dee	eef   ef   fd„Ze j(                  fd
eeef   dedeeef   fd„Z	 	 ddeegef   dedz  deegef   dz  deegef   fd„Zdeedef   edef   gef   deedef      ddfd„Zdedef   dedef   deedef   edef   gef   fd„Zdedef   dedef   deedef   edef   gef   fd„Z G d„ d«      Zy) é    N)ÚCallable)Úwraps©Úunwrap)ÚAnyÚConcatenateÚ	ParamSpecÚTypeVarÚ_PÚ_RÚ_T)ÚPassManagerÚinplace_wrapperÚlog_hookÚ	loop_passÚ this_before_that_pass_constraintÚ"these_before_those_pass_constraintÚfnÚreturnc           	      óˆ   ‡ — t        ‰ «      dt        dt        j                  dt        j                  dt        fˆ 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])
    ÚgmÚargsÚkwargsr   c                 ó    •—  ‰| g|¢­i |¤Ž | S ©N© )r   r   r   r   s      €úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/passes/pass_manager.pyÚ
wrapped_fnz#inplace_wrapper.<locals>.wrapped_fn)   s   ø€ á
ˆ2Ð�Ò˜ÒØˆ	ó    )r   r   r   r   r   )r   r   s   ` r   r   r      sG   ø€ ô ˆ2ƒYð”rð ¤"§'¡'ð ´R·Y±Yð Ä2ô ó ðð Ðr   Úlevelc                 ó€   ‡ ‡— t        ‰ «      dt        j                  dt        j                  dt        fˆ ˆ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``.

    Example::

        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])
    r   r   r   c                  óH   •—  ‰| i |¤Ž}t         j                  ‰d‰|«       |S )NzRan pass %s	 Return value: %s)ÚloggerÚlog)r   r   Úvalr   r    s      €€r   r   zlog_hook.<locals>.wrapped_fnM   s*   ø€ á�$Ð!˜&Ñ!ˆÜ�
‰
�5Ð:¸BÀÔDØˆ
r   )r   r   r   r   r   )r   r    r   s   `` r   r   r   1   s@   ù€ ô8 ˆ2ƒYðœ"Ÿ'™'ð ¬R¯Y©Yð ¼2õ ó ðð
 Ðr   Ú	base_passÚn_iterÚ	predicatec                 óx   ‡ ‡‡— ‰du‰duz  st        d«      ‚t        ‰ «      dt        dt        fˆ ˆˆ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.Úsourcer   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)r*   ÚoutputÚ_r&   r'   r(   s      €€€r   Únew_passzloop_pass.<locals>.new_passi   sˆ   ø€ àˆØÐ &¨1¢*Ü˜6“]ò +�Ù" 6Ó*‘ð+ð ˆð Ð"Ù˜FÔ#Ù" 6Ó*�ñ ˜FÕ#ð ˆô	 ØEØ�(Ð1°)°¸Að?óð r   )ÚAssertionErrorr   r   )r&   r'   r(   r1   s   ``` r   r   r   V   sO   ú€ ð  ˜4Ð I°TÐ$9Ò:ÜÐWÓXÐXä
ˆ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.   )r3   r4   ÚiÚaÚjÚbs         r   Ú"_validate_pass_schedule_constraintr<   €   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                 ó`   ‡ ‡— dt         dt        f   dt         dt        f   dt        fˆˆ fd„}|S )zd
    Defines a partial order ('depends on' function) where `this` must occur
    before `that`.
    r9   .r;   r   c                 ó   •— | ‰k7  xs |‰k7  S r   r   )r9   r;   r>   r=   s     €€r   Ú
depends_onz4this_before_that_pass_constraint.<locals>.depends_on—   s   ø€ Ø�D‰yÒ%˜A ™IÐ%r   ©r   r   Úbool)r=   r>   rA   s   `` r   r   r   �   s7   ù€ ð&”h˜s¤C˜xÑ(ð &¬X°c¼3°hÑ-?ð &ÄDö &ð Ðr   ÚtheseÚthosec                 ó`   ‡ ‡— dt         dt        f   dt         dt        f   dt        fˆ ˆfd„}|S )a\  
    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])
    r9   .r;   r   c                 ó@   •— t        | «      ‰k7  xs t        |«      ‰k7  S r   r   )r9   r;   rD   rE   s     €€r   rA   z6these_before_those_pass_constraint.<locals>.depends_onµ   s    ø€ Ü�a‹y˜EÑ!Ò7¤V¨A£Y°%Ñ%7Ð7r   rB   )rD   rE   rA   s   `` r   r   r   �   s7   ù€ ð08”h˜s¤C˜xÑ(ð 8¬X°c¼3°hÑ-?ð 8ÄDö 8ð Ðr   c                   óN  — e Zd ZU dZeedef      ed<   eedef      ed<   dZe	ed<   	 	 ddeedef      dz  deedef      dz  ddfd	„Z
edeedef      dd fd
„«       Zdedef   ddfd„Zdedef   ddfd„Zdee   ddfd„Zdedef   dedef   ddfd„Zdd„Zdedef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.
    .r4   ÚconstraintsFÚ
_validatedNr   c                 ó0   — |xs g | _         |xs g | _        y r   )r4   rI   )Úselfr4   rI   s      r   Ú__init__zPassManager.__init__Ï   s   € ð
 ’l ˆŒØ&Ò,¨"ˆÕr   c                 ó   — t        |«      }|S r   )r   )Úclsr4   Úpms      r   Úbuild_from_passlistzPassManager.build_from_passlist×   s   € ä˜Ó ˆàˆ	r   Ú_passc                 óH   — | j                   j                  |«       d| _        y ©NF)r4   ÚappendrJ   )rL   rR   s     r   Úadd_passzPassManager.add_passÝ   s   € Ø�‰×Ñ˜5Ô!Øˆ�r   r3   c                 óH   — | j                   j                  |«       d| _        y rT   )rI   rU   rJ   ©rL   r3   s     r   Úadd_constraintzPassManager.add_constraintá   s   € Ø×Ñ×Ñ 
Ô+Øˆ�r   Ú_passesc                 ó€   — |€y | j                   D �cg c]  }|j                  |vsŒ|‘Œ }}|| _         d| _        y c c}w rT   )r4   Ú__name__rJ   )rL   rZ   ÚpsÚpasses_lefts       r   Úremove_passzPassManager.remove_passå   s@   € Øˆ?ØØ$(§K¡KÖN˜b°2·;±;ÀgÒ3M’rÐNˆÐNØ!ˆŒØˆ�ùò Os   ’;¦;Ú_targetÚ_replacementc                 ó¾   — g }| j                   D ]>  }|j                  |j                  k(  r|j                  |«       Œ.|j                  |«       Œ@ || _         d| _        y rT   )r4   r\   rU   rJ   )rL   r`   ra   r^   r]   s        r   Úreplace_passzPassManager.replace_passì   sZ   € ð ˆØ—+‘+ò 	'ˆ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)rJ   rI   r<   r4   rX   s     r   ÚvalidatezPassManager.validateø   s:   € ð
 �?Š?ØØ×*Ñ*ò 	HˆJÜ.¨z¸4¿;¹;ÕGð	Hàˆ�r   r*   c                 ó\   — | j                  «        |}| j                  D ]
  } ||«      }Œ |S r   )re   r4   )rL   r*   ÚoutrR   s       r   Ú__call__zPassManager.__call__  s1   € Ø�‰ŒØˆØ—[‘[ò 	ˆEÙ˜“*‰Cð	àˆ
r   ©NN)r   N)r\   Ú
__module__Ú__qualname__Ú__doc__Úlistr   r   Ú__annotations__rJ   rC   rM   ÚclassmethodrQ   rV   rY   Ústrr_   rc   re   rh   r   r   r   r   r   »   sP  … ñð �˜#˜s˜(Ñ#Ñ$Ó$Ø�h˜s C˜xÑ(Ñ)Ó)Ø€J�Óð 37Ø7;ñ-à�X˜c 3˜hÑ'Ñ(¨4Ñ/ð-ð ˜( 3¨ 8Ñ,Ñ-°Ñ4ð-ð 
ó	-ð ð¨¨h°s¸C°xÑ.@Ñ)Að Àmò ó ðð
 ˜h s¨C xÑ0ð  °Tó  ð ¨°#°s°(Ñ);ð  Àó  ð  4¨¡9ð  °ó  ð
 Ø  S Ñ)ð
 Ø9AÀ#ÀsÀ(Ñ9Kð
 à	ó
 ó	ð˜sð  sô r   r   ri   )ÚloggingÚcollections.abcr   Ú	functoolsr   Úinspectr   Útypingr   r   r	   r
   r   r   r   Ú	getLoggerr\   r#   Ú__all__r   ÚINFOÚintr   rC   r   rm   r<   r   r   r   r   r   r   ú<module>rz      s  ðÛ Ý $Ý Ý ß 7Ó 7ñ ˆtƒ_€ÙˆTƒ]€ÙˆTƒ]€ð 
ˆ×	Ñ	˜8Ó	$€ò€ðØ�˜R ˜VÑ$ cÐ)Ñ*ðàˆk˜"˜b˜&Ñ! 2Ð%Ñ&óð, 18·±ñ "�˜"˜b˜&Ñ!ð "¨#ð "ÀÈ"ÈbÈ&ÑAQó "ðN Ø-1ñ#Ø˜˜˜b˜Ñ!ð#à�$‰Jð#ð ˜˜˜d˜
Ñ# dÑ*ð#ð ˆrˆd�BˆhÑó	#ðTØ˜( 3¨ 8Ñ,¨h°s¸C°xÑ.@ÐAÀ4ÐGÑHðà�˜#˜s˜(Ñ#Ñ$ðð 
óðØ
�3˜�8Ñ
ðØ$,¨S°#¨XÑ$6ðàˆx˜˜S˜Ñ! 8¨C°¨HÑ#5Ð6¸Ð<Ñ=óðØ�C˜�HÑðØ&.¨s°C¨xÑ&8ðàˆx˜˜S˜Ñ! 8¨C°¨HÑ#5Ð6¸Ð<Ñ=ó÷<Mò Mr   