o
    ˷ew                     @   s   d Z dgZdddZdS )z@Algorithm to select influential nodes in a graph using VoteRank.voterankNc                    s  g }i  t | dkr|S |du s|t | krt | }|  r.tdd |  D t |  }ntdd |  D t |  }|  D ]}ddg |< qAt|D ]}|  D ]}d | d< qT|  D ]$\}} | d   | d 7  < |  s | d   | d 7  < qa|D ]}d | d< qt| j fddd	} | d dkr|  S |	| ddg |< | |D ]\}} | d  d| 8  < t | d d | d< qqN|S )
a  Select a list of influential nodes in a graph using VoteRank algorithm

    VoteRank [1]_ computes a ranking of the nodes in a graph G based on a
    voting scheme. With VoteRank, all nodes vote for each of its in-neighbours
    and the node with the highest votes is elected iteratively. The voting
    ability of out-neighbors of elected nodes is decreased in subsequent turns.

    Parameters
    ----------
    G : graph
        A NetworkX graph.

    number_of_nodes : integer, optional
        Number of ranked nodes to extract (default all nodes).

    Returns
    -------
    voterank : list
        Ordered list of computed seeds.
        Only nodes with positive number of votes are returned.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 4)])
    >>> nx.voterank(G)
    [0, 1]

    The algorithm can be used both for undirected and directed graphs.
    However, the directed version is different in two ways:
    (i) nodes only vote for their in-neighbors and
    (ii) only the voting ability of elected node and its out-neighbors are updated:

    >>> G = nx.DiGraph([(0, 1), (2, 1), (2, 3), (3, 4)])
    >>> nx.voterank(G)
    [2, 3]

    Notes
    -----
    Each edge is treated independently in case of multigraphs.

    References
    ----------
    .. [1] Zhang, J.-X. et al. (2016).
        Identifying a set of influential spreaders in complex networks.
        Sci. Rep. 6, 27823; doi: 10.1038/srep27823.
        Nc                 s       | ]\}}|V  qd S N .0_degr   r   b/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/centrality/voterank_alg.py	<genexpr>=       zvoterank.<locals>.<genexpr>c                 s   r   r   r   r   r   r   r
   r   @   r      c                    s    |  d S )Nr   r   )x	vote_rankr   r
   <lambda>R   s    zvoterank.<locals>.<lambda>)key)
lenis_directedsum
out_degreedegreenodesrangeedgesmaxappend)Gnumber_of_nodesinfluential_nodes	avgDegreenr   nbrr   r   r
   r      s>   / 
r   )__doc____all__r   r   r   r   r
   <module>   s    