Ë
    M²j’F  ã                   óþ   — 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
mZ d dlmZ d dlmZ  ej                   e«      Zej'                  ej(                  «        G d„ d«      Z G d	„ d
«      Z G d„ d«      Zy)é    N)ÚIterableÚSequence)ÚGraphModule)Ú_get_qualified_nameÚNode)ÚOperatorSupportBase)Úfuse_by_partitionsc                   ó|   — e Zd Z	 	 	 ddedz  dee   dz  dee   dz  fd„Zdefd„Zdded	edz  fd
„Z	defd„Z
d„ Zy)Ú	PartitionNÚidÚnodesÚnode_ordersc                 ó  — || _         i | _        |�q|€t        j                  |d «      | _        y t	        |«      }t	        |«      }t        |«      t        |«      k7  rt        d«      ‚t        t        ||«      «      | _        y y )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         ú`/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/fx/passes/infra/partitioner.pyÚ__init__zPartition.__init__   s�   € ð ˆŒØ-/ˆŒ
ØÐØÐ"Ü!Ÿ]™]¨5°$Ó7�•
ä! %›[�
Ü#'¨Ó#4Ð Ü�z“?¤cÐ*:Ó&;Ò;Ü(ØIóð ô "¤# jÐ2BÓ"CÓD�•
ð ó    Úreturnc                 ó,   — t        | j                  «      S ©N)Ústrr   ©r   s    r   Ú__repr__zPartition.__repr__'   ó   € Ü�4—:‘:‹Ðr   ÚnodeÚ
node_orderc                 ó>   — | j                   j                  ||i«       y r   )r   Úupdate)r   r#   r$   s      r   Úadd_nodezPartition.add_node*   s   € Ø�
‰
×Ñ˜4 Ð,Õ-r   c                 ó   — | j                   |= y r   )r   ©r   r#   s     r   Úremove_nodezPartition.remove_node-   s   € Ø�J‰J�tÑr   c                 ó,   — t        | j                  «      S r   )r   r   r    s    r   ÚsizezPartition.size0   r"   r   )NNNr   )Ú__name__Ú
__module__Ú__qualname__Úintr   r   r   r   r!   r'   r*   r,   © r   r   r   r      s|   „ ð Ø'+Ø,0ñ	Eà�$‰JðEð ˜‰~ Ñ$ðEð ˜c‘] TÑ)ó	Eð(˜#ó ñ.˜Tð .¨s°T©zó .ð ó ór   r   c                   ó.   — e Zd Zdefd„Zdedee   fd„Zy)Ú_DependencyViewerÚgraph_modulec                 ó<  — t        j                  t        «      | _        t	        |j
                  j                  «      D ]\  }|j                  D ]K  }| j                  |   j                  |«       | j                  |   j                  | j                  |   «       ŒM Œ^ y r   )
ÚcollectionsÚdefaultdictÚsetÚdownstreamsÚreversedÚgraphr   ÚusersÚaddr&   )r   r4   r#   Úoutput_nodes       r   r   z_DependencyViewer.__init__5   s‰   € Ü&×2Ñ2´3Ó7ˆÔä˜\×/Ñ/×5Ñ5Ó6ò 	MˆDØ#Ÿz™zò M�à× Ñ  Ñ&×*Ñ*¨;Ô7Ø× Ñ  Ñ&×-Ñ-¨d×.>Ñ.>¸{Ñ.KÕLñMñ	Mr   r#   r   c                 ó    — | j                   |   S r   )r9   r)   s     r   Údownstreams_ofz _DependencyViewer.downstreams_of>   s   € Ø×Ñ Ñ%Ð%r   N)r-   r.   r/   r   r   r   r8   r@   r1   r   r   r3   r3   4   s'   „ ðM [ó Mð& 4ð &¨C°©Iô &r   r3   c                   ó°   — e Zd Z	 	 	 ddedededee   dz  dee   dz  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)ÚCapabilityBasedPartitionerNr4   Úoperator_supportÚallows_single_node_partitionÚnon_compute_opsÚ!allowed_single_node_partition_opsr   c                 óz   — || _         || _        || _        |�|ng | _        |�|ng | _        t        |«      | _        y r   )r4   rC   rD   rE   rF   r3   Údependency_viewer)r   r4   rC   rD   rE   rF   s         r   r   z#CapabilityBasedPartitioner.__init__C   sS   € ð )ˆÔØ 0ˆÔØ,HˆÔ)Ø2AÐ2M™ÐSUˆÔð 1Ð<ñ .àð 	Ô.ô
 "3°<Ó!@ˆÕr   r#   c                 ó|   — | j                   j                  t        | j                  j	                  «       «      |«      S r   )rC   Úis_node_supportedr   r4   Únamed_modulesr)   s     r   Ú_is_node_supportedz-CapabilityBasedPartitioner._is_node_supportedV   s4   € Ø×$Ñ$×6Ñ6Ü�×"Ñ"×0Ñ0Ó2Ó3°Tó
ð 	
r   c           	      óú  ‡ ‡‡‡‡‡— t        j                  t        «      Ši Ši Ši }i Ši Št        j                  «       }dt
        dt
        fˆˆˆˆˆˆ fd„}dt        dt
        d z  dt
        d z  fˆˆˆˆfd„}t        j                  d«       t        t        ‰ j                  j                  j                  «      «      D ]¾  \  }}i }‰ j                  |«      r(|‰vr$t        |«      }|||<   |‰|<    ||||«       d ||<   t!        ‰j#                  «       t%        j&                  d	«      ¬
«      D ]
  \  }}	d ||<   Œ t)        |j+                  «       «      }
t-        |
«      d	kD  sŒ¤|
d   }|
d	d  D ]  } |||«      \  }}	Œ ŒÀ ‰j/                  «       D ]I  }t1        t!        |j                  j#                  «       t%        j&                  d	«      d¬«      «      |_        ŒK t        j                  d«       	 i }‰ j                  j                  j                  D ]  }d}|j2                  D ]-  }|j4                  dk7  st7        |j8                  «      dk7  sŒ+d} n |sŒD‰j;                  |«      }|j2                  D ]  }‰j;                  |«      |k7  sŒ|||<   Œ Œ� |sn#|j#                  «       D ]  \  }} ||d |«       Œ ŒÊ‰ j<                  �st        j                  d«       ddh}|j?                  t        ‰ j@                  «      «      }g }‰j#                  «       D ]¸  \  }}d}|j                  D ]‹  }|j4                  dk(  sŒtC        |j8                  «      s!tE        dtG        |j8                  «      › �«      ‚t7        |j8                  «      |vr|d	z  }t7        |j8                  «      ‰ jH                  v sŒ‡|d	z  }Œ� |d	k  sŒ¨|jK                  |«       Œº |D ]  }‰|= Œ t        j                  d«       ‰j#                  «       D ]>  \  }}t        j                  d||j                  D �cg c]  }|jL                  ‘Œ c}«       Œ@ ‰j/                  «       D �cg c]  }|jO                  «       dkD  sŒ|‘Œ c}S c c}w c c}w )NÚself_idÚother_idc                 ó  •‡ ‡‡‡— ‰‰    j                   Š‰‰   j                   Šdt        t           fˆ	ˆˆˆ
ˆˆ ˆfd„}‰‰    ‰‰   z  }|j                  ‰‰«        ||«      r‰ dfS ‰ ‰}}t	        ‰«      t	        ‰«      k  r||}}‰|   j                   j                  ‰|   j                   «       ‰|   j                   D ]  }|‰	|<   Œ	 ‰|= t        ‰|   ‰|   «      ‰|<   ‰|= ‰
|   j                  ‰
|   «      ‰
|<   ‰
|= |‰|<   ‰|= |dfS )NÚall_user_nodesc                 óÞ   •— | D ]g  }t        «       }‰
j                  j                  |«      D ]=  }|‰v s|‰v r  y|‰v sŒ‰|   }||v rŒ‰	|   }‰|v s‰|v r  y|j                  |«       Œ? Œi y)NTF)r8   rH   r@   r=   )rQ   Ú	user_nodeÚvisited_partition_idsÚ	path_nodeÚpartition_idÚp_mapÚ
assignmentrO   Úother_nodesÚpartition_mapr   rN   Ú
self_nodess         €€€€€€€r   Údfs_iter_find_cycleziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cycley   s£   ø€ Ø!/ò D�IÜ,/«EÐ)à%)×%;Ñ%;×%JÑ%JÈ9Ó%Uò D˜	ð %¨
Ñ2°iÀ;Ñ6NÚ#'ð %¨
Ò2Ø+5°iÑ+@˜Lð  ,Ð/DÑDØ (Ø$1°,Ñ$?˜EØ&¨%Ñ/°8¸uÑ3DÚ'+à1×5Ñ5°lÕCñ+DðDð4 r   FT)r   r8   r   Údifference_updater   r&   ÚminÚunion)rN   rO   r\   rQ   Úmerge_idÚ
removed_idr#   rY   r[   rX   rZ   Úpartition_usersÚpartitions_by_idÚpartitions_orderr   s   ``     @@€€€€€€r   Úmaybe_merge_partitionzLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partitiont   s`  ü€ à)¨'Ñ2×8Ñ8ˆJØ*¨8Ñ4×:Ñ:ˆKð´C¼±I÷ ó ð< -¨WÑ5¸ÈÑ8QÑQˆNØ×,Ñ,¨[¸*ÔEñ # >Ô2ð  �~Ð%ð $+¨H�jˆHÜ�:‹¤ [Ó!1Ò1Ø'1°8˜*�ð ˜XÑ&×,Ñ,×3Ñ3Ð4DÀZÑ4P×4VÑ4VÔWà(¨Ñ4×:Ñ:ò ,�Ø#+�
˜4Ò ð,ð ! Ð,ä),Ø  Ñ*Ð,<¸ZÑ,Hó*Ð˜XÑ&ð ! Ð,à&3°HÑ&=×&CÑ&CØ˜jÑ)ó'ˆM˜(Ñ#ð ˜jÐ)à(6ˆO˜HÑ%Ø 
Ð+à˜T�>Ð!r   r#   r$   r   c                 óT  •— dt         dt        fˆˆfd„}| ‰v r‰‰|       j                  | «       |€‰j                  | «       y |‰vrG|‰| <   |€t	        d«      ‚t        || g|g¬«      ‰|<   t        | j                  «      ‰|<    || |«       y |‰| <   ‰|   j                  | |«       y )Nr#   r   c                 ó¦   •— | j                   D ]A  }‰j                  |«      }|€Œ‰|   j                  |«       ‰|   j                  ‰|   «       ŒC y r   )r<   Úgetr=   r&   )r#   r   rS   Ú	target_idrX   rZ   s       €€r   Ú_update_partition_mapzgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_map½   sY   ø€ ð "&§¡ò K�IØ *§¡¨yÓ 9�IØ Ñ,Ø% bÑ)×-Ñ-¨iÔ8Ø% bÑ)×0Ñ0°¸yÑ1IÕJñ	Kr   z)node_order is required for new partitions)r   r   r   )	r   r0   r*   Úpopr   r   r8   r<   r'   )r#   r$   r   rj   rX   rZ   rb   rc   s       €€€€r   Úmerge_single_nodezHCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node¼   sÉ   ø€ ðK¬Dð K´cö Kð �zÑ!Ø  ¨DÑ!1Ñ2×>Ñ>¸tÔDàˆzØ—‘˜tÕ$ØÐ+Ñ+Ø#%�
˜4Ñ ØÐ%Ü(Ð)TÓUÐUÜ'0Ø $ °j°\ô(Ð  Ñ$ô '*¨$¯*©*£o� Ñ#Ù% d¨BÕ/à#%�
˜4Ñ Ø  Ñ$×-Ñ-¨d°JÕ?r   zProposing partitions...é   )Úkeyr   T)rn   Ú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: %s)(r6   r7   r8   Ú	itertoolsÚcountr0   r   ÚloggerÚdebugÚ	enumerater:   r4   r;   r   rL   ÚnextÚsortedÚitemsÚoperatorÚ
itemgetterr   Úkeysr   Úvaluesr   r<   Úopr   Útargetrh   rD   r_   rE   Úcallabler   ÚtyperF   ÚappendÚnamer,   )r   Únodes_orderÚnew_partition_idre   rl   r$   r#   Úmerge_candidatesrV   Ú_Úmerge_candidates_listrN   rO   Ú	partitionÚnodes_reassignmentÚis_tuple_outputÚuserr   Údefault_non_compute_opsrE   Úpartitions_to_removeÚcompute_node_countrX   rZ   rb   rc   rd   s   `                     @@@@@r   Úpropose_partitionsz-CapabilityBasedPartitioner.propose_partitions[   s¾  ý€ ô )4×(?Ñ(?ÄÓ(Dˆð ')ˆ
ð ð 	ð
 ð 	ð
 ð 	ð
 ð 	ô %Ÿ?™?Ó,Ðð
