U
    9vfL                     @   sL   d Z ddlZddgZejddddZejddd
dZdd ZdS )a   This module provides the functions for node classification problem.

The functions in this module are not imported
into the top level `networkx` namespace.
You can access these functions by importing
the `networkx.algorithms.node_classification` modules,
then accessing the functions as attributes of `node_classification`.
For example:

  >>> from networkx.algorithms import node_classification
  >>> G = nx.path_graph(4)
  >>> G.edges()
  EdgeView([(0, 1), (1, 2), (2, 3)])
  >>> G.nodes[0]["label"] = "A"
  >>> G.nodes[3]["label"] = "B"
  >>> node_classification.harmonic_function(G)
  ['A', 'A', 'B', 'B']

References
----------
Zhu, X., Ghahramani, Z., & Lafferty, J. (2003, August).
Semi-supervised learning using gaussian fields and harmonic functions.
In ICML (Vol. 3, pp. 912-919).
    Nharmonic_functionlocal_and_global_consistencyZdirected   labelc                 C   s*  ddl }ddl}ddl}t| }t| |\}}|jd dkrPtd| d|jd }	|jd }
||	|
f}|j	dd}d||dk< |j
|j
jd| dd}||  }d||dddf < ||	|
f}d||dddf |dddf f< t|D ]}|| | }q ||j|dd  S )	a  Node classification by Harmonic function

    Function for computing Harmonic function algorithm by Zhu et al.

    Parameters
    ----------
    G : NetworkX Graph
    max_iter : int
        maximum number of iterations allowed
    label_name : string
        name of target labels to predict

    Returns
    -------
    predicted : list
        List of length ``len(G)`` with the predicted labels for each node.

    Raises
    ------
    NetworkXError
        If no nodes in `G` have attribute `label_name`.

    Examples
    --------
    >>> from networkx.algorithms import node_classification
    >>> G = nx.path_graph(4)
    >>> G.nodes[0]["label"] = "A"
    >>> G.nodes[3]["label"] = "B"
    >>> G.nodes(data=True)
    NodeDataView({0: {'label': 'A'}, 1: {}, 2: {}, 3: {'label': 'B'}})
    >>> G.edges()
    EdgeView([(0, 1), (1, 2), (2, 3)])
    >>> predicted = node_classification.harmonic_function(G)
    >>> predicted
    ['A', 'A', 'B', 'B']

    References
    ----------
    Zhu, X., Ghahramani, Z., & Lafferty, J. (2003, August).
    Semi-supervised learning using gaussian fields and harmonic functions.
    In ICML (Vol. 3, pp. 912-919).
    r   N*No node on the input graph is labeled by ''.Zaxis         ?offsets)numpyscipyscipy.sparsenxto_scipy_sparse_array_get_label_infoshapeNetworkXErrorzerossumsparse	csr_arraydiagsZtolilrangeargmaxtolist)Gmax_iter
label_namenpspr   Xlabels
label_dict	n_samples	n_classesFdegreesDPB_ r-   K/tmp/pip-unpacked-wheel-_lngutwb/networkx/algorithms/node_classification.pyr      s,    ,



$Gz?c                 C   s"  ddl }ddl}ddl}t| }t| |\}}	|jd dkrPtd| d|jd }
|	jd }||
|f}|j	dd}d||dk< |
|j|jjd| dd}||| |  }||
|f}d| ||dddf |dddf f< t|D ]}|| | }q|	|j|dd  S )	u  Node classification by Local and Global Consistency

    Function for computing Local and global consistency algorithm by Zhou et al.

    Parameters
    ----------
    G : NetworkX Graph
    alpha : float
        Clamping factor
    max_iter : int
        Maximum number of iterations allowed
    label_name : string
        Name of target labels to predict

    Returns
    -------
    predicted : list
        List of length ``len(G)`` with the predicted labels for each node.

    Raises
    ------
    NetworkXError
        If no nodes in `G` have attribute `label_name`.

    Examples
    --------
    >>> from networkx.algorithms import node_classification
    >>> G = nx.path_graph(4)
    >>> G.nodes[0]["label"] = "A"
    >>> G.nodes[3]["label"] = "B"
    >>> G.nodes(data=True)
    NodeDataView({0: {'label': 'A'}, 1: {}, 2: {}, 3: {'label': 'B'}})
    >>> G.edges()
    EdgeView([(0, 1), (1, 2), (2, 3)])
    >>> predicted = node_classification.local_and_global_consistency(G)
    >>> predicted
    ['A', 'A', 'B', 'B']

    References
    ----------
    Zhou, D., Bousquet, O., Lal, T. N., Weston, J., & Schölkopf, B. (2004).
    Learning with local and global consistency.
    Advances in neural information processing systems, 16(16), 321-328.
    r   Nr   r   r   r	   r
   r   )r   r   r   r   r   r   r   r   r   r   sqrtr   r   r   r   r   r   )r   alphar   r   r    r!   r   r"   r#   r$   r%   r&   r'   r(   ZD2r*   r+   r,   r-   r-   r.   r   k   s*    .



"(c           
      C   s   ddl }g }i }d}t| jddD ]J\}}||d kr$|d | }||kr\|||< |d7 }|||| g q$||}|dd t| dd	 d
D }	||	fS )a  Get and return information of labels from the input graph

    Parameters
    ----------
    G : Network X graph
    label_name : string
        Name of the target label

    Returns
    ----------
    labels : numpy array, shape = [n_labeled_samples, 2]
        Array of pairs of labeled node ID and label ID
    label_dict : numpy array, shape = [n_classes]
        Array of labels
        i-th element contains the label corresponding label ID `i`
    r   NT)datar	   c                 S   s   g | ]\}}|qS r-   r-   ).0r   r,   r-   r-   r.   
<listcomp>   s     z#_get_label_info.<locals>.<listcomp>c                 S   s   | d S )Nr	   r-   )xr-   r-   r.   <lambda>       z!_get_label_info.<locals>.<lambda>)key)r   	enumerateZnodesappendarraysorteditems)
r   r   r    r#   Zlabel_to_idZlidinr   r$   r-   r-   r.   r      s     
r   )r   r   )r/   r   r   )	__doc__Znetworkxr   __all__utilsZnot_implemented_forr   r   r   r-   r-   r-   r.   <module>   s   
L
M