ó
    Eñiš(  ã                   óŽ  • S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr  \R                   " \5      r\R'                  \R(                  5        / SQr\" S	S
9S\S\4S j5       rS\\\/\4   S\\   SS4S jrS\\   S\\   S\\   4S jr\" S	S
9S\S\S\4S j5       r\" S	S
9 " S S5      5       rg)é    N©ÚCallable)Úwraps)ÚQueue)Úcompatibility)ÚGraphModule)Ú
PassResult)Úpass_result_wrapperÚ this_before_that_pass_constraintÚPassManagerF)Úis_backward_compatibleÚfnÚreturnc                 ó¢   ^ • T c  g[        T 5      U 4S j5       n[        R                  " T 5      (       d  [        T 5      R                  Ul        U$ )a  
Wrapper for passes which currently do not return a PassResult.
This wrapper makes them return a PassResult containing the modified object
and True for the "modified" flag.

Args:
    fn (Callable[Module, Any])

Returns:
    wrapped_fn (Callable[Module, PassResult])
Nc                 ó¸   >• T" U 5      nUc  [        U S5      $ [        U[         5      (       a  U$ [        U[        R                  5      (       a  [        US5      $ g )NT)r	   Ú
isinstanceÚnnÚModule)ÚgmÚresr   s     €Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/fx/passes/infra/pass_manager.pyÚ
wrapped_fnÚ'pass_result_wrapper.<locals>.wrapped_fn%   sS   ø€ á�‹fˆØ‰;Ü˜b $Ó'Ð'Ü�cœ:×&Ñ&ØˆJÜ˜œRŸY™Y×'Ñ'Ü˜c 4Ó(Ð(ð (ó    )r   ÚinspectÚ
isfunctionÚtypeÚ__name__)r   r   s   ` r   r
   r
      sN   ø€ ð 
�zàä
ˆ2ƒYô)ó ð)ô ×Ò˜b×!Ñ!Ü" 2›h×/Ñ/ˆ
ÔàÐr   Ú
constraintÚpassesc                 ó´   • [        U5       HI  u  p#[        XS-   S  5       H0  u  pEU " X55      (       a  M  [        SU SU SU SU SU SU S35      e   MK     g )	Né   z,pass schedule constraint violated. Expected z before z but found z
 at index z and z	 at indexz in pass list.)Ú	enumerateÚRuntimeError)r   r    ÚiÚaÚjÚbs         r   Ú"_validate_pass_schedule_constraintr)   5   sz   € ô ˜&Ö!‰ˆÜ˜f¨¡U W˜oÖ.‰DˆAÙ˜!×ÑÙÜØ>¸q¸cÀÈ!ÈØ˜a˜S 
¨1¨#¨U°1°#°Y¸q¸cð Bðóð ó /ò "r   Úconstraintsc                 óN  ^• [        U5      S:X  a  U $ U  Vs0 s H  o"/ _M     nn[        R                  U S5      m[        5       nU  Hg  nU  HB  nXV:X  a  M
  U H2  nU" XV5      (       a  M  X6   R	                  U5        TU==   S-  ss'   M4     MD     TU   S:X  d  MV  UR                  U5        Mi     [        R                  U S5      n/ n	UR                  5       (       d{  UR                  5       nU	R	                  U5        SX‚'   X2    H7  n
XŠ   (       a  M  TU
==   S-  ss'   TU
   S:X  d  M&  UR                  U
5        M9     UR                  5       (       d  M{  [        [        U4S jTR                  5       5      5      n[        U5      S:w  a  SU 3n[        U5      eU	$ s  snf )zÁ
Args
    passes: Passes that we are ordering
    constraints: Constraints applied on these passes

Returns
    A sorted list of callables and a boolean of if a circular dependency
    existed
r   r"   FTc                 ó   >• TU    S:g  $ )Nr   © )ÚpÚindegree_maps    €r   Ú<lambda>Ú*_topological_sort_passes.<locals>.<lambda>r   s   ø€ ¨°a©¸AÒ)=r   z:Circular dependency detected within the following passes: )ÚlenÚdictÚfromkeysr   ÚappendÚputÚemptyÚgetÚlistÚfilterÚkeysr$   )r    r*   r.   ÚgraphÚ
candidatesr&   r(   r   ÚvisitedÚsorted_passesÚnÚcycle_passesÚerrorr/   s                @r   Ú_topological_sort_passesrC   C   s’  ø€ ô ˆ;Ó˜1ÓØˆñ =CÓ,CºF°q°ªU¹F€EÐ,CÜ(,¯©°f¸aÓ(@€LÜ›€JÛˆÛˆAØ‹vÙã)�
Ù! !×'Ó'Ø‘H—O‘O AÔ&Ø  “O qÑ(•Oó *ñ	 ð ˜‰?˜aÕØ�N‰N˜1Öñ ô %)§M¡M°&¸%Ó$@€GØ$&€Mà×Ñ× Ñ Ø�N‰NÓˆØ×Ñ˜QÔØˆ‰
à”ˆAØ—:‘:Ø˜Q“ 1Ñ$“Ø ‘? aÕ'Ø—N‘N 1Ö%ñ	 ð ×Ñ× Ó ô œÔ=¸|×?PÑ?PÓ?RÓSÓT€LÜ
ˆ<Ó˜AÓàHÈÈÐWð 	ô ˜5Ó!Ð!àÐùòM -Ds   —F"ÚthisÚthatc                 ó4   ^ ^• S[         S[         4UU 4S jjnU$ )a°  
Defines a partial order ('depends on' function) where `this` must occur
before `that`.

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

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

Args:
    this (Callable): pass which should occur first
    that (Callable): pass which should occur later

Returns:
    depends_on (Callable[[Object, Object], bool]
r&   r(   c                 ó&   >• U T:g  =(       d    UT:g  $ ©Nr-   )r&   r(   rE   rD   s     €€r   Ú
depends_onÚ4this_before_that_pass_constraint.<locals>.depends_on‘   s   ø€ Ø�D‰y×%˜A ™IÐ%r   r   )rD   rE   rI   s   `` r   r   r   |   s#   ù€ ð*&”hð &¤8÷ &ð &ð Ðr   c                   ó*  • \ rS rSr% Sr\\\R                  /\	4      \
S'   \\\\/\4      \
S'   Sr\\
S'   Sr\\
S'        SS
\S\4S jjrS\4S jrS\4S jrS rS rS\SS	4S jrS\R                  SS	4S jrS\R                  S\	4S jrSrg	)r   é—   a$  
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 a PassResult
    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.
    steps (int): Max number of times we run the passes (default = 1).
    run_checks_after_each_pass (bool): Whether to run checks and linting
        after each pass
    suppress_check_failures (bool): Whether to raise errors when running
        checks
r    r*   FÚ
_validatedr"   ÚstepsNÚrun_checks_after_each_passÚsuppress_check_failuresc                 óv   • U=(       d    / U l         U=(       d    / U l        U(       a  X0l        X@l        XPl        g rH   )r    r*   rN   rO   rP   )Úselfr    r*   rN   rO   rP   s         r   Ú__init__ÚPassManager.__init__²   s0   € ð —l ˆŒØ&×,¨"ˆÔÞØŒJà*DÔ'Ø'>Õ$r   Ú_passc                 óH   • U R                   R                  U5        SU l        g)z.
Adds a pass into the current list of passes.
FN)r    r5   rM   )rR   rU   s     r   Úadd_passÚPassManager.add_passÂ   s   € ð 	�‰×Ñ˜5Ô!Øˆ�r   r   c                 óH   • U R                   R                  U5        SU l        g)z9
Adds a constraint into the current list of constraints.
FN)r*   r5   rM   ©rR   r   s     r   Úadd_constraintÚPassManager.add_constraintÉ   s   € ð 	×Ñ×Ñ 
Ô+Øˆ�r   c                 ó†   • U R                   (       a  gU R                   H  n[        XR                  5        M     SU l         g)z{
Validates that current pass schedule defined by `self.passes` is valid
according to all constraints in `self.constraints`
NT)rM   r*   r)   r    rZ   s     r   Úvalidate_constraintsÚ PassManager.validate_constraintsÐ   s1   € ð
 �?�?ØØ×*Ô*ˆJÜ.¨z¿;¹;ÖGñ +àˆ�r   c                 ó\   • [        U R                  U R                  5      U l        SU l        g)a2  
Finds a valid traversal order based on the given constraints and orders
the passes based on this order.

If a circular dependency exists between the constraints and steps = 1,
then we will raise an error because if steps != 1 this means that we
will re-run the passes, allowing for circular dependencies.
TN)rC   r    r*   rM   )rR   s    r   Úsolve_constraintsÚPassManager.solve_constraintsÛ   s#   € ô /¨t¯{©{¸D×<LÑ<LÓMˆŒØˆ�r   Úcheckr   c                 óÀ   • [         R                  " U5      n[        [        UR                  R                  5       5      5      S:w  a  [        S5      e[        U SU5        g)z¯
Adds a function which takes runs various checks on a given graph module.
This function is run before and after each pass if the
`run_checks_after_each_pass` flag is enabled.
r"   zEPassManager check function should only take in one variable, a modulerc   N)r   Ú	signaturer2   r9   Ú
parametersÚvaluesÚ	TypeErrorÚsetattr)rR   rc   Úsigs      r   Ú
add_checksÚPassManager.add_checksç   sQ   € ô ×Ò Ó&ˆäŒt�C—N‘N×)Ñ)Ó+Ó,Ó-°Ó2ÜØWóð ô 	��g˜uÕ%r   Úmodulec                 ó   • g rH   r-   )rR   rm   s     r   rc   ÚPassManager.checkö   s   € Ør   c           	      ón  • U R                   (       d  U R                  5         U R                  U5        Sn[        U R                  5       GHX  nSn[        U R                  5       GH$  u  pV[        R                  " U5      (       a  UR                  O[        U5      R                  n[        R                  SU5         U" U5      n[        U[        5      (       d#  [        US5      (       d  [!        SU S3S-   5      eUR"                  nU=(       d    UR$                  n[        U[&        5      (       a0  [        R                  SXqR(                  5        UR+                  5         U R,                  (       a  U R                  U5        GM$  GM'     U=(       d    UnU(       a  GMY    O   [        X5      $ ! [.         ax  n	U R                  SU  V
s/ s H?  n
[        R                  " U
5      (       a  U
R                  O[        U
5      R                  PMA     Os  sn
f nn
S	U S
U 3n[/        U5      U	eSn	A	ff = f)aM  
Runs a list of passes in the order based on `self.passes` on the given
graph module. Each time a pass is run, checks and linting will be run on
the graph module if `run_checks_after_each_pass` is set.

If the module is a graph module, we will run the list of passes until
the graph stops changing, or until `steps` number of times.
FzRunning pass '%s'Úgraph_modulezThe result of the pass z should be type PassResult.z)Please wrap it with pass_result_wrapper()zGraph after pass '%s': %sNz$An error occurred when running the 'z#' pass after the following passes: )rM   ra   rc   ÚrangerN   r#   r    r   r   r   r   ÚloggerÚdebugr   r	   Úhasattrrh   rq   Úmodifiedr   r<   Ú	recompilerO   Ú	Exception)rR   rm   Úoverall_modifiedÚ_rv   r%   r   Úfn_namer   Úer.   Úprev_pass_namesÚmsgs                r   Ú__call__ÚPassManager.__call__ù   sò  € ð ��Ø×"Ñ"Ô$ð 	�
‰
�6Ôð !ÐÜ�t—z‘z×"ˆAØˆHô # 4§;¡;×/‘�Ü)0×);Ò);¸B×)?Ñ)?˜"Ÿ+š+ÄTÈ"ÃX×EVÑEV�Ü—‘Ð0°'Ô:ð0Ù˜V›*�Cä% c¬:×6Ñ6¼wØ˜^÷@ñ @ô (Ø5°g°YÐ>YÐZØIñJóð ð !×-Ñ-�FØ'×7¨3¯<©<�Hä! &¬+×6Ñ6ÜŸ™Ð%@À'Ï<É<ÔXØ×(Ñ(Ô*ð ×6×6ØŸ
™
 6×*ò 7ñ- 0ðD  0×;°8Ðß‘8ÙñQ #ôT ˜&Ó3Ð3øô !ó 0ð "&§¡¨R¨a¡ó'â!0˜Aô '.×&8Ò&8¸×&;Ñ&;˜Ÿ
š
ÄÀaÃ×AQÑAQÒQÚ!0ùò'�Oð 'ð AÀÀ	ÐIlÐm|Ðl}Ð~�CÜ# C›.¨aÐ/ûð0ús&   Â>CF2Æ2
H4Æ<H/ÇAH
ÈH/È/H4)rM   r*   r    rO   rN   rP   )NNNFF)r   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r9   r   r   r   r	   Ú__annotations__ÚboolrM   rN   ÚintrS   rW   r[   r^   ra   rk   rc   r   Ú__static_attributes__r-   r   r   r   r   —   sÞ   ‡ ñð( �˜2Ÿ9™9˜+ zÐ1Ñ2Ñ3Ó3Ø�h ¨(Ð3°TÐ9Ñ:Ñ;Ó;Ø€J�ÓØ€Eˆ3ƒNð ØØØ+0Ø(-ñ?ð
 %)ð?ð "&õ?ð  ˜hô  ð ¨ô  ò	ò
ð& ð &¨Tô &ð˜BŸI™Ið ¨$ô ð=4˜rŸy™yð =4¨Z÷ =4r   r   )r   ÚloggingÚcollections.abcr   Ú	functoolsr   Úqueuer   Útorch.nnr   Útorch.fx._compatibilityr   Útorch.fx.graph_moduler   Útorch.fx.passes.infra.pass_baser	   Ú	getLoggerr   rs   ÚsetLevelÚWARNINGÚ__all__r
   r†   r9   r)   rC   r   r   r-   r   r   Ú<module>r•      s  ðã Û Ý $Ý Ý å Ý 1Ý -Ý 6ð 
×	Ò	˜8Ó	$€Ø ‡��—‘Ô  â
T€ñ  eÑ,ð˜Hð ¨ó ó -ðð@Ø˜( HÐ-¨tÐ3Ñ4ðØ>BÀ8¹nðà	ôð6Ø�‰Nð6Ø)-¨h©ð6à	ˆ(�^ô6ñr  eÑ,ð¨8ð ¸8ð Èó ó -ðñ4  eÑ,÷^4ð ^4ó -ñ^4r   