
    sg>                        d dl mZ d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ  ej(                  e      Zej/                  ej0                          G d d	      Z G d
 d      Z G d d      Zy)    )fuse_by_partitionsN)copy)DictIterableListOptionalSequenceSet)GraphModule)Node_get_qualified_name)OperatorSupportBasec                   Z    e Zd Zddee   deee      fdZdefdZ	defdZ
defd	Zd
 Zy)	PartitionNidnodesc                 Z    || _         |t        j                  |      | _        y i | _        y N)r   dictfromkeysr   )selfr   r   s      T/var/www/html/venv/lib/python3.12/site-packages/torch/fx/passes/infra/partitioner.py__init__zPartition.__init__   s$    -2->T]]5)
B
    returnc                 ,    t        | j                        S r   )strr   r   s    r   __repr__zPartition.__repr__       4::r   nodec                 >    | j                   j                  |d i       y r   )r   updater   r!   s     r   add_nodezPartition.add_node   s    

4,'r   c                     | j                   |= y r   )r   r$   s     r   remove_nodezPartition.remove_node   s    JJtr   c                 ,    t        | j                        S r   )lenr   r   s    r   sizezPartition.size    r    r   )NN)__name__
__module____qualname__r   intr   r   r   r   r   r%   r'   r*    r   r   r   r      sN    G8C= G$8P G# (T ( r   r   c                   D    e Zd ZdefdZdedee   fdZdedee   fdZy)_DependencyViewergraph_modulec                 b   t        j                  t              | _        t        j                  t              | _        |j
                  j                  D ]\  }|j                  D ]K  }| j                  |   j                  |       | j                  |   j                  | j                  |          M ^ t        |j
                  j                        D ]\  }|j                  D ]K  }| j                  |   j                  |       | j                  |   j                  | j                  |          M ^ y r   )collectionsdefaultdictset	upstreamsdownstreamsgraphr   all_input_nodesaddr#   reversedusers)r   r2   r!   
input_nodeoutput_nodes        r   r   z_DependencyViewer.__init__$   s   $005&2237 &&,, 	HD"22 H
t$((4t$++DNN:,FGH	H \//556 	MD#zz M  &**;7  &--d.>.>{.KLM	Mr   r!   r   c                      | j                   |   S r   )r8   r$   s     r   downstreams_ofz _DependencyViewer.downstreams_of4   s    %%r   c                      | j                   |   S r   )r7   r$   s     r   upstreams_ofz_DependencyViewer.upstreams_of7   s    ~~d##r   N)	r+   r,   r-   r   r   r   r
   rA   rC   r/   r   r   r1   r1   #   s>    M[ M &4 &CI &$ $#d) $r   r1   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y)CapabilityBasedPartitionerNr2   operator_supportallows_single_node_partitionnon_compute_ops!allowed_single_node_partition_opsr   c                 z    || _         || _        || _        ||ng | _        ||ng | _        t        |      | _        y r   )r2   rF   rG   rH   rI   r1   dependency_viewer)r   r2   rF   rG   rH   rI   s         r   r   z#CapabilityBasedPartitioner.__init__<   sS     ) 0,H)2A2MSU 1< . 	.
 "3<!@r   r!   c                 |    | j                   j                  t        | j                  j	                               |      S r   )rF   is_node_supportedr   r2   named_modulesr$   s     r   __is_node_supportedz.CapabilityBasedPartitioner.__is_node_supportedN   s2    !!33D9J9J9X9X9Z4[]ab	
r   c           	      P    t        j                  t              i i t        j                         }dt
        dt
        f fd}dt        dt        t
           f fd}t        j                  d       t         j                  j                  j                        D ]  }i } j                  |      r|vrt        |      } |||       d ||<   D ]
  }d ||   <    t!        |j#                               }t%        |      dkD  sj|d	   }|dd  D ]  }	 |||	         t        j                  d
       i }
 j                  j                  j                  D ]  }d}|j&                  D ]-  }|j(                  dk7  st+        |j,                        dk7  s+d} n |sDj/                  |d       }|j&                  D ]  }j/                  |d       |k7  s||
