
    Vh                         d dl Z d dlmZmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZ  ed      Zdd	lmZ d
gZ e	d       G d d
             Zy)    N)CallableOptionalTypeVar)GraphNode)compatibility)GraphModule)
NodeSourceNodeSourceActionT   )FxGraphDrawerGraphTransformObserverF)is_backward_compatiblec            
           e Zd ZdZ	 	 ddededee   dee   fdZed        Z	d	e
egef   d
ee   fdZd	e
egef   d
ee   fdZd Zd Zd Zd Zd Zd Zd Zy)r   r   Ngmpassname	subsystemlog_urlc                 v   ddl m} || _        || _        || _        ||j
                  }|| _        |j                  xs | j                  du| _        | j                  rt               | _
        t               | _        i | _        g | _        | j                         | _        | j!                         | _        | j%                         | _        | j)                         | _        | j                  yt,        xj.                  dz  c_        t1        | j                  | j                  dd      j3                         | _        y)z{
        log_url is inferred to be torch._inductor.config.trace.log_url_for_graph_xform unless otherwise specified
        r   )traceNr   Tignore_getattrignore_parameters_and_buffers)torch._inductor.configr   r   r   r   log_url_for_graph_xformr   enabledactiveseterased_nodescreated_nodesname_to_node
copied_gmsget_node_creation_hook_node_creation_hookget_node_erase_hook_node_erase_hookget_node_replace_hook_node_replace_hookget_deepcopy_hook_deepcopy_hookr   #_GraphTransformObserver__pass_countr   get_dot_graphinput_dot_graph)selfr   r   r   r   r   s         X/home/dcms/DCMS/lib/python3.12/site-packages/torch/fx/passes/graph_transform_observer.py__init__zGraphTransformObserver.__init__   s    	1 "?33Gmm?t||4'?;;*-%D+.5D13D13DO'+'B'B'DD$$($<$<$>D!&*&@&@&BD#"&"8"8":D <<++q0+,GGMM*.	 

 -/ 	    c                     | j                   S N)r,   )clss    r0   get_current_pass_countz-GraphTransformObserver.get_current_pass_countG   s    r2   pass_fnreturnc                     | 5  | j                         s || j                        cd d d        S 	 d d d        y # 1 sw Y   y xY wr4   )_check_disable_passr   r/   r7   s     r0   apply_gm_passz$GraphTransformObserver.apply_gm_passK   sD     	(++-tww'	( 	(-	( 		( s	   "9Ac                     | 5  | j                         s% || j                  j                        cd d d        S 	 d d d        y # 1 sw Y   y xY wr4   )r:   r   graphr;   s     r0   apply_graph_passz'GraphTransformObserver.apply_graph_passR   sH     	.++-tww}}-	. 	.-	. 		. s   ,AAc                 n      j                   y fd}ddlm} |j                  d j                   |      S )NFc                       j                   S r4   )r   )r/   s   r0   <lambda>z<GraphTransformObserver._check_disable_pass.<locals>.<lambda>]   s    T]] r2   r   )CompilerBisectorinductor)r   !torch._inductor.compiler_bisectorrC   disable_subsystem)r/   
debug_inforC   s   `  r0   r:   z*GraphTransformObserver._check_disable_passY   s6    >>!*
F11

 	
r2   c                    | j                   s| S | j                  j                  | j                         | j                  j	                  | j
                         | j                  j                  | j                         | j                  j                  | j                         | j                  j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                  j                   D ]  }|| j                  |j"                  <    | S r4   )r   r   _register_create_node_hookr%   _register_erase_node_hookr'   _register_replace_node_hookr)   _register_deepcopy_hookr+   r    clearr!   r"   r#   r>   nodesname)r/   nodes     r0   	__enter__z GraphTransformObserver.__enter__d   s    {{K**4+C+CD))$*?*?@++D,C,CD''(;(;<!  "!GGMM'' 	0D+/Ddii(	0 r2   c           
         | j                   sy | j                  | j                  gz   D ]n  }|j                  | j                         |j                  | j                         |j                  | j                         |j                  | j                         p | j                  y t        | j                        dkD  st        | j                        dkD  r| j                  j!                         D ]C  }|j#                         | j                  v rd|j$                  d   d<   2d|j$                  d   d<   E | j                  J | j                  j'                  t(        j*                  j-                  | j                  dt.        j0                   d| j2                   d             t5        | j                  | j2                  d	d	
      j7                         }|j!                         D ]C  }|j#                         | j                  v rd|j$                  d   d<   2d|j$                  d   d<   E |j'                  t(        j*                  j-                  | j                  dt.        j0                   d| j2                   d             y y )Nr   yellow
attributes	fillcolorgreypass__z_input_graph.dotTr   z_output_graph.dot)r   r#   r   _unregister_create_node_hookr%   _unregister_erase_node_hookr'   _unregister_replace_node_hookr)   _unregister_deepcopy_hookr+   r   lenr!   r    r.   get_node_listget_nameobj_dictwriteospathjoinr   r,   r   r   r-   )r/   typevaluetbr   eoutput_dot_graphs          r0   __exit__zGraphTransformObserver.__exit__v   s2   {{//TWWI- 	>B++D,D,DE**4+@+@A,,T-D-DE(()<)<=		> <<t!!"Q&#d.?.?*@1*D))779 C::<4#4#44<DAJJ|,[9<BAJJ|,[9	C
 <<+++  &&LL2??@$--P`a  -#.2	 
 mo  &335 C::<4#5#55<DAJJ|,[9<BAJJ|,[9	C
 ""LL2??@$--Pab3 +Er2   c                       fd}|S )Nc                 F   j                   j                  | j                         | j                  | j                  <   t	        d j
                  t        j                        }d| j                  vr|g| j                  d<   y | j                  d   j                  |       y )N	from_node)
