U
    qh+                     @  sj   d dl mZ d dlZd dlmZ d dlZd dlmZmZmZmZ G dd dej	Z
edkrfejdd	 dS )
    )annotationsN)parameterized)
GraphProtoOperatorSetIdProtoTensorProtocheckerc                   @  s  e Zd Z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e	
di fdddifdddifddddfgddddddZdd  Ze	
d!d"d#d$d%d&d'd(d)d*d+d,gd-d. Ze	
d/ejfd0ejfd1ejfd2ejfd3ejfd4ejfd5ejfd6ejfd7ejfd8ejfd9ejfd:ejfd;ejfd<ejfd=ejfd>ejfd?ejfd@ej fdAej!fdBej"fdCej#fdDej$fgdddEdFZ%dGS )HTestBasicFunctionsr   None)graphreturnc                 C  sR   |  t|jd |  |jd jd |  |jd jd |  |jd jd d S )N   r   ZMatMul   ZAdd   ZSoftmax)assertEquallennodeop_type)selfr
    r   9/tmp/pip-unpacked-wheel-xnis5xre/onnx/test/parser_test.pycheck_graph   s    zTestBasicFunctions.check_graph)r   c                 C  s   d}t j|}| | d S )Nz
           agraph (float[N, 128] X, float[128,10] W, float[10] B) => (float[N] C)
           {
              T = MatMul(X, W)
              S = Add(T, B)
              C = Softmax(S)
           }
           )onnxparserparse_graphr   )r   inputr
   r   r   r   test_parse_graph   s    z#TestBasicFunctions.test_parse_graphc                 C  s@   d}t j|}| |jd | t|jd | |j d S )Na@  
           <
             ir_version: 7,
             opset_import: [ "" : 10, "com.microsoft": 1]
           >
           agraph (float[N, 128] X, float[128,10] W, float[10] B) => (float[N] C)
           {
              T = MatMul(X, W)
              S = Add(T, B)
              C = Softmax(S)
           }
              r   )	r   r   parse_modelr   
ir_versionr   Zopset_importr   r
   r   r   modelr   r   r   test_parse_model!   s
    z#TestBasicFunctions.test_parse_modelc                   s    d |  tjj fdd d S )Nz
           agraph (float[N, 128] X, float[128,10] W, float[10] B) => (float[N] C)
           {
              T = MatMul[X, W]
              S = Add(T, B)
              C = Softmax(S)
           }
           c                     s   t j S N)r   r   r   r   r   r   r   <lambda>=       z;TestBasicFunctions.test_parse_graph_error.<locals>.<lambda>assertRaisesr   r   
ParseErrorr   r   r#   r   test_parse_graph_error3   s
     
z)TestBasicFunctions.test_parse_graph_errorc                   s    d |  tjj fdd d S )NaA  
           <
             ir_version: 7,
             opset_import: [ "" : 10   "com.microsoft": 1]
           >
           agraph (float[N, 128] X, float[128,10] W, float[10] B) => (float[N] C)
           {
              T = MatMul(X, W)
              S = Add(T, B)
              C = Softmax(S)
           }
           c                     s   t j S r"   r   r   r   r   r#   r   r   r$   N   r%   z;TestBasicFunctions.test_parse_model_error.<locals>.<lambda>r&   r)   r   r#   r   test_parse_model_error@   s
     
