
    Vh9                     h   d dl Z d dlmZmZmZ d dlZd dlmc mZ	 d dl
mZ d dlmZ ej                  j                  ZdZdZdZ	 	 ddej&                  j(                  d	ej&                  j*                  d
eej,                     dee   ddf
dZd	ej&                  j*                  deee      defdZ G d dej&                  j8                        Z	 ddej&                  j(                  deeej&                  j*                  gef      ddfdZ	 	 	 ddej&                  j(                  dedeee      deeej&                  j*                  gef      ddf
dZ	 	 	 ddej&                  j(                  dedeee      deeej&                  j*                  gef      dej&                  j(                  f
dZ y)    N)AnyCallableOptional)maybe_set_is_frozen_param)
OrderedSetMODULE_TYPE_MAIN_MODULE_CONST_MODULEgmnodeconstantnamereturnc                 V   | j                   }|r|}nBt        | d      sd| _        | j                  }	 d| }t        | |      sn|dz  }|dz   | _        |j                  |      5  ||j	                  d|di       }n|j	                  d|di       }|j                  |       |j                  j                  |j                         |j                  |       |j                  |_	        d d d        |+| j                  ||       t        | ||       t        |       y y # 1 sw Y   7xY w)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           P/home/dcms/DCMS/lib/python3.12/site-packages/torch/_inductor/constant_folding.pyreplace_node_with_constantr&      s-    	Ar01%&B"""&qc*H2x(FA	  "#Q	
		D	! 	(]]:xRHN ]]=(BKN"">2""499-	T"ii	( 
8X.Hh'!(+ 	( 	(s   %BDD(lifted_constant_namesc                 H    | j                   dk(  xs | j                  |xs dv S )Nr   r   )opr   )r   r'   s     r%   is_const_sourcer*   >   s'     77j NDII2G2M2$NN    c                       e Zd Z	 	 	 ddej                  j
                  dedeee	      dee
ej                  j                  gef      ddf
 fdZdefdZd	ej                  j                  def fd
Zd	ej                  j                   j                  defdZdeej                  j                  eej                  j                     f   fdZd	ej                  j                  def fdZdej*                  defdZd	ej                  j                  dej*                  ddfdZdef fdZdeej                  j                  ef   ddfdZ xZS )ConstantFolderNr   skip_constructorsr'   skip_folding_node_fnr   c                     t         |   |       i | _        t        j                         | _        t               | _        || _        | j                         | _
        || _        t               | _        || _        y N)super__init__node_replacementscollectionsCounterreplaced_usesobjectunknown_valuer.   node_to_last_non_output_useuser_to_last_usesr'   deferred_valuer/   )selfr   r.   r'   r/   	__class__s        r%   r3   zConstantFolder.__init__E   sj     	;=7B7J7J7L#X'8 "&!A!A!C%:"$h$8!r+   c                      y)NFr   )r=   s    r%   _support_dynamic_shapez%ConstantFolder._support_dynamic_shapeY   s    r+   r   c                    | j                   t        | 	  |      S | j                  | j                  |      r| j                  S t        j                  |j                  i |j                  }|D ]n  }t        |t        j                  j                        s(|j                  | j                   xs dvsE| j                  |   | j                  k7  sb| j                  c S  | j                  S )Nr   )r'   r2   run_noder/   r9   pytreearg_tree_leavesargskwargs
