
    IЦiS                     :   S SK r S SKrS SKrS SKrS SKrS SKJrJrJrJ	r	  S SK
rSSKJr  SSKJrJrJrJrJrJrJrJrJrJr  SSKJr  SSKJrJr  SSKJrJr  SS	K J!r!J"r"  SS
K#J$r$  SSK%J&r&J'r'J(r(J)r)  SSK*J+r+  \RX                   " S S5      5       r- " S S5      r.g)    N)CounterDictListOptional   )utils)
add_push_nulladd_push_null_call_function_excreate_call_functioncreate_call_methodcreate_dup_topcreate_instructioncreate_load_constcreate_load_methodcreate_rot_nInstruction)unimplemented)
AttrSourceSource)is_safe_constantrot_n_helper)ValueMutationExistingVariableTracker)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableUnspecializedPythonVariable)TensorWithTFOverrideVariablec                   *    \ rS rSr% \\S'   \\S'   Srg)GraphOutputEntry&   indexvariable N)__name__
__module____qualname____firstlineno__int__annotations__r   __static_attributes__r%       T/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/torch/_dynamo/codegen.pyr!   r!   &   s    Jr-   r!   c                   L   \ rS rSrSr     S:S\\R                  R                     S\\	   SS4S jjr
SS	.S
 jrS rS rS;S jrS<S jrS rS rS rS rS rS rS rS rS\\   4S jrS\4S jrS\4S jrS\4S jrS\4S jrS\4S jrS;S\4S jjr S\4S jr!S\4S jr"S  r#S! r$S\4S" jr%S# r&S$ r'S\4S% jr(S& r)S=S' jr*S( r+S) r,S* r-S+\.S,\/4S- jr0S. r1S/ r2S0 r3 S=S1\	S2\4Rj                  S,\/4S3 jjr6S\4S4 jr7S1\	SS4S5 jr8S>S6 jr9S\\   4S7 jr:S\4S8 jr;S9r<g)?	PyCodegen,   z4
