Ë
    M²jÈ  ã                   ó  — d dl Z d dlmZ d dlmZ d dl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dz  dedz  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©ÚCallable©Úwraps©Úunwrap)Ú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    €ú[/var/www/html/ia-enhanced/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``.

    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])
    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_fnF   s$   ø€ á�‹fˆÜ�
‰
�5Ð:¸BÀÔDØˆ
r   r   )r   r   r   s   `` r   r   r   *   s#   ù€ ô8 ˆ2ƒYôó ðð
 Ðr   Ú	base_passÚn_iterÚ	predicatec                 ó^   ‡ ‡‡— ‰du‰duz  st        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_passb   sˆ   ø€ àˆØÐ &¨1¢*Ü˜6“]ò +�Ù" 6Ó*‘ð+ð ˆð Ð"Ù˜FÔ#Ù" 6Ó*�ñ ˜FÕ#ð ˆô	 ØEØ�(Ð1°)°¸Að?óð r   )ÚAssertionErrorr   )r   r    r!   r*   s   ``` r   r   r   O   sA   ú€ ð  ˜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&   )r,   r-   ÚiÚaÚjÚbs         r   Ú"_validate_pass_schedule_constraintr5   y   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`.
    r2   r4   c                 ó   •— | ‰k7  xs |‰k7  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                 ó0   ‡ ‡— dt         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])
    r2   r4   c                 ó@   •— t        | «      ‰k7  xs t        |«      ‰k7  S r   r   )r2   r4   r;   r<   s     €€r   r:   z6these_before_those_pass_constraint.<locals>.depends_on©   s    ø€ Ü�a‹y˜EÑ!Ò7¤V¨A£Y°%Ñ%7Ð7r   r   )r;   r<   r:   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@   r5   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Úcollections.abcr   Ú	functoolsr   Úinspectr   Ú	getLoggerrS   r   Ú__all__r
   ÚINFOr   Úintr   rf   rd   r5   r   r   r	   r   r   r   ú<module>rq      sæ   ðã Ý $Ý Ý ð 
ˆ×	Ñ	˜8Ó	$€ò€ð˜ð  Xó ð( ")§¡ñ "�ð "°(ó "ðN Ø!%ñ#Øð#à�$‰Jð#ð ˜$‰ó#ðTØ˜( HÐ-¨tÐ3Ñ4ðØ>BÀ8¹nóð	¨8ð 	¸8ó 	ð¨hð ¸xó ÷8Kò Kr   