z)TestBasicFunctions.test_parse_model_errorc                 C  s   d}t j|}t| d S )Nac  
            <
            ir_version: 9,
            opset_import: [ "" : 15, "custom_domain" : 1],
            producer_name: "FunctionProtoTest",
            producer_version: "1.0",
            model_version: 1,
            doc_string: "A test model for model local functions."
          >
         agraph (float[N] x) => (float[N] out)
         {
            out = custom_domain.Selu<alpha=2.0, gamma=3.0>(x)
         }
         <
         domain: "custom_domain",
         opset_import: [ "" : 15],
         doc_string: "Test function proto"
         >
           Selu
           <alpha: float=1.67326319217681884765625, gamma: float=1.05070102214813232421875>
           (X) => (C)
           {
               constant_alpha = Constant<value_float: float=@alpha>()
               constant_gamma = Constant<value_float: float=@gamma>()
               alpha_x = CastLike(constant_alpha, X)
               gamma_x = CastLike(constant_gamma, X)
               exp_x = Exp(X)
               alpha_x_exp_x = Mul(alpha_x, exp_x)
               alpha_x_exp_x_ = Sub(alpha_x_exp_x, alpha_x)
               neg = Mul(gamma_x, alpha_x_exp_x_)
               pos = Mul(gamma_x, X)
               _zero = Constant<value_float=0.0>()
               zero = CastLike(_zero, X)
               less_eq = LessOrEqual(X, zero)
               C = Where(less_eq, neg, pos)
           }
        )r   r   r   r   check_modelr   r   r   r   #test_parse_function_with_attributesQ   s    &z6TestBasicFunctions.test_parse_function_with_attributeszEagraph (float[N] x) => (float[N] out) { out = custom_domain.Selu(x) }zPagraph (float[N] x) => (float[N] out) { out = custom_domain.Selu<alpha=2.0>(x) }alphag       @zPagraph (float[N] x) => (float[N] out) { out = custom_domain.Selu<gamma=3.0>(x) }gammag      @z[agraph (float[N] x) => (float[N] out) { out = custom_domain.Selu<alpha=2.0, gamma=3.0>(x) })r/   r0   strdict)
graph_textexpected_attributer   c           
        s   d ddd } fdd}d  d d	}t j|g}t j|}td
ddtdddg}t jj|||d}	t|	 ||	 ||	j	j
d | d S )Ng   ?g   ?c                   sH   |D ]>  fdd| j D }t|dks,t|d j|  kstqd S )Nc                   s   g | ]}|j  kr|qS r   name).0attrkeyr   r   
<listcomp>   s     
 zzTestBasicFunctions.test_composite_parse_function_with_attributes.<locals>.expect_custom_node_attribute.<locals>.<listcomp>r   r   )	attributer   AssertionErrorf)r   
attributesZ
match_attrr   r9   r   expect_custom_node_attribute   s    zfTestBasicFunctions.test_composite_parse_function_with_attributes.<locals>.expect_custom_node_attributec                   s   t | jd jdkstdd | jd jD }t |dkrH|d j ksLtdd | jd jD }t |dkr||d jkstd S )Nr   r   c                 S  s   g | ]}|j d kr|qS )r/   r5   r7   Z
attr_protor   r   r   r;      s   
z}TestBasicFunctions.test_composite_parse_function_with_attributes.<locals>.expect_model_function_attribute.<locals>.<listcomp>r   c                 S  s   g | ]}|j d kr|qS )r0   r5   rA   r   r   r   r;      s   
)r   	functionsZattribute_protor=   r>   )r    Zattr_proto_alphaZattr_proto_gammaZdefault_alphaZdefault_gammar   r   expect_model_function_attribute   s    

ziTestBasicFunctions.test_composite_parse_function_with_attributes.<locals>.expect_model_function_attributez
         <
         domain: "custom_domain",
         opset_import: [ "" : 15],
         doc_string: "Test function proto"
         >
           Selu
           <alpha: float=z, gamma: float=a  >
           (X) => (C)
           {
               constant_alpha = Constant<value_float: float=@alpha>()
               constant_gamma = Constant<value_float: float=@gamma>()
               alpha_x = CastLike(constant_alpha, X)
               gamma_x = CastLike(constant_gamma, X)
               exp_x = Exp(X)
               alpha_x_exp_x = Mul(alpha_x, exp_x)
               alpha_x_exp_x_ = Sub(alpha_x_exp_x, alpha_x)
               neg = Mul(gamma_x, alpha_x_exp_x_)
               pos = Mul(gamma_x, X)
               _zero = Constant<value_float=0.0>()
               zero = CastLike(_zero, X)
               less_eq = LessOrEqual(X, zero)
               C = Where(less_eq, neg, pos)
           }
            )domainversionZcustom_domainr   )rB   opset_importsr   )r   r   Zparse_functionr   r   helperZ