|<     |
j1                         D ]  \  }} |||         j2                  st        j                  d       ddh}|j5                  t         j6                              }g }j1                         D ]  \  }}d	}|j                  D ]l  }|j(                  dk(  st9        |j,                        sJ t+        |j,                        |vr|dz  }t+        |j,                         j:                  v sh|dz  }n |dk  s|j=                  |        |D ]  }|=  t        j                  d       j1                         D ]>  \  }}t        j                  d||j                  D cg c]  }|j>                   c}       @ jA                         D cg c]  }|jC                         d	kD  s| c}S c c}w c c}w )Nself_idother_idc                     t        	    j                        j                  	   j                         dt        t           f
 fd}t               }D ])  }|j                  D ]  }|vs|j                  |        +  ||      ry	    _        	   j                  D ]  } |<   	 	=     j                            <   = y)Nall_user_nodesc                     | D ]c  }t               }
j                  j                  |      D ]9  }|v r  y|v s|   }||v r	|   }|v s|v r  y|j                  |       ; e y)NTF)r6   rK   rA   r;   )rT   	user_nodevisited_partition_ids	path_nodepartition_idp_map
assignmentmerged_nodesrR   partition_mapr   rQ   s         r   dfs_iter_find_cycleziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cyclef   s    !/ DI,/E)%)%;%;%J%J9%U D	 %4#' %
2+5i+@L  ,/DD ($1,$?E&%/8u3D'+155lC+DD4 r   FT)	r   r   r#   r
   r   r6   r=   r;   union)rQ   rR   r^   rT   r!   rV   r\   r[   r]   partitions_by_idr   s   ``    @r   maybe_merge_partitionzLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partitiona   s    0 9 ? ?@L 0 : @ @ACI  < !UN$ 6!% 6I 4&**9566
 #>2  /;W%+(288 +#*
4 + !*%27%;%A%A-PXBY%ZM'"h'r   r!   r   c                    dt         dt        ffd}| v r|       j                  |        |j                  |        y |vr || <   t	        || g      |<    || |       y || <   |   j                  |         || |       y )Nr!   r   c                 2   	j                   j                  |       }|D ]+  }j                  |d       }||   j                  |       - 	j                   j	                  |       }|D ]+  }j                  |d       }||   j                  |       - y r   )rK   rA   getr;   rC   )
r!   r   downstream_nodes	curr_node	target_idupstream_nodes	source_idr[   r]   r   s
          r   _update_partition_mapzgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_map   s     $(#9#9#H#H#N !1 9I *y$ ?I ,%b)--i89 "&!7!7!D!DT!J!/ 9I *y$ ?I ,%i044R89r   )r   r   )r   r.   r'   popr   r%   )r!   r   rj   r[   r]   r`   r   s      r   merge_single_nodezHCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node   s    9D 9c 9& z! D!12>>tDzt$++#%
4 '0Btf'E $%dB/#%
4  $--d3%dB/r   zProposing partitions...   r   z=Reassigning getitem nodes to its producer node's partition...Tcall_functionz_operator.getitemFz'Filtering out single node partitions...ztorch.ops.aten.viewzPartitions proposed:zpartition #%s: %s)"r4   r5   r6   	itertoolscountr.   r   r   loggerdebugr<   r2   r9   r   ._CapabilityBasedPartitioner__is_node_supportednextlistkeysr)   r=   opr   targetrd   itemsrG   r_   rH   callablerI   appendnamevaluesr*   )r   new_partition_idra   rl   r!   merge_candidatesrY   merge_candidates_listrQ   rR   nodes_reassignmentis_tuple_outputuserr   default_non_compute_opsrH   partitions_to_remove	partitioncompute_node_countr[   r]   r`   s   `                  @@@r   propose_partitionsz-CapabilityBasedPartitioner.propose_partitionsS   s    *5)@)@)E ')
13$??,
:	3 :	# :	 :	x 	0D  	0hsm  	0  	0D 	./T..44::; 	=D02 ''-$j2H#$45!$515 . # :59 D!12: %))9)>)>)@$A!()A-/2 5ab 9 =H *'8<	=+	=8 	TU.0%%++11 	6D"O

 77o-&t{{37JJ&+O	 ^^D$/ JJ 6D!~~dD1R735*406	6 +002 	(HD"dB'	( 00LLBC'<>Q&R#5;;C@T@T<UVO.0 !1!7!7!9 
4I%&"%OO 4Dww/1'444.t{{;?R.!3..t{{;t?e?ee.!3.4 &*(//3
4 + )$R() 	+,-335 	[MB	LL,b2Y4992YZ	[ ,<+B+B+D]i	HX[\H\	]] 3Z]s   N>N#N#
partitionsprefixc           	          t         j                  d       t        | j                  |D cg c]  }t	        |j
                         c}|      S c c}w )NzFusing partitions...r   )rq   rr   r   r2   ru   r   )r   r   r   r   s       r   fuse_partitionsz*CapabilityBasedPartitioner.fuse_partitions
  sB    +,!4>?yT)//"?
 	
