U
    hAS                     @   s   d Z ddlZddlZG dd dZG dd dZejdejej	ej
ejgdd	 ZG d
d dZG dd deZG dd deZG dd deZG dd deZG dd deZdS )z8
Unit tests for dedensification and graph summarization
    Nc                   @   sZ   e Zd Zdd Zdd Zdd Zeddd	Zd
d Zdd Z	dd Z
dd Zdd ZdS )TestDirectedDedensificationc                 C   sX   ddddddgfdddd	gfddgfg}t  }|D ]\}}|D ]}||| q@q4|S )
N1ZBC2ABC3AB64r   5ZABr   nxDiGraphadd_edgeselfZoriginal_matrixgraphsourcetargetstarget r   P/tmp/pip-unpacked-wheel-j2te_plx/networkx/algorithms/tests/test_summarization.pybuild_original_graph
   s    	z0TestDirectedDedensification.build_original_graphc                 C   sf   dddgfddddgfddgfd	dd
gfddgfdg}t  }|D ]\}}|D ]}||| qNqB|S )Nr   r   r   r   r	   r
   r   r   r   r   )r   r   r   r   Zcompressed_matrixcompressed_graphr   r   r   r   r   r   build_compressed_graph   s    
z2TestDirectedDedensification.build_compressed_graphc                 C   s,   t  }t j|dd\}}|t ks(tdS )zT
        Verify that an empty directed graph results in no compressor nodes
           	thresholdN)r   r   	dedensifysetAssertionError)r   Gr   c_nodesr   r   r   
test_empty+   s    z&TestDirectedDedensification.test_emptyTc           	      C   s   |r|   } |D ]v}tt| |}t| |}|D ]}| || q6|| }|D ]&}| || |D ]}| || qhqT| | q| S )a  
        Reconstructs the original graph from a dedensified, directed graph

        Parameters
        ----------
        G: dedensified graph
           A networkx graph
        compressor_nodes: iterable
           Iterable of compressor nodes in the dedensified graph
        inplace: bool, optional (default: False)
           Indicates if densification should be done inplace

        Returns
        -------
        G: graph
           A densified networkx graph
        )copyr$   r   all_neighborsZ	neighborsZremove_edger   remove_node)	r&   Zcompressor_nodesr)   Zcompressor_noder*   Zout_neighborsZout_neighborZin_neighborsZin_neighborr   r   r   densify3   s    z#TestDirectedDedensification.densifyc                 C   s
   d| _ d S )N)r   r'   r   r   r   r   setup_methodU   s    z(TestDirectedDedensification.setup_methodc                 C   s   |   }|  }tj|dd\}}| D ]H\}}dt|}dt|}|||}	|||}
|	|
ks*tq*t	|t	| j
kstdS )zy
        Verifies that dedensify produced the correct edges to/from compressor
        nodes in a directed graph
        r    r!    N)r   r   r   r#   edgesjoinsortedhas_edger%   lenr'   )r   r&   compressed_Gr   r'   sto_so_tZcompressed_graph_existsZverified_compressed_existsr   r   r   test_dedensify_edgesX   s    z0TestDirectedDedensification.test_dedensify_edgesc                 C   s^   |   }t| }tj|dd\}}t| }||ks>t|  }|t| ksZtdS )zu
        Verifies that dedensify produced the correct number of comrpessor nodes
        in a directed graph
        r    r!   N)r   r5   r1   r   r#   r%   r   )r   r&   original_edge_countc_Gr'   compressed_edge_countr6   r   r   r   test_dedensify_edge_counth   s    z5TestDirectedDedensification.test_dedensify_edge_countc                 C   sT   |   }| j|| jdd}|  }| D ]$\}}||||||ks*tq*dS )zq
        Verifies that densification produces the correct edges from the
        original directed graph
        T)r)   N)r   r,   r'   r   r1   r4   r%   )r   r6   original_graphr&   r7   r8   r   r   r   test_densify_edgesu   s
    z.TestDirectedDedensification.test_densify_edgesc                 C   sZ   |   }t| }| || j}t| }||ks:t|  }|t| ksVtdS )zy
        Verifies that densification produces the correct number of edges in the
        original directed graph
        N)r   r5   r1   r,   r'   r%   r   )r   r6   r>   r@   r<   r&   r   r   r   test_densify_edge_count   s    z3TestDirectedDedensification.test_densify_edge_countN)T)__name__
