
    Pi>                        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        j                  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 dS )    N)AnyCallableOptional)maybe_set_is_frozen_param)
OrderedSetMODULE_TYPE_MAIN_MODULE_CONST_MODULEgmnodeconstantnamereturnc                    | j         }|r|}nEt          | d          sd| _        | j        }	 d| }t          | |          sn|dz  }|dz   | _        |                    |          5  ||                    d|di           }n|                    d|di           }|                    |           |j                            |j                   |                    |           |j	        |_	        d d d            n# 1 swxY w Y   |8| 
                    ||           t          | ||           t          |           d S d S )	N_frozen_param_countr   T_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           {/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchao/quantization/pt2e/constant_fold.pyreplace_node_with_constantr&      s    	A 'r011 	'%&B""	*q**H2x(( FA		 "#Q	
		D	!	! 	( 	(]]:xRHHNN ]]=(BKKN"">222""49---	T"i	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 
8X...Hh'''!(+++++ s   'B	C<<D D lifted_constant_namesc                 .    | j         dk    p
| j        |pdv S )Nr   r   )opr   )r   r'   s     r%   is_const_sourcer*   C   s#     7j NDI2G2M2$NN    c                   0    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ej        j                 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 )ConstantFolderFNr   skip_constructorsr'   skip_folding_node_fnr   c                 b   t                                          |           i | _        t          j                    | _        t                      | _        || _        | 	                                | _
        || _        t                      | _        || _        |                                 | _        d S N)super__init__node_replacementscollectionsCounterreplaced_usesobjectunknown_valuer.   node_to_last_non_output_useuser_to_last_usesr'   deferred_valuer/   _find_mutable_buffersmutable_buffers)selfr   r.   r'   r/   	__class__s        r%   r3   zConstantFolder.__init__J   s     	;=7B7J7L7L#XX'8 "&!A!A!C!C%:"$hh$8!  $99;;r+   c                 z   t                      }| j        j        j        D ]}|j        dk    rt          |j        d          rxdt          |j                  v rbt          |j	                  dk    rJt          |j	        d         t          j        j                  r |                    |j	        d                    |S )zsFind 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=   z$ConstantFolder._find_mutable_buffersa   s     %%K%+ 	6 	6D?**DK33 +s4;//// ty>>A%%*TYq\58=*Q*Q%#''	!555r+   c                     dS )NFr   )r?   s    r%   _support_dynamic_shapez%ConstantFolder._support_dynamic_shapep   s    ur+   r   c                    | j         !t                                          |          S | j        |                     |          r| j        S t          j        |j        i |j        }|D ]P}t          |t          j        j                  r/|j        | j         pdvr| j        |         | j        k    r	| j        c S Q| j        S )Nr   )r'   r2   run_noder/   r9   pytreearg_tree_leavesrK   kwargsrL   rM   rN   rO   r   envr<   )r?   r   flattened_node_inpsinpr@   s       r%   _deduce_valuezConstantFolder._deduce_valuet   s    %-77##D))) $0T5N5Nt5T5T0%%$4diO4;OO& 	* 	*C3..*HT%?%E2FFHSMT%888))))""r+   c                    dt           j        j        j        dt          fd} ||          sf|j        t           j        j        j        j	        k    rdt          |j                  dk    rL |t          t          |j                                      r"t          |j        d         | j                  rdS t           j        j        j        j	        t           j        j        j        j	        t           j        j        j        j        t           j        j        j        j        t           j        j        j        g}|j        |v rdS |j        D ]-}t3          |t           j        j                  r|| j        v r dS .dS )Nr   r   c                 R   | j         t          j        j        j        j        k    ot          | j        d         t          j        j	                  oYd| j        d         j
        v oE| j        d         j
        d         j        t          j        k    o| j        d         t          j        k    S )Nr   valr   )rH   rM   opsprimsconvert_element_typedefaultrL   rK   rN   rO   r   dtypeint8bfloat16)r   s    r%   is_woq_int8_patternz5ConstantFolder.is_impure.<locals>.is_woq_int8_pattern   s    uyCKK 3ty|UX];;3TYq\..3 IaL%e,2ej@3 IaLEN2r+   r   r   TF)rM   rN   r   rO   boolrH   r_   atenpermuterb   rJ   usersnextiterr*   rK   r'   quantized_decomposeddequantize_per_channeldequantize_per_tensortensorra   no_fusetorchaodequantize_affinerL   r>   )r?   r   rf   DEQUANT_OPSargs        r%   	is_impurezConstantFolder.is_impure   s`   	ehm&8 	T 	 	 	 	  %%	 uy~5===
OOq((''T$*-=-=(>(>?? ) IaL&
 
 ) 4 I*AII*@HI*@GI*?GI/
 ;+%% 4 9 	 	C#ux}-- #9M2M2Mttur+   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    r$|j        v r                                        S )NoutputrZ   r   c                 t    | v rd S                      |                                         |            d S r1   )rP   append)rZ   last_non_output_user   	seen_usess    r%   add_usez;ConstantFolder.node_to_last_non_output_use.<locals>.add_use   sD    )##Fc"""#D)0055555r+   r   )r5   defaultdictlistr   rM   rN   rO   rk   rl   reversedrF   r   rG   rH   rU   tree_map_only_rK   rW   rJ   rj   rz   )r?   output_noder}   r{   r   r|   s      @@@r%   r:   z*ConstantFolder.node_to_last_non_output_use   s   )5d;;ux}-//	4):)@ A ABBCCT[.455 	7 	7D{h&&6UX] 6t 6 6 6 6 6 6 6 6 !%(-49dk:RSSS 4:!##tz(A(A#D)00666""r+   c                     |j         dk    rddt          j        j        dd f fd}t	          j        t          j        j        ||j                   t                                          |          S  	                    |          \  }}t	          j
        |i |}t           fd|D                       r j        S |j        dk    r!|j         t          j        j        k    r j        S |j        dk    r|j        dk    r j        S  j        r5t'          | j                  s t          d |D                       s j        S t+          |j         t          j        j                  r$t          j        j        |j         j        v r j        S |j        dk    r+t+          |j         t          j        j                  r j        S                      |          }t+          |t          j        j                  r|S | j        k    r j        S t'          | j                  s=t+          |t          j                  s| j         k    r| j         k    r|j!        j"        d	k    r|S  #                    |          s|S  $                    |          r j        S  %                    ||           t	          j
        |j        i |j&        }|D ]7}t+          |t          j        j                  s" j'        |xx         d
z  cc<   8 j(        )                    |g           D ]@}	 j'        |	         tU          |	j+                  k    r j,        -                    |	d            A|S )Nrx   ru   r   c                 &    j         j        | <   d S r1   )r9   rX   )ru   r?   s    r%   set_envz(ConstantFolder.run_node.<locals>.set_env   s     $ 2r+   c              3   x   K   | ]4}t          j                  t          |          k    o
j        |k    V  5d S r1   )typer9   ).0input_r?   s     r%   	<genexpr>z*ConstantFolder.run_node.<locals>.<genexpr>   sZ       
 
 #$$V4U9Kv9U
 
 
 
 
 
r+   rB   &triton_kernel_wrapper_functional_proxyc              3   J   K   | ]}t          |t          j                  V  d S r1   )rL   rM   Tensor)r   es     r%   r   z*ConstantFolder.run_node.<locals>.<genexpr>   s.      NN
1el33NNNNNNr+   r   r   ).rH   rM   rN   rO   rU   r   rK   r2   rT   fetch_args_kwargs_from_envrV   anyr9   r)   rh   _efficientzerotensorrb   r   r.   r*   r'   rL   _ops
OpOverloadTagnondeterministic_seededtagsHigherOrderOperatorr[   _CScriptObjectr   r<   devicer   insertable_tensor_checkrv   add_node_replacementrW   r7   r;   getrJ   rj   r4   pop)r?   r   r   rK   rW   flattened_inputsoutrY   n	to_deleter@   s   `         r%   rT   zConstantFolder.run_node   s   ;(""3UX] 3t 3 3 3 3 3 3 !%(-$)DDD77##D)))66t<<f!14B6BB
  
 
 
 
*
 
 
 
 
 	& %% G&&t8@@@%% G&&	EEE%% "	&#D$*DEE	& NN=MNNNNN	&
 %% t{EJ$9::	&	1T[5EEE%%7o%%*K7+
 +
% %%  &&c58011 	J$$$$%%tT%?@@ 	@sEL))	@-0D4G-G-Gd)))cjo.G.G
//44 
~~d## *))%%dC000"("8$)"St{"S"S( + +!!UX]33 "1%%%*%%%%!377bAA @ @	%i0C	4H4HHH*..y$???
r+   rp   c                     dS )NTr   )r?   rp   s     r%   r   z&ConstantFolder.insertable_tensor_check,  s    tr+   c                     || j         |<   d S r1   )r4   )r?   r   rp   s      r%   r   z#ConstantFolder.add_node_replacement/  s    '-t$$$r+   c                 v    i }|                      |           t                                          |          S )N)initial_env)insert_placerholder_valuesr2   run)r?   rX   r@   s     r%   r   zConstantFolder.run2  s4    (*'',,,ww{{s{+++r+   rX   c                     | j         j                            d          D ]}| j        ||<   | j        d S | j         j        j        D ]}|j        | j        pdv r
| j        ||<   d S )Nr   r)   r   )rF   r   
find_nodesr9   r'   rG   r   r<   )r?   rX   r   s      r%   r   z)ConstantFolder.insert_placerholder_values7  s    "---?? 	( 	(A'CFF%-F"( 	- 	-Av$4:;;,A	- 	-r+   )FNN)__name__
__module____qualname__rM   rN   GraphModulerg   r   r   rI   r   rO   r3   rE   r=   rR   r   r[   r   rv   dictr:   rT   r   r   r   r   r   __classcell__)r@   s   @r%   r-   r-   I   sM        #(59JN< <H <  <  (S	2	<
 'x0E'FG< 
< < < < < <.s58='9        #%(- #C # # # # # #"-ehm0 -T - - - -^#T%(-ehmAT2T-U # # # #2]UX] ]s ] ] ] ] ] ]~el t    . . .QU . . . .,S , , , , , ,
-d58=#3E.F -4 - - - - - - - -r+   r-   constraint_fnc                    t           j        j                                        5  t	          | d          }|                                 |j                                        D ]$\  }}| ||          st          | ||           %g }| j	        
                    d          D ]Y}t          |j                  dk    r?t          | |j                  rt          | |j                   |                    |           Z|D ]}| j	                            |           | j	                                         | j	                                         |                                  d d d            d S # 1 swxY w Y   d S )NT)r.   r   r   r   )rM   utils_python_dispatch_disable_current_modesr-   r   r4   itemsr&   r   r   rJ   rj   r   rH   delattrrz   r   eliminate_dead_codelint	recompile)r   r   cfr   r   erased_paramss         r%   constant_foldr   A  s    
	%	<	<	>	>  B$777
 288:: 	; 	;ND((t1D1D(&r4::::H'':'66 	+ 	+D4:!##2t{++ -B,,,$$T***! 	& 	&DH%%%%
$$&&&

+                 s   E E11E58E5Tr.   r/   c                    t           j        j                                        5  t	          | |||          }|                                 | j        j        D ]o}|  ||          rt          |j	        t          <   $t          ||          s||j        v s	||j        v rt          |j	        t          <   [t          |j	        t          <   p	 d d d            d S # 1 swxY w Y   d S )N)r.   r'   r/   )rM   r   r   r   r-   r   r   rG   
MODULE_TAGr   META_TAGr*   r4   r7   CONST_MODULE_TAG)r   r.   r'   r/   r   r   s         r%   constant_graph_tagr   ]  s9    
	%	<	<	>	> 1 1/"7!5	
 
 
 	HN 	1 	1D#/4H4H4N4N/&0	(#&;<<12///2+++&6	(##&0	(##	11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s   B$CCCc                    t          | |||           dt          j        j        dt          fd}| j        j        D ]#}|j        dk    s|j        |pdv r ||           $t          j        	                                }i g }| j        j        D ]x}|j
        t                   t          k    r|                    |fd          }||<   |j        D ]4}	|	j
        t                   t          k    r|                    |            n5y|                    t#          |                     |                                 t          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    rd} n"|st          | j        t          <   |S )NFT)rj   r   r   r   r   )r   used_to_foldus      r%   untagz)run_and_get_constant_graph.<locals>.untag  sV     	 	Avh#333# 4  	-",DIhr+   getattrr   c                     |          S r1   r   )xnode_remappings    r%   <lambda>z,run_and_get_constant_graph.<locals>.<lambda>  s    ~a7H r+   )r   rM   rN   rO   rg   r   rG   r)   r   Graphr   r   r   	node_copyrj   rz   rx   tupler   r   )r   r.   r'   r/   r   r   	new_graphoutput_nodesnew_nodeusernew_gmr   s              @r%   run_and_get_constant_graphr   z  s    
46J  EHM d       7iDI2G2M2$N$NE$KKK  I9;NL 
 
9X*,,&&t-H-H-H-HII'tJ 	 	Dy"j00##H--- 1 U<(()))NNX!!"i00FMr+   )NNr1   )TNN)!r5   typingr   r   r   rM   torch.utils._pytreer   _pytreerU   torch._inductor.freezing_utilsr   torch.utils._ordered_setr   r_   rh   r   r   r   rN   r   rO   r   rI   r&   r   rg   r*   Interpreterr-   r   r   r   r   r+   r%   <module>r      s       * * * * * * * * * *  $ $ $ $ $ $ $ $ $ D D D D D D / / / / / /y~
 
"  (,	', ',',
(-', u|$', 3-	',
 
', ', ', ',TO
(-O08c0CO	O O O Ou- u- u- u- u-UX) u- u- u-t @D Hehm_d%:;< 
   < #15FJ	1 111 $DI.1 #8UX]OT,A#BC	1
 
1 1 1 1> #15FJ	3 333 $DI.3 #8UX]OT,A#BC	3
 X3 3 3 3 3 3r+   