U
    yh=                     @   s   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eZeej G dd	 d	ZG d
d dZG dd dZdS )    )fuse_by_partitionsN)copy)DictIterableListOptionalSequenceSet)GraphModule)Node_get_qualified_name)OperatorSupportBasec                   @   s\   e Zd Zdee eee  dddZedddZ	edd	d
Z
edddZdd ZdS )	PartitionNidnodesc                 C   s"   || _ |d k	rt|nt | _d S N)r   setr   )selfr   r    r   S/var/www/html/venv/lib/python3.8/site-packages/torch/fx/passes/infra/partitioner.py__init__   s    zPartition.__init__returnc                 C   s
   t | jS r   )strr   r   r   r   r   __repr__   s    zPartition.__repr__nodec                 C   s   | j | d S r   )r   addr   r   r   r   r   add_node   s    zPartition.add_nodec                 C   s   | j | d S r   )r   remover    r   r   r   remove_node   s    zPartition.remove_nodec                 C   s
   t | jS r   )lenr   r   r   r   r   size    s    zPartition.size)NN)__name__
__module____qualname__r   intr   r   r   r   r   r!   r#   r%   r   r   r   r   r      s
   r   c                   @   sB   e Zd ZedddZeee dddZeee dddZd	S )
_DependencyViewer)graph_modulec                 C   s   t t| _t t| _|jjD ]6}|jD ]*}| j| | | j| 	| j|  q*q t
|jjD ]6}|jD ]*}| j| | | j| 	| j|  qnqdd S r   )collectionsdefaultdictr   	upstreamsdownstreamsgraphr   all_input_nodesr   updatereversedusers)r   r+   r   Z
input_nodeZoutput_noder   r   r   r   $   s    

z_DependencyViewer.__init__r   r   c                 C   s
   | j | S r   )r/   r    r   r   r   downstreams_of4   s    z _DependencyViewer.downstreams_ofc                 C   s
   | j | S r   )r.   r    r   r   r   upstreams_of7   s    z_DependencyViewer.upstreams_ofN)	r&   r'   r(   r
   r   r   r	   r6   r7   r   r   r   r   r*   #   s   r*   c                   @   s   e Zd Zdeeeeee  eee  ddddZ	e
edddZee d	d
dZdee eedddZee dddZdeedddZdS )CapabilityBasedPartitionerFN)r+   operator_supportallows_single_node_partitionnon_compute_ops!allowed_single_node_partition_opsr   c                 C   sD   || _ || _|| _|d k	r|ng | _|d k	r0|ng | _t|| _d S r   )r+   r9   r:   r;   r<   r*   dependency_viewer)r   r+   r9   r:   r;   r<   r   r   r   r   <   s    z#CapabilityBasedPartitioner.__init__r5   c                 C   s   | j t| j |S r   )r9   Zis_node_supporteddictr+   Znamed_modulesr    r   r   r   Z__is_node_supportedN   s    z.CapabilityBasedPartitioner.__is_node_supportedr   c                    s  t ti  i t }ttd fdd}ttt d fdd}t	d t
jjjD ]}i }|r| krt|}||| d ||<  D ]}d | | < qt| }t|dkrj|d	 }|dd  D ]}	|||	 qqjt	d
 i }
jjjD ]x}d}|jD ],}|jdks8t|jdkrd} qFq|r
 |d }|jD ] } |d |kr^||
|< q^q
|
 D ]\}}||| qjsjt	d ddh}|tj}g } D ]~\}}d	}|jD ]T}|jdkrt|js
