o
    ˷eS                     @   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   V   dddg dfddddgfd	dgfg}t  }|D ]\}}|D ]}||| qq|S )
N1BC2ABC3AB64r	   5ABr   r   r   nxDiGraphadd_edgeselforiginal_matrixgraphsourcetargetstarget r   c/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/tests/test_summarization.pybuild_original_graph
   s   
	z0TestDirectedDedensification.build_original_graphc                 C   sd   dddgfdg dfddgfddd	gfd
dgfdg}t  }|D ]\}}|D ]}||| q&q |S )Nr   r   r	   r
   r   r   r   r   r   r   )r	   r	   r   r   compressed_matrixcompressed_graphr   r   r   r   r   r    build_compressed_graph   s   

z2TestDirectedDedensification.build_compressed_graphc                 C   ,   t  }t j|dd\}}|t ksJ dS )zT
        Verify that an empty directed graph results in no compressor nodes
           	thresholdN)r   r   	dedensifyset)r   Gr$   c_nodesr   r   r    
test_empty+      z&TestDirectedDedensification.test_emptyTc           	      C   s   |r|   } |D ];}tt| |}t| |}|D ]}| || q|| }|D ]}| || |D ]}| || q4q*| | 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_neighbors	neighborsremove_edger   remove_node)	r,   compressor_nodesr0   compressor_noder1   out_neighborsout_neighborin_neighborsin_neighborr   r   r    densify3   s   z#TestDirectedDedensification.densifyc                 C   
   d| _ d S )N)r	   r-   r   r   r   r    setup_methodU      
z(TestDirectedDedensification.setup_methodc                 C   s   |   }|  }tj|dd\}}| D ]$\}}dt|}dt|}|||}	|||}
|	|
ks9J qt|t| j	ksEJ 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_edgelenr-   )r   r,   compressed_Gr$   r-   sto_so_tcompressed_graph_existsverified_compressed_existsr   r   r    test_dedensify_edgesX   s   z0TestDirectedDedensification.test_dedensify_edgesc                 C   s^   |   }t| }tj|dd\}}t| }||ksJ |  }|t| ks-J dS )zu
        Verifies that dedensify produced the correct number of comrpessor nodes
        in a directed graph
        r'   r(   N)r!   rF   rB   r   r*   r%   )r   r,   original_edge_countc_Gr-   compressed_edge_countrG   r   r   r    test_dedensify_edge_counth   s   z5TestDirectedDedensification.test_dedensify_edge_countc                 C   sT   |   }| j|| jdd}|  }| D ]\}}||||||ks'J qdS )zq
        Verifies that densification produces the correct edges from the
        original directed graph
        T)r0   N)r%   r;   r-   r!   rB   rE   )r   rG   original_graphr,   rH   rI   r   r   r    test_densify_edgesu   s   z.TestDirectedDedensification.test_densify_edgesc                 C   sZ   |   }t| }| || j}t| }||ksJ |  }|t| ks+J dS )zy
        Verifies that densification produces the correct number of edges in the
        original directed graph
        N)r%   rF   rB   r;   r-   r!   )r   rG   rQ   rS   rO   r,   r   r   r    test_densify_edge_count   s   z3TestDirectedDedensification.test_densify_edge_countN)T)__name__
__module____qualname__r!   r%   r.   staticmethodr;   r?   rN   rR   rT   rU   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   r   )
zC
        Builds graph shown in the original research paper
        )r   CBr   r
   r   r   r   r   r   r   r   Graphr   r   r   r   r    r!      s   
	z2TestUnDirectedDedensification.build_original_graphc                 C   r&   )zV
        Verify that an empty undirected graph results in no compressor nodes
        r'   r(   N)r   r]   r*   r+   )r   r,   rG   r-   r   r   r    r.      r/   z(TestUnDirectedDedensification.test_emptyc                 C   r<   )N)6ABr	   r=   r>   r   r   r    r?      r@   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 ]}||| q6q0|S )Nr   r   Cr   r	   r
   r^   r   r   r   r   r\   r"   r   r   r    r%      s    



