
     Ti 2                    r    S SK Jr  S SKrS SKJrJrJrJr  S SKJ	r	J
r
  S
S jrSS jrSS jr " S S	5      rg)    )annotationsN)AnyOptionalSequenceSet)	ast_utils
sourceinfoc                    [        U R                  [        R                  5      (       d  [	        U" U S5      5      eU R                  R
                  $ )Nz*For loop target must be a single variable.)
isinstancetargetastName	TypeErrorid)for_stmt	formatters     \/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxscript/_internal/analysis.py_get_loop_varr      s:    hoosxx00	(,XYZZ??    c                   U c
  [        5       $ [        U [        R                  5      (       a  U R                  1$ [        5       n[        U [        R
                  5      (       ap  U R                  nU R                   HS  n[        UR                  [        R                  5      (       d  M.  UR                  UR                  R                  5        MU     O[        R                  " U 5      nU H  nU[        U5      -  nM     U$ )zMReturn set of all variables used, including function names, in an expression.)setr   r   r   r   Callargskeywordsvalueadditer_child_nodes
_used_vars)exprresultchildrenkeywordcs        r   r   r      s    |u$!!yUF$!!99}}G'--22

7==++, % ''-*Q-' Mr   c                    S n[        U [        R                  5      (       a"  U R                   Vs1 s H
  o!" U5      iM     sn$ U" U 5      1$ s  snf )zGReturn set of assigned variables in the lhs of an assignment statement.c                f    [        U [        R                  5      (       d   S5       eU R                  $ )Nz"Only simple assignments supported.)r   r   r   r   )es    r   get_id_lhs_vars.<locals>.get_id(   s(    !SXX&&L(LL&ttr   )r   r   Tupleelts)lhsr'   xs      r   	_lhs_varsr-   %   sH     #syy!!#&88,8aq	8,,3K= -s   Ac                      \ rS rSr S       SS jjrSS jrSS jr      SS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSrg)AstAnalyzer1   Nc                    X l         0 U l        0 U l        0 U l        U(       a  U R	                  X5        U R                  U5        g N)
_formatter_constant_if_condition_live_in	_live_out_compute_constant_if_conditionsdo_liveness_analysis)selffunr   globalss       r   __init__AstAnalyzer.__init__2   s>     $:<#243500>!!#&r   c                8    U R                   R                  U5      $ )zKGet the set of variables that are live at the entry of the given statement.)r5   getr9   stmts     r   live_inAstAnalyzer.live_in@   s    }}  &&r   c                8    U R                   R                  U5      $ )zJGet the set of variables that are live at the exit of the given statement.)r6   r?   r@   s     r   live_outAstAnalyzer.live_outD   s    ~~!!$''r   c                   U R                  UR                  5      n[        R                  " U5       H  n[	        U[        R
                  5      (       d  M$  [	        UR                  [        R                  5      (       d  MO  UR                  R                  nXS;  d  Ml  XR;   d  Ms  [        X%   5      U R                  U'   M     g)a  Identify if-statements with constant conditions.

If-statements of the form `if name:` where `name` is an outer-scope variable
and name is not assigned to within the function body, are treated as constant
conditions. The value of such conditions is determined from the outer-scope.
N)assigned_varsbodyr   walkr   Iftestr   r   boolr4   )r9   r:   r;   rH   node
python_vars         r   r7   +AstAnalyzer._compute_constant_if_conditionsH   s     **3884HHSMD$''dii22!%J!6:;P<@AT<U33D9 "r   c                :    U R                   R                  US5      $ )zReturn the constant value of the if-statement condition, if it is constant.

Args:
    if_stmt: The if-statement-ast to analyze.

Returns:
    The constant boolean value of the if-statement condition, or None if not constant.
N)r4   r?   )r9   if_stmts     r   constant_if_condition!AstAnalyzer.constant_if_condition[   s     **..w==r   c                  ^  SU 4S jjn[        U[        R                  5      (       a  [        UR                  S   5      $ [        U[        R
                  5      (       a  [        UR                  5      $ [        U[        R                  5      (       a
  [        5       $ [        U[        R                  5      (       ad  T R                  U5      nUc%  U" UR                  5      U" UR                  5      -  $ U(       a  U" UR                  5      $ U" UR                  5      $ [        U[        R                  5      (       a*  U" UR                  5      [        UT R                  5      1-  $ [        U[        R                   5      (       a  U" UR                  5      $ [        U["        5      (       a  U" U5      $ [        U[        R$                  5      (       a
  [        5       $ [        U[        R&                  5      (       a
  [        5       $ [(        R*                  " U5      (       a
  [        5       $ [(        R,                  " U5      (       a
  [        5       $ T R                  US[/        U5      < S35      n[1        U5      e)zqReturn the set of all variables that may be assigned to in an execution of input stmt
or sequence of statements.
c                V   > [        5       nU  H  nUTR                  U5      -  nM     U$ r2   )r   rH   )blockr    sr9   s      r   assigned_in_block4AstAnalyzer.assigned_vars.<locals>.assigned_in_blockk   s.    "uF$"4"4Q"77 Mr   r   Unsupported statement type .)rW   Sequence[ast.stmt]returnSet[str])r   r   Assignr-   targets	AnnAssignr   Returnr   rK   rS   rI   orelseForr   r3   WhilelistBreakFunctionDefr   is_print_callis_doc_stringtype
ValueError)r9   rA   rY   constant_conderror_messages   `    r   rH   AstAnalyzer.assigned_varsf   s   
	 dCJJ''T\\!_--dCMM**T[[))dCJJ''5LdCFF## 66t<M$(36G6TTT(33(55dCGG$$$TYY/=t3W2XXXdCII&&$TYY//dD!!$T**dCII&&5LdCOO,, 5L""4((5L""4((5L0KDQUJ>YZ.[\''r   c                   ^ ^^ SUU 4S jjmSU U4S jjm[        U[        R                  5      (       d   e[        5       n[	        UR
                  5       H  nT" X25      nM     g)z4Perform liveness analysis of the given function-ast.c                T   > UTR                   U '   T" X5      nUTR                  U '   U$ r2   )r6   r5   )rA   rE   livedo_visitr9   s      r   visit/AstAnalyzer.do_liveness_analysis.<locals>.visit   s.    #+DNN4 D+D"&DMM$Kr   c           	       > SU4S jjn[        U [        R                  5      (       a=  UR                  [	        U R
                  S   5      5      [        U R                  5      -  $ [        U [        R                  5      (       a:  UR                  [	        U R                  5      5      [        U R                  5      -  $ [        U [        R                  5      (       a  [        U R                  5      $ [        U [        R                  5      (       a  T
R                  U 5      nUc@  U" U R                  U5      nU" U R                  U5      nXE-  [        U R                  5      -  $ U(       a  U" U R                  U5      $ U" U R                  U5      $ [        U [        R                   5      (       aM  [#        U T
R$                  5      nS nUnX:w  a,  UnU" U R                  U5      R                  U15      nX:w  a  M,  U$ [        U [        R&                  5      (       aA  [        U R                  5      n	S nX-  nX:w  a  UnU" U R                  U5      U	-  nX:w  a  M  U$ [        U [        R(                  5      (       a  U$ [*        R,                  " U 5      (       a  U$ [        U [        R.                  5      (       a  U$ [*        R0                  " U 5      (       a  U$ [3        T
R%                  U S[5        U 5      < S35      5      e)Nc                <   > [        U 5       H  nT" X!5      nM     U$ r2   reversed)rW   rE   rX   ru   s      r   
visitBlockFAstAnalyzer.do_liveness_analysis.<locals>.do_visit.<locals>.visitBlock   s     !%A$Q1H )r   r   r[   r\   rW   r]   rE   r_   r^   r_   )r   r   r`   
differencer-   ra   r   r   rb   r   rc   rK   rS   rI   rd   rL   re   r   r3   rf   rh   r   rk   ri   rj   rm   rl   )rA   rE   r{   rn   live1live2
p_loop_varprevcurr	cond_varsr9   ru   s             r   rt   2AstAnalyzer.do_liveness_analysis.<locals>.do_visit   se    
 $

++**9T\\!_+EFTXT^T^I___$..**9T[[+ABZPTPZPZE[[[$

++!$**--$'' $ : :4 @ (&tyy(;E&t{{H=E =:dii+@@@"%dii::%dkk8<<$((*4A
lD%dii6AA:,OD l $		**&tyy1	+lD%dii6BD l $		**
  &&t,,$00&&t,,(CDJ>QR&ST r   NrA   ast.stmtrE   r_   r^   r_   )r   r   ri   r   rz   rI   )r9   r:   rs   rX   rt   ru   s   `   @@r   r8    AstAnalyzer.do_liveness_analysis   sT    	 	4	 4	l #s////#((#A>D $r   c                L   ^ ^^ SU4S jjmSU U4S jjmT" U[        5       5      $ )a  Return the set of variables that are used before being defined by given block.
In essence, this identifies the "inputs" to a given code-block.
For example, consider the following code-block:
::

x = x + 10
y = 20
z = x + y
x = 30

The exposed_uses of this code-block is { x }. The value of z is not used within
the block. Even though the value of y is used within the block, it is assigned
a value before it is used. However, in contrast, the incoming value of x is used
(in the first statement). Hence x is included in the exposed_uses.
c                <   > [        U 5       H  nT" X!5      nM     U$ r2   ry   )rW   rE   rA   ru   s      r   r{   ,AstAnalyzer.exposed_uses.<locals>.visitBlock   s       0 (Or   c           	       > [        U [        R                  5      (       a=  UR                  [	        U R
                  S   5      5      [        U R                  5      -  $ [        U [        R                  5      (       a:  UR                  [	        U R                  5      5      [        U R                  5      -  $ [        U [        R                  5      (       a  [        U R                  5      $ [        U [        R                  5      (       a  T	R                  U 5      nUc@  T
" U R                  U5      nT
" U R                  U5      nX4-  [        U R                  5      -  $ U(       a  T
" U R                  U5      $ T
" U R                  U5      $ [         R"                  " U 5      (       a  U$ [         R$                  " U 5      (       a  U$ [        U [        R&                  5      (       an  [)        U T	R*                  5      1nUR                  U5      nT
" U R                  [-        5       5      R                  U5      n[        U R.                  5      nXx-  U-  $ [        U [        R0                  5      (       a7  T
" U R                  [-        5       5      n[        U R                  5      nXx-  U-  $ [        U [        R2                  5      (       a  U$ [        U [        R4                  5      (       aA  U R6                  U;   a/  UR9                  U R6                  5        UT	R;                  U 5      -  nU$ [=        T	R+                  U S[?        U 5      < S35      5      e)Nr   r[   r\   ) r   r   r`   r~   r-   ra   r   r   rb   r   rc   rK   rS   rI   rd   rL   r   rj   rk   re   r   r3   r   iterrf   rh   ri   nameremoveouter_scope_variablesrm   rl   )rA   rE   rn   r   r   loop_var_setused_after_loopused_inside_loopused_in_loop_headerr9   r{   s            r   ru   'AstAnalyzer.exposed_uses.<locals>.visit   s   $

++**9T\\!_+EFTXT^T^I___$..**9T[[+ABZPTPZPZE[[[$

++!$**--$'' $ : :4 @ (&tyy(;E&t{{H=E!MZ		-BBB"%dii::%dkk8<<&&t,,&&t,,$(( !.dDOO DE"*"5"5l"C#-dii#?#J#J<#X &0&;#'=OO$		** $.dii#? &0&;#'=HH$		**  $0099(OODII.'$*D*DT*JJH(CDJ>QR&ST r   r}   r   )r   )r9   stmtsru   r{   s   ` @@r   exposed_usesAstAnalyzer.exposed_uses   s$    "	
.	 .	` %''r   c                   [        U[        R                  5      (       d   eU R                  UR                  5      nUR
                  R
                   Vs/ s H  o3R                  PM     nnUR                  U5      $ s  snf )zReturn the set of outer-scope variables used in a nested function.

Args:
    fun: The function-ast to analyze.
    formatter: The formatter object.

Returns:
    A set of variable names (strings).
)r   r   ri   r   rI   r   argr~   )r9   r:   
used_vars_r,   inputss        r   r   !AstAnalyzer.outer_scope_variables  sc     #s////&&sxx0
!$/A%%/$$V,, 0s   A=)r4   r3   r5   r6   r2   )r:   ast.FunctionDefr   sourceinfo.Formatterr;   zdict[str, Any] | Noner^   None)rA   r   r^   zSet[str] | None)r:   r   r;   zdict[str, Any]r^   r   )rR   zast.Ifr^   zOptional[bool])rA   zast.stmt | list[ast.stmt]r^   r_   )r:   r   r^   r   )r   r]   r^   set[str])r:   r   r^   r   )__name__
__module____qualname____firstlineno__r<   rB   rE   r7   rS   rH   r8   r   r   __static_attributes__ r   r   r/   r/   1   s{    
 *.	'' (' '	'
 
''(V"V-;V	V&	>*(XB"HF(P-r   r/   )r   zast.Forr   r   r^   str)r   zOptional[ast.expr]r^   r_   )r+   zast.exprr^   r_   )
__future__r   r   typingr   r   r   r   onnxscript._internalr   r	   r   r   r-   r/   r   r   r   <module>r      s1    # 
 / / 6(	z- z-r   