
    [Th                     &   S SK r S SKJr  S SKJr  S SKJrJr  \ R                  " \	5      r
/ SQrS\S\4S jr\ R                  4S\S\4S	 jjr  SS
\S\\   S\\   4S jjrS\\\/\4   S\\   4S jrS\S\4S jrS\S\4S jr " S S5      rg)    Nwrapsunwrap)CallableOptional)PassManagerinplace_wrapperlog_hook	loop_pass this_before_that_pass_constraint"these_before_those_pass_constraintfnreturnc                 0   ^  [        T 5      U 4S j5       nU$ )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                    > T" U 5        U $ N )gmr   s    T/var/www/auris/envauris/lib/python3.13/site-packages/torch/fx/passes/pass_manager.py
wrapped_fn#inplace_wrapper.<locals>.wrapped_fn"   s    
2	    r   )r   r   s   ` r   r
   r
      s#     2Y  r   c                 4   ^ ^ [        T 5      U U4S j5       nU$ )a7  
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" U 5      n[         R                  TSTU5        U$ )NzRan pass %s	 Return value: %s)loggerlog)r   valr   levels     r   r   log_hook.<locals>.wrapped_fnG   s$    f

5:BD
r   r   )r   r   r   s   `` r   r   r   *   s#    : 2Y 
 r   	base_passn_iter	predicatec                 b   ^ ^^ TSLTSL-  (       d   S5       e[        T 5      U UU4S j5       nU$ )a;  
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                    > U nTb"  TS:  a  [        T5       H  nT" U5      nM     U$ Tb&  T" U5      (       a  T" U5      nT" U5      (       a  M  U$ [        ST ST S35      e)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_pass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                     [        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.)	enumerater(   )r.   r/   iajbs         r   "_validate_pass_schedule_constraintr7   {   sz     &!fUWo.DA!>qc!aS
1#U1#Yqc B  / "r   thisthatc                 4   ^ ^ S[         S[         4UU 4S jjnU$ )zX
Defines a partial order ('depends on' function) where `this` must occur
before `that`.
r4   r6   c                 &   > U T:g  =(       d    UT:g  $ r   r   )r4   r6   r9   r8   s     r   
depends_on4this_before_that_pass_constraint.<locals>.depends_on   s    Dy%AI%r   r   )r8   r9   r<   s   `` r   r   r      s#    &h &8 & & r   thesethosec                 4   ^ ^ S[         S[         4U U4S jjnU$ )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]
r4   r6   c                 J   > [        U 5      T:g  =(       d    [        U5      T:g  $ r   r   )r4   r6   r?   r@   s     r   r<   6these_before_those_pass_constraint.<locals>.depends_on   s     ayE!7VAY%%77r   r>   )r?   r@   r<   s   `` r   r   r      s#    .8h 88 8 8 r   c                       \ rS rSr% Sr\\   \S'   \\   \S'   Sr\	\S'     SS jr
\S	 5       rS
\4S jrS rS\\   4S jrS rS rS 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 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                 D    U=(       d    / U l         U=(       d    / U l        g r   )r/   rF   )selfr/   rF   s      r   __init__PassManager.__init__   s    
 l&,"r   c                     [        U5      nU$ r   )r	   )clsr/   pms      r   build_from_passlistPassManager.build_from_passlist   s     	r   _passc                 H    U R                   R                  U5        SU l        g NF)r/   appendrG   )rI   rQ   s     r   add_passPassManager.add_pass   s    5!r   c                 H    U R                   R                  U5        SU l        g rS   )rF   rT   rG   rI   r.   s     r   add_constraintPassManager.add_constraint   s    
+r   _passesc                     Uc  g U R                    Vs/ s H  o"R                  U;  d  M  UPM     nnX0l         SU l        g s  snf rS   )r/   __name__rG   )rI   r[   pspasses_lefts       r   remove_passPassManager.remove_pass   s=    ?$(KKNKb;;g3MrKN! Os
   A A c                     / nU R                    HA  nUR                  UR                  :X  a  UR                  U5        M0  UR                  U5        MC     X0l         SU l        g rS   )r/   r]   rT   rG   )rI   _target_replacementr_   r^   s        r   replace_passPassManager.replace_pass   sQ    ++B{{g...""<0""2&	 
 "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)rG   rF   r7   r/   rX   s     r   validatePassManager.validate   s1    
 ??**J.z;;G +r   c                 `    U R                  5         UnU R                   H  nU" U5      nM     U$ r   )rh   r/   )rI   r)   outrQ   s       r   __call__PassManager.__call__   s,    [[E*C !
r   )rG   rF   r/   NN)r]   
__module____qualname____firstlineno____doc__listr   __annotations__rG   boolrJ   classmethodrO   rU   rY   strr`   re   rh   rl   __static_attributes__r   r   r   r	   r	      sx     NhJ -  
 h    49   	r   r	   rn   )logging	functoolsr   inspectr   typingr   r   	getLoggerr]   r   __all__r
   INFOr   intr   ru   rs   r7   r   r   r	   r   r   r   <module>r      s       % 
		8	$ X ( ") # #( #P !$($$SM$ !$V(H-t34>B8n	8 	8 	h x :K Kr   