o
    3ήc"                     @   s|   d Z ddlZedZed ddl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 )z?Test trophic levels, trophic differences and trophic coherence
    Nnumpyscipyc                  C   sB   t  } | dd | dd t | }|ddddksJ dS )	zTrivial exampleabc         )r   r   r   N)nxDiGraphadd_edgetrophic_levels)Gd r   X/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/centrality/tests/test_trophic.pytest_trophic_levels   s
   
r   c                  C   s  t  } | jdddd | jdddd | jdddd | jdddd | jdd	d
d | jdddd | jdd	dd | jd	ddd |  }dd | jD }|D ]}| | qRt jj| j	}t
g dg dg dg dg}t
| |s}J t|jdksJ |jd |jd ksJ |jd t| ksJ |jd }t
|}t
j|| }t
|t
| }	t
g d}
t
|	|
sJ dddddd}t |}| D ]\}}|| }|tj|ddksJ qdS )zSExample from Figure 5 in Stephen Levine (1980) J. theor. Biol. 83,
    195-207
    r   r   g      ?)weightr	   皙?   g?   333333?333333?ffffff?c                 S   s   g | ]
\}}|d kr|qS )r   r   ).0nidr   r   r   r   
<listcomp>'   s    z.test_trophic_levels_levine.<locals>.<listcomp>)r   r   g        r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   gT @gq?g|kʚ@gT@gX[⎸@g|kʚ
@)r   r   r	   r   r   Hz>absN)r
   r   r   copy	in_degreeremove_nodelinalggraphmatrixadjacency_matrixTnparrayarray_equaltodenselenshapeeyeinvasarrayonesallcloser   itemspytestapprox)SS2zr   q
expected_qnniny
expected_y
expected_dr   levelexpected_levelr   r   r   test_trophic_levels_levine   sH   


rB   c                  C   sh   t ddgddgg} tj| tjd}t|}|d tjdddks%J |d tjdddks2J d S )Nr   r   create_usingr   r   r   )r'   r(   r
   from_numpy_arrayr   r   r3   r4   )matrix_ar   r   r   r   r   test_trophic_levels_simpleO   s
   
rG   c                  C   s   t g dg dg dg dg} tj| tjd}t|}g d}tdD ]}|| tj|| dd	ks7J q&t g d
g dg dg dg} tj| tjd}t|}g d}t	d| t	d| tdD ]}|| tj|| dd	ksyJ qhd S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   rC   )r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   g      @g      
@zCalculated result: zExpected Result: )
r'   r(   r
   rE   r   r   ranger3   r4   print)matrixr   r   expected_resultindr   r   r    test_trophic_levels_more_complexW   s2   
 


 rQ   c                  C   s   t g dg dg dg dg dg} t g dg dg dg d	g d
g}t t j|t d }tj| tjd}t	|}t
dD ]}|| tj|| ddksXJ qGd 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   r   r   r   )r         ?r         r   )r   r   r   r   r   )r   rY   r   r   rY   )r   r   r   r   r   r   rC   r   r   )r'   r(   ravelr#   r.   r0   r
   rE   r   r   rL   r3   r4   )rN   Kresult_1r   result_2rP   r   r   r   %test_trophic_levels_even_more_complexy   s(   
 r^   c                  C   sj   t d} tj| tjd}ttj}t| W d   n1 s#w   Y  d}|t	|j
v s3J dS )z;Should raise an error with graphs with only non-basal nodesr   rC   NTrophic levels are only defined for graphs where every node has a path from a basal node (basal nodes are nodes with no incoming edges).)r'   identityr
   rE   r   r3   raisesNetworkXErrorr   strvalue)rN   r   emsgr   r   r   #test_trophic_levels_singular_matrix   s   
rg   c                  C   s  t  } | dd | dd | dd | dd | dd tt j}t |  W d   n1 s8w   Y  d}|t|jv sHJ t  } | dd | dd | dd tt j}t |  W d   n1 stw   Y  d}|t|jv sJ dS )zShould fail to compute if there are any parts of the graph which are not
    reachable from any basal node (with in-degree zero).
    r   r   r   r   Nr_   )	r
   r   r   r3   ra   rb   r   rc   rd   )r   re   rf   r   r   r   'test_trophic_levels_singular_with_basal   s,   rh   c                  C   s  t ddgddgg} tj| tjd}t|}|d tjdddks%J t g dg dg d	g d
g}tj|tjd}t|}|d tjdddksPJ |d tjdddks]J |d tjdddksjJ |d tjdddkswJ |d tjdddksJ d S )Nr   r   rC   )r   r   r   r   rJ   rK   rH   rI   )r   r         ?)r   r   rX   )r   r	         ?)r   r	         ?)r'   r(   r
   rE   r   trophic_differencesr3   r4   )rF   r   diffsmatrix_br   r   r   test_trophic_differences   s"   

ro   c                  C   sn  t ddgddgg} tj| tjd}tj|dd}|tjdddks%J t g dg d	g d
g dg}tj|tjd}tj|dd}|tjt g dddksUJ t g dg dg d
g d
g}tj|tjd}tj|dd}|tjt g dddksJ t g dg d	g d
g dg}tj|tjd}tj|dd}|tjt g dddksJ d S )Nr   r   rC   Fcannibalismr   r   rJ   rK   rH   rI   r   ri   rX   rk   rj   )r   r   r   r   	r'   r(   r
   rE   r   trophic_incoherence_parameterr3   r4   std)rF   r   r8   rn   matrix_cmatrix_dr   r   r   1test_trophic_incoherence_parameter_no_cannibalism   s>     $rx   c                  C   s
  t ddgddgg} tj| tjd}tj|dd}|tjdddks%J t g dg d	g d
g dg dg}tj|tjd}tj|dd}|tjdddksSJ t g dg dg dg dg}tj|tjd}tj|dd}|tjt g dddksJ d S )Nr   r   rC   Trp   r   r   rR   rS   rT   rU   rV   r   rJ   rK   rH   rI   rr   rs   )rF   r   r8   rn   rv   r   r   r   .test_trophic_incoherence_parameter_cannibalism  s.   $ry   )__doc__r3   importorskipr'   networkxr
   r   rB   rG   rQ   r^   rg   rh   ro   rx   ry   r   r   r   r   <module>   s    


:"(.