U
    qhw                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dl	Z
d dlZ
d dl
mZmZmZmZmZmZmZ G dd dejZedkre  dS )    )annotationsN)Sequence)
GraphProtoSparseTensorProtoTensorProtocheckerhelpernumpy_helpershape_inferencec                   @  sp  e Zd ZeddddZdbddddddd	d
dZddddZddddZddddZddddZ	ddddZ
ddddZddddZddddZddddZdddd Zddd!d"Zddd#d$Zddd%d&Zddd'd(Zddd)d*Zddd+d,Zddd-d.Zddd/d0Zddd1d2Zddd3d4Zeddd5d6Zddd7d8Zddd9d:Zddd;d<Zddd=d>Zddd?d@ZdddAdBZ dddCdDZ!dddEdFZ"dddGdHZ#dddIdJZ$dddKdLZ%dddMdNZ&dddOdPZ'dddQdRZ(dddSdTZ)dddUdVZ*dddWdXZ+dYdZ Z,d[d\ Z-d]d^ Z.d_d` Z/daS )cTestCheckerr   )returnc                 C  s4   t jddt j}tjdtjd|	d
 dS )N      test)r   r      name	data_typedimsvalsnprandomrandnastypefloat32r   make_tensorr   FLOATZreshapetolistselfZnp_array r!   :/tmp/pip-unpacked-wheel-xnis5xre/onnx/test/checker_test.py_sample_float_tensor   s    z TestChecker._sample_float_tensorspvalzSequence[int]strr   )shapevaluesindices_shapeindicesr   r   c                 C  sT   t  }|j| t|}|jt|tj	|f| |j
tdtj	|| |S )NZspind)r   r   extendlenr'   ZCopyFromr   r   r   INT64r)   )r    r&   r'   r(   r)   r   sparseZnnzr!   r!   r"   make_sparse%   s    zTestChecker.make_sparseNonec                 C  s$   t jddgdgdd}t| d S )NReluXYr   r   r   	make_noder   
check_noder    noder!   r!   r"   test_check_node9   s    zTestChecker.test_check_nodec                 C  sj   t jdg dgdd}t| t jddgdgdd}t| t jddgdgdd}| tjtj| d S )NGivenTensorFillr2   r   r3    r0   )r   r5   r   r6   assertRaisesValidationErrorr7   r!   r!   r"   %test_check_node_input_marked_optional>   s    

z1TestChecker.test_check_node_input_marked_optionalc                 C  s   d}t ddt |dg}d}ddg}dg}t jd	dgd
g|dt jd	dgdg|dt jdd
dgdg|dg}t ||||||}t| d S )Nlocalr;         func_nested_identity_addabcZfunc_identityZa1)domainZb1Zfunc_add)r   make_opsetidr5   Zmake_functionr   Zcheck_function)r    Zfunc_domainZfunc_nested_opset_importsZfunc_nested_identity_add_nameZfunc_nested_identity_add_inputsZ func_nested_identity_add_outputsZfunc_nested_identity_add_nodesrB   r!   r!   r"   test_check_function_nestedK   s(    

z&TestChecker.test_check_function_nestedc                   s   t j  d _dtj i _t j ddd fdd}t	j
dd	gd
gdd}t	|gdt	d	tjddggt	d
tjddgg}|| |j| jg d|jd _| t j|| d	|jd _|| d S )Nr   r;   r   r/   )gr   c                   s   t |   d S N)r   check_graph)rI   ctxZlex_ctxr!   r"   check_ir_version_3k   s    zETestChecker.test_check_graph_ir_version_3.<locals>.check_ir_version_3r0   r1   r2   r   r3   rA   r   no-existr   )r   CZCheckerContext
ir_versiononnxZdefsZonnx_opset_versionopset_importsZLexicalScopeContextr   r5   
make_graphmake_tensor_value_infor   r   initializerr*   r#   r   r<   r=   )r    rN   r8   graphr!   rL   r"   test_check_graph_ir_version_3d   s$    

