ó žÃÒYc@szddlTddlmZmZmZddlZejZej Z d„Z de fd„ƒYZ dd d„ƒYZdS( iÿÿÿÿ(t*(tchaint combinationstproductNcCs2||f|kr |||fS|||fSdS(N((t dictionarytn1tn2((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pytget_pair st TestTreeLCAcBsžeZd„Zed„ƒZd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„ZRS(cCs)tjƒ|_d d d d ddg}|jj|ƒtt|jdƒƒ|_tg|jD]}||f|f^q_ƒ}|jtd„tdd ƒDƒƒƒ|jidd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6ƒ||_ dS(Niiiiiiicss!|]}d|fdfVqdS(iN((t.0ti((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys si(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii( tnxtDiGraphtDGtadd_edges_fromtdictttree_all_pairs_lcatanstupdatetrangetgold(tselftedgestnR((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pytsetUps,.& cCsSxLd„t||ƒDƒD]1\}}tt|||ƒt|||ƒƒqWdS(Ncss'|]}t|ƒt|ƒfVqdS(N(tmintmax(R tpair((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys -s(Rt assert_equalR(td1td2tatb((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pytassert_has_same_pairs+s&cCs#ttt|jƒƒ|jƒdS(s Specifying the root is optional.N(RRRR R(R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor10scCs]dddg}tt|jd|ƒƒ}td|koBd |kƒtt|ƒdƒdS( s2Specifying only some pairs gives only those pairs.iiiN(ii(ii(ii(ii(ii(RRR t assert_trueRtlen(Rt test_pairsR((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor24scCsZtt|jdƒd„|jDƒƒ}tt|jd|ƒƒ}|j||jƒdS(s+Specifying no pairs same as specifying all.icss|]}||fVqdS(N((R tnode((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys >siN(RRR RRR!R(Rt all_pairsR((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor3;scCs,tt|jƒƒ}|j|j|ƒdS(sGives the right answer.N(RRR R!R(RR((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor4CscCsTttjƒƒ}ttjt|ƒt|jddgƒ}ttjt|ƒdS(s Handles invalid input correctly.tpairsiÿÿÿÿiþÿÿÿN(iÿÿÿÿiþÿÿÿ(RR R t assert_raisestNetworkXPointlessConcepttlistR t NodeNotFound(Rt empty_digraphtbad_pairs_digraph((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor5HscCsKtt|jdƒƒ}td„|jjƒDƒƒ}|j||ƒdS(sWorks on subtrees.icss7|]-\}}td„|Dƒƒr||fVqdS(css|]}|dkVqdS(iiiN(iii((R R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys TsN(tall(R Rtlca((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys Ss N(RRR RtitemsR!(RRR((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor6PscCs©tjƒ}|jdƒtidd6tt|ƒƒƒ|jdƒtidd6tt|dƒƒƒtidd6tt|dƒƒƒttjtt|ƒƒdS(sWorks on disconnected nodes.iiN(ii(ii(ii( R R tadd_nodeRRRR,t NetworkXErrorR.(RtG((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor7Ws    ##cCs`tjddgƒ}ttjtt|ƒƒtjddgƒ}ttjtt|ƒƒdS( s"Raises right errors if not a tree.iiiN(ii(ii(ii(ii(R R R,R8R.R(RR9((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor8cscCsctdddgƒ}tt|jd|ƒƒ}td|koHd |kƒtt|ƒdƒdS( s/Test that pairs works correctly as a generator.iiiN(ii(ii(ii(ii(ii(titerRRR R#RR$(RR+t some_pairs((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt+test_tree_all_pairs_lowest_common_ancestor9lscCs/t|jddgƒ}ttjt|ƒdS(s.Test that pairs not in the graph raises error.iiÿÿÿÿN(iÿÿÿÿiÿÿÿÿ(RR R,R R/R.(RR4((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt,test_tree_all_pairs_lowest_common_ancestor10sscCsWtjdgƒ}ttjtt|ƒƒttjtt|jd|j ƒƒƒdS(s6Test that None as a node in the graph raises an error.iR+N(Ni( R R tNoneR,R8R.RR/R R(RR9((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt,test_tree_all_pairs_lowest_common_ancestor11xs cCs2tjddgƒ}ttjtt|ƒƒdS(s%Test that tree routine bails on DAGs.iiiN(ii(ii(R R R,R8R.R(RR9((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt,test_tree_all_pairs_lowest_common_ancestor12scCsîtj}tjdgƒ}t|t|ƒt|t|ƒt|tj|ddƒtjdgƒ}t|t|ƒt|t|ƒt|tj|ddƒtjdgƒ}t|t|ƒt|t|ƒt|tj|ddƒdS(Nii(ii(ii(ii( R tNetworkXNotImplementedtGraphR,Rt all_pairs_lcatlowest_common_ancestort MultiGrapht MultiDiGraph(RtNNIR9((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyttest_not_implemented_for„s cCs?tjƒ}|jdƒtt|ƒƒ}t|dgƒdS(s3Test that it works on non-empty trees with no LCAs.iN(ii((iii(R R R7R.RR(RR9R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt,test_tree_all_pairs_lowest_common_ancestor13“s  (t__name__t __module__Rt staticmethodR!R"R&R)R*R2R6R:R;R>R?RARBRJRK(((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyRs             t TestDAGLCAcBs‰eZd„Zdd„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „ZRS(cCsÂtjƒ|_tj|jd ƒtj|jd ƒtj|jdƒtj|jdƒ|jjddƒ|jjd dƒtj|jd dƒ|_i$dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6d d6d d6dd6dd 6dd!6dd"6d d#6dd$6dd%6dd&6dd'6dd(6dd)6dd*6dd+6dd,6dd-6dd.6dd/6dd06d d16d d26dd36|_|jjd „|jDƒƒdS(4Niiiiiiiiitsourcecss!|]}d|fdfVqdS(iN((R R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys Ës(iiii(iii(iiiii(iii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii( R R R tadd_pathtadd_edgetshortest_path_lengtht root_distanceRR(R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyRœsZ  c CsÛ|dkr!|j}|j}n_g|jD]\}}|dkr+|^q+}t|ƒdksgt‚tj|d|dƒ}xTd„t||ƒDƒD]9\}} t |t ||| ƒ|t ||| ƒƒqšWdS(sChecks if d1 and d2 contain the same pairs and have a node at the same distance from root for each. If G is None use self.DG.iiRPcss'|]}t|ƒt|ƒfVqdS(N(RR(R R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pys ÙsN( R@R RTt in_degreeR$tAssertionErrorR RSRRR( RRRR9RTRtdegtrootsRR ((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pytassert_lca_dicts_sameÍs   .&cCs&|jtt|jƒƒ|jƒdS(sProduces the correct results.N(RYRRER R(R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt&test_all_pairs_lowest_common_ancestor1ÝscCsYtt|jjƒ|jjƒƒƒ}t|jd|ƒ}|jt|ƒ|jƒdS(s2Produces the correct results when all pairs given.R+N(R.RR tnodesRERYRR(RR(R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt&test_all_pairs_lowest_common_ancestor2ás'cCsSt|jjƒ|jjƒƒ}t|jd|ƒ}|jt|ƒ|jƒdS(sAProduces the correct results when all pairs given as a generator.R+N(RR R[RERYRR(RR(R((sŒ/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/tests/test_lowest_common_ancestors.pyt&test_all_pairs_lowest_common_ancestor3çs!cCsÍ|jjƒ}|jddƒ|jddƒ|jjƒ}d|ds     Š