Helper class uses for constructing Python bytecode
Nrootgraph_output_varreturnc                    X l         S U l        [        R                  " 5       U l        0 U l        / U l        U=(       d    0 U l        Xl        X0l	        U R                  R                  R                  U l        U R                  R                  U l        U R                  R                  R                  U l        SU l        U=(       d    0 U l        g )NT)r2   top_of_stackcollectionsr   usesgraph_outputs_outputtempvarstxr3   outputcode_optionscell_and_freevarsnew_varvalue_from_sourceoverridden_sources)selfr<   r2   r3   r;   rB   s         r.   __init__PyCodegen.__init__1   s     	7;.9.A.A.C	:<*,
 !B 0 GGNN77!%!:!:ww~~--'+ 9K8Pbr-   T)rA   c                    U R                   nU =R                   U-  sl          U R                  U5        X0l         g ! X0l         f = fN)rA   foreach)rC   stack_valuesrA   prevs       r.   restore_stackPyCodegen.restore_stackN   s=    %%"33	*LL&%)"T"s	   ; Ac                 t    U R                   R                  5        Vs/ s H  oR                  PM     sn$ s  snf rG   )r9   valuesr$   )rC   xs     r.   graph_output_varsPyCodegen.graph_output_varsV   s-    $($6$6$=$=$?@$?q

$?@@@s   5c                 @    UR                  U 5      nUb
   SU 35       eg )Nzreconstruct!=None )reconstruct)rC   valueress      r.   call_reconstructPyCodegen.call_reconstructY   s)    %{8088{r-   c                    [        U R                  5      n[        R                  S:  a  U R	                  5         U" 5         U R                  US nU R                  US2	 U(       a%  U R                  R                  [        U5      5        O$U R                  R                  [        U5      5        [        R                  S:  a  U R	                  5         gg)a`  
`gen_fn` generates instructions via PyCodegen methods
that push a single callable to the stack.

`add_push_null` pushes a NULL to the stack before or after the
instructions generated by `gen_fn`, depending on Python version.

Will attempt to use the NULL push bit for instructions
with such bits (LOAD_GLOBAL 3.11+, LOAD_ATTR 3.12+, LOAD_SUPER_ATTR).
      N)lenr:   sysversion_info	clear_tosextendr
   r	   )rC   gen_fncall_function_exold_lenadded_instss        r.   r	   PyCodegen.add_push_null]   s     dll#g% NNll78,LL"LL >{ KLLLk :;w&NN 'r-   c                 T  ^ ^^^	 [        U[        5      (       a=  T R                  R                  X5      nT R	                  U5        T R                  5         g[        U[        5      (       d   eT R                  m	T R                  mU(       az  T R                  UL a  T	R                  [        5       5        gT R                  R                  U5      b5  T	R                  T R                  T R                  U   5      5        UT l	        gUR                  bI  U(       aB  [        UR                  [         5      (       d  T R"                  (       a  T " UR                  5      $ UR%                  5       (       aN  ['        UR)                  5       5      (       a0  T	R                  T R+                  UR)                  5       5      5        GO[        U[,        5      (       a  T R/                  U5      mT R1                  U 4S j5        T R3                  TT   R4                  5        T	R                  T R7                  UR9                  T R:                  5      SS95        T	R=                  [?        SS5      5        GO[        U[@        5      (       a  URC                  5       [D        :X  a  T R:                  RF                  (       dp  T R/                  URI                  T R:                  [J        RL                  5      5      mUUU	U 4S jnT R1                  U5        T	R=                  [?        SS5      5        GO^[        U[N        [@        [P        [R        45      (       a  T R/                  U5      m[        U[R        5      (       aP  T R1                  U 4S	 j5        T R3                  TT   R4                  5        T	R=                  [?        S
S5      5        GO[        U[P        5      (       aH  URT                  (       a7  UUU	U 4S jnT R1                  U5        T	R=                  [?        SS5      5        GOfT R3                  TT   R4                  5        GOF[        U[V        5      (       a  URX                  R[                  S5      nUS   T R\                  S   ;   a)  T	R                  T R                  US   5      5        US
S nO9T R^                  c   eT	R                  T Ra                  T R^                  5      5        U H#  nT	R                  T Rc                  U5      5        M%     OtT Rd                  U==   S
-  ss'    T R	                  U5        U(       aD  UT R                  ;   a4  T R                  R                  [        5       5        T Rk                  U5        UT l	        g! [f         a    [i        SU 35         Nmf = f)a  
Generate code such that top-of-stack (TOS) is set to value.

`allow_cache` is used to determine whether the following could happen,
when `value` is a `VariableTracker`:
1. if `value` was codegen-ed previously with `allow_cache=True` and
   without using source, reuse the generated code by loading from top
   of stack or tempvars.
2. emit code based on `value.source` to handle aliasing.

Notable effects:
1. `self.top_of_stack` will be set to `value`, if we don't codegen
   `value` based on source.
2. `self.uses[value]` will increment, if we don't codegen `value` based
   on source or cache/top-of-stack reuse; in other words, if we codegen
   as if `value` is modelling some brand new python value.
Nc                  D   > T R                  [        R                  S5      $ )Nto_subclassload_import_fromr   r&   rC   s   r.   <lambda>$PyCodegen.__call__.<locals>.<lambda>   s    --ennmLr-   Tadd   Fc                     > TR                  T T   R                  5        TR                  TR                  S5      5        g Nitemload_graph_outputr#   appendcreate_load_attrr9   graph_outputs_keyr=   rC   s   r.   ra   "PyCodegen.__call__.<locals>.gen_fn   s4    &&}5F'G'M'MNd33F;<r-   r   c                  D   > T R                  [        R                  S5      $ )Nto_numpy_helperri   rk   s   r.   rl   rm      s    D11%..BSTr-   r   c                     > TR                  T T   R                  5        TR                  TR                  S5      5        g rr   rt   rx   s   r.   ra   rz      s4    **=9J+K+Q+QRMM$"7"7"?@r-   .co_varnameszreconstruct: )6
isinstancer   rB   getrV   r_   r   r:   r9   r6   rv   r   r;   create_loadsourcemutation_typer   rA   is_python_constantr   as_python_constantr   r   add_graph_outputr	   ru   r#   create_load_globalglobal_mangled_class_namer<   r`   r   r   python_typefloatexport	as_tensortorchfloat64r   r   r   need_unwrapr   
module_keysplitr>   r2   create_load_const_uncheckedrw   r8   NotImplementedErrorr   	add_cache)
rC   rT   allow_cacher   ra   partspartr9   ry   r=   s
   `      @@@r.   __call__PyCodegen.__call__z   ss   $ eV$$,,00>F!!&)NN%1111**  E)n./}}  '3d..t}}U/CDE$)! <<#$ 5..0EFF))ELL))##%%*:5;S;S;U*V*VMM$001I1I1KLM;<< $ 5 5e <L ""=1B#C#I#IJMM''33DGG<$ ( 
 MM.q%89uo..!!#u,GGNN !% 5 57!= = v&MM.q%89+$	
 
 !% 5 5e <%!566""T &&}5F'G'M'MN21e<=E#>??EDUDUA A ""6*21e<=&&}5F'G'M'MN/00$$**3/EQx4,,];;d..uQx89ab	yy,,,d>>tyyIJd33D9:  IIe!7%%e, u5##N$45u%! ' 7eW567s   (V V'&V'c                     [        UR                  5       5      nX R                  ;  a,  [        [	        U R                  5      U5      U R                  U'   U$ rG   )idas_proxyr9   r!   r\   )rC   rT   ry   s      r.   r   PyCodegen.add_graph_output  sN    u~~/0$6$664DD&&'5D01 ! r-   c                     U R                   nUR                  U R                  U R                  5      5        UR                  U R	                  U5      5        UR                  [        S5      5        g )NBINARY_SUBSCR)r:   rv   r   r3   r   r   )rC   r#   r=   s      r.   ru   PyCodegen.load_graph_output  sQ    d&&t'<'<=>d,,U34(9:r-   c                     U R                  5       nX R                  U'   U R                  R                  U R	                  U5      5        g rG   )r@   r;   r:   rv   create_store)rC   rT   vars      r.   r   PyCodegen.add_cache  s6    lln"eD--c23r-   c                 &    U H  nU " U5        M     g rG   r%   )rC   itemsis      r.   rH   PyCodegen.foreach#  s    AG r-   c                     [         R                  " SSU5      nU R                  R                  nX;   a  [	        X1   5      [	        U5      :X  d   eOX#U'   U R                  USS9/$ )zStore value in a new globalz[^a-zA-Z0-9_]+_Trn   )resubr<   	f_globalsr   r   )rC   namerT   r   s       r.   setup_globally_cachedPyCodegen.setup_globally_cached'  sc    vv'd3GG%%	io&"U)333#dO''$'788r-   c                     S U l         g rG   )r6   rk   s    r.   r_   PyCodegen.clear_tos1  s
     r-   c                     [        U[        5      (       d   eU R                  R                  U5        U R	                  5         g rG   )r   r   r:   rv   r_   )rC   insts     r.   append_outputPyCodegen.append_output4  s1    $,,,,D!r-   c                     [        S U 5       5      (       d   eU R                  R                  U5        U R                  5         g )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7frG   )r   r   ).0rO   s     r.   	<genexpr>*PyCodegen.extend_output.<locals>.<genexpr>:  s     =u!:a--us   )allr:   r`   r_   )rC   instss     r.   extend_outputPyCodegen.extend_output9  s5    =u=====E"r-   c                     U R                   $ rG   )r:   rk   s    r.   get_instructionsPyCodegen.get_instructions>  s    ||r-   c                 N    XR                   S   ;   d
   U S35       e[        SUS9$ )Nr    missing	LOAD_FASTargvalr>   r   rC   r   s     r.   r   PyCodegen.create_loadA  s2    ((77JD69JJ7!+d;;r-   c                 n    XR                  5       ;   d   e[        R                  S:  a  SOSn[        X!S9$ )NrY   r   LOAD_CLOSUREr   )r?   r]   r^   r   )rC   r   	inst_names      r.   create_load_closurePyCodegen.create_load_closureE  s6    --////#&#3#3w#>KN	!)99r-   c                 @    XR                  5       ;   d   e[        SUS9$ )N
LOAD_DEREFr   r?   r   r   s     r.   create_load_derefPyCodegen.create_load_derefJ  s$    --////!,t<<r-   c                 N    XR                   S   ;   d
   U S35       e[        SUS9$ )Nr   r   
STORE_FASTr   r   r   s     r.   r   PyCodegen.create_storeN  s2    ((77JD69JJ7!,t<<r-   c                 @    XR                  5       ;   d   e[        SUS9$ )NSTORE_DEREFr   r   r   s     r.   create_store_derefPyCodegen.create_store_derefR  s$    --////!-==r-   c                     U(       a%  U R                   R                  R                  U5        XR                  S   ;   d
   U S35       e[	        SUS9$ )Nco_namesz not in co_namesLOAD_GLOBALr   )r<   r=   update_co_namesr>   r   )rC   r   ro   s      r.   r   PyCodegen.create_load_globalV  sL    GGNN**40((44O>N6OO4!-==r-   c                     [        U5      $ rG   r   rC   rT   s     r.   r   PyCodegen.create_load_const\  s     ''r-   c                     [        USS9$ )NF)checkedr   r   s     r.   r   %PyCodegen.create_load_const_unchecked_  s     66r-   c                     U R                   R                  R                  U5        U R                  [	        U5      5        g rG   )r<   r=   r   r   r   r   s     r.   load_methodPyCodegen.load_methodb  s,    &&t,-d34r-   c                 8    U R                  [        U5      5        g rG   )r   r   )rC   nargss     r.   call_methodPyCodegen.call_methodf  s    -e45r-   c                 j    XR                   S   ;  a  U R                   S==   U4-  ss'   [        SUS9$ )Nr   	LOAD_ATTRr   r   r   s     r.   rw   PyCodegen.create_load_attri  s8    ((44j)dW4)!+d;;r-   c                 D    U R                  U R                  U5      5        g rG   )r   rw   r   s     r.   	load_attrPyCodegen.load_attrn  s    40067r-   c                 l    UR                  S5       Vs/ s H  o R                  U5      PM     sn$ s  snf )Nr~   )r   rw   )rC   namesr   s      r.   create_load_attrsPyCodegen.create_load_attrsq  s.    8=C8HI8H%%d+8HIIIs   1c                 j    XR                   S   ;  a  U R                   S==   U4-  ss'   [        SUS9$ )Nr   
STORE_ATTRr   r   r   s     r.   create_store_attrPyCodegen.create_store_attrt  s8    ((44j)dW4)!,t<<r-   c                 D    U R                  U R                  U5      5        g rG   )r   r   r   s     r.   
store_attrPyCodegen.store_attry  s    411$78r-   c           	      z   / nU(       a}  [         R                  S:  ai  UR                  [        U R	                  USS95      5        US:  a9  UR                  / U R                  US-   5      QU R                  US-   5      Q5        U$ UR                  U R	                  USS9/U R                  US-   5      Q5        U$ )z6Load the global fn_name on the stack num_on_stack downrZ      Trn   r   rp   r   )r]   r^   r`   r	   r   rot_n)rC   fn_name	push_nullnum_on_stackr=   s        r.   load_function_namePyCodegen.load_function_name|  s    ))W4MM-(?(?T(?(RSTaL1$45L1$45  MM++G+>ZZq 01 r-   c                      [        U5      $ ! [         aF    [        SUS9U R                  [	        U5      5      /[        S5      Q[        SSS9P[        SUS9Ps $ f = f)NBUILD_TUPLEargrp   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   r   r   )rC   ns     r.   r  PyCodegen.rot_n  sz    
	?" 	 #=a800aA a ##51=	
 ##4!< 	s   
 AAAc                     [         R                  S:  d   eU R                  S 5      /[         R                  S:  a  [        SSS94OSQ[	        SS	5      Q[        S
5      P$ )Nr  c                      g rG   r%   r%   r-   r.   rl   $PyCodegen.pop_null.<locals>.<lambda>  s    Tr-   rY   SWAPrp   r  r%   r   FPOP_TOP)r]   r^   r   r   r   rk   s    r.   pop_nullPyCodegen.pop_null  sw     7***,,\:


 ##w. $F24

 "!U+

 y)

 
	
r-   c                 8    U R                  [        S5      5        g )Nr  )r   r   rk   s    r.   pop_topPyCodegen.pop_top  s    -i89r-   r   r  c                 4    U R                  [        XS95        g )N)r  )r   r   )rC   r   r  s      r.   call_functionPyCodegen.call_function  s    /KLr-   c                 6    U R                  [        5       5        g rG   )r   r   rk   s    r.   dup_topPyCodegen.dup_top  s    >+,r-   c                 D    U R                  U R                  U5      5        g rG   )r   r   rC   varnames     r.   storePyCodegen.store  s    4,,W56r-   c                 D    U R                  U R                  U5      5        g rG   )r   r   r$  s     r.   
load_derefPyCodegen.load_deref  s    411':;r-   r  codec                   ^ ^^^^ TR                   mT(       d   eT R                  mUUUUU 4S jnU(       al  [        R                  S:  aX  T R	                  U5        TR                  T R                  US-   5      5        TR                  T R                  US-   5      5        O*U" 5         TR                  T R                  US-   5      5        T R                  5         g )Nc                    > T H9  n U TR                  5       ;   d   eTR                  TR                  U 5      5        M;     TR                  [        S[	        T5      S95        TR                  TR                  T5      5        [        R                  S:  a   TR                  TR                  T5      5        [        R                  S:  a%  TR                  [        S5      [        SSS9/5        g TR                  [        SSS95        g )Nr  r  r  rY   MAKE_FUNCTIONSET_FUNCTION_ATTRIBUTE   )	r?   rv   r   r   r\   r   r]   r^   r`   )r   r+  r  freevarsr=   rC   s    r.   ra   4PyCodegen.make_function_with_closure.<locals>.gen_fn  s    
  d446666d66s;<   MM,]HNOMM$0067')d44W=>7**?;*+CN 0dKLr-   r  rp   r   )co_freevarsr:   r]   r^   r	   r`   r  r_   )rC   r  r+  r  r  ra   r1  r=   s   ```   @@r.   make_function_with_closure$PyCodegen.make_function_with_closure  s     ##x	M 	M, ))W4v&MM$**\A%567MM$**\A%567HMM$**\A%567r-   c                 H   U R                   R                  nUR                  n[        R                  " SSUR
                  5      nUR                  US5      UL a  U R                  USS9$ SU 3nU R                   R                  R                  XQ5      nU R                  USS9$ )zD
Generate a LOAD_GLOBAL instruction to fetch a given python module.
z^.*[.] NTrn   
___module_)	r<   r=   global_scoper   r   r&   r   r   install_global_by_id)rC   modr=   r9  r   prefixglobal_names          r.   create_load_python_module#PyCodegen.create_load_python_module  s     **vviS\\2D$'3.**4T*::dV$ggnn99&F&&{&==r-   c                   ^  T R                  T R                  US5      5        T R                  R                  R                  nU Hh  nUR
                  (       aC  T R                  U 4S j5        T R                  U5        T R                  [        SS5      5        MW  T R                  U5        Mj     T R                  [        [        U5      S5      5        g)z2Call the generated code function stored in fn_nameTc                  n   > T R                  T R                  [        5      T R                  S5      /5      $ )N_as_tensor_fullprec)r   r>  r   rw   rk   s   r.   rl   4PyCodegen.make_call_generated_code.<locals>.<lambda>  s2    D.. ::5A 112GHr-   r   FN)
r   r  r<   r=   	graphargspass_arg_as_tensorr	   rV   r   r\   )rC   r  rD  r  s   `   r.   make_call_generated_code"PyCodegen.make_call_generated_code  s    4227DABGGNN,,	C%%"" %%c*""#75#AB%%c*  	/IFGr-   c                 Z    U " [        U R                  R                  U5      U5      5        g rG   )r   r<   import_source)rC   module_nameobject_names      r.   rj   PyCodegen.load_import_from  s     Z--k:KHIr-   c                    [         R                  S:  aP  [        X5      nUS   R                  S:X  d   eUR	                  SU R                  U5      5        [        SUS9US'   U$ [         R                  S:  aY  [        X5      n[         R                  S:  a  SnSnOSnS	nXE   R                  U:X  d   e[        S
US9nUR	                  XW5        U$ U R                  U5      [        SUS9/$ )NrY   CALLCALL_KWr  r  )rZ      PRECALLKW_NAMESr   CALL_FUNCTION_KW)r]   r^   r   opnameinsertr   r   )rC   r   kw_namesr  r=   idxexpected_instkw_names_insts           r.   create_call_function_kw!PyCodegen.create_call_function_kw	  s    w&)%;F":$$...MM"d44X>?+I5AF2JM()%;F7* & );%%666.z(KMMM#-M""8,1u=
 	
r-   c                     [        SUS9$ )NDELETE_FASTr   )r   r   s     r.   create_deletePyCodegen.create_delete!  s    !->>r-   )r:   r?   r>   r3   r9   r@   rB   r2   r;   r6   r<   r8   rA   )NNNNN)F)T)r   )r4   N)=r&   r'   r(   r)   __doc__r   r   nnModulestrrD   rK   rP   rV   r	   r   r   ru   r   rH   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r  r  r  r  r*   boolr  r!  r&  r)  typesCodeTyper4  r>  rF  rj   r\  r`  r,   r%   r-   r.   r0   r0   ,   s    *.*.Q uxx'Q #3-	Q 
Q: @D *A9:T"l!;4
9!

${"3 <; <:; :
= ==K =>+ >>[ >(+ (7K 756< <
8J= =
9*
 :M3 M4 M-7< QR$$"'..$=A$L> >H H H,J
T+EV 
0?k ?r-   r0   )/r7   dataclassesr   r]   rg  typingr   r   r   r   torch.nnr   r7  r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   excr   r   r   r   r   r   variables.baser   r   variables.nn_moduler   variables.tensorr   r   r   r   variables.torch_functionr   	dataclassr!   r0   r%   r-   r.   <module>rs     s{      	 
  0 0      & 1 B 1  C   
v? v?r-   