F	"¬3ð F	"¼#÷ F	"ò F	"ðP	@¤Dð 	@´c¸D±jð 	@ÄcÈDÁj÷ 	@ð 	@ô8 	�‰Ð.Ô/ä )¬(°4×3DÑ3D×3JÑ3J×3PÑ3PÓ*QÓ Rò 	JÑˆJ˜à02Ðð ×&Ñ& tÔ,°¸ZÑ1GÜ#Ð$4Ó5�Ø$0�˜DÑ!Ø1=Ð  Ñ.Ù! $¨
°LÔAØ15Ð  Ñ.ô $*Ø ×&Ñ&Ó(¬h×.AÑ.AÀ!Ó.Dô$ò 6‘�˜að 26Ð  Ò.ð6ô
 %)Ð)9×)>Ñ)>Ó)@Ó$AÐ!ÜÐ(Ó)¨AÓ-Ø/°Ñ2�Ø 5°a°bÐ 9ò J�Hñ "7°wÀÓ!I‘J�G™QñJð3	Jð> *×0Ñ0Ó2ò 	ˆIÜ"ÜØ—O‘O×)Ñ)Ó+´×1DÑ1DÀQÓ1GÐQUôóˆI�Oð	ô 	�‰ÐTÔUØØ24ÐØ×)Ñ)×/Ñ/×5Ñ5ò :�Ø"&�Ø ŸJ™Jò �DàŸ™ ?Ò2Ü.¨t¯{©{Ó;Ð?RÓRà*/˜Ùðò #Ø#Ÿ™¨Ó-�BØ $§
