
    WjF                        d dl Z d dlZd dlZd dl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 d dlmZ d dlmZ  ej        e          Ze                    ej                    G d d	          Z G d
 d          Z G d d          ZdS )    N)IterableSequence)Optional)GraphModule)_get_qualified_nameNode)OperatorSupportBase)fuse_by_partitionsc            	           e Zd Z	 	 	 ddee         deee                  deee                  fdZdefdZ	dded	ee         fd
Z
defdZd ZdS )	PartitionNidnodesnode_ordersc                 P   || _         i | _        ||"t                              |d           | _        d S t	          |          }t	          |          }t          |          t          |          k    rt          d          t          t          ||                    | _        d S d S )Nz/nodes and node_orders must have the same length)r   r   dictfromkeyslistlenAssertionErrorzip)selfr   r   r   
nodes_listnode_orders_lists         f/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/fx/passes/infra/partitioner.py__init__zPartition.__init__   s     02
"!]]5$77


!%[[
#'#4#4 z??c*:&;&;;;(I   "#j2B"C"CDD


     returnc                 *    t          | j                  S N)strr   r   s    r   __repr__zPartition.__repr__(       4:r   node
node_orderc                 >    | j                             ||i           d S r   )r   update)r   r$   r%   s      r   add_nodezPartition.add_node+   s#    
4,-----r   c                     | j         |= d S r   r   r   r$   s     r   remove_nodezPartition.remove_node.   s    Jtr   c                 *    t          | j                  S r   )r   r   r!   s    r   sizezPartition.size1   r#   r   )NNNr   )__name__
__module____qualname__r   intr   r   r   r    r"   r(   r,   r.    r   r   r   r      s         !*./3	E ESME 'E hsm,	E E E E(#    . .T .x} . . . .        r   r   c                   6    e Zd ZdefdZdedee         fdZdS )_DependencyViewergraph_modulec                 $   t          j        t                    | _        t	          |j        j                  D ]W}|j        D ]M}| j        |                             |           | j        |         	                    | j        |                    NXd S r   )
collectionsdefaultdictsetdownstreamsreversedgraphr   usersaddr'   )r   r6   r$   output_nodes       r   r   z_DependencyViewer.__init__6   s    &2377\/566 	M 	MD#z M M &**;777 &--d.>{.KLLLLM	M 	Mr   r$   r   c                     | j         |         S r   )r;   r+   s     r   downstreams_ofz _DependencyViewer.downstreams_of?   s    %%r   N)r/   r0   r1   r   r   r   r:   rB   r3   r   r   r5   r5   5   sZ        M[ M M M M&4 &CI & & & & & &r   r5   c                       e Zd Z	 	 	 ddedededeee                  deee                  ddfd	Z	d
e
defdZdee         fdZ	 ddee         dedefdZdee         fdZddedefdZdS )CapabilityBasedPartitionerFNr6   operator_supportallows_single_node_partitionnon_compute_ops!allowed_single_node_partition_opsr   c                     || _         || _        || _        ||ng | _        ||ng | _        t          |          | _        d S r   )r6   rE   rF   rG   rH   r5   dependency_viewer)r   r6   rE   rF   rG   rH   s         r   r   z#CapabilityBasedPartitioner.__init__D   sa     ) 0,H)2A2MSU 1< .- 	.
 "3<!@!@r   r$   c                     | j                             t          | j                                                  |          S r   )rE   is_node_supportedr   r6   named_modulesr+   s     r   _is_node_supportedz-CapabilityBasedPartitioner._is_node_supportedW   s9    $66"002233T
 
 	
r   c           	          t          j        t                    i i i }i i t          j                    }dt
          dt
          f fd}dt          dt          t
                   dt          t
                   ffd}t          	                    d           t          t           j        j        j                            D ]\  }}i }                     |          r/|vr+t!          |          }|||<   ||<    ||||           d ||<   t#                                          t'          j        d	          
          D ]
\  }}	d ||<   t+          |                                          }
t/          |
          d	k    r$|
d         }|
d	d          D ]} |||          \  }}	                                D ]O}t3          t#          |j                                        t'          j        d	          d                    |_        Pt          	                    d           	 i } j        j        j        D ]t}d}|j        D ])}|j        dk    st9          |j                  dk    rd} n*|r=                    |          }|j        D ] }                    |          |k    r|||<   !u|sn(|                                D ]\  }} ||d |            j        st          	                    d           ddh}|                     t           j!                            }g }                                D ]\  }}d}|j        D ]}|j        dk    rstE          |j                  s$tG          dtI          |j                             t9          |j                  |vr|d	z  }t9          |j                   j%        v r|d	z  }|d	k    r|&                    |           |D ]}|= t          	                    d                                           D ]0\  }}t          	                    d|d |j        D                        1d                                 D             S )Nself_idother_idc                 h              j                  j         dt          t                   f	
 fd}                   z  }|                                ||          r dfS  }}t	                    t	                    k     r||}}|         j                             |         j                    |         j         D ]}|	|<   |= t          |         |                   |<   |= 
