
    9j!                    F   d dl mZ d dlZd dlmZmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ erd dlmZ d d	lmZ d d
lmZ ej0                  j2                  ZddZej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ejP                  ejR                  gZ*ddZ+ddZ,ddZ-ddZ.ddZ/y)    )annotationsN)AnyTYPE_CHECKING)free_unbacked_symbols)StorageWeakRef)_pytree)tree_flatten)Callable)OpOverloadPacket)TreeSpecc                r    t        | j                  d      r| j                  j                  S | j                  S )Noverloadpacket)hasattrtargetr   nodes    ^/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_functorch/compile_utils.pyget_aten_targetr      s+    t{{,-{{)));;    c                h   t        j                         }i i }i }ddlm}m}  ||        t        | j                        d   }|j                  dk7  rt        d|j                   d      dd}|j                  D ch c]0  } ||      r&t        |j                  d   j                               2 }	}| j                  D ch c]4  } ||      r*t        |j                  d   j                               |	v r|6 }
}| j                  D ]  }|j                  d	k(  s|j                  dk(  s|j                  d
k(  s}t        |      t        v slt        |      t        j                   u sQ||
v sMd|j                  v rZt#        |j                  d   t$        j&                        r3t)        |j                  d         r|j+                  |fd      }||<   	 	 	 	 dfd} ||j,                        \  }} ||j.                        \  }}|j0                  ||||d}t3        t5        d |D              t5        d |D              f      }|j0                  |f}||v }d}|r||   |k(  r||   } |||      r||<   od}|j+                  |fd      }||<   |s|r|||<   |||<    |S c c}w c c}w )Nr   )compute_mutation_region_idssame_mutation_regionsoutputz-expected output_node.op to be 'output', got ''c                    d| j                   vs't        | j                   d   t        j                        sy	 | j                   d   j	                          y# t
        $ r Y yw xY w)zGWe can evaluate only nodes that represent tensors with defined storage.valFT)meta
isinstancetorchTensoruntyped_storageNotImplementedErrorr   s    r   checkable_nodez$fx_graph_cse.<locals>.checkable_nodeM   sZ    		!DIIe4Dell)S	IIe,,.  # 		s   A 	A"!A"r   placeholderget_attrc                    |    S N xenvs    r   <lambda>zfx_graph_cse.<locals>.<lambda>       A r   c                |   t        |       \  } }t        t        |             D ]  }| |   }t        |t        j
                  j                  j                        r|v r|   | |<   t        |t        j                  t        j                  t        j                  f      s||j                  | |<    t        |       |fS r(   )r	   rangelenr   r    fxr   NodeSymBoolSymIntSymFloattuple)arg_listspecivr,   s       r   
substitutez fx_graph_cse.<locals>.substitute   s     ".h!7$s8}- -A A!!UXX]]%7%78Q#X&)!f!!emmU\\5>>%RS&'ff- X,,r   )r   args	args_speckwargskwargs_specc              3  6   K   | ]  }|t        |      f  y wr(   type.0as     r   	<genexpr>zfx_graph_cse.<locals>.<genexpr>   s     247|2   c              3  6   K   | ]  }|t        |      f  y wr(   rB   rD   s     r   rG   zfx_graph_cse.<locals>.<genexpr>   s     9W11d1g,9WrH   FTc                    |    S r(   r)   r*   s    r   r-   zfx_graph_cse.<locals>.<lambda>   r.   r   )r   fx.Nodereturnbool)r8   zlist[Any] | tuple[Any, ...]rL   z tuple[tuple[Any, ...], TreeSpec])r2   Graphtorch._inductor.pattern_matcherr   r   listnodesopAssertionErrorall_input_nodesr   r   r"   r   rand_opsatenemptyr   sympySymbolr   	node_copyr=   r?   r   hashr7   )fx_g	new_graphhash_env	token_mapr   r   output_noder$   noutput_storagesnodes_that_alias_outputsnew_noder<   r=   r>   r?   r@   tokenhash_arghash_valhash_val_in_hash_envoverwrite_due_to_mutationduplicate_n_prevr,   s                          @r   fx_graph_cserk   3   s   
I 	 
 	  8:I
  %
  

+B/K~~!;KNN;K1M
 	

 ,,! 	qvve}4467O   !166%=88:;N 	
    ZZ R, DDM!ttxttz!q!X- q!TZZ/,, qvve}ell;)!&&-8 !**1.>?HCF
-5
-1
- )0OD)",QXX"6FK
 ((& *E 2T22E9WPV9W4WXH (+H $,x#7 (-%#	((;u(D#+H#5 (,<=-CF 15- **1.>?HCF(0D%-"&+	(#eR,h A
 s   >5J*9J/c           	     z   t        | j                  j                  dt        j                              }t        |      D ]h  }t        |j                        dk7  r.t        d|j                   dt        |j                               |j                  d   }|j                  |       j | j                          | S )Ncall_function)rR   r      zexpected node z to have 1 input node, got r   )rP   graph
find_nodesoperatorgetitemreversedr1   rT   rS   nameappend	recompile)gmgetitem_nodesr   parents       r   raise_getitemsrz      s     
x7G7GHM ' t##$)  +Fs4K_K_G`Fab  %%a(d LLNIr   c                    | j                   j                  D ]L  }t        |j                  t        j
                  j                        s2|j                  j                  |_        N | j                          y)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)	ro   rQ   r   r   r    _ops
OpOverloadr   rv   )rw   r   s     r   strip_overloadsr~      sO      5dkk5::#8#89++44DK5 LLNr   c                &    | j                  d      S )Nr%   rR   )rp   )ro   s    r   get_placeholdersr      s    }--r   c                    | j                  d      D ]%  }t        j                  |j                  d         c S  t	        d      )Nr   r   r   zNo output node found)rp   pytreetree_leavesr=   rS   )ro   r   s     r   get_outputsr      sD      H - 0!!$))A,//0
/
00r   )r   rK   rL   z+OpOverloadPacket | Callable[..., Any] | str)r\   ztorch.fx.graph.GraphrL   fx.Graph)rw   fx.GraphModulerL   r   )rw   r   rL   None)ro   r   rL   zfx.graph._node_list)ro   r   rL   zlist[fx.Node])0
__future__r   rq   typingr   r   rX   r    torch.fxr2   %torch.fx.experimental.symbolic_shapesr    torch.multiprocessing.reductionsr   torch.utilsr   r   torch.utils._pytreer	   collections.abcr
   
torch._opsr   r   opsrV   r   dropout_fused_dropout_standard_gamma	bernoullimultinomialnative_dropoutnormalpoissonbinomialrrelu	rand_likerandrandintrandnrandpermrU   rk   rz   r~   r   r   r)   r   r   <module>r      s    "  %    G ; ) , (+,yy~~ 	LLNNKKLLMMJJNNIILLJJMM(FR*
.1r   