
    Vh\"                         d Z ddlZddlZ ej                  d      Z ej                  d       d Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zy)z>Test trophic levels, trophic differences and trophic coherence    Nnumpyscipyc                      t        j                         } | j                  dd       | j                  dd       t        j                  |       }|ddddk(  sJ y)	zTrivial exampleabc         )r   r   r   N)nxDiGraphadd_edgetrophic_levels)Gds     a/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/centrality/tests/test_trophic.pytest_trophic_levelsr      sN    


AJJsCJJsC
!Aaaa((((    c                     t        j                         } | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       | j                  dd	d
       | j                  ddd       | j                  dd	d       | j                  d	dd       | j                         }| j                  D cg c]  \  }}|dk(  s| }}}|D ]  }| j                  |        t         j                  j                  j                  |       j                  }t        j                  g dg dg dg dg      }t        j                  |j                         |      sJ t        |j                        dk(  sJ |j                  d   |j                  d   k(  sJ |j                  d   t        |       k(  sJ |j                  d   }t        j!                  |      }t        j                  j#                  ||z
        }	t        j%                  |	      t        j'                  |      z  }
t        j                  g d      }t        j)                  |
|      sJ dddddd}t        j*                  |      }|j-                         D ]&  \  }}||   }|t/        j0                  |d      k(  r&J  yc c}}w )zSExample from Figure 5 in Stephen Levine (1980) J. theor. Biol. 83,
    195-207
    r	   r
   g      ?)weightr   皙?   g?   333333?333333?ffffff?r   )r   r   g        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nidr   zq
expected_qnniny
expected_y
expected_dlevelexpected_levels                  r   test_trophic_levels_levinerC      si    	

AJJq!CJ JJq!CJ JJq!CJ JJq!CJ JJq!CJ JJq!CJ JJq!CJ JJq!CJ  
B ;;1a!q&1A1 	c 			..q133A 	 J >>!))+z222 qww<1771:###771:Q	
B
r
A
		a!eA


1#A@AJ;;q*%%%1
yIJ
"Aggi @
U#Cu$!????@G 	2s   K
"K
c                  *   t         j                  ddgddgg      } t        j                  | t        j                        }t        j
                  |      }|d   t        j                  dd      k(  sJ |d   t        j                  dd      k(  sJ y )Nr   r	   create_usingr
   r   r   )r'   r(   r   from_numpy_arrayr   r   r3   r4   )matrix_ar   r   s      r   test_trophic_levels_simplerI   O   s}    xx!Q!Q()H
H2::>A
!AQ46==----Q46==----r   c                  H   t         j                  g dg dg dg dg      } t        j                  | t        j                        }t        j
                  |      }g d}t        d      D ]$  }||   t        j                  ||   d	      k(  r$J  t         j                  g d
g dg dg dg      } t        j                  | t        j                        }t        j
                  |      }g d}t        d      D ]$  }||   t        j                  ||   d	      k(  r$J  y )N)r   r	   r   r   )r   r   r	   r   r   r   r   r	   r   r   r   r   rE   )r	   r
   r   r   r   r   r   r   r	   r	   r   r   r   r	   r	   )r	   r
   g      @g      
@)	r'   r(   r   rG   r   r   ranger3   r4   )matrixr   r   expected_resultinds        r    test_trophic_levels_more_complexrS   W   s
   XX	 F 	F<A
!A"OQx Gvs';FFFFG XX	 F 	F<A
!A'OQx Gvs';FFFFGr   c                     t         j                  g dg dg dg dg dg      } t         j                  g dg dg dg d	g d
g      }t         j                  t         j                  j	                  |      t         j                  d      z        }t        j                  | t        j                        }t        j                  |      }t        d      D ]$  }||   t        j                  ||   d      k(  r$J  y )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   r\   r   r	   r\   )r   r   r   r   r	   r   rE   r   r   )r'   r(   ravelr#   r.   r0   r   rG   r   r   rO   r3   r4   )rP   Kresult_1r   result_2rR   s         r   %test_trophic_levels_even_more_complexra   v   s     XX F 	 	A xx		a(2771:56H
F<A  #HQx G}hsm FFFFGr   c                     t         j                  d      } t        j                  | t        j                        }t        j                  t        j                  d      5  t        j                  |       ddd       y# 1 sw Y   yxY w)z;Should raise an error with graphs with only non-basal nodesr   rE   zno basal nodesmatchN)	r'   identityr   rG   r   r3   raisesNetworkXErrorr   )rP   r   s     r   #test_trophic_levels_singular_matrixrh      s]    [[^F
F<A	r''/?	@ 
!  s    A??Bc                     t        j                         } | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  dd       t        j                  t         j
                        5 }t        j                  |        ddd       d}|t        j                        v sJ t        j                         } | j                  dd       | j                  dd       | j                  dd       t        j                  t         j
                        5 }t        j                  |        ddd       d}|t        |j                        v sJ y# 1 sw Y   xY w# 1 sw Y   1xY w)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   NzTrophic 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   r   r   r3   rf   rg   r   strvalue)r   emsgs      r   'test_trophic_levels_singular_with_basalrn      sB    	

