§
    ŠŠtjA  ã                   óô  — 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dS ) é    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|¢R i |¤Ž | S ©N© )r   r   r   r   s      €úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/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      s[   ø€ õ ˆ2�Y„Yð•rð ¥"¤'ð µR´Yð Å2ð ð ð ð ð ñ „Yðð Ð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                  óR   •—  ‰| i |¤Ž}t                                ‰d‰|¦  «         |S )NzRan pass %s	 Return value: %s)ÚloggerÚlog)r   r   Úvalr   r    s      €€r   r   zlog_hook.<locals>.wrapped_fnM   s5   ø€ àˆb�$Ð!˜&Ð!Ð!ˆÝ�
Š
�5Ð:¸BÀÑDÔDÐDØˆ
r   )r   r   r   r   r   )r   r    r   s   `` r   r   r   1   sZ   øø€ õ8 ˆ2�Y„Yð�"œ'ð ­R¬Yð ½2ð ð ð ð ð ð ñ „Yðð
 Ðr   Ú	base_passÚn_iterÚ	predicatec                 ó’   ‡ ‡‡— ‰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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)r*   ÚoutputÚ_r&   r'   r(   s      €€€r   Únew_passzloop_pass.<locals>.new_passi   s¼   ø€ àˆØÐ &¨1¢* *Ý˜6‘]”]ð +ð +�Ø"˜ 6Ñ*Ô*��ð+àÐ"Ø�)˜FÑ#Ô#ð +Ø"˜ 6Ñ*Ô*�ð �)˜FÑ#Ô#ð +øõ ð?Øð?ð ?Ø2;ð?ð ?ð ?ñô ð ð ˆr   )ÚAssertionErrorr   r   )r&   r'   r(   r1   s   ``` r   r   r   V   s~   øøø€ ð  ˜4Ð I°TÐ$9Ñ:ð YÝÐWÑXÔXÐXå
ˆ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.   )r3   r4   ÚiÚaÚjÚbs         r   Ú"_validate_pass_schedule_constraintr<   €   sÔ   € õ ˜&Ñ!Ô!ð ð ‰ˆˆ1Ý˜f Q¨¡U W WœoÑ.Ô.ð 	ð 	‰DˆAˆqØˆz˜!˜QÑÔð ØÝð¸qð ð È!ð ð Øðð Ø+,ðð Ø34ðð Ø?@ðð ð ñô ð ð	ðð r   ÚthisÚthatc                 óv   ‡ ‡— 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                 ó   •— | ‰k    p|‰k    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   �   sV   øø€ ð&•h˜s¥C˜xÔ(ð &­X°c½3°hÔ-?ð &ÅDð &ð &ð &ð &ð &ð &ð &ð Ðr   ÚtheseÚthosec                 óv   ‡ ‡— 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                 óP   •— t          | ¦  «        ‰k    pt          |¦  «        ‰k    S r   r   )r9   r;   rD   rE   s     €€r   rA   z6these_before_those_pass_constraint.<locals>.depends_onµ   s$   ø€ Ý�a‰yŒy˜EÒ!Ð7¥V¨A¡Y¤Y°%Ò%7Ð7r   rB   )rD   rE   rA   s   `` r   r   r   �   sV   øø€ ð08•h˜s¥C˜xÔ(ð 8­X°c½3°hÔ-?ð 8ÅDð 8ð 8ð 8ð 8ð 8ð 8ð 8ð Ðr   c                   ó°  — 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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.
    .r4   ÚconstraintsFÚ
_validatedNr   c                 ó*   — |pg | _         |pg | _        d S 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                              |¦  «         d| _        d S ©NF)r4   ÚappendrJ   )rL   rR   s     r   Úadd_passzPassManager.add_passÝ   s#   € ØŒ×Ò˜5Ñ!Ô!Ð!ØˆŒˆˆr   r3   c                 óH   — | j                              |¦  «         d| _        d S rT   )rI   rU   rJ   ©rL   r3   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ÚpsrZ   s     €r   ú
<listcomp>z+PassManager.remove_pass.<locals>.<listcomp>è   s%   ø€ ÐNÐNÐN˜b°2´;ÀgÐ3MÐ3M�rÐ3MÐ3MÐ3Mr   F)r4   rJ   )rL   rZ   Úpasses_lefts    ` r   Úremove_passzPassManager.remove_passå   s:   ø€ Øˆ?ØˆFØNÐNÐNÐN D¤KÐNÑNÔNˆØ!ˆŒØˆŒˆˆr   Ú_targetÚ_replacementc                 ó°   — g }| j         D ]=}|j        |j        k    r|                     |¦  «         Œ(|                     |¦  «         Œ>|| _         d| _        d S rT   )r4   r]   rU   rJ   )rL   rc   rd   ra   r_   s        r   Úreplace_passzPassManager.replace_passì   sj   € ð ˆØ”+ð 	'ð 	'ˆ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)rJ   rI   r<   r4   rX   s     r   ÚvalidatezPassManager.validateø   sG   € ð
 Œ?ð 	ØˆFØÔ*ð 	Hð 	HˆJÝ.¨z¸4¼;ÑGÔGÐGÐGØˆŒˆˆr   r*   c                 ó\   — |                       ¦   «          |}| j        D ]} ||¦  «        }Œ|S r   )rh   r4   )rL   r*   ÚoutrR   s       r   Ú__call__zPassManager.__call__  s9   € Ø�Š‰ŒˆØˆØ”[ð 	ð 	ˆEØ�%˜‘*”*ˆCˆCØˆ
r   ©NN)r   N)r]   Ú
__module__Ú__qualname__Ú__doc__Úlistr   r   Ú__annotations__rJ   rC   rM   ÚclassmethodrQ   rV   rY   Ústrrb   rf   rh   rk   r   r   r   r   r   »   sõ  € € € € € € ðð ð �˜#˜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   rl   )ÚloggingÚcollections.abcr   Ú	functoolsr   Úinspectr   Útypingr   r   r	   r
   r   r   r   Ú	getLoggerr]   r#   Ú__all__r   ÚINFOÚintr   rC   r   rp   r<   r   r   r   r   r   r   ú<module>r}      s  ðØ €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ð €Yˆt�_„_€Ø€WˆT�]„]€Ø€Wˆ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ð Mð Mð Mñ Mô Mð Mð Mð Mr   