o
    Zh9                     @   s  d dl Z d dlmZmZmZ d dlZd dlm  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dZd	ejjdeee  defddZG dd dejjZ	ddejjdeeejjgef  ddfd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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dZ dS )!    N)AnyCallableOptional)maybe_set_is_frozen_param)
OrderedSetZMODULE_TYPEZ_MAIN_MODULEZ_CONST_MODULEgmnodeconstantnamereturnc                 C   s   | j }|r|}n!t| dsd| _| j}	 d| }t| |sn|d7 }q|d | _||2 |d ur<|d|di }n|d|di }|| |j|j || |j	|_	W d    n1 scw   Y  |d ur~| 
|| t| || t| d S d S )	N_frozen_param_countr   TZ_frozen_param   get_attr placeholder)graphhasattrr   Zinserting_beforeZcreate_nodeZreplace_all_uses_withmetaupdate
erase_noder
   Zregister_buffersetattrr   )r   r   r	   r
   gqualnameiZnew_input_noder   r   O/var/www/auris/lib/python3.10/site-packages/torch/_inductor/constant_folding.pyreplace_node_with_constant   s6   






r   lifted_constant_namesc                 C   s   | j dkp| j|p
dv S )Nr   r   )opr
   )r   r   r   r   r   is_const_source>   s   r   c                       s4  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d	Zdefd
dZdejjdef fddZdejjjdefddZdeejjeejj f fddZdejjdef fddZdejdefddZdejjdejddfddZdef fddZdeejjef ddfddZ  ZS ) ConstantFolderFNr   skip_constructorsr   skip_folding_node_fnr   c                    sL   t  | i | _t | _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!   )selfr   r    r   r!   	__class__r   r   r$   E   s   


zConstantFolder.__init__c                 C      dS )NFr   r.   r   r   r   _support_dynamic_shapeY   s   z%ConstantFolder._support_dynamic_shaper   c                    s   | j d u rt |S | jd ur| |r| jS tj|ji |j}|D ]}t	|t
jjrB|j| j p3dvrB| j| | jkrB| j  S q$| jS )Nr   )r   r#   run_noder!   r*   pytreearg_tree_leavesargskwargs
isinstancetorchfxNoder
   envr-   )r.   r   flattened_node_inpsinpr/   r   r   _deduce_value]   s   

zConstantFolder._deduce_valuec                 C   s   dt jjjdtfdd}||s)|jt jjjj	kr4t
|jdkr4|tt|jr4t|jd | jr4dS 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[dS d	S )
Nr   r   c                 S   s^   | j tjjjjko.t| jd tjj	o.d| jd j
v o.| jd j
d jtjko.| jd tjkS )Nr   valr   )targetr:   opsZprimsconvert_element_typedefaultr9   r7   r;   r<   r   ZdtypeZint8Zbfloat16)r   r   r   r   is_woq_int8_patterno   s   z5ConstantFolder.is_impure.<locals>.is_woq_int8_patternr   r   Tdequantize_per_channelF)r:   r;   r   r<   boolrB   rC   atenZpermuterE   lenusersnextiterr   r7   r   getattrZquantized_decomposedrG   Zdequantize_per_tensortensorrD   Zno_fuse)r.   r   rF   Zquant_registeredr   r   r   	is_impuren   s2   
	



	zConstantFolder.is_impurec                    s   t t ttjj  ttt	| j
jj}t	| j
jjD ]7jdkr&qdtjjdd f fdd}ttjj|jjf tjdkrU|jv rU   q S )Noutputr?   r   c                    s(   | v rd S  |    |  d S r"   )addappend)r?   Zlast_non_output_user   Z	seen_usesr   r   add_use   s   
z;ConstantFolder.node_to_last_non_output_use.<locals>.add_user   )r&   defaultdictlistr   r:   r;   r<   rL   rM   reversedmoduler   nodesrB   r5   tree_map_only_r7   r8   rJ   rK   rS   )r.   Zoutput_noderU   r   rT   r   r+      s   

z*ConstantFolder.node_to_last_non_output_usec           
         s&  |j dkr"dtjjdd f fdd}ttjj||j t |S  	|\}}tj
|i |}t fdd|D r? jS |jdkrN|j tjjkrN jS |jdkr[|jd	kr[ jS  jrpt| jsptd
d |D sp jS t|j tjjrtjj|j jv r jS |jdkrt|j tjjr j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 ]}t|tjjsq j%|  d7  < q j&'|g D ]}	 j%|	 t(|	j)kr j*+|	d  q|S )NrQ   argr   c                    s    j  j| < d S r"   )r*   r=   )r\   r2   r   r   set_env   s   z(ConstantFolder.run_node.<locals>.set_envc                 3   s,    | ]}t  jt |ko j|kV  qd S r"   )typer*   ).0Zinput_r2   r   r   	<genexpr>   s
    
