U
    zh%                     @   s   d dl Z d dlmZmZmZmZ d dlZd dlm  m	Z
 ejjZdZdZdZdddZG dd	 d	ejjZejj deeejjgef  d
ddZejj ejjdddZejjejjdddZdS )    N)AnyCallableDictOptionalZMODULE_TYPEZ_MAIN_MODULEZ_CONST_MODULEc              	   C   s   | j }|r|}n@t| ds d| _| j}d| }t| |s<qF|d7 }q&|d | _||8 |d|di }|| |j|j || W 5 Q R X | 	|| t
| || d S )N_frozen_param_countr   Z_frozen_param   get_attr )graphhasattrr   Zinserting_beforeZcreate_nodeZreplace_all_uses_withmetaupdate
erase_nodeZregister_buffersetattr)gmnodeconstantnamegqualnameiZnew_input_noder	   r	   R/var/www/html/venv/lib/python3.8/site-packages/torch/_inductor/constant_folding.pyreplace_node_with_constant   s$    





r   c                       s|   e Zd Zd fdd	ZejjjdddZdd Z	 fd	d
Z
ejedddZejjejddddZ fddZ  ZS )ConstantFolderFc                    s8   t  | i | _t | _t | _|| _| 	 | _
d S N)super__init__node_replacementscollectionsCounterreplaced_usesobjectunknown_valueskip_constructorsnode_to_last_non_output_useuser_to_last_uses)selfr   r#   	__class__r	   r   r   0   s    
zConstantFolder.__init__)r   c                 C   s~   |j tjjjjkrN|jd jdkrN|jd jd j	tj
krN|jd tjkrNdS |j tjjjjtjjjjtjjjjfkrzdS dS )Nr   r   valr   TF)targettorchopsZprimsZconvert_element_typedefaultargsopr   ZdtypeZint8Zbfloat16Zquantized_decomposedZdequantize_per_channelZdequantize_per_tensortensor)r&   r   r	   r	   r   	is_impure?   s     


zConstantFolder.is_impurec                    s   t t t ttt| jjj	}t| jjj	D ]`j
dkrDq4 fdd}ttjj|jjf tjdkr4|jkr4   q4 S )Noutputc                    s(   | krd S  |    |  d S r   )addappend)Zinp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listsetnextiterreversedmoduler
   nodesr*   pytreetree_map_only_r+   fxNoder.   kwargslenusersr4   )r&   Zoutput_noder6   r	   r5   r   r$   S   s    

z*ConstantFolder.node_to_last_non_output_usec           
         s  |j dkr6 fdd}ttjj||j t |S  	|\}}tj
||}t fdd|D rl 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r|jdkrtd	d |D s̈ jS t|j tjjrtjj|j jkr jS t |}|jdkrt|tjr|jjd
kr*|S  |s:|S  |rL jS  || tj
|j|j}|D ],}t|tjjsql j |  d7  < ql j!"|g D ]*}	 j |	 t#|	j$kr j%&|	d  q|S )Nr2   c                    s    j  j| < d S r   )r"   env)argr&   r	   r   set_envp   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_rH   r	   r   	<genexpr>}   s   z*ConstantFolder.run_node.<locals>.<genexpr>Zcall_functionZ&triton_kernel_wrapper_functional_proxyr   c                 s   s   | ]}t |tjV  qd S r   )
isinstancer+   Tensor)rK   er	   r	   r   rL      s     r   r   )'r*   r?   r@   r+   rA   rB   r.   r   run_nodeZfetch_args_kwargs_from_envZarg_tree_leavesanyr"   r/   atenZ_efficientzerotensorr-   r   r#   rM   Z_opsZ
OpOverloadTagZnondeterministic_seededtagsrN   ZdevicerJ   insertable_tensor_checkr1   add_node_replacementrC   r    r%   getrD   rE   r   pop)
r&   r   rI   r.   rC   Zflattened_inputsoutZflattened_node_inpsnZ	to_deleter'   rH   r   rP   l   sd    
zConstantFolder.run_node)r0   returnc                 C   s   dS )NTr	   )r&   r0   r	   r	   r   rU      s    z&ConstantFolder.insertable_tensor_checkN)r   r0   r[   c                 C   s   || j |< d S r   )r   )r&   r   r0   r	   r	   r   rV      s    z#ConstantFolder.add_node_replacementc                    s2   i }| j jjddD ]}| j||< qt j|dS )Nplaceholderr/   )Zinitial_env)r=   r
   
find_nodesr"   r   run)r&   rF   rZ   r'   r	   r   r_      s    zConstantFolder.run)F)__name__
__module____qualname__r   r+   rA   r   rB   r1   r$   rP   rN   boolrU   rV   r_   __classcell__r	   r	   r'   r   r   /   s    Rr   )constraint_fnc                 C   s   t | dd}|  |j D ]&\}}|d k	r8||s8qt| || qg }| jjddD ]4}t|jdkrXt	| |j
rt| |j
 || qX|D ]}| j| q| j  | j  |   d S )NTr#   r   r]   r   )r   r_   r   itemsr   r
   r^   rD   rE   r   r*   delattrr4   r   Zeliminate_dead_codelintZ	recompile)r   re   cfr   r   Zerased_paramsr	   r	   r   constant_fold   s"    

rk   )r   c                 C   sZ   t | dd}|  | jjD ]8}|jdks>||jks>||jkrJt|jt	< qt
|jt	< qd S )NTrf   r   )r   r_   r
   r>   r/   r   r    CONST_MODULE_TAGr   META_TAG
MODULE_TAG)r   rj   r   r	   r	   r   constant_graph_tag   s    ro   )r   r[   c           	         s   t |  | jjddD ]8}d}|jD ]}|jt tkr$d} q@q$|st|jt< qtj	
 }i  g }| jjD ]X}|jt tkr~qj|| fdd}| |< |jD ] }|jt tkr||  qjqqj|t| |  tj	| |}|S )zr
    Construct a GraphModule which corresponds to the part which could be
    constant folded in provided gm.
    r   r]   FTc                    s    |  S r   r	   )xZnode_remappingr	   r   <lambda>      z,run_and_get_constant_graph.<locals>.<lambda>)ro   r
   r^   rE   r   rm   rl   rn   r+   rA   ZGraphr>   Z	node_copyr4   r2   tupleri   GraphModule)	r   r   Zused_to_folduZ	new_graphZoutput_nodesnew_nodeuserZnew_gmr	   rq   r   run_and_get_constant_graph   s2    



ry   )N)N)r   typingr   r   r   r   r+   Ztorch.utils._pytreeutilsZ_pytreer?   r,   rR   rm   rn   rl   r   rA   ZInterpreterr   Z_python_dispatchZ_disable_current_modesrB   rc   rk   ru   ro   ry   r	   r	   r	   r   <module>   s   
 
$