z)TestChecker.test_check_graph_ir_version_3c                 C  s   t jddgdgdd}t |gdt dtjddggt dtjddgg}t| |j	| j
g d|jd	 _t| d|jd	 _t| d S )
Nr0   r1   r2   r   r3   rA   r   rO   r   )r   r5   rT   rU   r   r   r   rK   rV   r*   r#   r   r    r8   rW   r!   r!   r"   test_check_graph   s    

zTestChecker.test_check_graphc                 C  s  t jdddgdgdd}t jddgdgd	d}t ||gd
t dtjddgt dtjddggt dtjddgg}t j|d
d}| t	j
tj|d t| t ||gd
t dtjddgt dtjddggt dtjddgg}t j|d
d}| t	j
tj|d t| d S )NZDivr1   r2   ZZtest_divr3   IdentityWZtest_identityr   rA   r   producer_nameT)r   r5   rT   rU   r   r   BOOL
make_modelr<   r
   InferenceErrorr   check_modelrK   INT32)r    Znode_divZnode_identityrW   modelr!   r!   r"   test_check_graph_types   sD       
   z"TestChecker.test_check_graph_typesc                 C  s   t jddgdgdd}t |gdt dtjddggt dtjddgg}t| |j	| j
g d|jd	 _| tjtj| d S )
Nr0   r1   r2   r   r3   rA   r   r;   r   )r   r5   rT   rU   r   r   r   rK   rV   r*   r#   r   r<   r=   rY   r!   r!   r"   'test_check_graph_empty_initializer_name   s    
z3TestChecker.test_check_graph_empty_initializer_namec                 C  s   t jddgdgdd}t |gdt dtjddggt dtjddgg}t| | dgd	d
dgdgdddgd}|j	
|g | tjtj| d S )Nr0   r1   r2   r   r3   rA   r   d            r   	      Q   r;   )r   r5   rT   rU   r   r   r   rK   r.   sparse_initializerr*   r<   r=   r    r8   rW   r-   r!   r!   r"   .test_check_graph_empty_sparse_initializer_name   s    
"z:TestChecker.test_check_graph_empty_sparse_initializer_namec                 C  s   t jddgdgdd}t |gdt dtjddggt dtjddgg}t| |j	| j
g d|jd _| d	gd
ddgdgdddgd}|j	|g | tjtj| d S )Nr0   r1   r2   r   r3   rA   r   r   rh   ri   rj   rk   r   rl   rm   rn   )r   r5   rT   rU   r   r   r   rK   rV   r*   r#   r   r.   ro   r<   r=   rp   r!   r!   r"   %test_check_graph_duplicate_init_names   s    
"z1TestChecker.test_check_graph_duplicate_init_namesc                 C  sH   t jddgdgdd}t |gdg t dtjddgg}t| d S )Nr:   r;   r2   r   r3   rA   r   )r   r5   rT   rU   r   r   r   rK   rY   r!   r!   r"   test_check_graph_optional_input   s    z+TestChecker.test_check_graph_optional_inputc              
   C  s   t jddgdgdd}t jddgdgdd}t j||gdt dtjd	d
gt dtjd	d
ggt dtjd	d
ggd}| tjtj	| d S )Nr0   r1   r[   relu1r3   r2   relu2r   rA   r   inputsoutputs
r   r5   rT   rU   r   r   r<   r   r=   rK   )r    rt   ru   rW   r!   r!   r"   test_check_graph_ssa   s    	z TestChecker.test_check_graph_ssac              
   C  s   t jddgdgddd}t jddgdgdd	d}t j||gd
