
    `iRD                        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                 F   || _         i | _        ||"t                              |d           | _        d S t	          |          }t	          |          }t          |          t          |          k    s
J d            t          t          ||                    | _        d S d S )Nz/nodes and node_orders must have the same length)r   r   dictfromkeyslistlenzip)selfr   r   r   
nodes_listnode_orders_lists         u/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/fx/passes/infra/partitioner.py__init__zPartition.__init__   s     02
"!]]5$77


!%[[
#'#4#4 :#.>*?*????E @?? "#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.size0   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   r5   r#   output_nodes       r   r   z_DependencyViewer.__init__5   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.   r/   r0   r   r   r   r9   rA   r2   r   r   r4   r4   4   sZ        M[ M M M M&4 &CI & & & & & &r   r4   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 )CapabilityBasedPartitionerFNr5   operator_supportallows_single_node_partitionnon_compute_ops!allowed_single_node_partition_opsr   c                     || _         || _        || _        ||ng | _        ||ng | _        t          |          | _        d S r   )r5   rD   rE   rF   rG   r4   dependency_viewer)r   r5   rD   rE   rF   rG   s         r   r   z#CapabilityBasedPartitioner.__init__C   sa     ) 0,H)2A2MSU 1< .- 	.
 "3<!@!@r   r#   c                     | j                             t          | j                                                  |          S r   )rD   is_node_supportedr   r5   named_modulesr*   s     r   _is_node_supportedz-CapabilityBasedPartitioner._is_node_supportedV   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 ]v}d}|j        D ])}|j        dk    st9          |j                  dk    rd} n*|r?                    |d           }|j        D ]!}                    |d           |k    r|||<   "w|                                D ]\  }} ||d |            j        st          	                    d           ddh}|                     t           j!                            }g }                                D ]\  }}d}|j        D ]^}|j        dk    rQtE          |j                  s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)r9   rI   rA   r>   )rR   	user_nodevisited_partition_ids	path_nodepartition_idp_map
assignmentrP   other_nodespartition_mapr   rO   
self_nodess         r   dfs_iter_find_cycleziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cycley   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   r9   r   difference_updater   r&   minunion)rO   rP   r]   rR   merge_id
removed_idr#   rZ   r\   rY   r[   partition_userspartitions_by_idpartitions_orderr   s   ``     @@r   maybe_merge_partitionzLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partitiont   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rE|| <   |J t	          || g|g          |<   t          | j                  |<    || |           d S || <   |                             | |           d S )Nr#   r   c                     | j         D ]V}                    |d           }|<|                             |           |                             |                    Wd S r   )r=   getr>   r&   )r#   r   rT   	target_idrY   r[   s       r   _update_partition_mapzgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_map   su     "& K KI *y$ ? ?I ,%b)--i888%b)00y1IJJJ	K Kr   )r   r   r   )r   r1   r+   popr   r9   r=   r'   )r#   r$   r   rk   rY   r[   rc   rd   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 !---'0$j\( ( ( $ '*$*oo#%%dB/////#%
4  $--dJ?????r   zProposing partitions...   )keyr   T)ro   reversez=Reassigning getitem nodes to its producer node's partition...call_functionz_operator.getitemFz'Filtering out single node partitions...ztorch.ops.aten.viewzPartitions proposed:zpartition #%s: %sc                     g | ]	}|j         
S r2   )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-   rt   	partitions     r   ru   zACapabilityBasedPartitioner.propose_partitions.<locals>.<listcomp>2  s4     
 
 
#INNDTDTWXDXDXIDXDXDXr   )%r7   r8   r9   	itertoolscountr1   r   r   loggerdebug	enumerater;   r5   r<   r   rM   nextsorteditemsoperator
itemgetterr   keysr   valuesr   r=   opr   targetri   rE   r`   rF   callablerG   append)r   nodes_ordernew_partition_idrf   rm   r$   r#   merge_candidatesrW   _merge_candidates_listrO   rP   rx   nodes_reassignmentis_tuple_outputuserr   default_non_compute_opsrF   partitions_to_removecompute_node_countrY   r[   rc   rd   re   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 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@6 	./// )(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.0%+1 	6 	6D"O
  G..*4;77;NNN&+OE O  6^^D$// J 6 6D!~~dD11R7735*40*0022 	. 	.HD"dD"---- 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444.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 r2   r)   rw   s     r   ru   z>CapabilityBasedPartitioner.fuse_partitions.<locals>.<listcomp>=  s    999Y_999r   r   )r{   r|   r
   r5   )r   r   r   s      r   fuse_partitionsz*CapabilityBasedPartitioner.fuse_partitions6  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 )Nrq   )r   r   r   )r#   rF   s    r   is_non_compute_nodezVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_nodeE  s*    ?* H'44Gr   rx   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#   rx   r   input_nr   is_transparent_input_nodetransparent_input_nodess       r   r   z\CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_input_nodeO  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#   rx   r   output_nr   is_transparent_output_nodetransparent_output_nodess       r   r   z]CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_output_noded  s     =((	))M))t////55""4((  $
 % %H55 )]  % :?06$uu	%
 26(.t-2$T*5r   r   )r9   rF   r   r   r>   r   rl   )r   r   rx   r+   r#   r   r   r   rF   r   r   s        @@@@@@r   remove_bookend_non_compute_opsz9CapabilityBasedPartitioner.remove_bookend_non_compute_opsB  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.   r/   r0   r   r	   boolr   r   r   r   r   rM   r   r   r   r   r   r   r2   r   r   rC   rC   B   s]       
 .337EIA A!A .A '+	A
 "(3-0A ,4HSM+BA 
A A A A&
t 
 
 
 
 

Y
DO Y
 Y
 Y
 Y
x :B	
 	
y/	
36	
		
 	
 	
 	
I4i I4 I4 I4 I4V  K      r   rC   )r7   ry   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   r4   rC   r2   r   r   <module>r      s\             . . . . . . . .       - - - - - - 3 3 3 3 3 3 3 3 @ @ @ @ @ @ @ @ @ @ @ @ 
	8	$	$              B& & & & & & & &N N N N N N N N N Nr   