o
    3ήc(                     @   sX   d dl mZmZmZ d dlZd dlZejZej	Z
dd ZG dd dZG dd dZdS )	    )chaincombinationsproductNc                 C   s$   ||f| v r| ||f S | ||f S N )
dictionaryn1n2r   r   ]/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/tests/test_lowest_common_ancestors.pyget_pair   s   r   c                   @   s   e Zd Zedd Zedd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) TestTreeLCAc                 C   s   t  | _g d}| j| tt| jd| _dd | jD }|dd tddD  |dddddddddddddddd	 || _	d S )
N)r      r      r      r      r      r      r   c                 S   s   i | ]}||f|qS r   r   .0nr   r   r
   
<dictcomp>       z+TestTreeLCA.setup_class.<locals>.<dictcomp>c                 S   s   i | ]}d |fd qS r   r   )r   ir   r   r
   r      r   r      r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
nxDiGraphDGadd_edges_fromdicttree_all_pairs_lcaansupdaterangegold)clsedgesr5   r   r   r
   setup_class   s2   

zTestTreeLCA.setup_classc                 C   s>   dd t | |D D ]\}}t| ||t|||ksJ q
d S )Nc                 s        | ]}t |t|fV  qd S r   minmaxr   pairr   r   r
   	<genexpr>3       z4TestTreeLCA.assert_has_same_pairs.<locals>.<genexpr>)r   r   )d1d2abr   r   r
   assert_has_same_pairs1   s   z!TestTreeLCA.assert_has_same_pairsc                 C   s   t t| j| jksJ d S r   )r0   r1   r.   r2   selfr   r   r
   $test_tree_all_pairs_lca_default_root6      z0TestTreeLCA.test_tree_all_pairs_lca_default_rootc                 C   sB   g d}t t| jd|}d|v rd|v sJ t|dksJ d S N)r   r   r   r   r   r   rK   r   )r0   r1   r.   len)rG   
test_pairsr2   r   r   r
   %test_tree_all_pairs_lca_return_subset9   s   z1TestTreeLCA.test_tree_all_pairs_lca_return_subsetc                 C   sB   t t| jddd | jD }tt| jd|}| || j d S )Nr   c                 s   s    | ]}||fV  qd S r   r   )r   noder   r   r
   r?   @       z6TestTreeLCA.test_tree_all_pairs_lca.<locals>.<genexpr>r   )r   r   r.   r0   r1   rE   r2   rG   	all_pairsr2   r   r   r
   test_tree_all_pairs_lca?   s   z#TestTreeLCA.test_tree_all_pairs_lcac                 C   s    t t| j}| | j| d S r   )r0   r1   r.   rE   r5   )rG   r2   r   r   r
    test_tree_all_pairs_gold_exampleE   s   z,TestTreeLCA.test_tree_all_pairs_gold_examplec                 C   s@   t t }ttjt| t | jdgd}ttjt| d S )N)pairs)	r1   r,   r-   pytestraisesNetworkXPointlessConceptlistr.   NodeNotFound)rG   empty_digraphbad_pairs_digraphr   r   r
   %test_tree_all_pairs_lca_invalid_inputI   s   z1TestTreeLCA.test_tree_all_pairs_lca_invalid_inputc                 C   s4   t t| jd}dd | j D }| || d S )Nr   c                 S   s(   i | ]\}}t d d |D r||qS )c                 s   s    | ]}|d v V  qdS ))r   r   r   Nr   r   r   r   r
   r?   U   rP   zJTestTreeLCA.test_tree_all_pairs_lca_subtrees.<locals>.<dictcomp>.<genexpr>)all)r   r>   lcar   r   r
   r   R   s    z@TestTreeLCA.test_tree_all_pairs_lca_subtrees.<locals>.<dictcomp>)r0   r1   r.   r5   itemsrE   )rG   r2   r5   r   r   r
    test_tree_all_pairs_lca_subtreesP   s
   z,TestTreeLCA.test_tree_all_pairs_lca_subtreesc                 C   s   t  }|d dditt|ksJ |d dditt|dks'J dditt|dks4J tt jtt| d S )Nr   r   r   r   )r   r   )	r,   r-   add_noder0   r1   rY   rZ   NetworkXErrorr\   rG   Gr   r   r
   *test_tree_all_pairs_lca_disconnected_nodesY   s   

