
    sh                         S r SSKrSSKJr  / SQr\" S5      \R                  " SS9SS j5       5       r\" S5      \R                  " SS9SS	 j5       5       r\" S5      \R                  " SS9SS
 j5       5       r	g)zTrophic levels    N)not_implemented_for)trophic_levelstrophic_differencestrophic_incoherence_parameter
undirectedweight)
edge_attrsc                     U R                    VVs/ s H  u  p#US:X  d  M  UPM     nnnU(       d  [        R                  " S5      e[        R                  " XS9 VVs1 s H  oU  H  ofiM     M     nnn[	        U5      [	        U R
                  5      :w  a  [        R                  " S5      eSSKn[        R                  " XS9R                  R                  5       n	UR                  U	SS9n
XS:g     SS2U
S:g  4   nXU
S:g     SS2UR                  4   -  nUR                  S   nUR                  U5      n UR                  R                  X-
  5      nUR                  SS9S-   n0 nS	 U R                    5       nU H  nSUU'   M
     S
 U R                    5       n[#        U5       H  u  nnUR%                  U5      UU'   M     U$ s  snnf s  snnf ! UR                  R                    a  nSn[        R                  " U5      UeSnAff = f)aB  Compute the trophic levels of nodes.

The trophic level of a node $i$ is

.. math::

    s_i = 1 + \frac{1}{k^{in}_i} \sum_{j} a_{ij} s_j

where $k^{in}_i$ is the in-degree of i

.. math::

    k^{in}_i = \sum_{j} a_{ij}

and nodes with $k^{in}_i = 0$ have $s_i = 1$ by convention.

These are calculated using the method outlined in Levine [1]_.

Parameters
----------
G : DiGraph
    A directed networkx graph

Returns
-------
nodes : dict
    Dictionary of nodes with trophic level as the value.

References
----------
.. [1] Stephen Levine (1980) J. theor. Biol. 83, 195-207
r   z|This graph has no basal nodes (nodes with no incoming edges).Trophic levels are not defined without at least one basal node.)sourceszTrophic levels are only defined for graphs where every node has a path from a basal node (basal nodes are nodes with no incoming edges).Nr      )axisc              3   :   #    U  H  u  pUS :X  d  M  Uv   M     g7fr   N .0node_iddegrees      z/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/networkx/algorithms/centrality/trophic.py	<genexpr>!trophic_levels.<locals>.<genexpr>[   s     OK6Q;WWK   	c              3   :   #    U  H  u  pUS :w  d  M  Uv   M     g7fr   r   r   s      r   r   r   `   s     R{OGfPQk{r   )	in_degreenxNetworkXError
bfs_layerslennodesnumpyadjacency_matrixTtoarraysumnewaxisshapeeyelinalginvLinAlgError	enumerateitem)Gr   ndegbasal_nodeslayernodereachable_nodesnparowsumpnnierrmsgylevelszero_node_idsr   nonzero_node_idss                        r   r   r   	   s	   H $%;;;;#(1;K;N
 	
 --??EDE?   ?s177|+P
 	

  	A-//779A VVAAVF	A+q&A+~&A	6Q;2::..A 
B
r
A	-IIMM!%  	
1AF PAKKOM w ! Sq{{R 01
7&&)w 2 Mo <4 99   -) 	
 s#,-s(   G	G	G9G H/HHc                 `    [        XS9n0 nU R                   H  u  pEX%   X$   -
  X4U4'   M     U$ )a+  Compute the trophic differences of the edges of a directed graph.

The trophic difference $x_ij$ for each edge is defined in Johnson et al.
[1]_ as:

.. math::
    x_ij = s_j - s_i

Where $s_i$ is the trophic level of node $i$.

Parameters
----------
G : DiGraph
    A directed networkx graph

Returns
-------
diffs : dict
    Dictionary of edges with trophic differences as the value.

References
----------
.. [1] Samuel Johnson, Virginia Dominguez-Garcia, Luca Donetti, Miguel A.
    Munoz (2014) PNAS "Trophic coherence determines food-web stability"
r   )r   edges)r.   r   r>   diffsuvs         r   r   r   g   s<    8 A-FE	FI-!f L    c                 4   SSK nU(       a
  [        XS9nOS[        [        R                  " U 5      5      nU(       a"  U R                  5       nUR                  U5        OU n[        XaS9n[        UR                  [        UR                  5       5      5      5      $ )a  Compute the trophic incoherence parameter of a graph.

Trophic coherence is defined as the homogeneity of the distribution of
trophic distances: the more similar, the more coherent. This is measured by
the standard deviation of the trophic differences and referred to as the
trophic incoherence parameter $q$ by [1].

Parameters
----------
G : DiGraph
    A directed networkx graph

cannibalism: Boolean
    If set to False, self edges are not considered in the calculation

Returns
-------
trophic_incoherence_parameter : float
    The trophic coherence of a graph

References
----------
.. [1] Samuel Johnson, Virginia Dominguez-Garcia, Luca Donetti, Miguel A.
    Munoz (2014) PNAS "Trophic coherence determines food-web stability"
r   Nr   )
r!   r   listr   selfloop_edgescopyremove_edges_fromfloatstdvalues)r.   r   cannibalismr5   rC   
self_loopsG_2s          r   r   r      sw    8 #A5 "++A./
&&(C!!*- C#C7U\\^,-..rF   r   )r   F)
__doc__networkxr   networkx.utilsr   __all___dispatchabler   r   r   r   rF   r   <module>rW      s      .
T \"X&Y ' #Yx \"X& ' #B \"X&)/ ' #)/rF   