U
    ‰dC<  ã                   @   sd   d dl mZmZ d dlmZ d dlm  mZ d dl	m
Z
 d dlmZ d dlZG dd„ dejƒZdS )é    )ÚcoreÚ	test_util)Ú
caffe2_pb2N)Úgivenc                   @   s  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
ee ddg¡ddd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBS )CÚTestBindingsc                 C   sH   t  ¡ }|j}| t  d¡¡ | t  d¡¡ t|j ¡ ƒdksDt‚d S )NÚXÚFCé   )	ÚngÚNNModuleÚdataFlowÚ
createNodeÚNeuralNetDataÚNeuralNetOperatorÚlenÚgetMutableNodesÚAssertionError©ÚselfÚnnÚdfg© r   úA/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/nomnigraph_test.pyÚtest_simple   s
    zTestBindings.test_simplec                 C   sl   t  d¡}| ddgdg¡ t |¡}|j ¡ D ]6}| ¡ rN| ¡ dksft	‚q0| 
¡ r0| ¡ dks0t	‚q0d S ©NÚnamer   ÚWÚYr   )r   r   r   )r   ÚNetr   r
   r   r   r   Ú
isOperatorÚgetNamer   ÚisTensor©r   Únetr   Únoder   r   r   Útest_core_net_simple   s    

z!TestBindings.test_core_net_simplec                 C   s”   t  d¡}| ddgdg¡ | dgdg¡ t |¡}t|jƒdksHt‚|jD ]}| 	¡ dksNt‚qN|jd  
¡ d	kszt‚|jd
  
¡ dkst‚d S )Nr   r   r   r   ÚZr	   ÚOperatorr   r   é   ÚRelu)r   r   r   r)   r
   r   r   ÚcontrolFlowr   ÚgetTyper    )r   r#   r   Úinstrr   r   r   Útest_core_net_controlflow!   s    


z&TestBindings.test_core_net_controlflowc           	      C   sÐ   t  d¡}| ddgdg¡ | dgdg¡ t |¡}tƒ }|jD ]}| |j	¡ qB|tddddgƒkslt
‚tƒ }|jD ]}| |j	¡ qx|tddgƒksžt
‚tƒ }|jD ]}| |j	¡ qª|||B ksÌt
‚d S )Nr   r   r   r   r&   r   r)   )r   r   r   r)   r
   r   ÚsetÚtensorsÚaddr   r   Ú	operatorsÚnodes)	r   r#   r   r/   ÚtÚopsÚopr2   r$   r   r   r   Útest_core_net_nn_accessors,   s     




z'TestBindings.test_core_net_nn_accessorsc                 C   sx   t  d¡}| ddgdg¡ t | ¡ ¡}|j ¡ D ]>}| ¡ rV| 	¡  
¡ dksrt‚q4| ¡ r4| ¡  
¡ dks4t‚q4d S r   )r   r   r   r
   r   ÚProtor   r   r   ÚgetOperatorr    r   r!   Z	getTensorr"   r   r   r   Útest_netdef_simple>   s    
