o
    wi/                     @  sn   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r5ejdd	 dS dS )
    )annotationsN)parameterized)
GraphProtoOperatorSetIdProtoTensorProtocheckerc                   @  s|  e Zd ZdCddZdDddZdDd	d
ZdDddZdDddZdDddZe	
di fdddifdddifddddfgdEddZd d! Zd"d# Zd$d% Ze	
g d&d'd( Ze	
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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gdDd@dAZ(dBS )FTestBasicFunctionsgraphr   returnNonec                 C  sR   |  t|jd |  |jd jd |  |jd jd |  |jd jd d S )N   r   MatMul   Add   Softmax)assertEquallennodeop_type)selfr	    r   R/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/test/parser_test.pycheck_graph   s   zTestBasicFunctions.check_graphc                 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   opset_importr   r	   r   r   modelr   r   r   test_parse_model!   s
   z#TestBasicFunctions.test_parse_modelc                       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                        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                   r&   )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                     r'   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) })r5   r6   
graph_textstrexpected_attributedictc           
        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J |d j|  ks!J 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   f)r   
attributes
match_attrr   r?   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J dd | jd jD }t |dkr$|d j ks&J dd | jd jD }t |dkr>|d jks@J d S )Nr   r   c                 S     g | ]	}|j d kr|qS )r5   r;   r=   
attr_protor   r   r   rA      
    
z}TestBasicFunctions.test_composite_parse_function_with_attributes.<locals>.expect_model_function_attribute.<locals>.<listcomp>r   c                 S  rG   )r6   r;   rH   r   r   r   rA      rJ   )r   	functionsattribute_protorC   )r$   attr_proto_alphaattr_proto_gammadefault_alpha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versioncustom_domainr   )rK   opset_importsr   )r   r   parse_functionr   r   helper
make_modelr   r3   r	   r   )
r   r7   r9   rF   rR   function_textrK   r	   rX   r$   r   rO   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)in1in2out1out2r   attr1
SomeDomainSomeOp)r   r   
parse_noder   listr   outputr   rB   rZ   get_node_attr_valuerU   r   )r   r   attr_valr   r   r   test_parse_node   s   z"TestBasicFunctions.test_parse_nodec                 C  s   t jd}| t|jg  | t|jg  t jd}| t|jdg | t|jdg t jd}| t|jdg | t|jdg t jd}| t|jddg | t|jddg d S )Nz= SomeOp ()z, = SomeOp (,)rS   zx, = SomeOp (y,)yxz,x = SomeOp (,y)r   r   re   r   rf   r   rg   r   r   r   r   r   test_missing_identifier   s   z*TestBasicFunctions.test_missing_identifierc                 C  sp   t jd}| t|jdg | t|jdg t jd}| t|jddg | t|jddg d S )Nz"" = SomeOp ("")rS   z"",x = SomeOp ("",y)rk   rl   rm   rn   r   r   r   test_quoted_empty_identifier   s   z/TestBasicFunctions.test_quoted_empty_identifier))not_a_good_floatT)inf1T)z-inf1T)nan0T)z-nan0T)naninfT)infF)z-infF)infinityF)z	-infinityF)nanF)z-NaNFc                   s   d| d |r|  tjj fdd d S t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                     r'   r(   r1   r   
model_textr   r   r*     r+   zDTestBasicFunctions.test_parse_various_float_values.<locals>.<lambda>   FunctionProtoTestz1.0r   r   value_float)r-   r   r   r.   r    r   r!   producer_nameproducer_versionr   r	   r   rB   r<   typeAttributeProtoFLOATr8   rC   float)r   test_literalexpect_exceptionr$   r   rx   r   test_parse_various_float_values   s(   	 z2TestBasicFunctions.test_parse_various_float_valuesbfloat16bool	complex64
complex128doublefloat16r   float8e4m3fnfloat8e4m3fnuz
float8e5m2float8e5m2fnuzint4int8int16int32int64stringuint4uint8uint16uint32uint64
float4e2m1c              	   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   r<   itypew
text_graphr	   r   r   r   test_parse_graph_types%  s   
z)TestBasicFunctions.test_parse_graph_typesN)r	   r   r
   r   )r
   r   )r7   r8   r9   r:   r
   r   ))__name__
__module____qualname__r   r   r%   r0   r2   r4   r   expandr]   rj   ro   rp   r   r   BFLOAT16BOOL	COMPLEX64
COMPLEX128DOUBLEFLOAT16r   FLOAT8E4M3FNFLOAT8E4M3FNUZ
FLOAT8E5M2FLOAT8E5M2FNUZINT4INT8INT16INT32INT64r   UINT4UINT8UINT16UINT32UINT64
FLOAT4E2M1r   r   r   r   r   r      sr    





*D
 r   __main__r   )	verbosity)
__future__r   unittestr   r   r   r   r   r   TestCaser   r   mainr   r   r   r   <module>   s     G