§
    bŠtj³  ã                   óž   — d Z ddlmZ ddlmZ ddlmZ ddlZddl	m
Z
 dgZdZd	ZdZd
ZdZdZd„ Z ej        dd¬¦  «        dd„¦   «         ZdS )z=Lukes Algorithm for exact optimal weighted tree partitioning.é    )Údeepcopy)Ú	lru_cache)ÚchoiceN)Únot_implemented_forÚlukes_partitioningÚweightg      ð?é   Ú
partitionsi   c              #   óX   K  — | |k    sJ ‚t          || dz   ¦  «        D ]}|| |z
  fV — Œd S )Nr	   )Úrange)ÚnÚmin_size_of_first_partÚp1s      úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/networkx/algorithms/community/lukes.pyÚ_split_n_fromr      sY   è è € ð Ð&Ò&Ð&Ð&Ð&ÝÐ*¨A°©EÑ2Ô2ð ð ˆØ�!�b‘&ˆjÐÐÐÐðð ó    Únode_weightÚedge_weight)Ú
node_attrsÚ
edge_attrsc           
      óV	  ‡‡‡‡‡ ‡!‡"‡#‡$— t          j        | ¦  «        st          j        d¦  «        ‚t          j        | ¦  «        rKd„ |                      ¦   «         D ¦   «         }t          |¦  «        dk    sJ ‚|d         }t          | ¦  «        }n6t          t          | j	        ¦  «        ¦  «        }t          j
        | |¦  «        }‰�‰€bt          | ¦  «        Š$‰€'t          j        ‰$t          t          ¦  «         t          Š‰€'t          j        ‰$t          t           ¦  «         t           Šn| Š$t          j        ‰$‰¦  «                             ¦   «         }|D ]*}t'          |t(          ¦  «        st+          d‰› d�¦  «        ‚Œ+t-          d¦  «        d	„ ¦   «         Št-          d¦  «        ˆfd
„¦   «         }t/          t0          ¦  «        ˆˆ$fd„¦   «         Š ˆ fd„Š!t/          t0          ¦  «        ˆˆ$fd„¦   «         Š"d„ Šˆˆ!ˆ"fd„}	t3           ‰|¦  «        ¦  «        Š#‰#D ]d}
i |j	        |
         t4          <   ‰$j	        |
         ‰         }|
hg|j	        |
         t4                   |<   |
hg|j	        |
         t4                   d<   Œeˆ#fd„|j	        D ¦   «         D ]G}i |j	        |         t4          <   ‰$j	        |         ‰         }|hg|j	        |         t4                   |<   ŒHt          j        |¦  «         	  ||¦  «        }‰$j	        |         ‰         }d}d}i }t          j        ||¦  «        }|D �]%}t;          ||dz   ¦  «        D ]Â}t=          ||¦  «        D ]¯\  }}||j	        |         t4                   vs||j	        |         t4                   vrŒ:|j	        |         t4                   |         }|j	        |         t4                   |         } |	|||||¦  «        \  }}||vs||         d         |k     r||f||<   ||k    r|}|}Œ°ŒÃ|                     ¦   «         D ]#\  }\  }}||j	        |         t4                   |<   Œ$|                      ¦   «          �Œ'||j	        |         t4                   d<   | !                    |¦  «         ||k    r|j	        |         t4                   d         S �Œ¸)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 treesc                 ó$   — g | ]\  }}|d k    ¯|‘ŒS )r   © )Ú.0r   Úds      r   ú