¡
ò :˜Ø%Ÿ>™>¨$Ó/°2Ó5Ø79Ð.¨tÒ4ñ:ð:ñ$ &Øà.×4Ñ4Ó6ò 2‘��bÙ! $¨¨bÕ1ð2ð/ ð6 ×0Ó0Ü�L‰LÐBÔCØ'<Ð>QÐ&RÐ#Ø5×;Ñ;¼CÀ×@TÑ@TÓ<UÓVˆOØ.0Ð Ø!1×!7Ñ!7Ó!9ò 4‘��IØ%&Ð"Ø%ŸO™Oò 4�DØ—w‘w /Ó1Ü'¨¯©Ô4Ü"0Ø"@ÄÀdÇkÁkÓARÐ@SÐ Tó#ð ô /¨t¯{©{Ó;À?ÑRØ.°!Ñ3Ð.ä/°·±Ó<Ø#×EÑEòFð /°!Ñ3Ñ.ð4ð &¨Ó*Ø(×/Ñ/°Õ3ð!4ð" +ò )�Ø$ RÑ(ð)ô 	�‰Ð+Ô,Ø-×3Ñ3Ó5ò 	‰MˆB�	Ü�L‰LØ# RÀ	ÇÁÖ)P¸¨$¯)«)Ò)Põð	ð (8×'>Ñ'>Ó'@ö
Ø#ÀIÇNÁNÓDTÐWXÓDXŠIò
ð 	
ùò *Qùò
s   Ð%Q3ÑQ8Ñ,Q8Ú
partitionsÚprefixc                 ó–   — t         j                  d«       t        | j                  |D �cg c]  }|j                  ‘Œ c}|¬«      S c c}w )NzFusing partitions...©r‘   )rs   rt   r	   r4   r   )r   r�   r‘   rˆ   s       r   Úfuse_partitionsz*CapabilityBasedPartitioner.fuse_partitionsB  s?   € ô 	�‰Ð+Ô,ä!Ø×ÑØ.8Ö9 ˆY�_‹_Ò9Øô
ð 	
ùâ9s   ª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 )Nrp   )r}   r   r~   )r#   rE   s    €r   Úis_non_compute_nodezVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_nodeQ  s+   ø€ à—‘˜?Ñ*ò HÜ'¨¯©Ó4¸ÐGð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)r}   Úall_input_nodes)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�   ø€ ð —‘˜=Ò(Ø 	Ñ)Ø˜MÑ)àØÐ.Ñ.Ø.¨tÑ4Ð4Ù" 4Ô(Ø#×3Ñ3ò %�GÙ4°W¸iÈÕWØ8=Ð/°Ñ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š   )r}   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_nodep  s�   ø€ ð —‘˜=Ò(Ø 	Ñ)Ø˜MÑ)àØÐ/Ñ/Ø/°Ñ5Ð5Ù" 4Ô(Ø $§
¡
ò %�HÙ5Ø  )¨]õð :?Ð0°Ñ6Ù$ð%ð 26Ð(¨Ñ.ØØ-2Ð$ TÑ*Ør   r   )r8   rE   r   r   r=   r   rk   )r   r�   rˆ   r*   r#   r—   rž   r¢   rE   rŸ   r£   s        @@@@@@r   Úremove_bookend_non_compute_opsz9CapabilityBasedPartitioner.remove_bookend_non_compute_opsN  s  ý€ Ü˜d×2Ñ2Ó3ˆð	¤dõ 	ð 57ÐØ57Ð ð	Üð	Ü#&¤t¡9ð	Ü=@Ä¹Y÷	ð*	Üð	Ü#&¤t¡9ð	Ü=@Ä¹Y÷	ð. $ò 	4ˆIô &)£UˆKØ!Ÿ™ò *�Ù& tÕ,Ù-¨d´C¸	¿¹Ó4HÈ+ÔVÙ1Øœc )§/¡/Ó2°Kõð  —O‘O DÕ)ð*ô �;Ó 1Ó$Ø'ò 4�DØ—O‘O×'Ñ'¨¨dÕ3ñ4ñ	4r   c                 óL   — | j                  «       }| j                  ||¬«      }|S )Nr“   )r�   r”   )r   r‘   r�   Úfused_gms       r   Úpartition_and_fusez-CapabilityBasedPartitioner.partition_and_fuse™  s*   € Ø×,Ñ,Ó.ˆ
Ø×'Ñ'¨
¸6Ð'ÓBˆØˆr   )FNN)Úfused_)r-   r.   r/   r   r   Úboolr   r   r   r   rL   r   r   r�   r”   r¤   r§   r1   r   r   rB   rB   B   sØ   „ ð
 .3Ø04ØBFñAà!ðAð .ðAð '+ð	Að
 " #™¨Ñ-ðAð ,4°C©=¸4Ñ+?ðAð 
óAð&
 tð 
°ó 
ð
e
 D¨¡Oó e
ðP :Bñ	
Ø˜y™/ð	
Ø36ð	
à	ó	
ðI4¸¸i¹ó I4ñV¨ð ¸Kô r   rB   )r6   rq   Úloggingry   Úcollections.abcr   r   Útorch.fx.graph_moduler   Útorch.fx.noder   r   Ú torch.fx.passes.operator_supportr   Ú!torch.fx.passes.utils.fuser_utilsr	   Ú	getLoggerr-   rs   ÚsetLevelÚWARNINGr   r3   rB   r1   r   r   ú<module>r³      se   ðã Û Û Û ß .å -ß 3Ý @Ý @ð 
ˆ×	Ñ	˜8Ó	$€Ø ‡��—‘Ô  ÷ñ ÷D&ñ &÷Zò Zr   