z6TestTreeLCA.test_tree_all_pairs_lca_disconnected_nodesc                 C   sH   t ddg}tt jtt| t ddg}tt jtt| d S )Nr!   r   r   r   r,   r-   rY   rZ   rg   r\   r1   rh   r   r   r
   /test_tree_all_pairs_lca_error_if_input_not_treed   s   z;TestTreeLCA.test_tree_all_pairs_lca_error_if_input_not_treec                 C   sF   t g d}tt| jd|}d|v rd|v sJ t|dks!J d S rJ   )iterr0   r1   r.   rL   )rG   rX   
some_pairsr   r   r
   !test_tree_all_pairs_lca_generatorl   s   z-TestTreeLCA.test_tree_all_pairs_lca_generatorc                 C   sD   t | jddg}ttjt| t | jd dg}ttjt| d S )Nr   rU   rU   )r1   r.   rY   rZ   r,   r]   r\   )rG   rb   r   r   r
   3test_tree_all_pairs_lca_nonexisting_pairs_exceptionr   s   z?TestTreeLCA.test_tree_all_pairs_lca_nonexisting_pairs_exceptionc                 C   s&   t ddg}tt jtt| d S )Nr&   )r   r   rl   rh   r   r   r
   -test_tree_all_pairs_lca_routine_bails_on_DAGsy   s   z9TestTreeLCA.test_tree_all_pairs_lca_routine_bails_on_DAGsc                 C   s  t j}t dg}t| tt| W d    n1 sw   Y  t| tt| W d    n1 s:w   Y  t|t j|dd t 	dg}t| tt| W d    n1 sew   Y  t| tt| W d    n1 sw   Y  t|t j|dd t 
dg}t| tt| W d    n1 sw   Y  t| tt| W d    n1 sw   Y  t|t j|dd d S )Nr   r   r   )r,   NetworkXNotImplementedGraphrY   rZ   nextr1   all_pairs_lcalowest_common_ancestor
MultiGraphMultiDiGraph)rG   NNIri   r   r   r
   'test_tree_all_pairs_lca_not_implemented}   s2   z3TestTreeLCA.test_tree_all_pairs_lca_not_implementedc                 C   0   t  }|d tt|}|dgksJ d S Nr   )r   r   r   )r,   r-   rf   r\   r1   rG   ri   r2   r   r   r
   *test_tree_all_pairs_lca_trees_without_LCAs      