<listcomp>z&lukes_partitioning.<locals>.<listcomp>O   s!   € Ð:Ð:Ð:™$˜!˜Q°1¸²6°6�A°6°6°6r   r	   r   Nz9lukes_partitioning needs integer values for node_weight (ú)Ú
undirectedc              3   óP   K  — | j         D ]}t          j        | |¦  «        s|V — Œd S ©N)ÚnodesÚnxÚdescendants)ÚgrÚxs     r   Ú_leavesz#lukes_partitioning.<locals>._leavesv   sA   è è € ð ”ð 	ð 	ˆAÝ”> " aÑ(Ô(ð Ø���øð	ð 	r   c                 óÒ   •‡— t           ‰| ¦  «        ¦  «        Št          | j        ¦  «        ‰z
  D ]4}t          ˆfd„t          j        | |¦  «        D ¦   «         ¦  «        r|c S Œ5d S )Nc              3   ó    •K  — | ]}|‰v V — Œ	d S r    r   )r   r%   Útleavess     €r   ú	<genexpr>zGlukes_partitioning.<locals>._a_parent_of_leaves_only.<locals>.<genexpr>�   s'   øè è € Ð?Ð? A�1˜�<Ð?Ð?Ð?Ð?Ð?Ð?r   )Úsetr!   Úallr"   r#   )r$   r   r)   r&   s     @€r   Ú_a_parent_of_leaves_onlyz4lukes_partitioning.<locals>._a_parent_of_leaves_only}   s~   øø€ å�g�g˜b‘k”kÑ"Ô"ˆÝ�R”X‘” Ñ(ð 	ð 	ˆAÝÐ?Ð?Ð?Ð?­¬¸¸AÑ)>Ô)>Ð?Ñ?Ô?Ñ?Ô?ð Ø���ðð	ð 	r   c                 ód   •‡ — ˆ fd„‰j         D ¦   «         }t          ˆˆfd„|D ¦   «         ¦  «        S )Nc                 ó<   •— g | ]}|d          ‰v ¯|d         ‰v ¯|‘ŒS )r   r	   r   )r   ÚeÚclusters     €r   r   zAlukes_partitioning.<locals>._value_of_cluster.<locals>.<listcomp>†   s.   ø€ ÐVÐVÐV˜Q°!°A´$¸'°/°/ÀaÈÄdÈgÀoÀo�qÀoÀoÀor   c              3   ó>   •K  — | ]}‰j         |         ‰         V — Œd S r    )Úedges)r   r0   r   Úsafe_Gs     €€r   r*   z@lukes_partitioning.<locals>._value_of_cluster.<locals>.<genexpr>‡   s.   øè è € ÐEÐE°A�6”< ”? ;Ô/ÐEÐEÐEÐEÐEÐEr   )r3   Úsum)r1   Úvalid_edgesr   r4   s   ` €€r   Ú_value_of_clusterz-lukes_partitioning.<locals>._value_of_cluster„   sE   øø€ àVÐVÐVÐV &¤,ÐVÑVÔVˆÝÐEÐEÐEÐEÐE¸ÐEÑEÔEÑEÔEÐEr   c                 ó:   •— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3   óH   •K  — | ]} ‰t          |¦  «        ¦  «        V — Œd S r    )Ú	frozenset)r   Úcr7   s     €r   r*   zBlukes_partitioning.<locals>._value_of_partition.<locals>.<genexpr>Š   s5   øè è € ÐFÐF°qÐ$Ð$¥Y¨q¡\¤\Ñ2Ô2ÐFÐFÐFÐFÐFÐFr   ©r5   )Ú	partitionr7   s    €r   Ú_value_of_partitionz/lukes_partitioning.<locals>._value_of_partition‰   s&   ø€ ÝÐFÐFÐFÐF¸IÐFÑFÔFÑFÔFÐFr   c                 ó<   •— t          ˆˆfd„| D ¦   «         ¦  «        S )Nc              3   ó>   •K  — | ]}‰j         |         ‰         V — Œd S r    )r!   )r   r   r   r4   s     €€r   r*   zAlukes_partitioning.<locals>._weight_of_cluster.<locals>.<genexpr>Ž   s.   øè è € ÐAÐA°A�6”< ”? ;Ô/ÐAÐAÐAÐAÐAÐAr   r<   )r1   r   r4   s    €€r   Ú_weight_of_clusterz.lukes_partitioning.<locals>._weight_of_clusterŒ   s)   ø€ åÐAÐAÐAÐAÐA¸ÐAÑAÔAÑAÔAÐAr   c                 óZ   ‡— ˆfd„| D ¦   «         }t          |¦  «        dk    sJ ‚|d         S )Nc                 ó   •— g | ]}‰|v ¯|‘Œ	S r   r   )r   r;   Únodes     €r   r   z6lukes_partitioning.<locals>._pivot.<locals>.<listcomp>‘   s   ø€ Ð1Ð1Ð1�Q t¨q y yˆq y y yr   r	   r   )Úlen)r=   rD   Úccxs    ` r   Ú_pivotz"lukes_partitioning.<locals>._pivot�   s8   ø€ Ø1Ð1Ð1Ð1˜)Ð1Ñ1Ô1ˆÝ�3‰xŒx˜1Š}ˆ}ˆ}ˆ}Ø�1Œvˆr   c                 ój  •‡
