ó
    …~i³  ã                   ó–   • S r SSKJr  SSKJr  SSKJr  SSKrSSK	J
r
  S/rSrS	rSrS
rSrSrS r\R&                  " SSS9SS j5       rg)z=Lukes Algorithm for exact optimal weighted tree partitioning.é    )Údeepcopy)Ú	lru_cache)ÚchoiceN)Únot_implemented_forÚlukes_partitioningÚweightg      ð?é   Ú
partitionsi   c              #   óT   #   • X:¼  d   e[        XS-   5       H  nX U-
  4v •  M     g 7f)Nr	   )Úrange)ÚnÚmin_size_of_first_partÚp1s      Ú`/home/mande/repo/quber/.venv/lib/python3.13/site-packages/networkx/algorithms/community/lukes.pyÚ_split_n_fromr      s3   é € ð Ó&Ð&Ð&ÜÐ*°©EÖ2ˆØ�b‘&ˆjÔò 3ùs   ‚&(Únode_weightÚedge_weight)Ú
node_attrsÚ
edge_attrsc           
      ó6	  ^^^!^"^#^$^%^&• [         R                  " U 5      (       d  [         R                  " S5      e[         R                  " U 5      (       aN  U R	                  5        VVs/ s H  u  pEUS:X  d  M  UPM     nnn[        U5      S:X  d   eUS   n[        U 5      nO4[        [        U R                  5      5      n[         R                  " X5      nTb  Tc^  [        U 5      m&Tc&  [         R                  " T&[        [        5        [        mTc&  [         R                  " T&[        [         5        [         mOU m&[         R"                  " T&T5      R%                  5       nU H'  n	['        U	[(        5      (       a  M  [+        ST S35      e   [-        S5      S 5       m![-        S5      U!4S	 j5       n
[/        [0        5      UU&4S
 j5       m#U#4S jm$[/        [0        5      UU&4S j5       m%S m"U"U$U%4S jn[3        T!" U5      5      nU Ha  n0 UR                  U   [4        '   T&R                  U   T   nU1/UR                  U   [4           U'   U1/UR                  U   [4           S'   Mc     UR                   V	s/ s H  o™U;  d  M
  U	PM     sn	 HF  n0 UR                  U   [4        '   T&R                  U   T   nU1/UR                  U   [4           U'   MH     [         R6                  " U5         U
" U5      nT&R                  U   T   nSnSn0 n[         R8                  " UU5      nU GH  n[;        UUS-   5       Hµ  n[=        UU5       H¢  u  nnUUR                  U   [4           ;  d  UUR                  U   [4           ;  a  M<  UR                  U   [4           U   nUR                  U   [4           U   nU" UUUUU5      u  nnUU;  d  UU   S   U:  a  UU4UU'   UU::  d  Mž  UnUnM¤     M·     UR?                  5        H"  u  nu  nn UUR                  U   [4           U'   M$     URA                  5         GM     UUR                  U   [4           S'   URC                  U5        UU:X  a  UR                  U   [4           S   $ GMœ  s  snnf s  sn	f )u�  Optimal partitioning of a weighted tree using the Lukes algorithm.

This algorithm partitions a connected, acyclic graph featuring integer
node weights and float edge weights. The resulting clusters are such
that the total weight of the nodes in each cluster does not exceed
max_size and that the weight of the edges that are cut by the partition
is minimum. The algorithm is based on [1]_.

Parameters
----------
G : NetworkX graph

max_size : int
    Maximum weight a partition can have in terms of sum of
    node_weight for all nodes in the partition

edge_weight : key
    Edge data key to use as weight. If None, the weights are all
    set to one.

node_weight : key
    Node data key to use as weight. If None, the weights are all
    set to one. The data must be int.

Returns
-------
partition : list
    A list of sets of nodes representing the clusters of the
    partition.

Raises
------
NotATree
    If G is not a tree.
TypeError
    If any of the values of node_weight is not int.

References
----------
.. [1] Lukes, J. A. (1974).
   "Efficient Algorithm for the Partitioning of Trees."
   IBM Journal of Research and Development, 18(3), 217â€“224.

z&lukes_partitioning works only on treesr   r	   Nz9lukes_partitioning needs integer values for node_weight (Ú)Ú
undirectedc              3   ót   #   • U R                    H$  n[        R                  " X5      (       a  M   Uv •  M&     g 7f©N)ÚnodesÚnxÚdescendants)ÚgrÚxs     r   Ú_leavesÚ#lukes_partitioning.<locals>._leavesv   s)   é € ð —”ˆAÜ—>’> "×(Ó(Ø”ò ùs   ‚)8¯	8c                 óÌ   >^• [        T" U 5      5      m[        U R                  5      T-
   H5  n[        U4S j[        R                  " X5       5       5      (       d  M3  Us  $    g )Nc              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   © )Ú.0r   Útleavess     €r   Ú	<genexpr>ÚGlukes_partitioning.<locals>._a_parent_of_leaves_only.<locals>.<genexpr>�   s   øé € Ð?Ò)> A˜–<Ò)>ùs   ƒ)Úsetr   Úallr   r   )r   r   r&   r    s     @€r   Ú_a_parent_of_leaves_onlyÚ4lukes_partitioning.<locals>._a_parent_of_leaves_only}   sG   ù€ ä‘g˜b“kÓ"ˆÜ�R—X‘X“ Ô(ˆAÜÔ?¬¯ª¸Ô)>Ó?×?Ó?Ø’ò )ó    c                 óœ   >• TR                    Vs/ s H  oS   U ;   d  M  US   U ;   d  M  UPM     nn[        UU4S jU 5       5      $ s  snf )Nr   r	   c              3   óH   >#   • U  H  nTR                   U   T   v •  M     g 7fr   )Úedges)r%   Úer   Úsafe_Gs     €€r   r'   Ú@lukes_partitioning.<locals>._value_of_cluster.<locals>.<genexpr>‡   s   øé € ÐEº°A�6—<‘< ‘? ;Ö/ºùó   ƒ")r0   Úsum)Úclusterr1   Úvalid_edgesr   r2   s      €€r   Ú_value_of_clusterÚ-lukes_partitioning.<locals>._value_of_cluster„   sF   ø€ à"(§,¢,ÓV¢,˜Q°A±$¸'±/“qÀaÈÁdÈgÁo—q¡,ˆÐVÜÕE¹ÓEÓEÐEùò Ws   �A	 A	«A	c                 ó.   >• [        U4S jU  5       5      $ )Nc              3   óF   >#   • U  H  nT" [        U5      5      v •  M     g 7fr   )Ú	frozenset)r%   Úcr8   s     €r   r'   ÚBlukes_partitioning.<locals>._value_of_partition.<locals>.<genexpr>Š   s   øé € ÐFºI°qÑ$¤Y¨q£\×2Ð2ºIùs   ƒ!©r5   )Ú	partitionr8   s    €r   Ú_value_of_partitionÚ/lukes_partitioning.<locals>._value_of_partition‰   s   ø€ ÜÔF¹IÓFÓFÐFr-   c                 ó0   >• [        UU4S jU  5       5      $ )Nc              3   óH   >#   • U  H  nTR                   U   T   v •  M     g 7fr   )r   )r%   r   r   r2   s     €€r   r'   ÚAlukes_partitioning.<locals>._weight_of_cluster.<locals>.<genexpr>Ž   s   øé € ÐAº°A�6—<‘< ‘? ;Ö/ºùr4   r?   )r6   r   r2   s    €€r   Ú_weight_of_clusterÚ.lukes_partitioning.<locals>._weight_of_clusterŒ   s   ø€ äÕA¹ÓAÓAÐAr-   c                 ój   • U  Vs/ s H  o!U;   d  M
  UPM     nn[        U5      S:X  d   eUS   $ s  snf )Nr	   r   )Úlen)r@   Únoder=   Úccxs       r   Ú_pivotÚ"lukes_partitioning.<locals>._pivot�   s8   € Ù#Ó1š)�Q¨q¡y�q™)ˆÐ1Ü�3‹x˜1‹}Ðˆ}Ø�1‰vˆùò 2s   …	0’0c                 ó  >^
^• T" X5      mT" X5      m
TR                  T
5      nT" [        U5      5      U::  aE  [        [        U4S jU 5      5      n[        [        U
4S jU5      5      nU/U-   U-   nUT" U5      4$ X-   n	U	T" U	5      4$ )Nc                 ó   >• U T:g  $ r   r$   )r   rK   s    €r   Ú<lambda>ÚClukes_partitioning.<locals>._concatenate_or_merge.<locals>.<lambda>�   ó	   ø€ ¨¨Sªr-   c                 ó   >• U T:g  $ r   r$   )r   Úccis    €r   rP   rQ   ž   rR   r-   )Úunionr<   ÚlistÚfilter)Úpartition_1Úpartition_2r   ÚiÚ
ref_weightÚ	merged_xiÚcp1Úcp2Úoption_2Úoption_1rT   rK   rL   rA   rF   s             @@€€€r   Ú_concatenate_or_mergeÚ1lukes_partitioning.<locals>._concatenate_or_merge•   s—   ú€ Ù�[Ó$ˆÙ�[Ó$ˆØ—I‘I˜c“Nˆ	ñ œi¨	Ó2Ó3°zÓAÜ”vÔ0°+Ó>Ó?ˆCÜ”vÔ0°+Ó>Ó?ˆCà!�{ SÑ(¨3Ñ.ˆHØÑ0°Ó:Ð:Ð:à"Ñ0ˆHØÑ0°Ó:Ð:Ð:r-   )"r   Úis_treeÚNotATreeÚis_directedÚ	in_degreerI   r   r   rV   r   Údfs_treeÚset_edge_attributesÚD_EDGE_VALUEÚD_EDGE_WÚset_node_attributesÚD_NODE_VALUEÚD_NODE_WÚget_node_attributesÚvaluesÚ
isinstanceÚintÚ	TypeErrorr   r   ÚCLUSTER_EVAL_CACHE_SIZEr)   ÚPKEYÚ_clear_cacher   r   r   ÚitemsÚclearÚremove_nodes_from)'ÚGÚmax_sizer   r   r   ÚdÚrootÚt_GÚ
all_n_attrr   r+   ra   ÚleavesÚlvÚslotÚinnerÚx_nodeÚweight_of_xÚ
best_valueÚbest_partitionÚ	bp_bufferÚx_descendantsÚi_nodeÚjÚaÚbÚpart1Úpart2ÚpartÚvalueÚwÚbest_part_for_vlÚvlr    rL   r8   rA   rF   r2   s'     ``                             @@@@@@r   r   r      sa  ÿ€ ô^ �:Š:�a�=‰=Ü�kŠkÐBÓCÐCä�>Š>˜!×ÑØ"#§+¡+¤-Ô:¢-™$˜!°1¸±6—A¡-ˆDÑ:Ü�t“9 “>Ð!�>Ø˜‘7ˆDÜ˜1“+‰Cäœ$˜qŸw™w›-Ó(ˆDä—+’+˜aÓ&ˆCð Ñ˜kÑ1Ü˜!“ˆØÑÜ×"Ò" 6¬<¼ÔBÜ"ˆKØÑÜ×"Ò" 6¬<¼ÔBÜ"ˆKøàˆô ×'Ò'¨°Ó<×CÑCÓE€JÛˆÜ˜!œS×!Ó!Üð+Ø+6¨-°qð:óð ñ ô ˜Ó&ñó 'ðô
 ˜Ó&ôó 'ðô Ô&Ó'õFó (ðFõGô Ô&Ó'õBó (ðBò÷
;ô$ ‘˜“Ó€FÛˆØ ˆ�	‰	�"‰”dÑØ�|‰|˜BÑ Ñ,ˆØ&( T Fˆ�	‰	�"‰”dÑ˜DÑ!Ø#% $ ˆ�	‰	�"‰”dÑ˜AÓñ	 ð !ŸYšYÓ:šY˜°6©/—!™YÔ:ˆØ!#ˆ�	‰	�%ÑœÑØ�|‰|˜EÑ" ;Ñ/ˆØ).¨ yˆ�	‰	�%ÑœÑ˜tÓ$ñ ;ô ‡O‚O�CÔð Ù)¨#Ó.ˆØ—l‘l 6Ñ*¨;Ñ7ˆØˆ
ØˆØˆ	ÜŸš s¨FÓ3ˆÜ#ˆFÜ˜;¨°1©Ö5�Ü)¨!¨[Ö9‘D�A�qà §¡¨6Ñ!2´4Ñ!8Ó8Ø C§I¡I¨fÑ$5´dÑ$;Ó;ñ !àŸI™I fÑ-¬dÑ3°AÑ6�EØŸI™I fÑ-¬dÑ3°AÑ6�EÙ"7¸¸uÀfÈfÐVWÓ"X‘K�D˜%à 	Ó)¨Y°q©\¸!©_¸uÓ-Dà'+¨U {˜	 !™ð " UÕ*Ø%*˜
Ø)-šó' :ñ 6ð4 .7¯_©_Ö->Ñ)�Ñ)Ð$ bØ-=�—	‘	˜&Ñ!¤$Ñ'¨Ó*ñ .?à�O‰O×ñ; $ðB &4ˆ�	‰	�&Ñœ$Ñ Ñ"Ø×Ñ˜mÔ,à�T‹>ð —9‘9˜T‘?¤4Ñ(¨Ñ+Ð+ò] ùóM ;ùò~ ;s   Á(RÁ8RÉ=	RÊ
R)NN)Ú__doc__Úcopyr   Ú	functoolsr   Úrandomr   Únetworkxr   Únetworkx.utilsr   Ú__all__rj   ri   rm   rl   rt   rs   r   Ú_dispatchabler   r$   r-   r   Ú<module>rœ      sg   ðÙ Cå Ý Ý ã Ý .àÐ
 €à€Ø€Ø€Ø€Ø€ØÐ òð ×Ò˜]°}ÑEóF,ó FñF,r-   