zTestBindings.test_netdef_simplec                 C   s`   t  ¡ }|j}tjddgdgdd}| |¡ | ¡ D ]$}| ¡ sFt‚| 	¡  
¡ dks6t‚q6d S )NZCeilr   r   ZCUDNN©Úengine)r
   r   r   r   ÚCreateOperatorr   r   r   r   r8   r    )r   r   r   r5   r$   r   r   r   Útest_operatordef_simpleH   s    
z$TestBindings.test_operatordef_simplec              	   C   s2   t  ¡ }|j}|  t¡ | d¡ W 5 Q R X d S )Né   )r
   r   r   ÚassertRaisesÚ	Exceptionr   r   r   r   r   Útest_invalid_nodeQ   s    zTestBindings.test_invalid_nodec              	   C   sÔ   t  ¡ }|j}| t  d¡¡}| t  d¡¡}| t  d¡¡}|  t¡ | ||¡ W 5 Q R X | ||¡ | ||¡ t	|ƒ 
d¡sŠt‚t  ¡ }| |¡ | |¡ | ¡  t|ƒdks¾t‚t	|ƒ 
d¡sÐt‚d S )Nr   r   ÚOpú	digraph Gr	   )r
   r   r   r   r   r   r?   r@   Ú
createEdgeÚstrÚ
startswithr   Z
NNSubgraphZaddNodeZinduceEdgesr   )r   r   r   ÚxÚwr5   Zsgr   r   r   Útest_edges_simpleW   s     

zTestBindings.test_edges_simpleé
   é2   )Úsizec           	   
   C   s²   t  d¡ t ¡ }|j}g }g }t|ƒD ]}| | t d¡¡¡ q(t|ƒD ]"}| | t 	dt
|ƒ ¡¡¡ qLt|ƒD ]4}t|ƒD ]&}tt  d¡ƒr„| || || ¡ q„qxd S )Ni9  r   rB   r(   )ÚrandomÚseedr
   r   r   ÚrangeÚappendr   r   r   rE   ÚboolÚgetrandbitsrD   )	r   rL   r   r   Údatar4   Ú_ÚiÚjr   r   r   Útest_edges_complexp   s    
 zTestBindings.test_edges_complexc                 C   sò   t  d¡}| ddgdg¡ | dgdg¡ t |¡}|jd }|jd }|jd  ¡ r\t	‚|jd j
dkspt	‚|jd j
dks„t	‚|jd j
dks˜t	‚|jd j
dks¬t	‚|jd  ¡ s¾t	‚|jd jj
dksÔt	‚|jd jd j
d	ksît	‚d S )
NÚtestr   r   r   r&   r   r(   r   r)   )r   r   r   r)   r
   r   r*   ÚinputsZhasProducerr   r   ÚoutputsZproducerZ	consumers)r   r#   r   ÚfcZrelur   r   r   Útest_traversal‚   s    



zTestBindings.test_traversalc                 C   sN   t  ¡ }|j}| t  d¡¡ | t  d¡¡ | t  d¡¡ t  |j¡ d S )Nr   r   rB   )r
   r   r   r   r   r   Úrenderr   r   r   r   Ú
test_debug’   s    zTestBindings.test_debugc                 C   s    t  ¡ }| t  d¡¡ t  ¡ }|j t  d¡¡}|j t  d¡¡}|j ||¡ d}| |¡D ].}t	|ƒdkstt
‚|d7 }t|ƒ d¡s`t
‚q`|dksœt
‚d S )NrX   r   r   r(   rC   )r
   ÚNNMatchGraphr   r   r   r   r   rD   Úmatchr   r   rE   rF   ©r   Úmgr   rX   rG   Úcountr`   r   r   r   Útest_match_graph_node›   s    z"TestBindings.test_match_graph_nodec              	   C   s¨   t  ¡ }|jt  d¡dd t  ¡ }|j t  d¡¡}|j t  d¡¡}|j ||¡ d}| |¡D ]}t	|ƒdksxt