tt|j|kr"|d7 }t|jjkr|d7 }q|dkr|| q|D ]}|= q\t	d  D ]$\}}t	d|dd |jD  q|dd   D S )N)self_idother_idc                    s   t  j   j tt d fdd}t } D ]"}|jD ]}| krR|| qRqH||rxdS   _ jD ]}|< q=   < = dS )N)all_user_nodesc                    sz   | D ]p}t  }j|D ]X}|kr.  dS | kr | }||krHq| }|ks`|krh  dS || qqdS )NTF)r   r=   r6   r   )rA   	user_nodeZvisited_partition_idsZ	path_nodepartition_idZp_map)
assignmentmerged_nodesr@   partition_mapr   r?   r   r   dfs_iter_find_cyclef   s    ziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cycleFT)	r   r   r2   r	   r   r   r4   r   union)r?   r@   rG   rA   r   rB   rD   rF   Zpartitions_by_idr   )rE   r@   r?   r   maybe_merge_partitiona   s"     


zLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partitionr   r   c                    s   t td fdd}|  kr2 |   |  |d krF |  nN|krt| | < t|| gd|< || | n | | < | |  || | d S )NrK   c                    st   j | }|D ]&} |d }|d k	r| | qj | }|D ]&} |d }|d k	rH| | qHd S r   )r=   r6   getr   r7   )r   r   Zdownstream_nodesZ	curr_nodeZ	target_idZupstream_nodesZ	source_id)rD   rF   r   r   r   _update_partition_map   s    zgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_mapr   )r   r)   r#   popr   r!   )r   r   rM   rI   r   r   merge_single_node   s    zHCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_nodez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: %sc                 S   s   g | ]
}|j qS r   )name).0r   r   r   r   
<listcomp>  s     zACapabilityBasedPartitioner.propose_partitions.<locals>.<listcomp>c                 S   s   g | ]}|  d kr|qS )r   )r%   rS   	partitionr   r   r   rT     s      )!r,   r-   r   	itertoolscountr)   r   r   loggerdebugr3   r+   r0   r   ._CapabilityBasedPartitioner__is_node_supportednextlistkeysr$   r4   opr   targetrL   itemsr:   rH   r;   callableAssertionErrorr<   appendvalues)r   Znew_partition_idrJ   rO   r   Zmerge_candidatesrC   Zmerge_candidates_listr?   r@   Znodes_reassignmentZis_tuple_outputuserr   Zdefault_non_compute_opsr;   Zpartitions_to_removerV   Zcompute_node_countr   rI   r   propose_partitionsS   sv    
<"










z-CapabilityBasedPartitioner.propose_partitionsfused_)
partitionsprefixr   c                 C   s$   t d t| jdd |D |dS )NzFusing partitions...c                 S   s   g | ]}t |jqS r   )r]   r   rU   r   r   r   rT     s     z>CapabilityBasedPartitioner.fuse_partitions.<locals>.<listcomp>rj   )rY   rZ   r   r+   )r   ri   rj   r   r   r   fuse_partitions
  s    
z*CapabilityBasedPartitioner.fuse_partitions)ri   c                    s   t | jtdfdd i i ttt tt d fddttt tt d fdd|D ]\}t  }|jD ]2} |r|||j|s||j|r||| q|t|d	krl|j| |_qld S )
Nr   c                    s   | j dkot| j kS )NrQ   )r_   r   r`   r   )r;   r   r   is_non_compute_node  s    
zVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_node)r   rV   removed_nodesc                    st   | j dks| |ks| |krdS | kr.|  S  | rh| jD ]}|||s<d| <  dS q<d| < dS d| < dS NplaceholderTF)r_   r1   )r   rV   rn   Zinput_n)rm   is_transparent_input_nodetransparent_input_nodesr   r   rq     s    
z\CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_input_nodec                    st   | j dks| |ks| |krdS | kr.|  S  | rh| jD ]}|||s<d| <  dS q<d| < dS d| < dS ro   )r_   r4   )r   rV   rn   Zoutput_n)rm   is_transparent_output_nodetransparent_output_nodesr   r   rs   .  s    
z]CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_output_noder   )r   r;   r   r	   r   r   r$   )r   ri   rV   r#   r   r   )rm   rq   rs   r;   rr   rt   r   remove_bookend_non_compute_ops  s"    
""
z9CapabilityBasedPartitioner.remove_bookend_non_compute_ops)rj   r   c                 C   s   |   }| j||d}|S )Nrk   )rg   rl   )r   rj   ri   Zfused_gmr   r   r   partition_and_fuseK  s    z-CapabilityBasedPartitioner.partition_and_fuse)FNN)rh   )rh   )r&   r'   r(   r
   r   boolr   r   r   r   r   r[   r   r   rg   rl   ru   rv   r   r   r   r   r8   :   s"      

 8
7r8   )Z!torch.fx.passes.utils.fuser_utilsr   r,   rW   loggingr   typingr   r   r   r   r   r	   Ztorch.fx.graph_moduler
   Ztorch.fx.noder   r   Z torch.fx.passes.operator_supportr   	getLoggerr&   rY   setLevelWARNINGr   r*   r8   r   r   r   r   <module>   s    
