
    \Mh{	                     8    d Z ddlZdgZej        d             ZdS )z(Function for computing walks in a graph.    Nnumber_of_walksc                      ddl }|dk     rt          d|           t          j         d          }|j                            |                                |           fdt                     D             }|S )a  Returns the number of walks connecting each pair of nodes in `G`

    A *walk* is a sequence of nodes in which each adjacent pair of nodes
    in the sequence is adjacent in the graph. A walk can repeat the same
    edge and go in the opposite direction just as people can walk on a
    set of paths, but standing still is not counted as part of the walk.

    This function only counts the walks with `walk_length` edges. Note that
    the number of nodes in the walk sequence is one more than `walk_length`.
    The number of walks can grow very quickly on a larger graph
    and with a larger walk length.

    Parameters
    ----------
    G : NetworkX graph

    walk_length : int
        A nonnegative integer representing the length of a walk.

    Returns
    -------
    dict
        A dictionary of dictionaries in which outer keys are source
        nodes, inner keys are target nodes, and inner values are the
        number of walks of length `walk_length` connecting those nodes.

    Raises
    ------
    ValueError
        If `walk_length` is negative

    Examples
    --------

    >>> G = nx.Graph([(0, 1), (1, 2)])
    >>> walks = nx.number_of_walks(G, 2)
    >>> walks
    {0: {0: 1, 1: 0, 2: 1}, 1: {0: 0, 1: 2, 2: 0}, 2: {0: 1, 1: 0, 2: 1}}
    >>> total_walks = sum(sum(tgts.values()) for _, tgts in walks.items())

    You can also get the number of walks from a specific source node using the
    returned dictionary. For example, number of walks of length 1 from node 0
    can be found as follows:

    >>> walks = nx.number_of_walks(G, 1)
    >>> walks[0]
    {0: 0, 1: 1, 2: 0}
    >>> sum(walks[0].values())  # walks from 0 of length 1
    1

    Similarly, a target node can also be specified:

    >>> walks[0][1]
    1

    r   Nz"`walk_length` cannot be negative: )weightc                 R    i | ]"\  }|fd t                    D             #S )c                 D    i | ]\  }}|                     |          S  )item).0v_idxvpoweru_idxs      Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/networkx/algorithms/walks.py
<dictcomp>z.number_of_walks.<locals>.<dictcomp>.<dictcomp>L   s-    EEEHE1Auzz%''EEE    )	enumerate)r
   ur   Gr   s     @r   r   z#number_of_walks.<locals>.<dictcomp>K   sN       E1 	
EEEEE	!EEE  r   )numpy
ValueErrornxadjacency_matrixlinalgmatrix_powertoarrayr   )r   walk_lengthnpAresultr   s   `    @r   r   r      s    t QKkKKLLL
Ad+++A I""199;;<<E    !!  F Mr   )__doc__networkxr   __all___dispatchabler   r   r   r   <module>r$      sM    . .    
 F F F F Fr   