?s   A
c                 L  	
 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 ]W  } |      s |t        |j                        |      s |t        |j                        |      sG|j                  |       Y t        |      dk7  s|D ]  }|j                  j                  |d           y )Nr!   c                 T    | j                   dk(  xr t        | j                        v S )Nrn   )rw   r   rx   )r!   rH   s    r   is_non_compute_nodezVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_node  s,    77o- D#DKK0OCDr   r   removed_nodesc                     | j                   dk(  s| |vs| |v ry| v r|    S  |       r(| j                  D ]  } |||      rd| <    y d| <   yd| <   yNplaceholderTF)rw   r:   )r!   r   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    ww-'D	,At}G\...t44"4(#33 %G4WiW8=/5$% 15'-,1#D)r   c                     | j                   dk(  s| |vs| |v ry| v r|    S  |       r(| j                  D ]  } |||      rd| <    y d| <   yd| <   yr   )rw   r=   )r!   r   r   output_nr   is_transparent_output_nodetransparent_output_nodess       r   r   z]CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_output_node.  s    ww-'D	,At}G\///55"4( $

 %H5h	=Y9>06$% 26(.-2$T*r   r   )r6   rH   r   r
   r   r;   r)   rk   )r   r   r   r'   r!   r   r   r   rH   r   r   s        @@@@@@r   remove_bookend_non_compute_opsz9CapabilityBasedPartitioner.remove_bookend_non_compute_ops  s   d223	Dd 	D
 5757 	D 	SY 	WZ[_W` 		T 	c$i 	X[\`Xa 	 $ 	4I &)UK! *&t,.tS5I;W/c)//6JKXOOD)	* ;1$' 4DOO''d34	4r   c                 L    | j                         }| j                  ||      }|S )Nr   )r   r   )r   r   r   fused_gms       r   partition_and_fusez-CapabilityBasedPartitioner.partition_and_fuseL  s*    ,,.
''
6'Br   )FNN)fused_)r+   r,   r-   r   r   boolr   r	   r   r   r   rs   r   r   r   r   r   r   r/   r   r   rE   rE   :   s    
 7<<@NRA*A#6A 04A #+8C="9	A
 5=Xc]4KA A$
 
 

u^DO u^n
$y/ 
3 
Va 
64i 64p K r   rE   )!torch.fx.passes.utils.fuser_utilsr   r4   ro   loggingr   typingr   r   r   r   r	   r
   torch.fx.graph_moduler   torch.fx.noder   r    torch.fx.passes.operator_supportr   	getLoggerr+   rq   setLevelWARNINGr   r1   rE   r/   r   r   <module>r      sg    @     @ @ - 3 @ 
		8	$    "$ $.U Ur   