isinstancetorchfxNoder   envr<   )r=   r   flattened_node_inpsinpr>   s       r%   _deduce_valuezConstantFolder._deduce_value]   s    %%-7#D)) $$0T5N5Nt5T%%%$44diiO4;;O& 	*C3.HHT%?%?%E2FHHSMT%8%88)))	* """r+   c                 ~   dt         j                  j                  j                  dt        fd} ||      sw|j
                  t         j                  j                  j                  j                  k(  r`t        |j                        dk(  rH |t        t        |j                                    r$t        |j                  d   | j                         ryt#        t         j                  j$                  dd       d u}|r|j
                  t         j                  j$                  j&                  j                  t         j                  j$                  j(                  j                  t         j                  j$                  j(                  j*                  t         j                  j$                  j,                  j.                  fv ryy)	Nr   r   c                    | j                   t        j                  j                  j                  j
                  k(  xr t        | j                  d   t        j                  j                        xrv d| j                  d   j                  v xrY | j                  d   j                  d   j                  t        j                  k(  xr  | j                  d   t        j                  k(  S )Nr   valr   )targetrH   opsprimsconvert_element_typedefaultrG   rE   rI   rJ   r   dtypeint8bfloat16)r   s    r%   is_woq_int8_patternz5ConstantFolder.is_impure.<locals>.is_woq_int8_patterno   s    uyyCCKKK 3tyy|UXX]];3TYYq\...3 IIaL%%e,22ejj@3 IIaLENN2r+   r   r   Tdequantize_per_channelF)rH   rI   r   rJ   boolrR   rS   atenpermuterV   lenusersnextiterr*   rE   r'   getattrquantized_decomposedr[   dequantize_per_tensortensorrU   no_fuse)r=   r   rZ   quant_registereds       r%   	is_impurezConstantFolder.is_impuren   s;   	ehhmm&8&8 	T 	  %uyy~~55===

Oq('T$**-=(>?IIaL&&
  EII224LdS 	 II**AAIIII**@@HHII**@@GGII**??GG	0
 !
 r+   c                    t        j                  t              t        t        j
                  j                            t        t        t        | j                  j                  j                                    }t        | j                  j                  j                        D ]  j                  dk(  rdt        j
                  j                  dd ffd}t        j                  t        j
                  j                  |j                   j"                  f       t%        j&                        dk(  s|j&                  v s   j)                          S )NoutputrM   r   c                 Z    | v ry j                  |           j                  |        y r1   )addappend)rM   last_non_output_user   	seen_usess    r%   add_usez;ConstantFolder.node_to_last_non_output_use.<locals>.add_use   s-    )#c"#D)005r+   r   )r5   defaultdictlistr   rH   rI   rJ   ra   rb   reversedmoduler   nodesrR   rC   tree_map_only_rE   rF   r_   r`   rn   )r=   output_noderq   ro   r   rp   s      @@@r%   r:   z*ConstantFolder.node_to_last_non_output_use   s    )55d;uxx}}-/	4):):)@)@ ABCT[[..445 	7D{{h&6UXX]] 6t 6 !!%((--499dkk:RS 4::!#tzz(A#D)006!	7$ #"r+   c                     |j                   dk(  rjdt        j                  j                  dd f fd}t	        j
                  t        j                  j                  ||j                         t        
 !  |      S  j                  |      \  }}t	        j                  |i |}t         fd|D              r j                  S |j                  dk(  r3|j                   t        j                  j                   k(  r j                  S |j                  dk(  r|j"                  dk(  r j                  S  j$                  r4t'        | j(                        st        d |D              s j                  S t+        |j                   t        j,                  j.                        r<t        j0                  j2                  |j                   j4                  v r j                  S |j                  dk(  r:t+        |j                   t        j,                  j6                        r j                  S  j9                  |      }| j                  k(  r j                  S t'        | j(                        set+        |t        j:                        s| j<                  k(  r;| j<                  k7  r|j>                  j@                  d	k(  r|S  jC                  |      s|S  jE                  |      r j                  S  jG                  ||       t	        j                  |j                  i |jH                  }|D ]>  }t+        |t        j                  j                        s( jJ                  |xx   d
z  cc<   @  jL                  jO                  |g       D ]D  }	 jJ                  |	   tQ        |	jR                        k(  s) jT                  jW                  |	d        F |S )Nrk   argr   c                 8    j                   j                  | <   y r1   )r9   rK   )rz   r=   s    r%   set_envz(ConstantFolder.run_node.<locals>.set_env   s     $ 2 2r+   c              3      K   | ]6  }t        j                        t        |      k(  xr j                  |k(   8 y wr1   )typer9   ).0input_r=   s     r%   	<genexpr>z*ConstantFolder.run_node.<locals>.<genexpr>   s@      
 ##$V4U9K9Kv9UU
s   <?call_function&triton_kernel_wrapper_functional_proxyc              3   P   K   | ]  }t        |t        j                           y wr1   )rG   rH   Tensor)r   es     r%   r   z*ConstantFolder.run_node.<locals>.<genexpr>   s     N
1ell3Ns   $&r   r   ),rR   rH   rI   rJ   rC   rw   rE   r2   rB   fetch_args_kwargs_from_envrD   anyr9   r)   r]   _efficientzerotensorrV   r   r.   r*   r'   rG   _ops
OpOverloadTagnondeterministic_seededtagsHigherOrderOperatorrN   r   r<   devicer~   insertable_tensor_checkri   add_node_replacementrF   r7   r;   getr_   r`   r4   pop)r=   r   r|   rE   rF   flattened_inputsoutrL   n	to_deleter>   s   `         r%   rB   zConstantFolder.run_node   s   ;;("3UXX]] 3t 3 !!%((--$))D7#D))66t<f!114B6B
  
*
 
 %%% GG&t88@@@%%% GG&		EE%%% ""#D$*D*DEN=MNN%%% t{{EJJ$9$9:		11T[[5E5EE%%%77o%*KK77+
 %%%  &$$$$%%%tT%?%?@sELL)SD4G4G-Gd)))cjjoo.G
//4
~~d#)))%%dC0"("8"8$))"St{{"S( +!!UXX]]3""1%*%	+ "3377bA @	%%i0C	4HH**..y$?@ 
r+   rf   c                      y)NTr   )r=   rf   s     r%   r   z&ConstantFolder.insertable_tensor_check  s    r+   c                 "    || j                   |<   y r1   )r4   )r=   r   rf   s      r%   r   z#ConstantFolder.add_node_replacement  s    '-t$r+   c                 J    i }| j                  |       t        | 	  |      S )N)initial_env)insert_placerholder_valuesr2   run)r=   rK   r>   s     r%   r   zConstantFolder.run  s'    (*'',w{s{++r+   rK   c                 4   | j                   j                  j                  d      D ]  }| j                  ||<    | j                  y | j                   j                  j
                  D ].  }|j                  | j                  xs dv s | j                  ||<   0 y )Nr   r)   r   )ru   r   
