
    ^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     2Yr "'' RYY 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 2Y"'' RYY 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IT$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fQUWo. 	DAq!Q>qc!aS
1#U1#Yqc 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    Dy%AI%r   r   r   bool)r=   r>   rA   s   `` r   r   r      s7    &hsCx( &Xc3h-? &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     ayE!7VAY%%77r   rB   )rD   rE   rA   s   `` r   r   r      s7    08hsCx( 8Xc3h-? 8D 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@    ?$(KKNb2;;g3Mr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.z4;;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(#$$hsCx())J 377;-Xc3h'(4/- (38,-4- 
	- hsCx.@)A m  
 hsCx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*# rdBh	#T(38,hsCx.@A4GH#s(#$ 

38
$,S#X$6xS!8CH#56<=CH&.sCx&8xS!8CH#56<=<M Mr   