z6TestTreeLCA.test_tree_all_pairs_lca_trees_without_LCAsN)__name__
__module____qualname__classmethodr8   staticmethodrE   rH   rN   rS   rT   r`   rd   rj   rm   rp   rr   rs   r|   r   r   r   r   r
   r      s$    

	r   c                   @   s   e Zd Zedd Zd"ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! ZdS )#
TestDAGLCAc                 C   sl  t  | _t | jd t | jd t | jd t | jd | jdd | jdd t j| jdd	| _i d
dddddddddddddddddddddddddddddddddi ddd dd!dd"d#d$dd%dd&dd'dd(dd)dd*dd+dd,dd-dd.dd/dd0ddd#d1| _| jd2d3 | jD  d S )4N)r   r   r   r   )r   r   r   )r   r   r      r   )r   r    r   r   r   r    r   sourcere   r   r!   r   r   r"   r#   )r   r    )r   r   )r   r   r$   r%   r   r   r   )r   r    )r   r   r   r   r&   r   r'   r(   )r   r    )r   r   r   )r   r   r)   r*   )r   r    )r   r   )r   r   r+   )r   r    )r   r   )r   r   )r   r    )r   r   )r    r    )r    r   )r   r   c                 s   s    | ]	}d |fd fV  qdS )r   Nr   r   r   r   r
   r?      s    z)TestDAGLCA.setup_class.<locals>.<genexpr>)	r,   r-   r.   add_pathadd_edgeshortest_path_lengthroot_distancer5   r3   )r6   r   r   r
   r8      s   
	
 !"#
&zTestDAGLCA.setup_classNc                 C   s   |du r| j }| j}ndd |jD }t|dksJ tj||d d}dd t||D D ]\}}|t||| |t||| ksDJ q.dS )	zChecks 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.Nc                 S   s   g | ]
\}}|d kr|qS r   r   )r   r   degr   r   r
   
<listcomp>   s    z4TestDAGLCA.assert_lca_dicts_same.<locals>.<listcomp>r   r   r   c                 s   r9   r   r:   r=   r   r   r
   r?      r@   z3TestDAGLCA.assert_lca_dicts_same.<locals>.<genexpr>)r.   r   	in_degreerL   r,   r   r   r   )rG   rA   rB   ri   r   rootsrC   rD   r   r   r
   assert_lca_dicts_same   s   z TestDAGLCA.assert_lca_dicts_samec                 C   s   |  tt| j| j d S r   )r   r0   rw   r.   r5   rF   r   r   r
   test_all_pairs_lca_gold_example   rI   z*TestDAGLCA.test_all_pairs_lca_gold_examplec                 C   s>   t t| j | j }t| j|d}| t|| j d S NrW   )r\   r   r.   nodesrw   r   r0   r5   rQ   r   r   r
   "test_all_pairs_lca_all_pairs_given   s   z-TestDAGLCA.test_all_pairs_lca_all_pairs_givenc                 C   s:   t | j | j }t| j|d}| t|| j d S r   )r   r.   r   rw   r   r0   r5   rQ   r   r   r
   test_all_pairs_lca_generator   s   z'TestDAGLCA.test_all_pairs_lca_generatorc                 C   s   | j  }|dd |dd | j }d|d< d|d< d|d< d|d< d|d< d|d	< d|d
< tt|}|dd |dd | ||| d S )N	   
   r   )r   r   r   r   )r   r   )r   r   )r   r   )r   r   )r   r   rU   r   )r.   copyr   r5   r0   rw   r   )rG   ri   r5   testingr   r   r
   -test_all_pairs_lca_input_graph_with_two_roots   s   

z8TestDAGLCA.test_all_pairs_lca_input_graph_with_two_rootsc                 C   s   t tjt| jdg d S )Nrq   )rY   rZ   r,   r]   rw   r.   rF   r   r   r
   .test_all_pairs_lca_nonexisting_pairs_exception   s   z9TestDAGLCA.test_all_pairs_lca_nonexisting_pairs_exceptionc                 C   s:   | j  }|d t|ddg}t|ddiksJ d S )NrU   rq   )rU   r   )r.   r   rf   rw   r0   )rG   ri   genr   r   r
   $test_all_pairs_lca_pairs_without_lca  s   

z/TestDAGLCA.test_all_pairs_lca_pairs_without_lcac                 C   s   t tjtt  d S r   )rY   rZ   r,   r[   rw   r-   rF   r   r   r
   test_all_pairs_lca_null_graph  s   z(TestDAGLCA.test_all_pairs_lca_null_graphc                 C   s   t tjttddg d S )Nr&   )r   r   )rY   rZ   r,   rg   rw   r-   rF   r   r   r
   test_all_pairs_lca_non_dags  s   z&TestDAGLCA.test_all_pairs_lca_non_dagsc                 C   r}   r~   )r,   r-   rf   r\   rw   r   r   r   r
   -test_all_pairs_lca_nonempty_graph_without_lca  r   z8TestDAGLCA.test_all_pairs_lca_nonempty_graph_without_lcac                 C   s.   t g d}tt|}t|dksJ d S )N)r   r!   r$   r   )r,   r-   r\   rw   rL   r   r   r   r
   test_all_pairs_lca_bug_gh4942  s   z(TestDAGLCA.test_all_pairs_lca_bug_gh4942c                 C   s2   t ddg}t }t j|dd|d|u sJ d S )Nr   rk   r   r   )default)r,   r-   objectrx   )rG   ri   sentinelr   r   r
    test_all_pairs_lca_default_kwarg  s   z+TestDAGLCA.test_all_pairs_lca_default_kwargc                 C   s,   t  }|d t |dddksJ d S )Nr   )r,   r-   rf   rx   rh   r   r   r
   test_all_pairs_lca_identity  s   
z&TestDAGLCA.test_all_pairs_lca_identityc                 C   s>   t  }|td |g d t |ddd ksJ d S )N   ))r   r   r!   )r   r   )r   r   )r   r   )   r   r)   )r   r   r   )r   r   )   r   )   r   )   r   r   )   r   )   r   r    r   )r,   r-   add_nodes_fromr4   r/   rx   rh   r   r   r
   test_all_pairs_lca_issue_4574#  s   z(TestDAGLCA.test_all_pairs_lca_issue_4574c                 C   s^   t  }|dd |dd |dd |dd |dd t |dddks-J d S )Nr   r   r   r   r   r   )r,   r-   r   rx   rh   r   r   r
   "test_all_pairs_lca_one_pair_gh4942=  s   z-TestDAGLCA.test_all_pairs_lca_one_pair_gh4942r   )r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r      s$    

3r   )	itertoolsr   r   r   rY   networkxr,   %tree_all_pairs_lowest_common_ancestorr1    all_pairs_lowest_common_ancestorrw   r   r   r   r   r   r   r
   <module>   s     