z4TestUnDirectedDedensification.build_compressed_graphc                 C   s   |   }tj|dd\}}|  }| D ]$\}}dt|}dt|}|||}	|||}
|	|
ks9J qt|t| j	ksEJ 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(   rA   N)
r!   r   r*   r%   rB   rC   rD   rE   rF   r-   )r   r,   rP   r-   v_compressed_GrH   rI   rJ   rK   has_compressed_edgeverified_has_compressed_edger   r   r    rN      s   z2TestUnDirectedDedensification.test_dedensify_edgesc                 C   sd   |   }tj|ddd\}}t| }t| }||ks J |  }t| }||ks0J dS )zm
        Verifies that dedensify produced the correct number of edges in an
        undirected graph
        r'   T)r)   r0   N)r!   r   r*   rF   rB   r%   )r   r,   rP   r-   rQ   verified_original_edge_countverified_compressed_Gverified_compressed_edge_countr   r   r    rR      s   z7TestUnDirectedDedensification.test_dedensify_edge_countN)	rV   rW   rX   r!   r.   r?   r%   rN   rR   r   r   r   r    rZ      s    rZ   
graph_typec                 C   s(   |  }t j|dd}t ||sJ d S )Ncolor)node_attributes)r   snap_aggregationis_isomorphic)rf   r,   summary_graphr   r   r    test_summarization_empty   s   rm   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )AbstractSNAPrg   c                 C      d S Nr   r>   r   r   r    r!         z!AbstractSNAP.build_original_graphc                 C   ro   rp   r   r>   r   r   r    build_summary_graph   rq   z AbstractSNAP.build_summary_graphc                 C   sB   |   }|  }d}t|| j|}| |}t||sJ d S Ntyper!   rr   r   rj   ri   deterministic_labelsrk   r   rS   rl   relationship_attributesgenerated_summary_graphrelabeled_summary_graphr   r   r    test_summary_graph   s   
zAbstractSNAP.test_summary_graphc                    sZ   t  j}t| fddd}|  t }t|D ]\}}d| }|||< qt |S )Nc                    s   t  j|  d d S )Ngroupr   )rD   nodes)nr,   r   r    <lambda>   s    z3AbstractSNAP.deterministic_labels.<locals>.<lambda>)keyzSupernode-%s)listr~   rD   sortdict	enumerater   relabel_nodes)r   r,   node_labelslabel_mappingindexnodelabelr   r   r    rw      s   

z!AbstractSNAP.deterministic_labelsN)rV   rW   rX   ri   r!   rr   r|   rw   r   r   r   r    rn      s    rn   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J d S rs   rv   rx   r   r   r    r|     s   
z&TestSNAPNoEdgeTypes.test_summary_graphc                 C   s   t ddt ddt ddt ddt ddt ddt ddt ddt ddt ddt ddt ddd}g d}t }|D ]}|| }|j|fi | q=|D ]
\}}||| qO|S )NRedrg   BlueYellowr   r   r_   DEFr,   HIJKL))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]   add_noder   )r   r~   rB   r,   r   
attributesr   r   r   r   r    r!     s*   z(TestSNAPNoEdgeTypes.build_original_graphc           	      C   s   t ddt ddt ddt ddt ddt ddd}g d}t }|D ]}|| }|j|fi | q%|D ]
\}}||| q7ddhd	d
hddhddhddhddhd}t||d |S )Nr   rg   r   r   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   r_   r   r   r   r,   r   r   r   r   r   r}   r   r   r]   r   r   set_node_attributes)	r   r~   rB   r,   r   r   r   r   
supernodesr   r   r    rr   =  s.   	z'TestSNAPNoEdgeTypes.build_summary_graphN)rV   rW   rX   ry   r|   r!   rr   r   r   r   r    r     s
    'r   c                   @      e Zd Zdd Zdd ZdS )TestSNAPUndirectedc           	      C   s   t ddt ddt ddt ddt ddt ddt ddt ddt ddt ddt ddt ddd}g d}t }|D ]}|| }|j|fi | q=|D ]\}}}|j|||d qO|S )Nr   rg   r   r   r   ))r   r   Strong)r   r_   Weak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   rt   r   	r   r~   rB   r,   r   r   r   r   ru   r   r   r    r!   d  s*   z'TestSNAPUndirected.build_original_graphc           
      C   s   t ddt ddt ddt ddt ddt ddd}g d}t }|D ]}|| }|j|fi | q%|D ]\}}}|j||t |dgd q7d	d