__module____qualname__r   r   r(   staticmethodr,   r/   r;   r?   rA   rB   r   r   r   r   r   	   s   !r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestUnDirectedDedensificationc                 C   sX   ddddddgfdddd	gfddgfg}t  }|D ]\}}|D ]}||| q@q4|S )
zC
        Builds graph shown in the original research paper
        )r   ZCBr   r   r	   r
   r   r   r   r   r   Graphr   r   r   r   r   r      s    	z2TestUnDirectedDedensification.build_original_graphc                 C   s,   t  }t j|dd\}}|t ks(tdS )zV
        Verify that an empty undirected graph results in no compressor nodes
        r    r!   N)r   rI   r#   r$   r%   )r   r&   r6   r'   r   r   r   r(      s    z(TestUnDirectedDedensification.test_emptyc                 C   s
   d| _ d S )N)6ABr   r-   r.   r   r   r   r/      s    z*TestUnDirectedDedensification.setup_methodc              
   C   s   dddgfddgfddgfddgfd	dgfd
ddgfdddgfdddgfddgfg	}t  }|D ]\}}|D ]}||| qlq`|S )Nr   r
   Cr   r   r   rJ   r   r   r   r	   rH   r   r   r   r   r      s    



z4TestUnDirectedDedensification.build_compressed_graphc                 C   s   |   }tj|dd\}}|  }| D ]H\}}dt|}dt|}|||}	|||}
|	|
ks*tq*t	|t	| j
kstdS )z
        Verifies that dedensify produced correct compressor nodes and the
        correct edges to/from the compressor nodes in an undirected graph
        r    r!   r0   N)r   r   r#   r   r1   r2   r3   r4   r%   r5   r'   )r   r&   r=   r'   Zv_compressed_Gr7   r8   r9   r:   Zhas_compressed_edgeZverified_has_compressed_edger   r   r   r;      s    z2TestUnDirectedDedensification.test_dedensify_edgesc                 C   sd   |   }tj|ddd\}}t| }t| }||ks@t|  }t| }||ks`tdS )zm
        Verifies that dedensify produced the correct number of edges in an
        undirected graph
        r    T)r"   r)   N)r   r   r#   r5   r1   r%   r   )r   r&   r=   r'   r>   Zverified_original_edge_countZverified_compressed_GZverified_compressed_edge_countr   r   r   r?      s    z7TestUnDirectedDedensification.test_dedensify_edge_countN)	rC   rD   rE   r   r(   r/   r   r;   r?   r   r   r   r   rG      s   rG   
graph_typec                 C   s(   |  }t j|dd}t ||s$td S )Ncolor)node_attributes)r   snap_aggregationis_isomorphicr%   )rL   r&   summary_graphr   r   r   test_summarization_empty   s    rS   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )AbstractSNAPrM   c                 C   s   d S Nr   r.   r   r   r   r      s    z!AbstractSNAP.build_original_graphc                 C   s   d S rU   r   r.   r   r   r   build_summary_graph   s    z AbstractSNAP.build_summary_graphc                 C   sB   |   }|  }d}t|| j|}| |}t||s>td S Ntyper   rV   r   rP   rO   deterministic_labelsrQ   r%   r   r@   rR   relationship_attributesZgenerated_summary_graphZrelabeled_summary_graphr   r   r   test_summary_graph   s      
zAbstractSNAP.test_summary_graphc                    sX   t  j}t| fddd}|  i }t|D ]\}}d| }|||< q2t |S )Nc                    s   t  j|  d d S )Ngroupr   )r3   nodes)nr&   r   r   <lambda>       z3AbstractSNAP.deterministic_labels.<locals>.<lambda>)keyzSupernode-%s)listr`   r3   sort	enumerater   Zrelabel_nodes)r   r&   Znode_labelsZlabel_mappingindexnodelabelr   rb   r   r[      s    

z!AbstractSNAP.deterministic_labelsN)rC   rD   rE   rO   r   rV   r^   r[   r   r   r   r   rT      s
   rT   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestSNAPNoEdgeTypesr   c                 C   s@   |   }|  }d}t|| j}| |}t||s<td S rW   rZ   r\   r   r   r   r^     s     
z&TestSNAPNoEdgeTypes.test_summary_graphc                 C   s   ddiddiddiddiddiddiddiddiddiddiddiddid}dddd	d
dddddddg}t  }|D ]}|| }|j|f| qv|D ]\}}||| q|S )NrN   RedBlueYellowr	   r
   rK   DEFr&   HIJKL)r	   r
   )r	   rK   )r	   rr   )r	   ru   )r
   rq   )r
   rv   )r
   rs   )rK   r&   )rq   rt   )ru   rv   )rv   rw   )ru   rx   r   rI   add_noder   )r   r`   r1   r&   rj   