make_modelr   r-   r
   r   )
r   r3   r4   r@   rD   Zfunction_textrB   r
   rI   r    r   rC   r   -test_composite_parse_function_with_attributes{   s,    

  
z@TestBasicFunctions.test_composite_parse_function_with_attributesc                 C  s   t jd}| t|jddg | t|jddg | t|jd t j	
|d}| |d | |jd | |jd	 d S )
Nz5out1, out2 = SomeDomain.SomeOp <attr1 = 1> (in1, in2)Zin1Zin2Zout1Zout2r   Zattr1Z
SomeDomainZSomeOp)r   r   Z
parse_noder   listr   outputr   r<   rJ   Zget_node_attr_valuerG   r   )r   r   Zattr_valr   r   r   test_parse_node   s    z"TestBasicFunctions.test_parse_node)Znot_a_good_floatT)Zinf1T)z-inf1T)Znan0T)z-nan0T)ZnaninfT)infF)z-infF)ZinfinityF)z	-infinityF)nanF)z-NaNFc                   s   d| d |r*|  tjj fdd ntj }| |jd | |jd | |jd | t	|j
jd | t	|j
jd	 jd | |j
jd	 jd	 jd
 | |j
jd	 jd	 jtjj | t|j
jd	 jd	 jtt| d S )Nz
        <
        ir_version: 8,
        opset_import: ["" : 18, "this" : 1],
        producer_name: "FunctionProtoTest",
        producer_version: "1.0"
        >
        _func () => ()
        {
        tmp = Constant <value_float = z>()
        }
        c                     s   t j S r"   r+   r   Z
model_textr   r   r$      r%   zDTestBasicFunctions.test_parse_various_float_values.<locals>.<lambda>   ZFunctionProtoTestz1.0r   r   Zvalue_float)r'   r   r   r(   r   r   r   Zproducer_nameZproducer_versionr   r
   r   r<   r6   typeZAttributeProtoFLOATr1   r>   float)r   Ztest_literalZexpect_exceptionr    r   rQ   r   test_parse_various_float_values   s.    	 
  
z2TestBasicFunctions.test_parse_various_float_valuesZbfloat16boolZ	complex64Z
complex128doubleZfloat16rU   Zfloat8e4m3fnZfloat8e4m3fnuzZ
float8e5m2Zfloat8e5m2fnuzZint4Zint8Zint16Zint32Zint64stringZuint4Zuint8Zuint16Zuint32Zuint64c              	   C  sT   |t jkrdnd}d| d| d| d| d	}tj|}| t|jjd d S )	Nz{"0"}z{0}z
           <
             ir_version: 10,
             opset_import: [ "" : 19]
           >
           agraph (float[N] X) => (z![N] C)
           <
             z[1] weight = z5
           >
           {
              C = Cast<to=z>(X)
           }
           r   )	r   STRINGr   r   r   r   r   r
   r   )r   r6   itypewZ
text_graphr
   r   r   r   test_parse_graph_types  s    
z)TestBasicFunctions.test_parse_graph_typesN)&__name__
__module____qualname__r   r   r!   r*   r,   r.   r   expandrK   rN   rV   r   ZBFLOAT16ZBOOLZ	COMPLEX64Z
COMPLEX128ZDOUBLEZFLOAT16rT   ZFLOAT8E4M3FNZFLOAT8E4M3FNUZZ
FLOAT8E5M2ZFLOAT8E5M2FNUZZINT4ZINT8ZINT16ZINT32ZINT64rZ   ZUINT4ZUINT8ZUINT16ZUINT32ZUINT64r]   r   r   r   r   r      s   *D
 r   __main__r   )	verbosity)
__future__r   Zunittestr   r   r   r   r   r   ZTestCaser   r^   mainr   r   r   r   <module>   s     0