
    h>                     z   S SK r S SKJrJrJr  S SKrS SKJs  Jr	  S SK
Jr  S SKJr  \R                  R                  rSrSrSr  SS\R&                  R(                  S	\R&                  R*                  S
\\R,                     S\\   SS4
S jjrS	\R&                  R*                  S\\\      S\4S jr " S S\R&                  R8                  5      r SS\R&                  R(                  S\\\R&                  R*                  /\4      SS4S jjr   SS\R&                  R(                  S\S\\\      S\\\R&                  R*                  /\4      SS4
S jjr   SS\R&                  R(                  S\S\\\      S\\\R&                  R*                  /\4      S\R&                  R(                  4
S jjr g)    N)AnyCallableOptional)maybe_set_is_frozen_param)
OrderedSetMODULE_TYPE_MAIN_MODULE_CONST_MODULEgmnodeconstantnamereturnc                 ~   U R                   nU(       a  UnOL[        U S5      (       d  SU l        U R                  n SU 3n[        X5      (       d  OUS-  nM  US-   U l        UR                  U5         Ub  UR	                  SUS0 5      nOUR	                  SUS0 5      nUR                  U5        UR                  R                  UR                  5        UR                  U5        UR                  Ul	        S S S 5        Ub)  U R                  XR5        [        XU5        [        U5        g g ! , (       d  f       N;= f)N_frozen_param_countr   _frozen_param   get_attr placeholder)graphhasattrr   inserting_beforecreate_nodereplace_all_uses_withmetaupdate
erase_noder   register_buffersetattrr   )r   r   r   r   gqualnameinew_input_nodes           a/home/james-whalen/.local/lib/python3.13/site-packages/torchao/quantization/pt2e/constant_fold.pyreplace_node_with_constantr&      s&    	Ar011%&B"""&qc*H2((FA	  "#Q	
		D	!]]:xRHN ]]=(BKN"">2""499-	T"ii 
" 
8.h'!(+  
"	!s   4BD..
D<lifted_constant_namesc                 ^    U R                   S:H  =(       d    U R                  U=(       d    S;   $ )Nr   r   )opr   )r   r'   s     r%   is_const_sourcer*   C   s'     77j NDII2G2M2$NN    c                     ^  \ rS rSr   SS\R
                  R                  S\S\\	\
      S\\\R
                  R                  /\4      SS4
U 4S jjjrS\\R
                  R                     4S	 jrS\4S
 jrS\R
                  R                  S\4U 4S jjrS\R
                  R&                  R                  S\4S jrS\\R
                  R                  \	\R
                  R                     4   4S jrS\R
                  R                  S\4U 4S jjrS\R0                  S\4S jrS\R
                  R                  S\R0                  SS4S jrS\4U 4S jjrS\\R
                  R                  \4   SS4S jrSrU =r$ )ConstantFolderI   Nr   skip_constructorsr'   skip_folding_node_fnr   c                   > [         TU ]  U5        0 U l        [        R                  " 5       U l        [        5       U l        X l        U R                  5       U l
        X0l        [        5       U l        X@l        U R                  5       U l        g N)super__init__node_replacementscollectionsCounterreplaced_usesobjectunknown_valuer/   node_to_last_non_output_useuser_to_last_usesr'   deferred_valuer0   _find_mutable_buffersmutable_buffers)selfr   r/   r'   r0   	__class__s        r%   r4   ConstantFolder.__init__J   sw     	;=7B7J7J7L#X'8 "&!A!A!C%:"$h$8!  $99;r+   c                    [        5       nU R                  R                  R                   H  nUR                  S:X  d  M  [        UR                  S5      (       d  M2  S[        UR                  5      ;   d  MM  [        UR                  5      S:  d  Mh  [        UR                  S   [        R                  R                  5      (       d  M  UR                  UR                  S   5        M     U$ )zkFind mutable buffers by identifying copy_ operations.
The first argument of copy_ op is the mutable buffer.call_function_schemacopy_r   )setmoduler   nodesr)   r   targetstrlenargs
isinstancetorchfxNodeadd)r@   r?   r   s      r%   r>   $ConstantFolder._find_mutable_buffersa   s     %KK%%++D?*DKK33s4;;// tyy>A%*TYYq\588==*Q*Q#''		!5 , r+   c                     g)NFr   )r@   s    r%   _support_dynamic_shape%ConstantFolder._support_dynamic_shapep   s    r+   r   c                   > U R                   c  [        TU ]	  U5      $ U R                  b"  U R                  U5      (       a  U R                  $ [
        R                  " UR                  0 UR                  D6nU H~  n[        U[        R                  R                  5      (       d  M.  UR                  U R                   =(       d    S;  d  MS  U R                  U   U R                  :w  d  Mr  U R                  s  $    U R                  $ )Nr   )r'   r3   run_noder0   r:   pytreearg_tree_leavesrM   kwargsrN   rO   rP   rQ   r   envr=   )r@   r   flattened_node_inpsinprA   s       r%   _deduce_valueConstantFolder._deduce_valuet   s    %%-7#D)) $$0T5N5Nt5T5T%%%$44diiO4;;O&C3..HHT%?%?%E2FHHSMT%8%88))) ' """r+   c                 <   S[         R                  R                  R                  S[        4S jnU" U5      (       d~  UR
                  [         R                  R                  R                  R                  :X  ak  [        UR                  5      S:X  aR  U" [        [        UR                  5      5      5      (       a)  [        UR                  S   U R                   5      (       a  g[         R                  R"                  R$                  R                  [         R                  R"                  R&                  R                  [         R                  R"                  R&                  R(                  [         R                  R"                  R*                  R,                  [         R                  R.                  R0                  /nUR
                  U;   a  gUR                   H?  n[3        U[         R                  R                  5      (       d  M.  X@R4                  ;   d  M?    g   g)Nr   r   c                    U R                   [        R                  R                  R                  R
                  :H  =(       a    [        U R                  S   [        R                  R                  5      =(       a    SU R                  S   R                  ;   =(       a^    U R                  S   R                  S   R                  [        R                  :H  =(       a     U R                  S   [        R                  :H  $ )Nr   valr   )rJ   rO   opsprimsconvert_element_typedefaultrN   rM   rP   rQ   r   dtypeint8bfloat16)r   s    r%   is_woq_int8_pattern5ConstantFolder.is_impure.<locals>.is_woq_int8_pattern   s    uyyCCKKK 3tyy|UXX]];3TYYq\...3 IIaL%%e,22ejj@3 IIaLENN2r+   r   r   TF)rO   rP   r   rQ   boolrJ   rd   atenpermuterg   rL   usersnextiterr*   rM   r'   quantized_decomposeddequantize_per_channeldequantize_per_tensortensorrf   no_fusetorchaodequantize_affinerN   r?   )r@   r   rk   DEQUANT_OPSargs        r%   	is_impureConstantFolder.is_impure   sj   	ehhmm&8&8 	T 	  %%uyy~~55===

Oq('T$**-=(>??IIaL&&
 
  II**AAIIII**@@HHII**@@GGII**??GGII//
 ;;+%  99C#uxx}}--#9M9M2M  r+   c                   ^^^ [         R                  " [        5      m[        [        R
                  R                     " 5       m[        [        [        U R                  R                  R                  5      5      5      n[        U R                  R                  R                  5       H  mTR                  S:X  a  M  S[        R
                  R                  SS 4UUU4S jjn[        R                  " [        R
                  R                  UTR                   TR"                  45        [%        TR&                  5      S:X  d  M  UTR&                  ;   d  M  TT   R)                  T5        M     T$ )Noutputr^   r   c                 ^   > U T;   a  g TR                  U 5        TT   R                  U 5        g r2   )rR   append)r^   last_non_output_user   	seen_usess    r%   add_use;ConstantFolder.node_to_last_non_output_use.<locals>.add_use   s-    )#c"#D)005r+   r   )r6   defaultdictlistr   rO   rP   rQ   rq   rr   reversedrH   r   rI   rJ   rY   tree_map_only_rM   r[   rL   rp   r   )r@   output_noder   r   r   r   s      @@@r%   r;   *ConstantFolder.node_to_last_non_output_use   s    )55d;uxx}}-/	4):):)@)@ ABCT[[..445D{{h&6UXX]] 6t 6 6 !!%((--499dkk:RS 4::!#tzz(A#D)006! 6$ #"r+   c                   >^  UR                   S:X  al  S[        R                  R                  SS 4U 4S jjn[        R
                  " [        R                  R                  X!R                  5        [        T
T ]!  U5      $ T R                  U5      u  p4[        R                  " U0 UD6n[        U 4S jU 5       5      (       a  T R                  $ UR                  S:X  a4  UR                   [        R                  R                   :X  a  T R                  $ UR                  S:X  a  UR"                  S:X  a  T R                  $ T R$                  (       a>  ['        UT R(                  5      (       d#  [        S U 5       5      (       d  T R                  $ [+        UR                   [        R,                  R.                  5      (       a>  [        R0                  R2                  UR                   R4                  ;   a  T R                  $ UR                  S:X  a?  [+        UR                   [        R,                  R6                  5      (       a  T R                  $ T R9                  U5      n[+        U[        R:                  R<                  5      (       a  U$ UT R                  :X  a  T R                  $ ['        UT R(                  5      (       Gd  [+        U[        R>                  5      (       d  UT R@                  :X  GaS  UT R@                  :w  a  URB                  RD                  S	:X  a  U$ T RG                  U5      (       d  U$ T RI                  U5      (       a  T R                  $ T RK                  X5        [        R                  " UR                  0 URL                  D6nU HE  n[+        U[        R                  R                  5      (       d  M.  T RN                  U==   S
-  ss'   MG     T RP                  RS                  U/ 5       HG  n	T RN                  U	   [U        U	RV                  5      :X  d  M+  T RX                  R[                  U	S 5        MI     U$ )Nr   r{   r   c                 8   > TR                   TR                  U '   g r2   )r:   r\   )r{   r@   s    r%   set_env(ConstantFolder.run_node.<locals>.set_env   s     $ 2 2r+   c              3      >#    U  H<  n[        TR                  5      [        U5      :H  =(       a    TR                  U:H  v   M>     g 7fr2   )typer:   ).0input_r@   s     r%   	<genexpr>*ConstantFolder.run_node.<locals>.<genexpr>   s?      
* ##$V4U9K9Kv9UU*s   AArD   &triton_kernel_wrapper_functional_proxyc              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr2   )rN   rO   Tensor)r   es     r%   r   r      s      N=M
1ell33=Ms   ')r   r   ).rJ   rO   rP   rQ   rY   r   rM   r3   rX   fetch_args_kwargs_from_envrZ   anyr:   r)   rn   _efficientzerotensorrg   r   r/   r*   r'   rN   _ops
OpOverloadTagnondeterministic_seededtagsHigherOrderOperatorr_   _CScriptObjectr   r=   devicer   insertable_tensor_checkr|   add_node_replacementr[   r8   r<   getrL   rp   r5   pop)r@   r   r   rM   r[   flattened_inputsoutr]   n	to_deleterA   s   `         r%   rX   ConstantFolder.run_node   sD   ;;("3UXX]] 3t 3 !!%((--))D7#D))66t<!114B6B
  
*
 
 
 %%% GG&t88@@@%%% GG&		EE%%% ""#D$*D*DEEN=MNNN%%% t{{EJJ$9$9::		11T[[5E5EE%%%77o%*KK77+
 +
 %%%  &c5880011J$$$$%%%tT%?%?@@sELL))SD4G4G-Gd)))cjjoo.G
//44
~~d##)))%%d0"("8"8$))"St{{"S(!!UXX]]33""1%*%	 ) "3377bA	%%i0C	4HH**..y$? B 
r+   rv   c                     g)NTr   )r@   rv   s     r%   r   &ConstantFolder.insertable_tensor_check,  s    r+   c                      X R                   U'   g r2   )r5   )r@   r   rv   s      r%   r   #ConstantFolder.add_node_replacement/  s    '-t$r+   c                 D   > 0 nU R                  U5        [        TU ]	  US9$ )N)initial_env)insert_placerholder_valuesr3   run)r@   r\   rA   s     r%   r   ConstantFolder.run2  s'    (*'',w{s{++r+   r\   c                 D   U R                   R                  R                  SS9 H  nU R                  X'   M     U R                  c  g U R                   R                  R
                   H6  nUR                  U R                  =(       d    S;   d  M(  U R                  X'   M8     g )Nr   r)   r   )rH   r   
find_nodesr:   r'   rI   r   r=   )r@   r\   r   s      r%   r   )ConstantFolder.insert_placerholder_values7  s    ""---?A''CF @%%-""((Avv$44:;,, )r+   )	r=   r'   r?   r5   r8   r/   r0   r:   r<   )FNN)__name__
__module____qualname____firstlineno__rO   rP   GraphModulerm   r   r   rK   r   rQ   r4   rG   r>   rU   r   r_   r   r|   dictr;   rX   r   r   r   r   r   __static_attributes____classcell__)rA   s   @r%   r-   r-   I   s    #(59JN<HH  <  <  (S	2	<
 'x0E'FG< 
< <.s588=='9  #%((-- #C #"-ehhmm00 -T -^#T%((--ehhmmAT2T-U #2]UXX]] ]s ]~ell t . . .QU .,S ,
-d588==#3E.F -4 - -r+   r-   constraint_fnc                    [         R                  R                  R                  5          [	        U SS9nUR                  5         UR                  R                  5        H#  u  p4Ub  U" U5      (       d  M  [        XU5        M%     / nU R                  R                  SS9 H^  n[        UR                  5      S:X  d  M  [        XR                  5      (       a  [        XR                  5        UR!                  U5        M`     U H  nU R                  R#                  U5        M      U R                  R%                  5         U R                  R'                  5         U R)                  5         S S S 5        g ! , (       d  f       g = f)NT)r/   r   r   r   )rO   utils_python_dispatch_disable_current_modesr-   r   r5   itemsr&   r   r   rL   rp   r   rJ   delattrr   r   eliminate_dead_codelint	recompile)r   r   cfr   r   erased_paramss         r%   constant_foldr   A  s    
	%	%	<	<	>B$7
 2288:ND(t1D1D&r: ;
 HH'':'6D4::!#2{{++B,$$T*	 7 "DHH% " 	$$&

+ 
?	>	>s   BE3>B,E33
Fr/   r0   c                    [         R                  R                  R                  5          [	        U UUUS9nUR                  5         U R                  R                   H  nUb&  U" U5      (       a  [        UR                  [        '   M,  [        XR5      (       d  XTR                  ;   d  XTR                  ;   a  [        UR                  [        '   Ms  [        UR                  [        '   M     S S S 5        g ! , (       d  f       g = f)N)r/   r'   r0   )rO   r   r   r   r-   r   r   rI   
MODULE_TAGr   META_TAGr*   r5   r8   CONST_MODULE_TAG)r   r/   r'   r0   r   r   s         r%   constant_graph_tagr   ]  s     
	%	%	<	<	>/"7!5	
 	HHNND#/4H4N4N&0		(#<<///+++&6		(#&0		(# # 
?	>	>s   CC33
Dc                   ^ [        XX#5        S[        R                  R                  S[        4S jnU R
                  R                   H6  nUR                  S:X  d  UR                  U=(       d    S;   d  M.  U" U5        M8     [        R                  R                  5       n0 m/ nU R
                  R                   H}  nUR                  [           [        :X  a  M   UR                  UU4S j5      nUTU'   UR                   H2  n	U	R                  [           [        :X  d  M   UR                  U5          M{     M     UR!                  [#        U5      5        UR%                  5         [        R                  R'                  X5      n
U
$ )zf
Construct a GraphModule which corresponds to the part which could be
constant folded in provided gm.
r   r   c                     SnU R                    H"  nUR                  [           [        :X  d  M   Sn  O   U(       d  [        U R                  [        '   U$ )NFT)rp   r   r   r   r   )r   used_to_foldus      r%   untag)run_and_get_constant_graph.<locals>.untag  sH    Avvh#33#  ",DIIhr+   getattrr   c                    > TU    $ r2   r   )xnode_remappings    r%   <lambda>,run_and_get_constant_graph.<locals>.<lambda>  s
    ~a7Hr+   )r   rO   rP   rQ   rm   r   rI   r)   r   Graphr   r   r   	node_copyrp   r   r   tupler   r   )r   r/   r'   r0   r   r   	new_graphoutput_nodesnew_nodeusernew_gmr   s              @r%   run_and_get_constant_graphr   z  s-    
4EHHMM d  77iDII2G2M2$N$K   I9;NL99X*,&&t-HI'tJJDyy"j0##H-   U<()NNXX!!"0FMr+   )NNr2   )TNN)!r6   typingr   r   r   rO   torch.utils._pytreer   _pytreerY   torch._inductor.freezing_utilsr   torch.utils._ordered_setr   rd   rn   r   r   r   rP   r   rQ   r   rK   r&   r   rm   r*   Interpreterr-   r   r   r   r   r+   r%   <module>r      s    * *  $ $ D /yy~~
 
"  (,	',',
((--', u||$', 3-	',
 
',TO
((--O08c0CO	Ou-UXX)) u-t @DHehhmm_d%:;< 
< #15FJ	111 $DI.1 #8UXX]]OT,A#BC	1
 
1> #15FJ	333 $DI.3 #8UXX]]OT,A#BC	3
 XX3r+   