attributesr   r   r   r   r   r     sB    z(TestSNAPNoEdgeTypes.build_original_graphc           	      C   s   ddiddiddiddiddiddid}dddd	d
ddg}t  }|D ]}|| }|j|f| qH|D ]\}}||| qhddhddhddhddhddhddhd}t ||d |S )NrN   rm   rn   ro   Supernode-0Supernode-1Supernode-2Supernode-3Supernode-4Supernode-5)r}   r}   )r}   r~   )r}   r   )r}   r   )r~   r   )r   r   )r   r   r	   r
   rK   rq   rr   rs   r&   rt   ru   rv   rw   rx   r_   r   rI   rz   r   set_node_attributes)	r   r`   r1   r&   rj   r{   r   r   
supernodesr   r   r   rV   =  s<    		z'TestSNAPNoEdgeTypes.build_summary_graphN)rC   rD   rE   r]   r^   r   rV   r   r   r   r   rl     s   'rl   c                   @   s   e Zd Zdd Zdd ZdS )TestSNAPUndirectedc           	      C   s   ddiddiddiddiddiddiddiddiddiddiddiddid}dddd	d
dddddddg}t  }|D ]}|| }|j|f| qv|D ]\}}}|j|||d q|S )NrN   rm   rn   ro   rp   )r	   r
   Strong)r	   rK   Weakr	   rr   r   )r	   ru   r   )r
   rq   r   )r
   rv   r   r
   rs   r   )rK   r&   r   )rq   rt   r   )ru   rv   r   )rv   rw   r   )ru   rx   r   rX   ry   	r   r`   r1   r&   rj   r{   r   r   rY   r   r   r   r   d  sB    z'TestSNAPUndirected.build_original_graphc           
      C   s   ddiddiddiddiddiddid}dddd	d
ddg}t  }|D ]}|| }|j|f| qH|D ] \}}}|j||d|igd qhddhddhddhddhddhddhd}	t ||	d |S )NrN   rm   rn   ro   r|   )r}   r}   r   )r}   r~   r   )r}   r   r   )r}   r   r   )r~   r   r   )r   r   r   )r   r   r   rY   typesr	   r
   rK   rq   rr   rs   r&   rt   ru   rv   rw   rx   r_   r   )