AJJsC JJsCJJsC JJsCJJsC	r''	( A
!	 
 #agg, 	

AJJsCJJsCJJsC	r''	( A
!	 
 #agg,+  s   E28E>2E;>Fc                     t         j                  ddgddgg      } t        j                  | t        j                        }t        j
                  |      }|d   t        j                  dd      k(  sJ t         j                  g dg dg d	g d
g      }t        j                  |t        j                        }t        j
                  |      }|d   t        j                  dd      k(  sJ |d   t        j                  dd      k(  sJ |d   t        j                  dd      k(  sJ |d   t        j                  dd      k(  sJ |d   t        j                  dd      k(  sJ y )Nr   r	   rE   )r   r	   r   r   rM   rN   rK   rL   )r   r
         ?r	   r
   r[   )r	   r         ?r
   r         ?)r'   r(   r   rG   r   trophic_differencesr3   r4   )rH   r   diffsmatrix_bs       r   test_trophic_differencesrx      s:   xx!Q!Q()H
H2::>A""1%E=FMM!6666 xx	 H 	H2::>A""1%E=FMM!6666=FMM#48888=FMM#48888=FMM$D9999=FMM$D9999r   c                  >   t         j                  ddgddgg      } t        j                  | t        j                        }t        j
                  |d      }|t        j                  dd      k(  sJ t         j                  g dg d	g d
g dg      }t        j                  |t        j                        }t        j
                  |d      }|t        j                  t         j                  g d      d      k(  sJ t         j                  g dg dg d
g d
g      }t        j                  |t        j                        }t        j
                  |d      }|t        j                  t         j                  g d      d      k(  sJ t         j                  g dg d	g d
g dg      }t        j                  |t        j                        }t        j
                  |d      }|t        j                  t         j                  g d      d      k(  sJ y )Nr   r	   rE   Fcannibalismr   r   rM   rN   rK   rL   r	   rp   r[   rt   rr   )r   r	   r	   r	   	r'   r(   r   rG   r   trophic_incoherence_parameterr3   r4   std)rH   r   r9   rw   matrix_cmatrix_ds         r   1test_trophic_incoherence_parameter_no_cannibalismr      s   xx!Q!Q()H
H2::>A
((>AaT**** xx	 H 	H2::>A
((>Abff%>?TJJJJ xx	 H 	H2::>A
((>Abff%>?TJJJJ xx	 H 	H2::>A
((>Abff%>?TJJJJr   c                     t         j                  ddgddgg      } t        j                  | t        j                        }t        j
                  |d      }|t        j                  dd      k(  sJ t         j                  g dg d	g d
g dg dg      }t        j                  |t        j                        }t        j
                  |d      }|t        j                  dd      k(  sJ t         j                  g dg dg dg dg      }t        j                  |t        j                        }t        j
                  |d      }|t        j                  t         j                  g d      d      k(  sJ y )Nr   r	   rE   Trz   r   r   rU   rV   rW   rX   rY   r
   rM   rN   rK   rL   r|   r}   )rH   r   r9   rw   r   s        r   .test_trophic_incoherence_parameter_cannibalismr     s3   xx!Q!Q()H
H2::>A
((=AaT**** xx H 	H2::>A
((=AaT**** xx	 H 	H2::>A
((=Abff%>?TJJJJr   c                     t        j                  g d      } t        j                  t         j                  d      5  t        j
                  |        d d d        | j                  d       t        j                  t         j                  d      5  t        j
                  |        d d d        y # 1 sw Y   ^xY w# 1 sw Y   y xY w)N)rq   rs   )r   r	   zno basal noderc   r   z$every node .* path from a basal node)r   r   r3   rf   rg   r   add_node)r   s    r   test_no_basal_noder   (  s    


+,A	r''	? 
!JJqM	r''/U	V 
!   s   B0B<0B9<C)__doc__r3   networkxr   importorskipr'   r   rC   rI   rS   ra   rh   rn   rx   r   r   r    r   r   <module>r      sp    D  V!   G )7@t.G>G6%P:0+K\KBr   