‡—  ‰| |¦  «        Š ‰||¦  «        Š
‰                      ‰
¦  «        } ‰t          |¦  «        ¦  «        |k    rVt          t          ˆfd„| ¦  «        ¦  «        }t          t          ˆ
fd„|¦  «        ¦  «        }|g|z   |z   }| ‰|¦  «        fS | |z   }	|	 ‰|	¦  «        fS )Nc                 ó   •— | ‰k    S r    r   )r%   rF   s    €r   ú<lambda>zClukes_partitioning.<locals>._concatenate_or_merge.<locals>.<lambda>�   ó   ø€ ¨¨Sª€ r   c                 ó   •— | ‰k    S r    r   )r%   Úccis    €r   rJ   zClukes_partitioning.<locals>._concatenate_or_merge.<locals>.<lambda>ž   rK   r   )Úunionr:   ÚlistÚfilter)Úpartition_1Úpartition_2r%   ÚiÚ
ref_weightÚ	merged_xiÚcp1Úcp2Úoption_2Úoption_1rM   rF   rG   r>   rA   s             @@€€€r   Ú_concatenate_or_mergez1lukes_partitioning.<locals>._concatenate_or_merge•   sá   øøø€ Øˆf�[ !Ñ$Ô$ˆØˆf�[ !Ñ$Ô$ˆØ—I’I˜c‘N”Nˆ	ð Ð�i¨	Ñ2Ô2Ñ3Ô3°zÒAÐAÝ•vÐ0Ð0Ð0Ð0°+Ñ>Ô>Ñ?Ô?ˆCÝ•vÐ0Ð0Ð0Ð0°+Ñ>Ô>Ñ?Ô?ˆCà!�{ SÑ(¨3Ñ.ˆHØÐ0Ð0°Ñ:Ô:Ð:Ð:à" [Ñ0ˆHØÐ0Ð0°Ñ:Ô:Ð:Ð:r   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   r%   Úleavess     €r   r   z&lukes_partitioning.<locals>.<listcomp>®   s   ø€ Ð:Ð:Ð:˜¨!°6¨/¨/�!¨/¨/¨/r   )"r"   Úis_treeÚNotATreeÚis_directedÚ	in_degreerE   r   r   rO   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   ÚrootÚt_GÚ
all_n_attrr%   r-   rZ   Ú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&   rG   r7   r>   rA   r\   r4   s%     ``                          @@@@@@@r   r   r      su  øøøøøøøøø€ õ^ Œ:�a‰=Œ=ð 'ÝŒkÐBÑCÔCÐCåŒ>˜!ÑÔð 	'Ø:Ð: !§+¢+¡-¤-Ð:Ñ:Ô:ˆDÝ�t‘9”9 ’>�>�>�>Ø˜”7ˆDÝ˜1‘+”+ˆCˆCå�$˜qœw™-œ-Ñ(Ô(ˆDå”+˜a Ñ&Ô&ˆCð Ð˜kÐ1Ý˜!‘”ˆØÐÝÔ" 6­<½ÑBÔBÐBÝ"ˆKØÐÝÔ" 6­<½ÑBÔBÐBÝ"ˆKøàˆõ Ô'¨°Ñ<Ô<×CÒCÑEÔE€JØð ð ˆÝ˜!�SÑ!Ô!ð 	Ýð:Ø+6ð:ð :ð :ñô ð ð	õ ˜Ñ&Ô&ðð ñ 'Ô&ðõ
 ˜Ñ&Ô&ðð ð ð ñ 'Ô&ðõ Õ&Ñ'Ô'ðFð Fð Fð Fð Fñ (Ô'ðFðGð Gð Gð Gð Gõ Õ&Ñ'Ô'ðBð Bð Bð Bð Bñ (Ô'ðBðð ð ð
;ð ;ð ;ð ;ð ;ð ;ð ;õ$ ��˜‘”ÑÔ€FØð (ð (ˆØ ˆŒ	�"Œ•dÑØŒ|˜BÔ Ô,ˆØ&( T FˆŒ	�"Œ•dÔ˜DÑ!Ø#% $ ˆŒ	�"Œ•dÔ˜AÑÐà:Ð:Ð:Ð:˜SœYÐ:Ñ:Ô:ð 1ð 1ˆØ!#ˆŒ	�%Ô�ÑØŒ|˜EÔ" ;Ô/ˆØ).¨ yˆŒ	�%Ô�Ô˜tÑ$Ð$Ý„O�CÑÔÐð.,Ø)Ð)¨#Ñ.Ô.ˆØ”l 6Ô*¨;Ô7ˆØˆ
ØˆØˆ	Ýœ s¨FÑ3Ô3ˆØ#ð 	ñ 	ˆFÝ˜;¨°1©Ñ5Ô5ð .ð .�Ý)¨!¨[Ñ9Ô9ð .ð .‘D�A�qà ¤¨6Ô!2µ4Ô!8Ð8Ð8Ø C¤I¨fÔ$5µdÔ$;Ð;Ð;ð !àœI fÔ-­dÔ3°AÔ6�EØœI fÔ-­dÔ3°AÔ6�EØ"7Ð"7¸¸uÀfÈfÐVWÑ"XÔ"X‘K�D˜%à 	Ð)Ð)¨Y°q¬\¸!¬_¸uÒ-DÐ-Dà'+¨U {˜	 !™ð " UÒ*Ð*Ø%*˜
Ø)-˜øð'.ð2 .7¯_ª_Ñ->Ô->ð >ð >Ñ)�Ñ)Ð$ bØ-=�”	˜&Ô!¥$Ô'¨Ñ*Ð*Ø�OŠOÑÔÐÑð &4ˆŒ	�&Ô�$Ô Ñ"Ø×Ò˜mÑ,Ô,Ð,à�TŠ>ˆ>ð ”9˜T”?¥4Ô(¨Ô+Ð+ñ].,r   )NN)Ú__doc__Úcopyr   Ú	functoolsr   Úrandomr   Únetworkxr"   Únetworkx.utilsr   Ú__all__rd   rc   rg   rf   rn   rm   r   Ú_dispatchabler   r   r   r   ú<module>r”      sÙ   ðØ CÐ Cà Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .àÐ
 €à€Ø€Ø€Ø€Ø€ØÐ ðð ð ð €Ô˜]°}ÐEÑEÔEðF,ð F,ð F,ñ FÔEðF,ð F,ð F,r   