r   r`   r1   r&   rj   r{   r   r   rY   r   r   r   r   rV     s<    		z&TestSNAPUndirected.build_summary_graphNrC   rD   rE   r   rV   r   r   r   r   r   c  s   'r   c                   @   s   e Zd Zdd Zdd ZdS )TestSNAPDirectedc           	      C   s   ddiddiddiddiddiddiddiddid}ddd	d
ddddddddg}t  }|D ]}|| }|j|f| q^|D ]\}}}|j|||d q~|S )NrN   rm   Greenrn   ro   r	   r
   rK   rq   rr   rs   r&   rt   )r	   rK   r   r   )r	   rs   r   )r
   rq   r   )r
   rr   r   r   )rK   r&   r   )rK   rs   r   )rq   rr   r   )rq   rt   r   )r&   rr   r   )rt   rs   r   rX   )r   r   rz   r   r   r   r   r   r     s:    z%TestSNAPDirected.build_original_graphc           
      C   s   ddiddiddiddid}ddd	d
igfddd	did	d
igfddd	d
igfddd	d
igfddd	d
igfg}t  }|D ]}|| }|j|f| qz|D ]\}}}|j|||d qddhddhddhddhddhddhd}	t ||	d |S )NrN   rm   r   rn   ro   r}   r~   r   r   r}   r~   rY   r   r   r   r   r   r	   r
   rK   rq   rr   rs   r&   rt   ru   rv   rw   rx   r|   r_   )r   r   rz   r   r   )
r   r`   r1   r&   rj   r{   r   r   r   r   r   r   r   rV     s4    z$TestSNAPDirected.build_summary_graphNr   r   r   r   r   r     s   #r   c                   @   s   e Zd Zdd Zdd ZdS )TestSNAPUndirectedMultic           
      C   s   ddiddiddiddiddiddiddiddiddid	}dddd	gfd
ddd	gfddd	gfddd	gfdddgfdddd	gfdddd	gfdddd	gfg}t  }|D ]}|| }|j|f| q|D ]$\}}}|D ]}	|j|||	d qq|S )NrN   rm   rn   ro   )	r	   r
   rK   rq   rr   rs   r&   rt   ru   r	   rq   r   r   r
   rr   ru   rt   rs   r&   rX   )r   
MultiGraphrz   r   
r   r`   r1   r&   rj   r{   r   r   r   rY   r   r   r   r     s6    



z,TestSNAPUndirectedMulti.build_original_graphc              	   C   s  ddiddiddiddiddiddid}dddd	igfdd
dd	iddigfdd
ddigfdddd	iddigfd
d
dd	iddigfg}t  }|D ]}|| }|j|f| q|D ]$\}}}|D ]}	|j|||	d qqddhddhddhddhddhddhd}
t ||
d |S )NrN   rm   rn   ro   r|   r~   r   rY   r   r   r   r   r   rX   r	   r
   rK   rq   rr   rs   r&   rt   ru   rv   rw   rx   r_   )r   r   rz   r   r   r   r`   r1   r&   rj   r{   r   r   r   rY   r   r   r   r   rV     s:    	z+TestSNAPUndirectedMulti.build_summary_graphNr   r   r   r   r   r     s   !r   c                   @   s   e Zd Zdd Zdd ZdS )TestSNAPDirectedMultic           
      C   s  ddiddiddiddiddiddiddiddid}ddd	d
gfddd
gfddd	gfddd	d
gfddd	gfddd
gfddd	d
gfddd
gfddd
gfddd	d
gfddd
gfddd
gfg}t  }|D ]}|| }|j|f| q|D ]$\}}}|D ]}	|j|||	d qq|S )NrN   rm   r   rn   ro   r   r	   rK   r   r   rr   rs   r
   rq   r&   rt   rX   )r   MultiDiGraphrz   r   r   r   r   r   r   ?  s<    







z*TestSNAPDirectedMulti.build_original_graphc                 C   s   ddiddiddiddid}dddd	gfdd
dd	gfdd
d	gfdddd	gfdd
d	gfg}t  }|D ]}|| }|j|f| qf|D ]$\}}}|D ]}	|j|||	d qqddhddhddhddhd}
t ||
d |S )NrN   rm   rn   ro   r   r}   r~   r   r   r   r   rX   r	   r
   rK   rq   rr   rs   r&   rt   r_   )r   r   rz   r   r   r   r   r   r   rV   c  s2    

z)TestSNAPDirectedMulti.build_summary_graphNr   r   r   r   r   r   >  s   $r   )__doc__ZpytestZnetworkxr   r   rG   markZparametrizerI   r   r   r   rS   rT   rl   r   r   r   r   r   r   r   r   <module>   s     P 
![NFG