z*ConstantFolder.run_node.<locals>.<genexpr>Zcall_functionZ&triton_kernel_wrapper_functional_proxyc                 s   s    | ]	}t |tjV  qd S r"   )r9   r:   Tensor)r_   er   r   r   r`      s    r   r   ),rB   r:   r;   r<   r5   r[   r7   r#   r4   Zfetch_args_kwargs_from_envr6   anyr*   r   rI   Z_efficientzerotensorrE   r
   r    r   r   r9   Z_opsZ
OpOverloadTagZnondeterministic_seededtagsZHigherOrderOperatorr@   ra   r-   Zdevicer^   insertable_tensor_checkrP   add_node_replacementr8   r(   r,   getrJ   rK   r%   pop)
r.   r   r]   r7   r8   Zflattened_inputsoutr>   nZ	to_deleter/   r2   r   r4      sn   










zConstantFolder.run_noderO   c                 C   r1   )NTr   )r.   rO   r   r   r   rf     s   z&ConstantFolder.insertable_tensor_checkc                 C   s   || j |< d S r"   )r%   )r.   r   rO   r   r   r   rg     s   z#ConstantFolder.add_node_replacementc                    s   i }|  | t j|dS )N)Zinitial_env)insert_placerholder_valuesr#   run)r.   r=   r/   r   r   rm     s   
zConstantFolder.runr=   c                 C   s\   | j jjddD ]}| j||< q| jd u rd S | j jjD ]}|j| jp$dv r+| j||< qd S )Nr   r   r   )rY   r   
find_nodesr*   r   rZ   r
   r-   )r.   r=   rk   r   r   r   rl     s   

z)ConstantFolder.insert_placerholder_values)FNN)__name__
__module____qualname__r:   r;   GraphModulerH   r   rW   strr   r<   r$   r3   r   r@   r   rP   dictr+   r4   ra   rf   rg   rm   rl   __classcell__r   r   r/   r   r   D   s0    
")[&r   constraint_fnc                 C   s   t jj i t| dd}|  |j D ]\}}|d ur#||s#qt| || qg }| j	j
ddD ]}t|jdkrMt| |jrHt| |j || q3|D ]}| j	| qP| j	  | j	  |   W d    d S 1 srw   Y  d S )NT)r    r   rn   r   )r:   utils_python_dispatch_disable_current_modesr   rm   r%   itemsr   r   ro   rJ   rK   r   rB   delattrrS   r   Zeliminate_dead_codelintZ	recompile)r   rw   cfr   r	   Zerased_paramsr   r   r   constant_fold   s(   



"r   Tr    r!   c                 C   s   t jj D t| |||d}|  | jjD ]*}|d ur'||r't|j	t
< qt||s6||jv s6||jv r<t|j	t
< qt|j	t
< qW d    d S 1 sMw   Y  d S )N)r    r   r!   )r:   rx   ry   rz   r   rm   r   rZ   
MODULE_TAGr   META_TAGr   r%   r(   CONST_MODULE_TAG)r   r    r   r!   r~   r   r   r   r   constant_graph_tag<  s(   


"r   c                    s   t | ||| dtjjdtfdd}| jjD ]}|jdks$|j|p"dv r(|| qtj	 }i  g }| jjD ],}|j
t tkr@q6|| fdd}| |< |jD ]}	|	j
t tkra||  nqQq6|t| |  tj| |}
|
S )	zr
    Construct a GraphModule which corresponds to the part which could be
    constant folded in provided gm.
    r   r   c                 S   s8   d}| j D ]}|jt tkrd} nq|st| jt< |S )NFT)rK   r   r   r   r   )r   Zused_to_foldur   r   r   untagh  s   

z)run_and_get_constant_graph.<locals>.untagrN   r   c                    s    |  S r"   r   )xZnode_remappingr   r   <lambda>  s    z,run_and_get_constant_graph.<locals>.<lambda>)r   r:   r;   r<   rH   r   rZ   r   r
   ZGraphr   r   r   Z	node_copyrK   rS   rQ   tupler}   rs   )r   r    r   r!   r   r   Z	new_graphZoutput_nodesnew_nodeuserZnew_gmr   r   r   run_and_get_constant_graphY  s4   


r   )NNr"   )TNN)!r&   typingr   r   r   r:   Ztorch.utils._pytreerx   Z_pytreer5   Ztorch._inductor.freezing_utilsr   Ztorch.utils._ordered_setr   rC   rI   r   r   r   r;   rs   r<   ra   rt   r   rW   rH   r   ZInterpreterr   r   r   r   r   r   r   r   <module>   s    
*

 _



