
    -i@                         S r SSKrSSKJr  SSKJr  SSKJrJ	r	J
r
  \
" SS	/\	" \SSS
S9/\	" \SSS
S9S/S.SS9SS.S j5       r  SS jrg)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   [         R                  " U 5      (       a  U R                  5       n O[         R                  " U 5      n 0 nSnU/nU(       aW  Un[	        5       nU H,  nXs;  d  M
  XCU'   UR                  U R                  U   5        M.     Ub  X$::  a   U$ US-  nU(       a  MW  U$ )a  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   )r   issparsetolil
lil_matrixsetupdaterows)r   r   r   seenlevel
next_level
this_levelvs           F/var/www/html/venv/lib/python3.13/site-packages/sklearn/utils/graph.py"single_source_shortest_path_lengthr      s    V u!!%(DEJ

U
A}Q!!%**Q-0  &/K 	
 * K    c                 r   US:X  a&  [         R                  " U 5      (       a  [        S5      e[        U5       H  n[        R
                  " X7:H  5      nX   n	[        U5       H  n
[        R
                  " X::H  5      nX   nUS:X  a  U [        R                  " X5         nO[        X4SU0UD6n[        R                  " UR                  SS9UR                  5      u  pUS:X  a  SXU   X   4'   SXU   X   4'   M  US:X  a   XU4   XU   X   4'   XU4   XU   X   4'   M  [        S	U-  5      e   M     U$ )
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   sX   f 6??1#5#5
 	
 )*/45XqANN#3#89EB&bffU*+&rGfGG%%ahhDh&9177CFB~%./Bi*+./Bi*+#./BiBi*+./BiBi*+ U #  +2 Lr   )r$   	euclidean)__doc__numpyr'   scipyr   metrics.pairwiser   _param_validationr   r   r	   r   r<    r   r   <module>rD      s~    %
   1 B B 0Haf=>Haf=tD
 #' AE 44x 
Sr   