Ë
    êÿæiS  ã            
       ó¨   — d Z ddlZddlmZ ddlmZ ddlmZm	Z	m
Z
  e
ddg e	eddd¬	«      g e	eddd¬	«      dgd
œd¬«      ddœd„«       Z	 	 dd„Zy)zGraph utilities and algorithms.é    N)Úsparse)Úpairwise_distances)ÚIntegralÚIntervalÚvalidate_paramsz
array-likezsparse matrixÚleft)Úclosed)ÚgraphÚsourceÚcutoffT)Úprefer_skip_nested_validation)r   c                ó(  — t        j                  | «      r| j                  «       } nt        j                  | «      } i }d}|g}|rM|}t	        «       }|D ]*  }||vsŒ|||<   |j                  | j                  |   «       Œ, |�||k  r	 |S |dz  }|rŒM|S )aD  Return the length of the shortest path from source to all reachable nodes.

    Parameters
    ----------
    graph : {array-like, sparse matrix} of shape (n_nodes, n_nodes)
        Adjacency matrix of the graph. Sparse matrix of format LIL is
        preferred.

    source : int
       Start node for path.

    cutoff : int, default=None
        Depth to stop the search - only paths of length <= cutoff are returned.

    Returns
    -------
    paths : dict
        Reachable end nodes mapped to length of path from source,
        i.e. `{end: path_length}`.

    Examples
    --------
    >>> from sklearn.utils.graph import single_source_shortest_path_length
    >>> import numpy as np
    >>> graph = np.array([[ 0, 1, 0, 0],
    ...                   [ 1, 0, 1, 0],
    ...                   [ 0, 1, 0, 0],
    ...                   [ 0, 0, 0, 0]])
    >>> single_source_shortest_path_length(graph, 0)
    {0: 0, 1: 1, 2: 2}
    >>> graph = np.ones((6, 6))
    >>> sorted(single_source_shortest_path_length(graph, 2).items())
    [(0, 1), (1, 1), (2, 0), (3, 1), (4, 1), (5, 1)]
    r   é   )r   ÚissparseÚtolilÚ
lil_matrixÚsetÚupdateÚrows)r
   r   r   ÚseenÚlevelÚ
next_levelÚ
this_levelÚvs           úh/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/sklearn/utils/graph.pyÚ"single_source_shortest_path_lengthr      s©   € ôV ‡��uÔØ—‘“‰ä×!Ñ! %Ó(ˆØ€DØ€EØ�€JÙ
Øˆ
Ü“Uˆ
ÛˆAØ˜Š}Ø��Q‘Ø×!Ñ! %§*¡*¨Q¡-Õ0ð ð Ð &¨E¢/Øà€Kð 	�‰
ˆò ð €Kó    c                 óx  — |dk(  r t        j                  | «      rt        d«      ‚t        |«      D �]  }t	        j
                  ||k(  «      }| |   }	t        |«      D ]×  }
t	        j
                  ||
k(  «      }| |   }|dk(  r| t	        j                  ||«         }nt        |	|fd|i|¤Ž}t	        j                  |j                  d¬«      |j                  «      \  }}|dk(  rd|||   ||   f<   d|||   ||   f<   Œ¡|dk(  r%|||f   |||   ||   f<   |||f   |||   ||   f<   ŒËt        d	|z  «      ‚ �Œ |S )
a   Add connections to sparse graph to connect unconnected components.

    For each pair of unconnected components, compute all pairwise distances
    from one component to the other, and add a connection on the closest pair
    of samples. This is a hacky way to get a graph with a single connected
    component, which is necessary for example to compute a shortest path
    between all pairs of samples in the graph.

    Parameters
    ----------
    X : array of shape (n_samples, n_features) or (n_samples, n_samples)
        Features to compute the pairwise distances. If `metric =
        "precomputed"`, X is the matrix of pairwise distances.

    graph : sparse matrix of shape (n_samples, n_samples)
        Graph of connection between samples.

    n_connected_components : int
        Number of connected components, as computed by
        `scipy.sparse.csgraph.connected_components`.

    component_labels : array of shape (n_samples)
        Labels of connected components, as computed by
        `scipy.sparse.csgraph.connected_components`.

    mode : {'connectivity', 'distance'}, default='distance'
        Type of graph matrix: 'connectivity' corresponds to the connectivity
        matrix with ones and zeros, and 'distance' corresponds to the distances
        between neighbors according to the given metric.

    metric : str
        Metric used in `sklearn.metrics.pairwise.pairwise_distances`.

    kwargs : kwargs
        Keyword arguments passed to
        `sklearn.metrics.pairwise.pairwise_distances`.

    Returns
    -------
    graph : sparse matrix of shape (n_samples, n_samples)
        Graph of connection between samples, with a single connected component.
    ÚprecomputedzŒ_fix_connected_components with metric='precomputed' requires the full distance matrix in X, and does not work with a sparse neighbors graph.ÚmetricN)ÚaxisÚconnectivityr   Údistancez?Unknown mode=%r, should be one of ['connectivity', 'distance'].)r   r   ÚRuntimeErrorÚrangeÚnpÚflatnonzeroÚix_r   Úunravel_indexÚargminÚshapeÚ
ValueError)ÚXr
   Ún_connected_componentsÚcomponent_labelsÚmoder    ÚkwargsÚiÚidx_iÚXiÚjÚidx_jÚXjÚDÚiiÚjjs                   r   Ú_fix_connected_componentsr;   O   sw  € ðf �Ò¤6§?¡?°1Ô#5Üðó
ð 	
ô Ð)×*ˆÜ—‘Ð/°1Ñ4Ó5ˆØˆu‰XˆÜ�q–ˆAÜ—N‘NÐ#3°qÑ#8Ó9ˆEØ�5‘ˆBà˜Ò&Ø”b—f‘f˜U EÓ*Ñ+‘ä& r¨2ÑG°fÐGÀÑG�ä×%Ñ% a§h¡h°D hÓ&9¸1¿7¹7ÓC‰FˆB�Ø�~Ò%Ø./��e˜B‘i  r¡Ð*Ñ+Ø./��e˜B‘i  r¡Ð*Ò+Ø˜Ò#Ø./°°B°©i��e˜B‘i  r¡Ð*Ñ+Ø./°°B°©i��e˜B‘i  r¡Ð*Ò+ä ØUØñóð ò# ð +ð2 €Lr   )r#   Ú	euclidean)Ú__doc__Únumpyr&   Úscipyr   Úsklearn.metrics.pairwiser   Úsklearn.utils._param_validationr   r   r   r   r;   © r   r   Ú<module>rC      s~   ðÙ %ó
 Ý å 7ß OÑ Oñ à Ð0Ù˜H a¨°fÔ=Ð>Ù˜H a¨°fÔ=¸tÐDñð
 #'ôð AEó 4óð4ðx 
ØôSr   