ó
 ,µ[c           @   sf   d  Z  d d l Z d d l m Z d d l m Z d g Z e d ƒ e d ƒ d d d „ ƒ ƒ Z d S(	   s=   
Algorithm to find a maximal (not maximum) independent set.

iÿÿÿÿN(   t   not_implemented_for(   t   py_random_statet   maximal_independent_seti   t   directedc         C   s3  | s' t  | j t |  ƒ ƒ g ƒ } n t  | ƒ } | j |  ƒ sX t j d | ƒ ‚ n  t  j g  | D] } t  |  j | ƒ ^ qe Œ  } t  j | | ƒ r¯ t j d | ƒ ‚ n  t | ƒ } t  |  j	 ƒ  ƒ j
 | j | ƒ ƒ } xM | r.| j t | ƒ ƒ } | j | ƒ | j t |  j | ƒ | g ƒ qâ W| S(   s$  Return a random maximal independent set guaranteed to contain
    a given set of nodes.

    An independent set is a set of nodes such that the subgraph
    of G induced by these nodes contains no edges. A maximal
    independent set is an independent set such that it is not possible
    to add a new node and still get an independent set.

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

    nodes : list or iterable
       Nodes that must be part of the independent set. This set of nodes
       must be independent.

    seed : integer, random_state, or None (default)
        Indicator of random number generation state.
        See :ref:`Randomness<randomness>`.

    Returns
    -------
    indep_nodes : list
       List of nodes that are part of a maximal independent set.

    Raises
    ------
    NetworkXUnfeasible
       If the nodes in the provided list are not part of the graph or
       do not form an independent set, an exception is raised.

    NetworkXNotImplemented
        If `G` is directed.

    Examples
    --------
    >>> G = nx.path_graph(5)
    >>> nx.maximal_independent_set(G) # doctest: +SKIP
    [4, 0, 2]
    >>> nx.maximal_independent_set(G, [1]) # doctest: +SKIP
    [1, 3]

    Notes
    -----
    This algorithm does not solve the maximum independent set problem.

    s$   %s is not a subset of the nodes of Gs!   %s is not an independent set of G(   t   sett   choicet   listt   issubsett   nxt   NetworkXUnfeasiblet   uniont   adjt   intersectiont   nodest
   differencet   appendt   difference_update(   t   GR   t   seedt   vt	   neighborst   indep_nodest   available_nodest   node(    (    s6   lib/python2.7/site-packages/networkx/algorithms/mis.pyR      s"    2!/$	%(	   t   __doc__t   networkxR   t   networkx.utilsR    R   t   __all__t   NoneR   (    (    (    s6   lib/python2.7/site-packages/networkx/algorithms/mis.pyt   <module>   s   			