U
    zh                     @   s   d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	 ej
jZejedddZejejejejejejejejejejejejejejejgZejjjdd	d
Z dd Z!dd Z"dd Z#dS )    )CallableN)_pytree)tree_flatten)nodereturnc                 C   s   t | jdr| jjS | jS )Noverloadpacket)hasattrtargetr   )r    r
   P/var/www/html/venv/lib/python3.8/site-packages/torch/_functorch/compile_utils.pyget_aten_target   s    r   )fx_gc                    s0  t  }i  i }i }| jD ]}|jdksJ|jdksJ|jdksJt|tkrh|| fdd}| |< q fdd}||j\}}||j\}	}
|j	|||	|
d}t
td	d
 |D td	d
 |	D f}|j	|f}||k}|r|| |kr||  |< q|| fdd}| |< |s|||< |||< q|S )NplaceholderoutputZget_attrc                    s    |  S Nr
   xenvr
   r   <lambda>6       zfx_graph_cse.<locals>.<lambda>c                    sv   t | \} }tt| D ]P}| | }t|tjjjrH| krH | | |< t|tjtj	tj
fr|j| |< qt| |fS r   )r   rangelen
isinstancetorchfxr   NodeZSymBoolZSymIntZSymFloattuple)arg_listspecivr   r
   r   
substitute;   s    z fx_graph_cse.<locals>.substitute)r	   args	args_speckwargskwargs_specc                 s   s   | ]}|t |fV  qd S r   )type).0ar
   r
   r   	<genexpr>V   s     zfx_graph_cse.<locals>.<genexpr>c                    s    |  S r   r
   r   r   r
   r   r   `   r   )r   Graphnodesopr   rand_opsZ	node_copyr#   r%   r	   hashr   )r   Z	new_graphZhash_envZ	token_mapnnew_noder"   r#   r$   r%   r&   tokenZhash_argZhash_valZhash_val_in_hash_envr
   r   r   fx_graph_cse(   sL    


"

r3   c                 C   s4   | j jD ]}t|jtjjr|jj|_q|   dS )z
    Modifies the target of graph nodes in :attr:`gm` to strip overloads.

    Args:
        gm(fx.GraphModule): The input Fx graph module to be modified
    N)	graphr,   r   r	   r   Z_opsZ
OpOverloadr   Z	recompile)Zgmr   r
   r
   r   strip_overloadsi   s    r5   c                 C   s   | j ddS )Nr   r-   )
find_nodes)r4   r
   r
   r   get_placeholdersv   s    r8   c                 C   s0   | j ddD ]}t|jd   S tdd S )Nr   r6   r   zNo output node found)r7   pytreeZtree_leavesr#   AssertionError)r4   r   r
   r
   r   get_outputsz   s    r;   )$typingr   r   Ztorch.fxr   Ztorch.utilsr   r9   Ztorch.utils._pytreer   ZopsZatenr   r   ZdropoutZ_fused_dropoutZ_standard_gammaZ	bernoulliZmultinomialZnative_dropoutnormalZpoissonZbinomialZrreluZ	rand_likeZrandrandintZrandnZrandpermr.   r4   r+   r3   r5   r8   r;   r
   r
   r
   r   <module>   s4   A