‚|d7 }qd|  t¡ |dksšt
‚W 5 Q R X d S )NrX   T©Ústrictr   r   r(   )r
   r_   r   r   r   r   r   rD   r`   r   r   r?   r@   ra   r   r   r   Útest_match_graph_node_strict«   s    
z)TestBindings.test_match_graph_node_strictc                 C   sú   t  ¡ }|jt  d¡dd}|jt  d¡dd}| t  d¡¡}| ||¡ | ||¡ t  ¡ }|j t  d¡¡}|j t  d¡¡}|j t  d¡¡}|j ||¡ |j ||¡ d}	| |¡D ](}
t	t
|
ƒƒ t
|
ƒdksàt‚|	d7 }	qÀ|	dksöt‚d S )	NÚtest2Tre   r   rX   r   é   r(   )r
   r_   r   r   r   rD   r   r   r`   Úprintr   r   )r   rb   Útest2mÚxmÚtestmr   rh   rG   rX   rc   r`   r   r   r   Útest_match_graph»   s$    
zTestBindings.test_match_graphc                 C   sæ   t  ¡ }|jt  d¡dd}|jt  d¡dd}| t  d¡¡}| ||¡ | ||¡ t  ¡ }|j t  d¡¡}|j t  d¡¡}|j t  d¡¡}|j ||¡ |j ||¡ | |¡D ]}	|	}
q¼| 	|
¡ t
|jƒdksât‚d S )Nrh   Tre   r   rX   r   )r
   r_   r   r   r   rD   r   r   r`   ZdeleteSubgraphr   r*   r   )r   rb   rk   rl   rm   r   rh   rG   rX   Úmr`   r   r   r   Útest_delete_subgraphÑ   s     
z!TestBindings.test_delete_subgraphc                 C   s  t  ¡ }|jt  d¡dd}|jt  d¡dd}| t  d¡¡}| ||¡ | ||¡ t  ¡ }|j t  d¡¡}|j t  d¡¡}|j t  d¡¡}|j ||¡ |j ||¡ | |¡D ]}	|	}
q¼|j t  d¡¡}| 	|
|g g ¡ t
|jƒdksút‚|jd jdkst‚d S )	Nrh   Tre   r   rX   Únew_opr(   r   )r
   r_   r   r   r   rD   r   r   r`   ZreplaceSubgraphr   r*   r   r   )r   rb   rk   rl   rm   r   rh   rG   rX   ro   r`   rq   r   r   r   Útest_replace_subraphå   s$    z!TestBindings.test_replace_subraphc                 C   s6   t  ¡ }| d¡}| d¡}| ||¡}t  |¡ d S )NZhello1Zhello2)r
   ZGraphr   rD   r]   )r   ÚgÚn1Ún2Úer   r   r   Útest_genericGraphû   s
    

zTestBindings.test_genericGraphc                 C   s®   t  d¡}t |¡}| d¡}|  |jd d¡ |j t 	d¡¡}| 
||¡ | d¡}| 
||¡ |  |jd d¡ |  |j|j¡ | d¡}| d¡}|  |j|j¡ d S )Nr   Úar   Útest1Úb)r   r   r
   r   ZcreateUniqueDataNodeÚassertEqualr   r   r   r'   rD   ZassertNotEqual)r   r#   r   rt   ru   Zn3r   r   r   Útest_createUniqueDataNode  s    





z&TestBindings.test_createUniqueDataNodec           	      C   sn  t  d¡}| ddgdg¡ t |¡}| ¡ }t|ƒ t| ¡ ƒ t|j	ƒt| ¡ j	ƒks^t
‚tt|j	ƒƒD ]¤}| ¡ j	| }|j	| }|j|jks˜t
‚t|jƒt|jƒks°t
‚t|jƒt|jƒksÈt
‚t|j|jƒD ]\}}||ksÖt
‚qÖt|j|jƒD ]\}}||ksút
‚qúqlt|j| ¡ jƒD ]\}}||ks$t
‚q$t|j| ¡ jƒD ]\}}||ksPt
‚qPd S )Nr   r   r   r   )r   r   r   r
   r   ÚconvertToCaffe2Protorj   r7   r   r5   r   rO   ÚtypeÚinputÚoutputÚzipZexternal_inputZexternal_output)	r   r#   r   Z
new_netdefrU   r5   rq   rx   rz   r   r   r   Útest_convertToProto  s*    


z TestBindings.test_convertToProtoc           
      C   sh  t  ¡ }|j}| t  d¡¡}| t  d¡¡}| t  d¡¡}| ||¡ | ||¡ | ¡ }t|ƒdksnt	‚|d |ks~t	‚| t  d¡¡}| t  d¡¡}| ||¡ | ||¡ | ¡ }t|ƒdksÎt	‚||ksÚt	‚||ksæt	‚t| 
¡ ƒdksút	‚t| 
¡ ƒdkst	‚| 
¡ d |ks&t	‚|||fD ]}	|	 ¡ s0t	‚q0||fD ]}	|	 ¡ sNt	‚qNd S )	Nry   rh   rG   r(   r   Útest3Úyr	   )r
   r   r   r   r'   ÚDatarD   ZgetOperatorPredecessorsr   r   ZgetOperatorSuccessorsr   r!   )
r   r   r   ry   rh   rG   Úprƒ   r„   r$   r   r   r   Útest_node_interactions(  s2    z#TestBindings.test_node_interactionsc                 C   s@   t  ¡ }|j t  d¡¡}|j |¡ t|j ¡ ƒdks<t‚d S )NÚTestOpr   )	r
   r   r   r   r   Ú
deleteNoder   r   r   )r   r   r$   r   r   r   Útest_delete_nodeI  s    zTestBindings.test_delete_nodec                 C   sˆ   t  d¡}| ddgdg¡ t |¡}|jd }|j t d¡¡}| 	|j
d |¡ | |¡ t|jƒdkspt‚|jd jdks„t‚d S ©Nr   r   r   r   r   rˆ   r(   )r   r   r   r
   r   r*   r   r   r   ZreplaceProducerrZ   r‰   r   r   r   ©r   r#   r   r[   Ztest_opr   r   r   Útest_replace_producerO  s    



z"TestBindings.test_replace_producerc                 C   sŠ   t  d¡}| ddgdg¡ | ddgdg¡ t |¡}|jd }|j t d¡¡}| 	|j
d |¡ |jD ]}|j
d jdkslt‚qld S )	Nr   r   r   r   ZW2ZY2r   ÚT)r   r   r   r
   r   r*   r   r   r   ZreplaceAllUsesWithrY   r   r   )r   r#   r   r[   Ztest_tensorr5   r   r   r   Útest_replace_all_uses_withZ  s    



z'TestBindings.test_replace_all_uses_withc                 C   s¶   t  d¡}| ddgdg¡ t |¡}|jd }|j t d¡¡}| 	||¡ | 
|¡ t|jƒdksjt‚|jd jdks~t‚|jd jd jdks˜t‚|jd jd jdks²t‚d S r‹   )r   r   r   r
   r   r*   r   r   r   ZreplaceAsConsumerr‰   r   r   r   rY   rŒ   r   r   r   Útest_replace_as_consumerf  s    



z%TestBindings.test_replace_as_consumerc                 C   s@   t  ¡ }| d¡ | ¡ dks"t‚| d¡ | ¡ dks<t‚d S )NÚwootr>   )r
   Ú
AnnotationZ	setDeviceZ	getDevicer   ÚsetDeviceTypeÚgetDeviceType)r   Úannotr   r   r   Útest_annotation_basics  s
    

z"TestBindings.test_annotation_basicc                 C   sR   t  ¡ }|j t  d¡¡}| ¡ }| d¡ | |¡ | ¡ }| ¡ dksNt	‚d S )Nrˆ   r>   )
r
   r   r   r   r   ÚgetAnnotationr“   ÚsetAnnotationr”   r   )r   r   r$   r•   Ú	new_annotr   r   r   Útest_annotation_from_graphz  s    

z'TestBindings.test_annotation_from_graphc                 C   s„   t  ¡ }tjdg g dd}|j |¡}|jjjdks8t	‚tjdg g dd}||j_| 
¡ }t|jƒdkslt	‚|jd jdks€t	‚d S )NZConvZSENTINELr:   ZNEW_SENTINELr(   r   )r
   r   r   r<   r   r   Ú
annotationZoperator_defr;   r   r}   r   r5   )r   r   Zopdefr$   Znetdefr   r   r   Útest_annotation_operator_defƒ  s    z)TestBindings.test_annotation_operator_defc                 C   sN   t  ¡ }|j t  d¡¡}t ¡ }d|_||j_	|j
d jj	}||ksJt‚d S )Nrˆ   rX   r   )r
   r   r   r   r   r   ÚDeviceOptionZ	node_namer›   Údevice_optionr*   r   )r   r   r$   ÚdZd_2r   r   r   Útest_annotation_device_optionŽ  s    z*TestBindings.test_annotation_device_optionc                 C   sJ   t  ¡ }|j t  d¡¡}|j ¡ r(t‚t 	¡ }||j_
|j ¡ sFt‚d S )Nrˆ   )r
   r   r   r   r   r›   ZhasDeviceOptionr   r   r   rž   )r   r   r$   rŸ   r   r   r   Útest_has_device_option˜  s    z#TestBindings.test_has_device_optionc                 C   sÌ   t  ¡ }|j t  d¡¡}|j t  d¡¡}|j t  d¡¡}t  ¡ }| |¡ | |¡ | 	dddg¡ | 
|¡ | ¡ }| ¡ |ksŒt‚t| ¡ ƒdks t‚| ¡ d dks´t‚| ¡ d	 dksÈt‚d S )
NÚkeyÚlengthrˆ   Ú rX   r‘   ri   r   r	   )r
   r   r   r   r   r   r’   Z
setKeyNodeZsetLengthNodeZsetComponentLevelsr˜   r—   Z
getKeyNoder   r   ZgetComponentLevels)r   r   r¢   r£   r$   r•   r™   r   r   r   Útest_distributed_annotations   s    


z)TestBindings.test_distributed_annotationsc              	   C   sb   t  d¡}| ddgdg¡ t ¡ }t |||dœ¡}|  t¡ t |||dœ¡}W 5 Q R X d S )Nr   r   r   r   )r   r   )r   ZFake)	r   r   r   r   r   r
   r   r?   r@   )r   r#   rŸ   r   r   r   r   Útest_distributed_device_map´  s    
z(TestBindings.test_distributed_device_mapN)%Ú__name__Ú
__module__Ú__qualname__r   r%   r-   r6   r9   r=   rA   rI   r   ÚstZsampled_fromrW   r\   r^   rd   rg   rn   rp   rr   rw   r|   r‚   r‡   rŠ   r   r   r   r–   rš   rœ   r    r¡   r¥   r¦   r   r   r   r   r      s@   

	
	!	
r   )Zcaffe2.pythonr   r   Zcaffe2.protor   Zcaffe2.python.nomnigraphÚpythonZ
nomnigraphr
   Z
hypothesisr   Zhypothesis.strategiesZ
strategiesrª   rM   ZTestCaser   r   r   r   r   Ú<module>   s   