hddhddhddhddhddhd}	t||	d |S )Nr   rg   r   r   r   ))r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   rt   typesr   r   r_   r   r   r   r,   r   r   r   r   r   r}   r   )
r   r~   rB   r,   r   r   r   r   ru   r   r   r   r    rr     s.   	z&TestSNAPUndirected.build_summary_graphNrV   rW   rX   r!   rr   r   r   r   r    r   c  s    'r   c                   @   r   )TestSNAPDirectedc           	   
   C   s   t ddt ddt ddt ddt ddt ddt ddt ddd}g d}t }|D ]}|| }|j|fi | q-|D ]\}}}|j|||d q?|S )	Nr   rg   Greenr   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   rt   )r   r   r   r   r   r   r   r   r    r!     s"   
z%TestSNAPDirected.build_original_graphc           
      C   s   t ddt ddt ddt dd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i | qA|D ]\}}}|j|||d qSddhddhddhddhddhddhd}	t||	d |S )Nr   rg   r   r   r   r   r   r   r   r   r   ru   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~   rB   r,   r   r   r   r   r   r   r   r   r    rr     s4   z$TestSNAPDirected.build_summary_graphNr   r   r   r   r    r     s    #r   c                   @   r   )TestSNAPUndirectedMultic           
      C   s  t ddt ddt ddt ddt ddt ddt ddt ddt dd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i | q\|D ]\}}}|D ]
}	|j|||	d quqn|S )Nr   rg   r   r   )	r   r   r_   r   r   r   r,   r   r   r   r   r   r   r   r   r   r   r   r,   rt   )r   r   
MultiGraphr   r   
r   r~   rB   r,   r   r   r   r   r   ru   r   r   r    r!     s8   



z,TestSNAPUndirectedMulti.build_original_graphc              	   C   s$  t ddt ddt ddt ddt ddt dd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i | qO|D ]\}}}|D ]
}	|j|||	d qhqaddhddhddhddhddhddhd}
t||
d |S )Nr   rg   r   r   r   r   r   ru   r   r   r   r   r   rt   r   r   r_   r   r   r   r,   r   r   r   r   r   r}   )r   r   r   r   r   r   r   r~   rB   r,   r   r   r   r   r   ru   r   r   r   r    rr     s<   	z+TestSNAPUndirectedMulti.build_summary_graphNr   r   r   r   r    r     s    !r   c                   @   r   )TestSNAPDirectedMultic           
      C   s$  t ddt ddt ddt ddt ddt ddt ddt dd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i | qk|D ]\}}}|D ]
}	|j|||	d qq}|S )Nr   rg   r   r   r   r   r   r_   r   r   r   r   r   r   r,   r   rt   )r   r   MultiDiGraphr   r   r   r   r   r    r!   ?  s>   







z*TestSNAPDirectedMulti.build_original_graphc                 C   s   t ddt ddt ddt dd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i | q7|D ]\}}}|D ]
}	|j|||	d qPqIddhddhddhddhd}
t||
d |S )Nr   rg   r   r   r   r   r   r   r   r   r   rt   r   r   r_   r   r   r   r,   r   r}   )r   r   r   r   r   r   r   r   r   r    rr   c  s4   

z)TestSNAPDirectedMulti.build_summary_graphNr   r   r   r   r    r   >  s    $r   )__doc__pytestnetworkxr   r   rZ   markparametrizer]   r   r   r   rm   rn   r   r   r   r   r   r   r   r   r    <module>   s      P
![NFG