|                             
|                   
|<   
|= ||<   |= |dfS )Nall_user_nodesc                     | D ]s}t                      }
j                            |          D ]H}|v s|v r  dS |v r6|         }||v r	|         }|v s|v r  dS |                    |           ItdS )NTF)r:   rJ   rB   r?   )rS   	user_nodevisited_partition_ids	path_nodepartition_idp_map
assignmentrQ   other_nodespartition_mapr   rP   
self_nodess         r   dfs_iter_find_cycleziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cyclez   s    !/ D DI,/EE)%)%;%J%J9%U%U D D	 %
22i;6N6N#'444 %
22+5i+@L  ,/DDD ($1,$?E&%//8u3D3D'+ttt155lCCC+D. ur   FT)r   r:   r   difference_updater   r'   minunion)rP   rQ   r^   rS   merge_id
removed_idr$   r[   r]   rZ   r\   partition_userspartitions_by_idpartitions_orderr   s   ``     @@r   maybe_merge_partitionzLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partitionu   s   )'28J*84:KCI            < -W58QQN,,[*EEE #">22 & ~% $+HjH:[!1!111'18* X&,334DZ4P4VWWW(4: , ,#+
4   ,), *,<Z,H* *X& !,&3H&=&C&Cj)' 'M(# j)(6OH%
+T>!r   r$   r%   r   c                    dt           dt          ffd}| v r!|                                       |            |                    |            d S |vrR|| <   |t	          d          t          || g|g          |<   t          | j                  |<    || |           d S || <   |                             | |           d S )Nr$   r   c                     | j         D ]U}                    |          }|<|                             |           |                             |                    Vd S r   )r>   getr?   r'   )r$   r   rU   	target_idrZ   r\   s       r   _update_partition_mapzgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_map   ss     "& K KI *y 9 9I ,%b)--i888%b)00y1IJJJ	K Kr   z)node_order is required for new partitions)r   r   r   )	r   r2   r,   popr   r   r:   r>   r(   )r$   r%   r   rl   rZ   r\   rd   re   s       r   merge_single_nodezHCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node   s-   KD Kc K K K K K K K z!! D!12>>tDDDzt$$$$$+++#%
4 %()TUUU'0$j\( ( ( $ '*$*oo#%%dB/////#%
4  $--dJ?????r   zProposing partitions...   )keyr   T)rp   reversez=Reassigning getitem nodes to its producer node's partition...call_functionz_operator.getitemFz'Filtering out single node partitions...ztorch.ops.aten.viewzExpected callable target, got zPartitions proposed:zpartition #%s: %sc                     g | ]	}|j         
S r3   )name).0r$   s     r   
<listcomp>zACapabilityBasedPartitioner.propose_partitions.<locals>.<listcomp><  s    )P)P)P$))P)P)Pr   c                 B    g | ]}|                                 d k    |S )r   )r.   ru   	partitions     r   rv   zACapabilityBasedPartitioner.propose_partitions.<locals>.<listcomp>?  s4     
 
 
#INNDTDTWXDXDXIDXDXDXr   )'r8   r9   r:   	itertoolscountr2   r   r   loggerdebug	enumerater<   r6   r=   r   rN   nextsorteditemsoperator
itemgetterr   keysr   valuesr   r>   opr   targetrj   rF   ra   rG   callabler   typerH   append)r   nodes_ordernew_partition_idrg   rn   r%   r$   merge_candidatesrX   _merge_candidates_listrP   rQ   ry   nodes_reassignmentis_tuple_outputuserr   default_non_compute_opsrG   partitions_to_removecompute_node_countrZ   r\   rd   re   rf   s   `                     @@@@@r   propose_partitionsz-CapabilityBasedPartitioner.propose_partitions\   s    )4(?(D(D ')
  	
  	
  	
  	 %?,,
F	"3 F	"# F	" F	" F	" F	" F	" F	" F	" F	" F	" F	" F	"P	@D 	@hsm 	@RU 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@8 	./// )(43D3J3P*Q*Q R R 	J 	JJ02 &&t,, 6Z1G1G#$455$0D!1= .!!$
LAAA15 . $* &&((h.A!.D.D$ $ $ 6 6a 26 ..$()9)>)>)@)@$A$A!())A--/2 5abb 9 J JH "7!6w!I!IJGQQ *0022 	 	I"O))++1DQ1G1GQU   IOO 	TUUU	224)/5 : :"& J  D?22.t{;;?RRR*/ S # :#--B $
 : :%>>$//25579.t4 & .4466 2 2b!!$b11111	26 0 	)LLBCCC'<>Q&R#5;;C@T<U<UVVO.0 !1!7!7!9!9 4 4I%&"%O 4 4Dw/11'44 "0 TdkARAR T T# #  /t{;;?RR.!3./<<#EF F /!3.%**(//333* ) )$R((+,,,-3355 	 	MB	LL#R)P)P	)P)P)P   
 
'7'>'>'@'@
 
 
 	
r   fused_
partitionsprefixc                 x    t                               d           t          | j        d |D             |          S )NzFusing partitions...c                     g | ]	}|j         
S r3   r*   rx   s     r   rv   z>CapabilityBasedPartitioner.fuse_partitions.<locals>.<listcomp>J  s    999Y_999r   r   )r|   r}   r
   r6   )r   r   r   s      r   fuse_partitionsz*CapabilityBasedPartitioner.fuse_partitionsC  sH     	+,,,!99j999
 
 
 	
r   c                   	
 t          | j                  dt          ffdi 	i 
dt          dt           t                   dt           t                   f	fddt          dt           t                   dt           t                   f
fd|D ]}t                      }|j        D ]`} |          rS |t          |j                  |          s |t          |j                  |          r|                    |           at          |          dk    r |D ]}|j                            |d            d S )Nr$   c                 F    | j         dk    ot          | j                  v S )Nrr   )r   r   r   )r$   rG   s    r   is_non_compute_nodezVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_nodeR  s*    ?* H'44Gr   ry   removed_nodesc                     | j         dk    s| |vs| |v rdS | v r|          S  |           r&| j        D ]} |||          sd| <    dS d| <   dS d| <   dS NplaceholderTF)r   all_input_nodes)r$   ry   r   input_nr   is_transparent_input_nodetransparent_input_nodess       r   r   z\CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_input_node\  s     =((	))M))t....t44""4(( #3 % %G44WiWW %8=/5$uu% 15'-t,1#D)5r   c                     | j         dk    s| |vs| |v rdS | v r|          S  |           r&| j        D ]} |||          sd| <    dS d| <   dS d| <   dS r   )r   r>   )r$   ry   r   output_nr   is_transparent_output_nodetransparent_output_nodess       r   r   z]CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_output_nodeq  s     =((	))M))t////55""4((  $
 % %H55 )]  % :?06$uu	%
 26(.t-2$T*5r   r   )r:   rG   r   r   r?   r   rm   )r   r   ry   r,   r$   r   r   r   rG   r   r   s        @@@@@@r   remove_bookend_non_compute_opsz9CapabilityBasedPartitioner.remove_bookend_non_compute_opsO  s   d233	d 	 	 	 	 	 	 5757 		#&t9	=@Y	 	 	 	 	 	 	 	*		#&t9	=@Y	 	 	 	 	 	 	 	. $ 	4 	4I &)UUK! * *&&t,, *--dC	4H4H+VV*11c)/22K *  OOD)));1$$' 4 4DO''d3333!	4 	4r   c                 \    |                                  }|                     ||          }|S )Nr   )r   r   )r   r   r   fused_gms       r   partition_and_fusez-CapabilityBasedPartitioner.partition_and_fuse  s0    ,,..
''
6'BBr   )FNN)r   )r/   r0   r1   r   r	   boolr   r   r    r   r   rN   r   r   r   r   r   r   r3   r   r   rD   rD   C   s]       
 .337EIA A!A .A '+	A
 "(3-0A ,4HSM+BA 
A A A A&
t 
 
 
 
 

e
DO e
 e
 e
 e
P :B	
 	
y/	
36	
		
 	
 	
 	
I4i I4 I4 I4 I4V  K      r   rD   )r8   rz   loggingr   collections.abcr   r   typingr   torch.fx.graph_moduler   torch.fx.noder   r    torch.fx.passes.operator_supportr	   !torch.fx.passes.utils.fuser_utilsr
   	getLoggerr/   r|   setLevelWARNINGr   r5   rD   r3   r   r   <module>r      s\             . . . . . . . .       - - - - - - 3 3 3 3 3 3 3 3 @ @ @ @ @ @ @ @ @ @ @ @ 
	8	$	$              D& & & & & & & &Z Z Z Z Z Z Z Z Z Zr   