t dtjddggt dtjddggd}| tjtj	| d S )NScaler1   r2          @n1Zscaler   r[         @n2r   rA   r   rv   ry   )r    r}   r   rW   r!   r!   r"   %test_check_graph_topologically_sorted
  s    z1TestChecker.test_check_graph_topologically_sortedc                 C  sh   t jddgdgdd}t |gdt dtjddggt dtjddgg}t j|dd}t| d S 	Nr0   r1   r2   r   r3   rA   r   r^   )	r   r5   rT   rU   r   r   ra   r   rc   r    r8   rW   re   r!   r!   r"   test_check_model  s    zTestChecker.test_check_modelc                 C  sl   t jddgdgdd}t |gdt dtjddggt dtjddgg}t j|dd}t|	  d S r   )
r   r5   rT   rU   r   r   ra   r   rc   ZSerializeToStringr   r!   r!   r"   test_check_serialized_model"  s    z'TestChecker.test_check_serialized_modelc                 C  sx   t jddgdgdd}t |gdt dtjddggt dtjddgg}t d	d}t j|d|gd
}t	| d S )NZPadr1   r2   )r   r   r   r   )Zpaddingsr   rA   r   r;   r_   rS   
r   r5   rT   rU   r   r   rG   ra   r   rc   r    r8   rW   onnx_idre   r!   r!   r"   test_check_old_model.  s    z TestChecker.test_check_old_modelc                 C  sB   | j }t| tjddtj |_	| 
tjtj| d S )Nr   r   )r#   r   check_tensorr   r   r   r   r   tobytesraw_datar<   r=   r    Ztensorr!   r!   r"   test_check_tensor;  s    
zTestChecker.test_check_tensorc                 C  sX   t  }t j|_|jd |jd t| |jd d = d|_| 	tj
tj| d S )NrA   s   Test)r   STRINGr   r   appendZstring_datar   r   r   r<   r=   r   r!   r!   r"   test_check_string_tensorB  s    
z$TestChecker.test_check_string_tensorc                 C  s$   | j }tj|_| tjtj| d S rJ   )r#   r   rd   r   r<   r   r=   r   r   r!   r!   r"   "test_check_tensor_mismatched_fieldN  s    z.TestChecker.test_check_tensor_mismatched_fieldc              
   C  s   t jddgdgddd}t jddgdgdd	d}t j||gd
g t dtjddggd}t jddgdg||d}t j|gdt dtjdgt dtjddggt dtjddggd}t| d S Nr{   r1   r2   r|   r}   r~   r[   r   r   nestedrA   r   rv   ZIfZcond)Zthen_branchZelse_branchr   )	r   r5   rT   rU   r   r   r`   r   rK   )r    r}   r   rW   i1r!   r!   r"   test_nested_graphS  s0        
zTestChecker.test_nested_graphc              
   C  s   t jddgdgddd}t jddgdgdd	d}t }d|_t j||gd
g t dtjddggd}t jddgdg||d}t j|gdt dtj	dgt dtjddggt dtjddggd}t
| d S r   )r   r5   rR   ZValueInfoProtor   rT   rU   r   r   r`   r   rK   )r    r}   r   Zinput_xrW   r   r!   r!   r"   .test_nested_graph_without_subgraph_input_shapen  s4        
z:TestChecker.test_nested_graph_without_subgraph_input_shapec                 C  s4   t jddt j}tjdtjd|	d
 dS )Nr   r   r   )r   r   r   r   r   r!   r!   r"   _sample_0_elem_tensor  s    z!TestChecker._sample_0_elem_tensorc                 C  s   | j }t| d S rJ   )r   r   r   r   r!   r!   r"   test_check_tensor_zero_elem  s    z'TestChecker.test_check_tensor_zero_elemc                 C  s(   t jdg dgdddgd}t| d S )NZConstantFillr2   r   rA   r   )r   r&   r4   r7   r!   r!   r"   "test_check_removed_experimental_op  s    z.TestChecker.test_check_removed_experimental_opc                 C  sz   t jddgdgddd}t |gdt dtjddggt dtjddgg}t dd}t j|d|gd	}t	| d S )