r!   addrO   r"   r
   r   r   CREATEmetaappend)rP   sourcer/   s     r0   on_node_creationzGGraphTransformObserver.get_node_creation_hook.<locals>.on_node_creation   s{    ""499-+/Ddii(dmm5E5L5LMF$))+*0		+&		+&--f5r2    )r/   rs   s   ` r0   r$   z-GraphTransformObserver.get_node_creation_hook   s    	6  r2   c                       fd}|S )Nc                     j                   j                  | j                         j                  j	                  | j                  d        y r4   )r    rn   rO   r"   pop)rP   r/   s    r0   on_node_erasezAGraphTransformObserver.get_node_erase_hook.<locals>.on_node_erase   s5    !!$)),!!$))T2r2   rt   )r/   rx   s   ` r0   r&   z*GraphTransformObserver.get_node_erase_hook   s    	3 r2   c                 8     dt         dt        dt         f fd}|S )Noldnewuserc                    	j                   j                  |d       }|sy t        |t              sJ t        j
                  g}|j                  	j                  v r|j                  t        j                         	fd}|j                  j                  dg       }|D cg c]  } ||      r| }}t        | 	j                  |      }|j                  |       ||j                  d<   y c c}w )Nc                 v    | j                   j                  k(  xr | j                  t        j                  gk(  S r4   )	pass_namer   actionr   ro   )rr   r/   s    r0   created_this_passz`GraphTransformObserver.get_node_replace_hook.<locals>.on_node_replace.<locals>.created_this_pass   s9    ''4==8 V]]$++O > r2   rm   )r"   get
isinstancer   r   REPLACErO   r!   rq   ro   rp   r
   r   )
rz   r{   r|   new_noder   r   new_from_noderr   new_node_sourcer/   s
            r0   on_node_replacezEGraphTransformObserver.get_node_replace_hook.<locals>.on_node_replace   s    ((,,S$7Hh---&../F}} 2 22.556 %MM--k2>M%2!:KF:SM 
 )dmmVDO  1)6HMM+&s    C,.C,)r   str)r/   r   s   ` r0   r(   z,GraphTransformObserver.get_node_replace_hook   s%    	7 	7C 	7t 	7: r2   c                       fd}|S )Nc                 <    j                   j                  |        y r4   )r#   rq   )r   r/   s    r0   on_deepcopyz=GraphTransformObserver.get_deepcopy_hook.<locals>.on_deepcopy   s    OO""2&r2   rt   )r/   r   s   ` r0   r*   z(GraphTransformObserver.get_deepcopy_hook   s    	' r2   )NN)__name__
__module____qualname__r,   r	   r   r   r1   classmethodr6   r   r   r<   r   r?   r:   rQ   rj   r$   r&   r(   r*   rt   r2   r0   r   r      s    L $(!%-- - C=	-
 #-^    X{mQ.>%? HQK %!(< ! 	
$*X @r2   )rb   typingr   r   r   torch.fxr   r   torch.fx._compatibilityr   torch.fx.graph_moduler	   torch.fx.tracebackr
   r   r   graph_drawerr   __all__r   rt   r2   r0   <module>r      sU    	 . .   1 - ; CL ( $
$ e,F F -Fr2   