o
    toi!                     @  sr   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZmZ G dd dejZedkr7e  dS dS )    )annotationsN)
ModelProtoTensorProtoTensorShapeProtoValueInfoProtohelper)
make_modelmake_tensor_value_infoc                   @  sR   e Zd ZdddZdd
dZdddZdddZdddZdddZdddZ	dS )TestSymbolicShape
onnx_modelr   value_infoslist[ValueInfoProto]returnNonec           	      C  s   |D ]`}|  ||j}|dusJ | |jdr |jjj}n|jdr+|jjj}t|jt|jks:J | t	|jD ]"\}}|j| }|j
dkrV|jsUJ | q?|j
|j
ksaJ | q?qdS )zAssert onnx_model.value_info should be the same as expected value_infos
        Instead of exact symbol, use -1 to represent symbolic shape in expected value_infos
        Ntensor_typesparse_tensor_type)_get_shape_from_namenametypeHasFieldr   shaper   lendim	enumerate	dim_value	dim_param)	selfr   r   expected_vir   expected_shapedim_ir   expected_dim r"   Q/home/ubuntu/.local/lib/python3.10/site-packages/onnx/test/symbolic_shape_test.py_assert_valueinfo_shape   s   


z)TestSymbolicShape._assert_valueinfo_shapeintc                 C  sh   t  }t|jj}t|jj}t|jj}|| | D ]}|jjjj	D ]}|j
r.||j
 q#qt|S )z0Return the total number of unique symbolic shape)setlistgraphinputoutput
value_infor   r   r   r   r   addr   )r   r   symbol_shape_setinputsoutputs
valueinfosvr   r"   r"   r#   _count_unique_dim_param_number%   s   z0TestSymbolicShape._count_unique_dim_param_numberr   strTensorShapeProto | Nonec                 C  sx   t |jj}t |jj}t |jj}|| | D ]!}|j|kr9|jdr,|jjj	  S |jdr9|jj
j	  S qdS )zHGet shape from tensor_type or sparse_tensor_type according to given namer   r   N)r'   r(   r)   r*   r+   r   r   r   r   r   r   )r   r   r   r.   r/   r0   r1   r"   r"   r#   r   1   s   
z&TestSymbolicShape._get_shape_from_namec              
   C  s   t jdddgdgddd}tj jddgdgtjd	}t jd
||g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|}tjj	|dd}| 
|tdtjdg | |d| |dksfJ d S )NConcatABC   r.   r/   r   axisCastr*   r.   r/   to
test_graph      r   nodesr.   r/   Tstrict_moder@   r   r   	make_nodeonnxr   FLOAT
make_graphr	   r   shape_inferenceinfer_shapesr$   r   r   concatcast	graph_defr   inferred_modelr"   r"   r#   test_concat_enable_symbolic@   s2   
z-TestSymbolicShape.test_concat_enable_symbolicc                 C  s
  t jdddgdgddd}t jdddgdgddd}tj jd	dgd
gtjd}t jd|||gt dtjddg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|}tjj	|dd}| 
|tdtjdtdtjdg | |d| |d
ksJ d S )Nr5   r6   r7   r8   r9   r:   DEr<   r*   r=   r?   r@   rA   rB   TrD   rF   rG   )r   concat1concat2rP   rQ   r   rR   r"   r"   r#   test_two_symbolic_concat]   s@   
z*TestSymbolicShape.test_two_symbolic_concatc           	      C  s   t jdddgdgddd}t jdddgdgddd}tj jd	dgd
gtjd}t jd|||gt dtjddg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|}| |}tj	j
|dd}| |}||d ks{J | | d S )Nr5   r6   r7   r8   r9   r:   rT   rU   r<   r*   r=   r?   r@   unk__0rA   unk__1rB   TrD   )r   rH   rI   r   rJ   rK   r	   r   r2   rL   rM   )	r   rV   rW   rP   rQ   r   original_countrR   inferred_countr"   r"   r#   test_duplicate_symbolic_shape   s4   

 z/TestSymbolicShape.test_duplicate_symbolic_shapec              
   C  s   t jdddgdgddd}tj jddgdgtjd	}t jd
||g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|}tjj	|dd}| 
|tdtjdg | |d| |dksfJ d S )Nr5   r6   r7   r8   r9   r:   r<   r*   r=   r?   rA   rB   TrD   )rA   r   rG   rN   r"   r"   r#   test_unknown_shape   s6   
z$TestSymbolicShape.test_unknown_shapeN)r   r   r   r   r   r   )r   r   r   r%   )r   r   r   r3   r   r4   )r   r   )
__name__
__module____qualname__r$   r2   r   rS   rX   r]   r^   r"   r"   r"   r#   r
      s    





%#r
   __main__)
__future__r   unittestonnx.shape_inferencerI   r   r   r   r   r   onnx.helperr   r	   TestCaser
   r_   mainr"   r"   r"   r#   <module>   s    :