NZ
NonExistOpr1   r2   r   ztest.domain)r   rF   rA   r   r   r   r   r!   r!   r"   -test_skip_schema_check_on_non_standard_domain  s         z9TestChecker.test_skip_schema_check_on_non_standard_domainc                 C  s.   |  dgdddgdgdddg}t| d S )	Nrh   ri   rj   rk   r   rl   rm   rn   r.   r   check_sparse_tensorr    r-   r!   r!   r"   test_check_sparse_tensor  s     z$TestChecker.test_check_sparse_tensorc                 C  s6   |  dgdddgdgdddg}| tjtj| d S )	Nrh   ri   rj   rk   r   rl   rm      r.   r<   r   r=   r   r   r!   r!   r"   &test_check_sparse_tensor_invalid_index  s     z2TestChecker.test_check_sparse_tensor_invalid_indexc                 C  s6   |  dgdddgdgdddg}| tjtj| d S )	Nrh   ri   rj   rk   r   rm   rl   rn   r   r   r!   r!   r"   "test_check_sparse_tensor_unordered  s     z.TestChecker.test_check_sparse_tensor_unorderedc                 C  s8   |  ddgdddgddgdddd	d
dg}t| d S )N
   ri   rj   rk   r   r   r   rl         rA   r   r   r!   r!   r"   #test_check_sparse_tensor_coo_format  s    *z/TestChecker.test_check_sparse_tensor_coo_formatc                 C  s@   |  ddgdddgddgdddd	d
dg}| tjtj| d S )Nr   ri   rj   rk   r   r   r   rl   rm   r   rA   r   r   r!   r!   r"   1test_check_sparse_tensor_coo_format_invalid_index  s    *z=TestChecker.test_check_sparse_tensor_coo_format_invalid_indexc                 C  s@   |  ddgdddgddgdddd	d
dg}| tjtj| d S )Nr   ri   rj   rk   r   r   r   rl   r   r   rA   r   r   r!   r!   r"   1test_check_sparse_tensor_coo_format_invalid_shape  s    *z=TestChecker.test_check_sparse_tensor_coo_format_invalid_shapec                 C  s:   |  ddgdddgddgdddg}| tjtj| d S )	Nr   ri   rj   rk   r   rA   r   r   r   r   r!   r!   r"   0test_check_sparse_tensor_coo_format_invalid_dim2  s    $z<TestChecker.test_check_sparse_tensor_coo_format_invalid_dim2c           	      C  s   d}d}t dtj|g}| ||gdddgdgdddg}t jd	g d
g|d}t dtj|g}t dd
dgdg}t ||gd|g|g}t| d S )N   r   r1   r   r   rA      %   ConstantrP   )Zsparse_valuer2   ZMatMulZsparse_matmul)	r   rU   r   r   r.   r5   rT   r   rK   )	r    MNr1   Zsparse_tensornode1r2   node2rW   r!   r!   r"   test_check_sparse_matmul  s    "z$TestChecker.test_check_sparse_matmulc           	      C  s   d}t dtj|g}t dtj|g}t dtj|g}t dd}t dddgdg}t |gd||g|g}t j|d	|gd
}| 	t
jtj|d d S Nr   r1   r2   r[   r;   r   AddZtest_add_inputr   r   T)r   rU   r   r`   r   rG   r5   rT   ra   r<   r
   rb   r   rc   	r    r   r1   r2   r[   r   r8   rW   re   r!   r!   r"   'test_check_model_unsupported_input_type  s       z3TestChecker.test_check_model_unsupported_input_typec           	      C  s   d}t dtj|g}t dtj|g}t dtj|g}t dd}t dddgdg}t |gd||g|g}t j|d	|gd
}| 	t
jtj|d d S r   )r   rU   r   r   rd   rG   r5   rT   ra   r<   r
   rb   r   rc   r   r!   r!   r"   "test_check_model_inconsistent_type  s       z.TestChecker.test_check_model_inconsistent_typec           	      C  s   d}t dtj|g}t dtj|g}t dtj|g}t dd}t dddgdg}t |gd||g|g}t j|d	|gd
}| 	t
jtj|d d S r   )r   rU   r   r   r`   rG   r5   rT   ra   r<   r
   rb   r   rc   r   r!   r!   r"   (test_check_model_unsupported_output_type  s       z4TestChecker.test_check_model_unsupported_output_typec                 C  s  t jt ddgdt jdt jdtjdgdt jdtjg dt jd	tjdgdt jd
