ó
|£*^c        @   @   s�   d  Z  d d l m Z d d l Z d j d d g ƒ Z d g Z d, Z d- Z	 d( „  e
 e	 ƒ Dƒ Z d) „  Z d* „  Z d+ „  Z d S(.   s*   Functions for analyzing triads of a graph.iÿÿÿÿ(   t   divisionNs   
s%   Alex Levenson (alex@isnontinvain.com)s9   Diederik van Liere (diederik.vanliere@rotman.utoronto.ca)t   triadic_censust   003t   012t   102t   021Dt   021Ut   021Ct   111Dt   111Ut   030Tt   030Ct   201t   120Dt   120Ut   120Ct   210t   300i   i   i   i   i   i   i   i   i   i	   i   i
   i   i   i   i   c         C   s'   i  |  ] \ } } t  | d  | “ q S(   i   (   t   TRIAD_NAMES(   t   .0t   it   code(    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pys
   <dictcomp>#   s   	 c             sÉ  d „  ‰  ‡  f d †  t  Dƒ }  |  d j d g ƒ |  d j d d g ƒ |  d j d d g ƒ |  d j d d g ƒ |  d	 j d d g ƒ |  d
 j d d g ƒ |  d j d  d! d" g ƒ |  d j d# d$ d% g ƒ |  d j d& d' d( g ƒ |  d j d) d* d+ g ƒ |  d j d, d- d. d/ g ƒ |  d j d0 d1 d2 d3 g ƒ |  d j d4 d5 d6 d7 g ƒ |  d j d8 d9 d: d; g ƒ |  d j d< d= d> d? d@ g ƒ |  d j dA dB dC dD dE dF g ƒ |  S(G   s7   Returns a dictionary mapping triad name to triad graph.c          S   s   t  j ƒ  }  |  j d ƒ |  S(   s_   Returns a directed graph on three nodes, named ``'a'``, ``'b'``, and
        ``'c'``.

        t   abc(   t   nxt   DiGrapht   add_nodes_from(   t   G(    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pyt	   abc_graph)   s    c            s   i  |  ] } ˆ  ƒ  | “ q S(    (    (   R   t   name(   R   (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pys
   <dictcomp>2   s   	 R   t   at   bR   R   t   cR   R   R   R	   R
   R   R   R   R   R   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   t   add_edges_from(   t   tg(    (   R   sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pyt   triad_graphs&   s*    		
c            sh   | | d f | | d f | | d f | | d f | | d f | | d f f } t  ‡  f d †  | Dƒ ƒ S(   s÷   Returns the integer code of the given triad.

    This is some fancy magic that comes from Batagelj and Mrvar's paper. It
    treats each edge joining a pair of ``v``, ``u``, and ``w`` as a bit in
    the binary representation of an integer.

    i   i   i   i   i   i    c         3   s.   |  ]$ \ } } } | ˆ  | k r | Vq d  S(   N(    (   R   t   ut   vt   x(   R   (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pys	   <genexpr>R   s    (   t   sum(   R   R$   R#   t   wt   combos(    (   R   sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pyt   _tricodeH   s    <c   
      C   s  |  j  ƒ  s t j d ƒ ‚ n  d „  t Dƒ } t |  ƒ } d „  t |  ƒ Dƒ } x�|  D]…} t |  j | ƒ t |  j | ƒ B} xX| D]P} | | | | k r¨ qˆ n  | t |  j | ƒ Bt |  j | ƒ B| | h } | |  | k r| |  | k r| d c | t | ƒ d 7<n | d c | t | ƒ d 7<xœ | D]” } | | | | k  s¨| | | | k  r@| | | | k  r@| |  j | k r@| |  j | k r@t	 |  | | | ƒ }	 | t
 |	 c d 7<q@q@Wqˆ WqW W| | d | d d t | j ƒ  ƒ | d	 <| S(
   sü  Determines the triadic census of a directed graph.

    The triadic census is a count of how many of the 16 possible types of
    triads are present in a directed graph.

    Parameters
    ----------
    G : digraph
       A NetworkX DiGraph

    Returns
    -------
    census : dict
       Dictionary with triad names as keys and number of occurrences as values.

    Notes
    -----
    This algorithm has complexity `O(m)` where `m` is the number of edges in
    the graph.

    References
    ----------
    .. [1] Vladimir Batagelj and Andrej Mrvar, A subquadratic triad census
        algorithm for large sparse networks with small maximum degree,
        University of Ljubljana,
        http://vlado.fmf.uni-lj.si/pub/networks/doc/triads/triads.pdf

    s"   Not defined for undirected graphs.c         S   s   i  |  ] } d  | “ q S(   i    (    (   R   R   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pys
   <dictcomp>v   s   	 c         S   s   i  |  ] \ } } | | “ q S(    (    (   R   R   R$   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pys
   <dictcomp>y   s   	 R   i   R   i   i   R   (   t   is_directedR   t   NetworkXErrorR   t   lent	   enumeratet   sett   predt   succR)   t   TRICODE_TO_NAMER&   t   values(
   R   t   censust   nt   mR$   t   vnbrsR#   t	   neighborsR'   R   (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pyR   U   s,    $2 !<#.(   R   R   R   R   R   R   R   R	   R
   R   R   R   R   R   R   R   (@   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i	   i	   i   i   i
   i	   i   i   i   i   i   i   i   i   i   i   i	   i
   i   i   i	   i	   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   (   t   __doc__t
   __future__R    t   networkxR   t   joint
   __author__t   __all__R   t   TRICODESR-   R1   R"   R)   R   (    (    (    sn   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/networkx/algorithms/triads.pyt   <module>   s   		    	"	