ó žÃÒYc@ sîdZddlmZddlmZddlZddlZddlmZddlZ ddl Tdd d d d d dgZ e ddgƒZ idd6dd6dd6ZedƒZded„Zd„Zd„Zddd„Zdddd„Zde jfd„ƒYZd„Zdefd„ƒYZddd „Zddd!„Zddd"„Zddd#„Zd$Z e d%Z!e j"d&d'd(dƒe_e j"d&d)d(dƒe_e!j"d&d'd(dƒe_e!j"d&d)d(dƒe_dS(*sö Algorithms for finding optimum branchings and spanning arborescences. This implementation is based on: J. Edmonds, Optimum branchings, J. Res. Natl. Bur. Standards 71B (1967), 233–240. URL: http://archive.org/details/jresv71Bn4p233 iÿÿÿÿ(tdivision(tprint_functionN(t itemgetteri(t*tbranching_weighttgreedy_branchingtmaximum_branchingtminimum_branchingtmaximum_spanning_arborescencetminimum_spanning_arborescencetEdmondstmaxtmint branchingt arborescencesspanning arborescencetinficC s?tj|ƒdjgt|ƒD]}tjtjƒ^q ƒS(Nt(trandomtseedtjointrangetchoicetstringt ascii_letters(tLRtn((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt random_string;s cC s| S(N((tweight((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt _min_weight?scC s|S(N((R((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt _max_weightBsRc s)t‡‡fd†|jdtƒDƒƒS(s3 Returns the total weight of a branching. c3 s%|]}|djˆˆƒVqdS(iN(tget(t.0tedge(tattrtdefault(sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pys Jstdata(tsumtedgestTrue(tGR!R"((R!R"sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyREsc C s³|tkrtjdƒ‚n|dkr3t}nt}|d krQtƒ}ng|jdtƒD]*\}}}|||j||ƒf^qd}y&|j dt dddƒd|ƒWn-t k ré|j dt dƒd|ƒnXtj ƒ} | j |ƒtjjƒ} xšt|ƒD]Œ\} \}}} | || |krNqq| j|ƒdkriqqi}|d k rˆ| ||RURM(R'tnodes(sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt first_keyís i(R+t shortest_pathR5(R'R:R;ReR>RUR%((R'Rdsy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pytget_pathás2cB s8eZdZdd„Zd„Zddddd„ZRS( sW Edmonds algorithm for finding optimal branchings and spanning arborescences. cC s5||_t|_g|_td|ƒd|_dS(NRs_{0}(t G_originalR&tstoreR%Rttemplate(RER'R((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyRBüs   c C sa|tkrtjdƒ‚n||_||_||_||_|dkr^t|_}n t |_}|dkrƒt ƒ}n||_ t ƒ|_}xgt|jjdtƒƒD]J\}\}} } i|| j||ƒƒ|6} |j|| || q¸Wd|_t ƒ|_i|j_g|_g|_tjjƒ|_g|_g|_dS(NsUnknown value for `kind`.R R#i(R*R+R,R!R"R9tstyleRttransRR.Rt_attrR@R'R5RhR%R&RR7tlevelR<RDtgraphst branchingsR3R4R=tcircuitstminedge_circuit( RER!R"R9RkRlR'R(R:R;R#RY((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt_init s0          1     RiR R c% sÔ|jˆ|||ƒ|j}|j|j‰}tgƒ}ttˆjƒƒƒ}|j‰ˆj } ‡‡fd†} xt rûyt |ƒ} Wn©t k r>t ˆƒt |ƒksÁt‚t |ƒrât|ƒsât‚n|jr:|jjˆjƒƒ|jj|jƒƒ|jjgƒ|jjd ƒnPnX| |krQq}n|j| ƒ|j| ƒ| | ƒ\} } | d krq}q}| d}|||| krÙt|| |ƒ\}}|j| dƒn d \}}|jdkr | dkr t}nt }|r}i| ˆ6}|j|| d| d|t ˆ|| | dd<|j|| ƒ|d k røt}d }i}xS|D]K}|j |\}} }|ˆ}||| <||krŽ|}|}qŽqŽW|jj|ƒ|jj|ƒ|jr|jjˆjƒƒn|jj|jƒƒ|j!j"|j#ƒ}ˆj|ƒg}xψj$dt dt ƒD]µ\}} }}||krÎ| |kr¦qvq+|jƒ}|j|| ||fƒqv| |krv|ˆ}|||| 7}|jƒ}||ˆ<|j||||fƒqvqvqvWˆj%|ƒ|j%|ƒ|j&t|ƒƒxl|D]d\}} }}ˆj|| ||d|krc|d=|j|| |||j|| ƒqcqcWttˆjƒƒƒ}|j#d 7_#qøq}q}W|j'j(ƒ}d „}t|j|j#j ƒ}x&|j#dkrU|j#d 8_#|j!j"|j#ƒ}|j|j#} ||j|j#d ||ƒ\}!}"|j)| ƒ|!rá|j|j#}|d krÑt*‚n|j+|ƒq0|j|j#‰ˆj |"d }#x@| D],}"ˆj |"\}} }| |#kr Pq q Wt*d ƒ‚|j+|"ƒq0W||_$|j,|j'ƒx^|D]V}"|jdj |"\}} }$i|j-|$|j.ƒ|j.6}|j|| |qvW|S(sm Returns a branching from G. Parameters ---------- attr : str The edge attribute used to in determining optimality. default : float The value of the edge attribute used if an edge does not have the attribute `attr`. kind : {'min', 'max'} The type of optimum to search for, either 'min' or 'max'. style : {'branching', 'arborescence'} If 'branching', then an optimal branching is found. If `style` is 'arborescence', then a branching is found, such that if the branching is also an arborescence, then the branching is an optimal spanning arborescences. A given graph G need not have an optimal spanning arborescence. Returns ------- H : (multi)digraph The branching. c szd}t }x`ˆj|dtdtƒD]C\}}}}|ˆ}||kr)|}||||f}q)q)W||fS(sO Find the edge directed toward v with maximal weight. R#RMN(R.tINFtin_edgesR&(R;R RR:RVR(R#t new_weight(R'R!(sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt desired_edgeds.  iiR R(t candidateR#RMicS s|||kr$tdj|ƒƒ‚nxQ|j|D]8}x/|j||D]}||krJt|fSqJWq2WtdfSdS(s½ Returns True if `u` is a root node in G. Node `u` will be a root node if its in-degree, restricted to the specified edges, is equal to 0. s{0!r} not in GN(RRRSRHR-R&R.(R'R:tedgekeysR;tedgekey((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pytis_roots  s+Couldn't find edge incoming to merged node.N(NN(/RsR=R'R<RGtiterRcRdRmRHR&tnextt StopIterationtlentAssertionErrort is_branchingRiRotappendtcopyRpRqRrR.taddtadd_nodeRgRkR-R7R8RtRDRjRSRnR%RPtdifference_updateRhRQRJRRtremoveR2RlR!(%RER!R"R9RkR=R<tDRdtG_predRwR;R RR:tQ_nodestQ_edgest acceptabletddt minweighttminedgetQ_incoming_weighttedge_keyR#R?tnew_nodet new_edgesR(tHR{R%t merged_nodetcircuittisrootRzttargetRY((R'R!sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt find_optimum?sä                        +                     N(R`RaRbR.RBRsR™(((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyR ÷s 6cC s.t|ƒ}|j||ddddƒ}|S(NR9R RkR (R R™(R'R!R"tedR<((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyRYs cC s.t|ƒ}|j||ddddƒ}|S(NR9R RkR (R R™(R'R!R"RšR<((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyR^s cC sUt|ƒ}|j||ddddƒ}t|ƒsQd}tjj|ƒ‚n|S(NR9R RkRs&No maximum spanning arborescence in G.(R R™tis_arborescenceR+t exceptionR,(R'R!R"RšR<tmsg((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyRcs   cC sUt|ƒ}|j||ddddƒ}t|ƒsQd}tjj|ƒ‚n|S(NR9R RkRs&No minimum spanning arborescence in G.(R R™R›R+RœR,(R'R!R"RšR<R((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyR ks   s_ Returns a {kind} {style} from G. Parameters ---------- G : (multi)digraph-like The graph to be searched. attr : str The edge attribute used to in determining optimality. default : float The value of the edge attribute used if an edge does not have the attribute `attr`. Returns ------- B : (multi)digraph-like A {kind} {style}. sV Raises ------ NetworkXException If the graph does not contain a {kind} {style}. R9tmaximumRktminimum(#Rbt __future__RRRRtoperatorRtnetworkxR+t recognitiont__all__RGR*tSTYLEStfloatRtR.RRRRRt MultiDiGraphR@RgtobjectR RRRR tdocstring_branchingtdocstring_arborescenceRS(((sy/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tree/branchings.pyt sJ         LI ÿc