tjg dt jdtjdgdgt jdtjdgdgt	j
tjdtjdddt	j
tjdgtjdd	dt	j
tjdtjdd
dt	j
tjdgtjdddgt jddgdgddtjdt jddd
gdgdddt jddgdgdddt jdddddgddgd t jd!t jd"tjg dt jd#tjg dt jd$tjdgdt jd%tjdgdt jd&tjg dgt jd'tjg dt jd(tjdgdt jd%tjdgdgt	j
tjdtjdd&dgt jd)d$d%gd(gd*d+t jdd(gd,gd-dtjdt jdd,d&gd.gd/ddt jdd.gd'gd0ddgd1d2t jd3dgd4gd5d6gd7t jd8d4d	gdgd8d+gd1d9}tj|d:d; d S )<Nr;   r   r   	test-loopinput_0rA   r&   while_maximum_iterations_0const_fold_opt__18const_fold_opt__17Const_0output_0    Zdtyper3         $@Castwhile_cond_158_while_Less__13_0while_cond_158_while_Less__13rw   rx   r   rF   toLesswhile_cond_158_while_Less_0while_cond_158_while_Lessrw   rx   r   rF   Squeezewhile_cond_158_while_Squeeze_0while_cond_158_while_SqueezeLoopwhile_loop_0while_loop_1
while_loop
while_bodywhile_while_loop_counter_0
cond__15_0while_placeholder_0while_add_const_0_0Zconst_fold_opt__191cond___while_Identity_graph_outputs_Identity__3_0while_Identity_2_0r   	while_Addrw   rx   r   cond___while_Less__13_0cond___while_Less__13cond___while_Less_0cond___while_Lesscond___while_Squeezer   rw   rx   rV   Znodesrw   rx   r   body	UnsqueezeReshape_tensor_0Reshape_tensorr   rw   rx   r   ZaxesReshaperS   rQ   rW   TZ
full_check)r   ra   make_operatorsetidrT   rU   r   rd   r,   r   r	   
from_arrayr   arrayint64r   int32r5   r`   r   rc   r    re   r!   r!   r"   /test_loop_with_same_initializer_input_below_ir4  s|                  
            	
Z 0z;TestChecker.test_loop_with_same_initializer_input_below_ir4c                 C  sj  t jt ddgdt jdt jdtjdgdt jdtjg dt jd	tjdgdt jd
tjg dt jdtjdgdgt jdtjdgdgt	j
tjdtjdddt	j
tjdgtjdd	dt	j
tjdtjdd
dt	j
tjdgtjdddgt jddgdgddtjdt jddd
gdgdddt jddgdgdddt jdddddgddgd t jd!t jd"tjg dt jd#tjg dt jd$tjdgdt jd%tjdgdt jd	tjg dgt jd&tjg dt jd'tjdgdt jd%tjdgdgg t jd(d$d%gd'gd)d*t jdd'gd&gd+dtjdgd,d-t jd.dgd/gd0d1gd2t jd3d/d	gdgd3d*gd,d4}| tjtj|d5 d S )6Nr;   r   r   r   r   rA   r   r   r   r   r   r   r   r   r3   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r   ra   r   rT   rU   r   rd   r,   r   r	   r   r   r   r   r   r   r5   r`   r<   r
   rb   r   rc   r   r!   r!   r"   4test_loop_with_different_initializer_input_below_ir4  s\                  
            	C    z@TestChecker.test_loop_with_different_initializer_input_below_ir4c                 C  s  t jt ddgdt jdt jdtjdgdt jdtjg dt jd	tjdgdt jd
tjg dt jdtjdgdgt jdtjdgdgt	j
tjdtjdddt	j
tjdgtjdd	dt	j
tjdtjdd
dt	j
tjdgtjdddgt jddgdgddtjdt jddd
gdgdddt jddgdgdddt jdddddgddgd t jd!t jd"tjg dt jd#tjg dt jd$tjdgdt jd%tjdgdgt jd&tjg dt jd'tjdgdt jd%tjdgdgt	j
tjd(tjdd"dgt jd)d$d%gd'gd*d+t jdd'gd,gd-dtjdt jdd,d"gd.gd/ddt jdd.gd&gd0ddgd1d2t jd3dgd4gd5d6gd7t jd8d4d	gdgd8d+gd1d9}| tjtj|d: d S );Nr;   r   r   r   r   rA   r   r   r   r   r   r   r   r   r3   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   Tr   r   r!   r!   r"   /test_loop_with_same_initializer_input_above_ir4W  s|                  
          	
