
    Vh,                        d dl Z d dl mZ d dlmZmZmZ d dlZd dlmc m	Z
 ej                  j                  ZdZdZdZddZ G d d	ej"                  j$                        Z	 dd
ej"                  j(                  deeej"                  j*                  gef      fdZd
ej"                  j(                  ddfdZd
ej"                  j(                  dej"                  j(                  fdZy)    N)defaultdict)AnyCallableOptionalMODULE_TYPE_MAIN_MODULE_CONST_MODULEc                    | j                   }|r|}nBt        | d      sd| _        | j                  }	 d| }t        | |      sn|dz  }|dz   | _        |j                  |      5  |j	                  d|di       }|j                  |       |j                  j                  |j                         |j                  |       d d d        | j                  ||       t        | ||       y # 1 sw Y   )xY w)N_frozen_param_countr   _frozen_param   get_attr )graphhasattrr   inserting_beforecreate_nodereplace_all_uses_withmetaupdate
erase_noderegister_buffersetattr)gmnodeconstantnamegqualnameinew_input_nodes           U/home/dcms/DCMS/lib/python3.12/site-packages/torch/_export/passes/constant_folding.pyreplace_node_with_constantr#      s    
Ar01%&B"""&qc*H2x(FA	  "#Q	
		D	! z8RD"">2""499-	T	 x*B(# s   %AC))C2c                       e Zd Z	 ddej                  j
                  def fdZdej                  j                  defdZ	d Z
 fdZd	ej                  defd
Zdej                  j                  d	ej                  ddfdZ fdZ xZS )ConstantFolderr   skip_constructorsc                     t         |   |       i | _        t        j                         | _        t               | _        || _        | j                         | _
        y N)super__init__node_replacementscollectionsCounterreplaced_usesobjectunknown_valuer&   node_to_last_non_output_useuser_to_last_uses)selfr   r&   	__class__s      r"   r*   zConstantFolder.__init__2   sP    
 	;=7B7J7J7L#X'8 "&!A!A!C    r   returnc                    |j                   t        j                  j                  j                  j
                  k(  rt|j                  d   j                  dk(  rX|j                  d   j                  d   j                  t        j                  k(  r!|j                  d   t        j                  k(  ry|j                   t        j                  j                  j                  j
                  t        j                  j                  j                  j
                  t        j                  j                  j                  j                  t        j                  j                   j"                  fv ryy)Nr   r   valr   TF)targettorchopsprimsconvert_element_typedefaultargsopr   dtypeint8bfloat16quantized_decomposeddequantize_per_channeldequantize_per_tensortensor
pt2e_quantdequantize_affine)r3   r   s     r"   	is_impurezConstantFolder.is_impureA   s    KK599????GGG		!:-		!!!%(..%**<		!. ;;II**AAIIII**@@HHII**@@GGII  22	
 
 r5   c                 T   t        j                  t              t               t	        t        t        | j                  j                  j                                    }t        | j                  j                  j                        D ]  j                  dk(  rfd}t        j                  t        j                  j                  |j                   j"                  f       t%        j&                        dk(  sx|j&                  v s   j)                          S )Noutputc                 Z    | v ry j                  |           j                  |        y r(   )addappend)inplast_non_output_user   	seen_usess    r"   add_usez;ConstantFolder.node_to_last_non_output_use.<locals>.add_use_   s-    )#c"#D)005r5   r   )r,   r   listsetnextiterreversedmoduler   nodesr9   pytreetree_map_only_r:   fxNoder?   kwargslenusersrO   )r3   output_noderS   rQ   r   rR   s      @@@r"   r1   z*ConstantFolder.node_to_last_non_output_useV   s    )55d;E	4):):)@)@ ABCT[[..445 	7D{{h&6 !!%((--499dkk:RS 4::!#tzz(A#D)006!	7$ #"r5   c                 >    |j                   dk(  rM 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$                  r-|j                  dk7  rt        d |D              s j                  S t'        |j                   t        j(                  j*                        r<t        j,                  j.                  |j                   j0                  v r j                  S t        
 !  |      }|j                  dk7  rGt'        |t        j2                        r,|j4                  j6                  dk(  r|S  j9                  |      s|S  j;                  |      r j                  S  j=                  ||       t        j                  |j                  i |j>                  }|D ]>  }t'        |t        j                  j
                        s( j@                  |xx   d	z  cc<   @  jB                  jE                  |g       D ]D  }	 j@                  |	   tG        |	jH                        k(  s) jJ                  jM                  |	d        F |S )
NrL   c                 8    j                   j                  | <   y r(   )r0   env)argr3   s    r"   set_envz(ConstantFolder.run_node.<locals>.set_envs   s     $ 2 2r5   c              3      K   | ]6  }t        j                        t        |      k(  xr j                  |k(   8 y wr(   )typer0   ).0input_r3   s     r"   	<genexpr>z*ConstantFolder.run_node.<locals>.<genexpr>   s@      
 ##$V4U9K9Kv9UU
s   <?call_function&triton_kernel_wrapper_functional_proxyr   c              3   P   K   | ]  }t        |t        j                           y wr(   )
isinstancer:   Tensor)rj   es     r"   rl   z*ConstantFolder.run_node.<locals>.<genexpr>   s     N
1ell3Ns   $&r   r   )'r9   r[   r\   r:   r]   r^   r?   r)   run_nodefetch_args_kwargs_from_envarg_tree_leavesanyr0   r@   aten_efficientzerotensorr>   r   r&   rp   _ops
OpOverloadTagnondeterministic_seededtagsrq   deviceri   insertable_tensor_checkrJ   add_node_replacementr_   r.   r2   getr`   ra   r+   pop)r3   r   rg   r?   r_   flattened_inputsoutflattened_node_inpsn	to_deleter4   s   `         r"   rs   zConstantFolder.run_nodeo   s   ;;("3 !!%((--$))D7#D))66t<f!114B6B
  
*
 
 %%% GG&t88@@@%%% GG&		EE%%% "":%N=MNN%%% t{{EJJ$9$9:		11T[[5E5EE%%%gt$77j ZU\\%Bzz&(
//4
~~d#)))%%dC0"("8"8$))"St{{"S( +!!UXX]]3""1%*%	+ "3377bA @	%%i0C	4HH**..y$?@ 
r5   rG   c                      y)NTr   )r3   rG   s     r"   r   z&ConstantFolder.insertable_tensor_check   s    r5   Nc                 "    || j                   |<   y r(   )r+   )r3   r   rG   s      r"   r   z#ConstantFolder.add_node_replacement   s    '-t$r5   c                     i }| j                   j                  j                  d      D ]  }| j                  ||<    t        |   |      S )Nplaceholderr@   )initial_env)rY   r   
find_nodesr0   r)   run)r3   re   r   r4   s      r"   r   zConstantFolder.run   sO    ""---? 	(A''CF	(w{s{++r5   )F)__name__
__module____qualname__r:   r]   GraphModuleboolr*   r^   rJ   r1   rs   rq   r   r   r   __classcell__)r4   s   @r"   r%   r%   1   s     #(DHH  D  Dehhmm  *#2Pdell t . . .QU ., ,r5   r%   r   constraint_fnc                    t         j                  j                  j                         5  t	        | d      }|j                          |j                  j                         D ]  \  }}|	 ||      st        | ||        g }t        t              }| j                  j                  D ]H  }|j                  dk(  s||j                     j                  |j                   j#                                J | j                  j%                  d      D ]k  }|j                  dk(  st'        ||j                           dk(  s/t)        | |j                        rt+        | |j                         |j-                  |       m |D ]  }| j                  j/                  |        | j                  j1                          | j                  j3                          | j5                          d d d        y # 1 sw Y   y xY w)NTr&   r   r   r   )r:   utils_python_dispatch_disable_current_modesr%   r   r+   itemsr#   r   rT   r   rZ   r@   r9   extendra   keysr   r`   r   delattrrO   r   eliminate_dead_codelint	recompile)r   r   cfr   r   erased_paramsget_attr_node_userss          r"   constant_foldr      s    
	%	%	<	<	> $B$7
 2288: 	;ND((t1D&r4:	;
  *$/HHNN 	KDww*$#DKK077

8IJ	K HH'':'6 	+Dww*$-@-M)NRS)S2t{{+B,$$T*		+
 " 	&DHH%	& 	$$&

I$ $ $s    BG,;A&G,"G,>B%G,,G5r6   c                    t         j                  j                  j                         5  t	        | d      }|j                          | j                  j                  D ]\  }|j                  dk(  s||j                  v s||j                  v rt        |j                  t        <   Ft        |j                  t        <   ^ 	 d d d        y # 1 sw Y   y xY w)NTr   r   )r:   r   r   r   r%   r   r   rZ   r@   r+   r.   CONST_MODULE_TAGr   META_TAG
MODULE_TAG)r   r   r   s      r"   constant_graph_tagr      s    		%	%	<	<	> 1B$7
HHNN 	1D:%2///2+++&6		(#&0		(#	1	1 1 1s   BCCc                   	 t        |        | j                  j                  d      D ]M  }d}|j                  D ]   }|j                  t
           t        k(  sd} n |r7t        |j                  t
        <   O 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   FTc                     |    S r(   r   )xnode_remappings    r"   <lambda>z,run_and_get_constant_graph.<locals>.<lambda>#  s    ~a7H r5   )r   r   r   ra   r   r   r   r   r:   r]   GraphrZ   	node_copyrO   rL   tupler   r   )
r   r   used_to_foldu	new_graphoutput_nodesnew_nodeusernew_gmr   s
            @r"   run_and_get_constant_graphr   	  sH    r ##z#2 - 	Avvh#33#	 ",DIIh-  I9;NL 
99X*,&&t-HI'tJJ 	Dyy"j0##H-	
 U<()NNXX!!"i0FMr5   r(   )r,   r   typingr   r   r   r:   torch.utils._pytreer   _pytreer[   r;   rw   r   r   r   r#   r]   Interpreterr%   r   r^   r   r   r   r   r   r5   r"   <module>r      s     # * *  $ $ yy~~
 
" $:Z,UXX)) Z,~ @D((Hehhmm_d%:;<(V1588// 1D 1 &588#7#7 &EHH<P<P &r5   