find_nodesr9   r'   rv   r   r<   )r=   rK   r   s      r%   r   z)ConstantFolder.insert_placerholder_values  s    ""---? 	(A''CF	(%%-""(( 	-Avv$44:;,,A	-r+   )FNN)__name__
__module____qualname__rH   rI   GraphModuler\   r   rs   strr   rJ   r3   r@   r   rN   r   ri   dictr:   rB   r   r   r   r   r   __classcell__)r>   s   @r%   r-   r-   D   sq    #(59JN9HH  9  9  (S	2	9
 'x0E'FG9 
9( #%((-- #C #"'ehhmm00 'T 'R#T%((--ehhmmAT2T-U #2YUXX]] Ys Yvell t . . .QU .,S ,
-d588==#3E.F -4 -r+   r-   constraint_fnc                    t         j                  j                  j                         5  t	        | d      }|j                          |j                  j                         D ]  \  }}|	 ||      st        | ||        g }| j                  j                  d      D ]X  }t        |j                        dk(  st        | |j                        rt        | |j                         |j!                  |       Z |D ]  }| j                  j#                  |        | j                  j%                          | j                  j'                          | j)                          d d d        y # 1 sw Y   y xY w)NT)r.   r   r   r   )rH   utils_python_dispatch_disable_current_modesr-   r   r4   itemsr&   r   r   r_   r`   r   rR   delattrrn   r   eliminate_dead_codelint	recompile)r   r   cfr   r   erased_paramss         r%   constant_foldr      s/    
	%	%	<	<	> B$7
 2288: 	;ND((t1D&r4:	;
 HH'':'6 	+D4::!#2t{{+B,$$T*		+ " 	&DHH%	& 	$$&

+  s   BE);B%E))E2r.   r/   c                    t         j                  j                  j                         5  t	        | |||      }|j                          | j                  j                  D ]{  }|  ||      rt        |j                  t        <   %t        ||      s||j                  v s||j                  v rt        |j                  t        <   et        |j                  t        <   } 	 d d d        y # 1 sw Y   y xY w)N)r.   r'   r/   )rH   r   r   r   r-   r   r   rv   
MODULE_TAGr   META_TAGr*   r4   r7   CONST_MODULE_TAG)r   r.   r'   r/   r   r   s         r%   constant_graph_tagr   <  s     
	%	%	<	<	> 1/"7!5	
 	HHNN 	1D#/4H4N&0		(#&;<2///2+++&6		(#&0		(#	11 1 1s   B4C''C0c                    t        | |||       dt        j                  j                  dt        fd}| j
                  j                  D ],  }|j                  dk(  s|j                  |xs dv s% ||       . t        j                  j                         }i g }| j
                  j                  D ]u  }|j                  t           t        k(  r|j                  |fd      }||<   |j                  D ]/  }	|	j                  t           t        k(  s|j                  |        u w |j!                  t#        |             |j%                          t        j                  j'                  | |      }
|
S )zr
    Construct a GraphModule which corresponds to the part which could be
    constant folded in provided gm.
    r   r   c                     d}| j                   D ]   }|j                  t           t        k(  sd} n |st        | j                  t        <   |S )NFT)r`   r   r   r   r   )r   used_to_foldus      r%   untagz)run_and_get_constant_graph.<locals>.untagh  sM     	Avvh#33#	 ",DIIhr+   rc   r   c                     |    S r1   r   )xnode_remappings    r%   <lambda>z,run_and_get_constant_graph.<locals>.<lambda>  s    ~a7H r+   )r   rH   rI   rJ   r\   r   rv   r)   r   Graphr   r   r   	node_copyr`   rn   rk   tupler   r   )r   r.   r'   r/   r   r   	new_graphoutput_nodesnew_nodeusernew_gmr   s              @r%   run_and_get_constant_graphr   Y  sD    
46JEHHMM d   77iDII2G2M2$N$K  I9;NL 
99X*,&&t-HI'tJJ 	Dyy"j0##H-	
 U<()NNXX!!"i0FMr+   )NNr1   )TNN)!r5   typingr   r   r   rH   torch.utils._pytreer   _pytreerC   torch._inductor.freezing_utilsr   torch.utils._ordered_setr   rS   r]   r   r   r   rI   r   rJ   r   r   r&   rs   r\   r*   Interpreterr-   r   r   r   r   r+   r%   <module>r      s    * *  $ $ D / yy~~
 
"  (,	',',
((--', u||$', 3-	',
 
',TO
((--O08c0CO	OY-UXX)) Y-| @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+   