X -   z;TestChecker.test_loop_with_same_initializer_input_above_ir4c                 C  s8   t jd}tj|dd t jd}tj|dd d S )Nz
            <
                ir_version: 7,
                opset_import: [ "" : 17]
            >
            agraph (float[N] x) => (int64[M] y)
            {
                y = Constant <value_ints: ints = []>()
            }
        Tr   z
            <
                ir_version: 7,
                opset_import: [ "" : 17]
            >
            agraph (float[N] x) => (float[M] y)
            {
                y = Constant <value_floats: floats = []>()
            }
        )rR   parserparse_modelr   rc   r   r!   r!   r"   test_empty_list_attribute  s    z%TestChecker.test_empty_list_attributec              	   C  s   t dtjjdg}t dtjjdg}t ddgdg}t |gd|g|g}t j|dd}t	 .}t
j|d}t|| tj|dd	 W 5 Q R X d S )
NinputrA   outputr\   r   r^   u   模型モデル모델✨.onnxTr   )r   rU   rR   r   r   r5   rT   ra   tempfileTemporaryDirectoryospathjoinsaver   rc   )r    Zinput_tensorZoutput_tensorr8   rW   re   temp_dirZunicode_model_pathr!   r!   r"   &test_check_model_supports_unicode_path)  s"        
z2TestChecker.test_check_model_supports_unicode_pathc                 C  s"   t jd}| tjtj| d S )Nz
            <ir_version: 7, opset_import: [ "" : 17]>
            agraph (float[N] x) => (float[N] y, float[N] z)
            {
                y = Add(x, x)
            }
            # Error: z is not defined
        rR   r   r   r<   r   r=   rc   r   r!   r!   r"   test_graph_output_is_defined9  s    
z(TestChecker.test_graph_output_is_definedc                 C  s"   t jd}| tjtj| d S )Nap  
            <ir_version: 7, opset_import: [ "" : 17]>
            agraph (float[N] x, bool cond) => (float[N] y)
            {
                sum = Add (x, x)
                prod = Mul (x, x)
                y = If (cond) <
                    then_branch = then_graph () => (sum) {},
                    else_branch = else_graph () => (prod) {}
                >
            }
            # Error: sum/prod are accessible inside if-then-else branches, but cannot
            # be used as outputs of the then/else branch implicitly.
            # An explicit "Identity(sum)" must be used to return sum as output.
        r  r   r!   r!   r"   -test_graph_output_is_defined_within_sub_graphF  s    z9TestChecker.test_graph_output_is_defined_within_sub_graphN)r$   )0__name__
__module____qualname__propertyr#   r.   r9   r>   rH   rX   rZ   rf   rg   rq   rr   rs   rz   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      sd    .	 7 ! 5r   __main__)
__future__r   r   r   Zunittesttypingr   Znumpyr   Z	onnx.defsrR   Zonnx.parserr   r   r   r   r   r	   r
   ZTestCaser   r	  mainr!   r!   r!   r"   <module>   s&   $        I