o
    r::j                    @  sn  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ ddl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mZmZmZmZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z? ddl@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJmKZK ddlLmMZMmNZN ddlOmMZP ddlQmRZR erddlSmTZT eUeddZVeUed d!ZWd"d# ZXd$d% ZYd&d' ZZd(d) Z[d*d+ Z\d,d- Z]d>d7d8Z^G d9d: d:ej_Z`ead;kr5ejbd<d= dS dS )?zYou can run a specific test by using the following syntax.

::

    python onnx/test/reference_evaluator_test.py TestReferenceEvaluator.test_function_attribute_nested_graph
    )annotationsN)redirect_stdoutwraps)StringIO)getenv)dedent)TYPE_CHECKING)assert_allclose)AttributeProtoFunctionProto
ModelProtoTensorProtocheckerparser)get_roi_align_input_values)check_model)onnx_opset_version)make_function
make_graph
make_modelmake_model_gen_version	make_nodemake_operatorsetidmake_opsetidmake_sequence_type_protomake_tensormake_tensor_sequence_value_infomake_tensor_value_infomake_value_info)
from_array)ReferenceEvaluator)OpRunOpRunExpand)load_op)_get_indices_is_out)Cast_19Celu)Adam)_apply_causal)_vcelu1)_col2im_naive_implementation_2dcol2im_naive_implementation)Conv_conv_implementation)r.   )_conv_implementation_im2col)SequenceORT_MAX_IR_SUPPORTED_VERSION8$ORT_MAX_ONNX_OPSET_SUPPORTED_VERSION18c                      t   fdd}|S )Nc                    ,   t jdd u rtd | i | d S )Nonnxruntimezonnxruntime not installed	importlibutil	find_specunittestSkipTestargskwargsfn i/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/onnx/test/reference_evaluator_test.pywrapperX      
z'skip_if_no_onnxruntime.<locals>.wrapperr   rC   rF   rD   rB   rE   skip_if_no_onnxruntimeW      rI   c                   r6   )Nc                    r7   )Ntorchztorch not installedr9   r?   rB   rD   rE   rF   b   rG   z!skip_if_no_torch.<locals>.wrapperr   rH   rD   rB   rE   skip_if_no_torcha   rJ   rL   c                   r6   )Nc                    r7   )Ntorchvisionztorchvision not installedr9   r?   rB   rD   rE   rF   l   rG   z'skip_if_no_torchvision.<locals>.wrapperr   rH   rD   rB   rE   skip_if_no_torchvisionk   rJ   rN   c                 C  s*   t |trt| ||S t|}t| ||S N)
isinstanceintr   r   r   )name	elem_typeshapes_typerD   rD   rE   make_sequence_value_infou   s   
rV   c                 C  sV   dd l }t}| jD ]}|jdv r|j} nq	| jtks|tkr!d S |j|  dgdS )Nr   ) zai.onnxCPUExecutionProvider)	providers)	r8   r4   opset_importdomainversion
ir_versionr2   InferenceSessionSerializeToString)
onnx_modelortonnx_domain_opsetopsetrD   rD   rE   run_ort_inference|   s   



rd   c                   s  t |tstdt|dt| jt|kr$td| jd|dtd  t fddt	 D }t
| j| }t	 D ]0}|| || d	 || d	   }t|| | || d
  || d	  ||  d	 }	|	||< qDt|}
tj|
| jd}t|}t|jd   }t	|D ]L}t||jd   }t|}t	|D ]6}t||}t|}|| |ddd
f  ||  }t|}t|| jrd
||| < q| t| ||| < qq|S )zNaive implementation for `im2col`.

    Args:
        data: image (float)
        kernel_shape: kernel shape
        dilations: dilations
        pads: pads
        strides: strides

    Returns:
        result
    zUnexpected type z for kernel_shape.zShape mismatch z and .   c                   s    g | ]}| |   fqS rD   rD   .0in_dimspadsrD   rE   
<listcomp>   s     z/im2col_naive_implementation.<locals>.<listcomp>   r   dtypeN)rP   tuple	TypeErrortypelenrT   
ValueErrornparrayrangelistrQ   zerosrp   prodr%   r&   )datakernel_shape	dilationsrl   stridesnew_padslist_output_shapedkdndoutput_shapereskernel_sizeres_sizeri   i_rest_resji_kernelt_kerneli_imgt_imgrD   rj   rE   im2col_naive_implementation   s@   
 *


 
r   img
np.ndarrayr}   tuple[int, ...]r~   Sequence[int]rl   r   returnc           
      C  s   d }t | jd D ]6}t | jd D ],}t| ||df ||||}|d u r7| jd d |j }	tj|	| jd}||||df< qq	g |jd t|  dR }	||	S )Nr   rn   .rf   ro   )rx   rT   r   rv   emptyrp   rt   reshape)
r   r}   r~   rl   r   r   ncout	new_shaperD   rD   rE   im2col   s   
r   c                   @  s  e Zd ZdZedddZedd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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 dBdC Z!dDdE Z"dFdG Z#dHdI Z$dJdK Z%dLdM Z&dNdO Z'dPdQ Z(dRdS Z)dTdU Z*dVdW Z+dXdY Z,dZd[ Z-d\d] Z.d^d_ Z/d`da Z0e1dbdc Z2e1ddde Z3dfdg Z4dhdi Z5djdk Z6dldm Z7dndo Z8dpdq Z9drds Z:dtdu Z;e<dvdw Z=dxdy Z>e<dzd{ Z?e<d|d} Z@d~d ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMe1dd ZNdd ZOe<ePdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYedddZZe[j[\e]^de_j`e_jae_jagddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`ddgddgge_jbde_j`ddgddgge_jcdgfde_j`e_jae_jagddgge_jbde_j`ddgddgge_jcdgfg	ddgdddZde[j[\g dddddZedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zlemneopdddd Zqdd Zrdd Zsdd  Ztdd Zudd Zvdd Zwdd Zxd	d
 Zydd Zzdd Z{e[j[\de_|d}dd e_|dd}dde_~dddg dg dg dgfde_|d}dd e_|dd}dde_dddg dg dg dgfe_|d}ddg dg dg dge_~dddg dg dg d gfe_|dd!d"gd#d$gd%dg d&fe_d'e_d(e_~d(d%dd	fe_d)e_d(e_~d(ddd	fgd*d+ Ze[j[\e_|d}dde_|dd}dde_~dddg d,g d-g d.gfe_|d}dde_|dd}dde_dddg d/g d0g d1gfe_e_|d}ddgd e_e_`ddgddgge_`dd2gddggge_~d3ddg d4g d5gg d6g d7ggfe_|d}ddg d8g d8g d8ge_~dddg d9g d:g d;gfe_|dddgddgd%dg d<fe_d'e_d(e_~d(d%dd	fe_d)e_d(e_~d(ddd	fgd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP Ze[j[\g dQdRdS Ze[j[\g dTdUdV ZdWdX ZdYdZ Zd[d\ Ze[j[\d]d^gd_d`gdadbgdcfg dddegg dfdgfdhg dig dig djdgfgdkdl Ze[j[\dmdngdod	g dpg dqgddgfg drdod	dsdtgdudvgdtdtggg dwfg dxdoddsdtgdudvgdudyggg dzfg d{g d{gdod	g d|g d}g dqgg d|g d}g dqggg d~g d~gfg dd	d	g dg dg dgg dfg ddtd	g dg dg dgg dfddgdd	g dg dgddgfg dde_`g }dg fgdd Zdd Ze[j[\e_jejdggdggddggfe_jejdggdggd"dggfgdd Ze[j[\g ddg ddgfg dg dgdg dg dgdfg ddg ddfgdd Zdd Ze[j[\ejg dg dfejg dg dfejd%gd%gfejg dg dfejg dg dfejd%gd%gfgdd Ze[j[\e]^ejejfejejfdd Ze[j[\e]^ejejfejejfdddZe[j[\ejg dg dfejg dg dfejd%gd%gfejg dg dfejg dg dfejd%gd%gfgdd Ze[j[\e]^ejejfejejfdd Ze[j[\e]^ejejfejejfdddZdd Zdd ZdÐdĄ Ze[j[\g dŢddɐdʄZe[j[\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 Zd	S (  TestReferenceEvaluatora6  
        <
            ir_version: 7,
            opset_import: [ "": 10, "com.microsoft": 1]
        >
        agraph (float[N, M] B01, float[N, M] B11, float[N, M] B21) => (float[N, M] D0)
        {
            C0 = Add(B01, B11)
            C1 = Sub(B11, B21)
            D0 = Mul(C0, C1)
        }
        m_defstrr   r   c                 C  s   t | }t| |S )zjParses a model from a string representation, including checking
        the model for correctness
        )r   parse_modelr   r   )r   mrD   rD   rE   _load_model   s   

z"TestReferenceEvaluator._load_modelFN            ?c              
     sB  t dtjd d g}t dtjd d g}t dtjd d g}t dtjd g}tdddgdg}| rtdddgdg}	|d ur~|d	k r~rZ rOtd
dgdg d}
n td
dgdgd}
n rgtd
dgdg d}
ntd
dgdg}
t||	|
gd|||g|g}nOrttjgtjdddnd } rttj gtjdddnd }d|rdnd|rdndg}td
|dg}
dd ||fD }t||	|
gd|||g|g|d} fdd}ntdddgdg}	t||	gd|||g|g}dd }|d u rt	|}n
t	|t
d|gd}z	t| W ||fS  ty  } ztd| |d }~ww )NXABYMatMulXAAddY_clip   Clip)minmax)r   )r   lrro   mirR   marW   c                 S  s   g | ]}|r|qS rD   rD   )rh   _rD   rD   rE   rm     s    z=TestReferenceEvaluator._linear_regression.<locals>.<listcomp>initializerc                   s   t || |  S rO   )rv   clipxab	max_value	min_valuerD   rE   f  s   z4TestReferenceEvaluator._linear_regression.<locals>.fc                 S  s   || | S rO   rD   r   rD   rD   rE   <lambda>  s    z;TestReferenceEvaluator._linear_regression.<locals>.<lambda>opset_importszchecker fails for
)r   r   FLOATr   r   r    rv   rw   float32r   r   r   	ExceptionAssertionError)r   rc   r   r   r   r   r   r   node1node2node3graphr   r   inputsr   r   r`   erD   r   rE   _linear_regression   s\   

z)TestReferenceEvaluator._linear_regressionc                 C  sJ   t dtjd d g}| t t| W d    d S 1 sw   Y  d S )Nr   )r   r   r   assertRaisesrr   r!   )selfr   rD   rD   rE   #test_reference_evaluator_exceptions%  s   
"z:TestReferenceEvaluator.test_reference_evaluator_exceptionsc                 C  s   t t j}t| t|}| |jg d | |jdg | |j	ddd t
jddgddggt
jd	}t
jd
dgddggt
jd	}t
jddgddggt
jd	}|d |||dd }|| ||  }t|| d S NB01B11B21D0
   rn   rW   zcom.microsoftr   rf      ro               )r   r   m2_defr   r   r!   assertEqualinput_namesoutput_namesopsetsrv   rw   r   runr
   r   r   sessr   yzr   expectedrD   rD   rE   %test_reference_evaluator_no_attribute*  s   
z<TestReferenceEvaluator.test_reference_evaluator_no_attributec                 C  s   t t j}t| t|}| |jg d | |jdg | |j	ddd t
jddgddggt
jd	}t
jd
dgddggt
jd	}t
jddgddggt
jd	}|jd |||ddd}| |t || ||  }t|d | d S )Nr   r   r   rn   r   r   rf   r   ro   r   r   r   r   r   r   r   r   T)intermediate)r   r   r   r   r   r!   r   r   r   r   rv   rw   r   r   assertIsInstancedictr
   r   rD   rD   rE   2test_reference_evaluator_no_attribute_intermediate8  s   
zITestReferenceEvaluator.test_reference_evaluator_no_attribute_intermediatec                 C  s   t t j}t| t| }| |jg d | |j	dg | |j
ddd tjddgddggtjd	}tjd
dgddggtjd	}tjddgddggtjd	}|d |||dd }|| ||  }t|| d S r   )r   r   r   r   r   r!   r_   r   r   r   r   rv   rw   r   r   r
   r   rD   rD   rE   +test_reference_evaluator_no_attribute_bytesG  s   
zBTestReferenceEvaluator.test_reference_evaluator_no_attribute_bytesc           	   	   C  s  t t j}tjddgddggtjd}tjddgdd	ggtjd}tjd
dgddggtjd}| jdd; t|dd}t }t	| |
d |||d W d    n1 sYw   Y  | }d}| || W d    n1 stw   Y  | jdd@ t|dd}t }t	| |
d |||d W d    n1 sw   Y  | }tdd}| || W d    n1 sw   Y  | jdd@ t|dd}t }t	| |
d |||d W d    n1 sw   Y  | }tdd}| || W d    n	1 sw   Y  | jddB t|dd}t }t	| |
d |||d W d    n	1 s@w   Y  | }tdd}| || W d    d S 1 sbw   Y  d S )Nr   rn   rf   r   ro   r   r   r   r   r   r   r   r   levelverboser   z:Add(B01, B11) -> C0
Sub(B11, B21) -> C1
Mul(C0, C1) -> D0
a  
                 +I B01: float32:(2, 2) in [0.0, 3.0]
                 +I B11: float32:(2, 2) in [4.0, 7.0]
                 +I B21: float32:(2, 2) in [-7.0, -4.0]
                Add(B01, B11) -> C0
                 + C0: float32:(2, 2) in [4.0, 10.0]
                Sub(B11, B21) -> C1
                 + C1: float32:(2, 2) in [8.0, 14.0]
                Mul(C0, C1) -> D0
                 + D0: float32:(2, 2) in [32.0, 140.0]
                
a  
                 +I B01: float32:(2, 2):[0.0, 1.0, 2.0, 3.0]
                 +I B11: float32:(2, 2):[4.0, 5.0, 6.0, 7.0]
                 +I B21: float32:(2, 2):[-4.0, -5.0, -6.0, -7.0]
                Add(B01, B11) -> C0
                 + C0: float32:(2, 2):[4.0, 6.0, 8.0, 10.0]
                Sub(B11, B21) -> C1
                 + C1: float32:(2, 2):[8.0, 10.0, 12.0, 14.0]
                Mul(C0, C1) -> D0
                 + D0: float32:(2, 2):[32.0, 60.0, 96.0, 140.0]
                   a  
                 +I B01: float32:(2, 2):[0.0, 1.0, 2.0, 3.0]
                 +I B11: float32:(2, 2):[4.0, 5.0, 6.0, 7.0]
                 +I B21: float32:(2, 2):[-4.0, -5.0, -6.0, -7.0]
                Add(B01, B11) -> C0
                -- begin Add.run(2 inputs)
                -- done Add.run -> 1 outputs
                 + C0: float32:(2, 2):[4.0, 6.0, 8.0, 10.0]
                Sub(B11, B21) -> C1
                -- begin Sub.run(2 inputs)
                -- done Sub.run -> 1 outputs
                 + C1: float32:(2, 2):[8.0, 10.0, 12.0, 14.0]
                Mul(C0, C1) -> D0
                -- begin Mul.run(2 inputs)
                -- done Mul.run -> 1 outputs
                 + D0: float32:(2, 2):[32.0, 60.0, 96.0, 140.0]
                )r   r   r   rv   rw   r   subTestr!   r   r   r   getvaluer   r   lstrip)	r   r   r   r   r   r   stdoutr   logrD   rD   rE   -test_reference_evaluator_no_attribute_verboseU  sp   
	


$zDTestReferenceEvaluator.test_reference_evaluator_no_attribute_verbosec              
   C  s$  t dtjd dg}t dtjd dg}tddgdg}t|gd|g|g}t|}dD ]e}| j|dU t||d}tj	g tj
d	d
d}t }	t|	 |d d|i}
W d    n1 s_w   Y  |}t|
d
 | | |
d
 jd |	 }| d| W d    n1 sw   Y  q*d S )Ninputr   outputIdentitytest_empty_array)rf   r   r   r   r   r   ro   r   )r   r   )r   r   r   r   r   r   r   r!   rv   rw   r   r   r   r   r   r
   r   rT   r   assertIn)r   input_tensoroutput_tensornoder   modelverbose_levelr   empty_inputr   resultr   r   rD   rD   rE   ,test_reference_evaluator_empty_array_verbose  s*   
zCTestReferenceEvaluator.test_reference_evaluator_empty_array_verbosec           	      C  s   t  \}}tjddgddggtjd}tjddgtjd}tjdgtjd}||||}t|}|d |||dd }t|| d S )Nr   rn   rf   r   ro   r   r   r   r   )r   r   rv   rw   r   r!   r   r
   )	r   r   r   r   r   r   r   r   gotrD   rD   rE   test_reference_evaluator_lr  s   z2TestReferenceEvaluator.test_reference_evaluator_lrc           
      C  sv  | j ddY tjdd\}}tjddgddggtjd	}tjddgtjd	}tjd
gtjd	}||||}t|}|jd }| |j	j
d |d |||dd }	t|	| W d    n1 sbw   Y  | j ddZ tjdd d\}}tjddgddggtjd	}tjddgtjd	}tjd
gtjd	}||||}t|}|jd }| |j	j
d |d |||dd }	t|	| W d    n1 sw   Y  | j dd[ tjdd d\}}tjddgddggtjd	}tjddgtjd	}tjd
gtjd	}||||}t|}|jd }| |j	j
d |d |||dd }	t|	| W d    d S 1 s4w   Y  d S )Nmin+maxoptT)r   r   rn   rf   r   ro   r   r   Clip_11r  r   )r   r   r   )r   r   )r   r   r   rv   rw   r   r!   	rt_nodes_r   	__class____name__r   r
   
r   r   r   r   r   r   r   r   	last_noder  rD   rD   rE    test_reference_evaluator_lr_clip  sH   


$z7TestReferenceEvaluator.test_reference_evaluator_lr_clipc           
      C  s  | j ddh tjddd\}}tjddgdd	ggtjd
}tjddgtjd
}tjdgtjd
}||||}t|}|jd }| |j	j
d | |jd | |jd |d |||dd }	t|	| W d    n1 sqw   Y  | j ddi tjddd d\}}tjddgdd	ggtjd
}tjddgtjd
}tjdgtjd
}||||}t|}|jd }| |j	j
d | |jd | |jd |d |||dd }	t|	| W d    n1 sw   Y  | j ddj tjddd d\}}tjddgdd	ggtjd
}tjddgtjd
}tjdgtjd
}||||}t|}|jd }| |j	j
d | |jd | |jd |d |||dd }	t|	| W d    d S 1 saw   Y  d S )Nr  r  Tr   )r   rc   r   rn   rf   r   ro   r   r   Clip_6r  r   )r   rc   r   g   r   )r   rc   r   g   G)r   r   r   rv   rw   r   r!   r  r   r  r  r   r   r   r
   r  rD   rD   rE   "test_reference_evaluator_lr_clip_6  s\   




$z9TestReferenceEvaluator.test_reference_evaluator_lr_clip_6c                 C  sR   t d}t|}tjg dtjdd}|d d|id }|}t|| d S )Naf  
            <
              ir_version: 8,
              opset_import: [ "" : 14, "local" : 1],
              producer_name: "test",
              producer_version: "1.0",
              model_version: 1,
              doc_string: "Test preprocessing model"
            >
            agraph (uint8[H, W, C] x) => (uint8[H, W, C] x_processed)
            {
                x_processed = local.func(x)
            }

            <
              opset_import: [ "" : 14 ],
              domain: "local",
              doc_string: "function 1"
            >
            f1 (x) => (y) {
                y = Identity(x)
            }

            <
              opset_import: [ "" : 14 ],
              domain: "local",
              doc_string: "function 2"
            >
            f2 (x) => (y) {
                y = Identity(x)
            }

            <
              opset_import: [ "" : 14, "local" : 1 ],
              domain: "local",
              doc_string: "Preprocessing function."
            >
            func (x) => (y) {
                x1 = local.f1(x)
                y = local.f2(x1)
            }
        )r   rn   r   ro   rn   rn   r   r   r   )	r   r   r!   rv   rw   uint8r   r   r
   )r   r   r   r   r  r   rD   rD   rE   test_nested_local_functions   s   -z2TestReferenceEvaluator.test_nested_local_functionsc           
      C  s   t dtjd d g}t dtjd g}tddgdgdgdd}t|gd|g|g}t|tddgd	}t| t	d

dtj}|jddd}t|}|d d|id }	t|	| d S )Nr   r   	ReduceSumrn   axeskeepdimsrsrW   r   r   <   r   r   r   axisr#  r   r   r   r   r   r   r   r   r   rv   aranger   astyper   sumr!   r   r
   
r   r   r   r   r   r`   r   r   r   r  rD   rD   rE   test_reduce_sum_11T  s   z)TestReferenceEvaluator.test_reduce_sum_11c           
      C  s   t dtjd d g}t dtjd g}tddgdgdgdd}t|gd|g|g}t|tddgd	}t| t	d

dtj}|| jddd}t|}|d d|id }	t|	| d S )Nr   r   ReduceSumSquarern   r!  r$  rW   r   r   r%  r&  r'  r   r)  r-  rD   rD   rE   test_reduce_sum_square_11a  s   z0TestReferenceEvaluator.test_reduce_sum_square_11c                 C  s   t dtjd d g}t dtjd d g}t dtjd g}tdddgdgdd}t|gd||g|g}t|tdd	gd
}t| t	
ddt	j}t	jdgt	jd}|jddd}	t|}
|
d ||dd }t||	 d S )Nr   r   r   r   rn   r#  r$  rW      r   r%  r&  ro   r'  r   r   r   r   r   r   INT64r   r   r   r   r   rv   r*  r   r+  r   rw   int64r,  r!   r   r
   r   r   r   r   r   r   r`   r   r   r   r   r  rD   rD   rE   test_reduce_sum_13n  s   z)TestReferenceEvaluator.test_reduce_sum_13c                 C  sD  t  }d}td|t|dg}tdddgdg}t }d|_d|_tj|_|j	| t
|d	ddgdg|g|dg}tdtjd d g}tdtjd g}tdtjd g}	ttd	ddgdg|dd
gd||g|	g}
t|
||gd}t|}tddtj}tjdgtjd}|d ||dd }|jddd}t|| d S )NcustomrW   rn   r   r   r(  r   r#  MyReduceSum)r[   r#  exampler   	functionsr   r   rf   r   ro   )r   r(  r   r'  )r   r   r   r   rR   ref_attr_nameINTrs   	attributeappendr   r   r   r   r5  r   r   r!   rv   r*  r   r+  r   rw   r6  r   r,  r
   )r   rc   
new_domainr   r  attmy_reduce_sumr   r(  r   r   r`   r   r   r   r  r   rD   rD   rE   test_reduce_sum_attribute}  sV   
	z0TestReferenceEvaluator.test_reduce_sum_attributec                 C  s   t dtjd d g}t dtjd d g}t dtjd g}tdddgdgdd}t|gd||g|g}t|tdd	gd
}t| t	
ddt	j}t	jdgt	jd}|| jddd}	t|}
|
d ||dd }t||	 d S )Nr   r   r   r/  rn   r1  r$  rW      r   r%  r&  ro   r'  r3  r   r4  r7  rD   rD   rE   test_reduce_sum_square_18  s   z0TestReferenceEvaluator.test_reduce_sum_square_18c                 C  s   t dtjd d g}t dtjd d g}t dtjd g}tdddgdgdd}t|gd||g|g}t|tdd	gd
}t| t	
ddt	j}t	jg t	jd}|jdd}	t|}
|
d ||dd }t||	 d S )Nr   r   r   r   rn   r1  r$  rW   r2  r   r%  r&  ro   r3  r   r4  r7  rD   rD   rE   test_reduce_sum_13_empty_axes  s   z4TestReferenceEvaluator.test_reduce_sum_13_empty_axesc                 C  s   t dtjd d g}t dtjd d g}t dtjd g}tdddgdgdd}t|gd||g|g}t|tdd	gd
}t| t	
ddt	j}t	jg t	jd}|| jdd}	t|}
|
d ||dd }t||	 d S )Nr   r   r   r/  rn   r1  r$  rW   rG  r   r%  r&  ro   r3  r   r4  r7  rD   rD   rE   $test_reduce_sum_square_18_empty_axes  s   z;TestReferenceEvaluator.test_reduce_sum_square_18_empty_axesc           	      C  s   t dtjd d g}t dtjd g}tddgdgddd}t|gd|g|g}t|tddgd	}t| t	d

dtj}t|}|d d|id }t|| d S )Nr   r   r   rn   r#  noop_with_empty_axesr$  rW   r2  r   r%  r&  r   r   r   r   r   r   r   r   r   rv   r*  r   r+  r   r!   r   r
   	r   r   r   r   r   r`   r   r   r  rD   rD   rE   "test_reduce_sum_13_empty_axes_noop  s   z9TestReferenceEvaluator.test_reduce_sum_13_empty_axes_noopc           	      C  s   t dtjd d g}t dtjd g}tddgdgddd}t|gd|g|g}t|tddgd	}t| t	d

dtj}t|}|d d|id }t|| | d S )Nr   r   r/  rn   rK  r$  rW   rG  r   r%  r&  r   rM  rN  rD   rD   rE   )test_reduce_sum_square_18_empty_axes_noop  s   z@TestReferenceEvaluator.test_reduce_sum_square_18_empty_axes_noopc                 C  s   t dtjd d g}t dtjd g}t dtjd g}tdddgdg}t|gd||g|g}t|tddgd}t| t	d	
d
tj}tjdgtjd}||k}	t|}
|
d ||dd }t||	 d S )Nr   r   ZGreatergrW   r2  r   r   rf   rf   rf   ro   r   r   r   r   r   r   r   r   r   r   r   rv   r*  r   r+  r   rw   r!   r   r
   r   r   r   rQ  r   r   r`   r   r   r   r   r  rD   rD   rE   test_greater     z#TestReferenceEvaluator.test_greaterc                 C  sp   t dddgdg}tddtj}tjdgtjd}||k}t|}|d ||d	d
 }t	|| d S )NrR  r   r   rQ  r   rT  rf   ro   rU  r   )
r   rv   r*  r   r+  r   rw   r!   r   r
   )r   r   r   r   r   r   r  rD   rD   rE   test_node_proto  s   z&TestReferenceEvaluator.test_node_protoc                 C  s   t dtjd d g}t dtjd g}t dtjd g}tdddgdg}t|gd||g|g}t|tddgd}t| t	d	
d
tj}tjdgtjd}||k}	t|}
|
d ||dd }t||	 d S )Nr   r   rQ  GreaterOrEqualrS  rW   r2  r   r   rT  rf   ro   rU  r   rV  rW  rD   rD   rE   test_greater_or_equal  rY  z,TestReferenceEvaluator.test_greater_or_equalc              	   C  s  t dtjd g}tdg dgttjdgtjdd}t|gdg |g}t dtjd g}tdg dgttjdgtjdd}t|gdg |g}ttjdgtjdd	d
}tddd	gdg}tddgdg||d}t dtjd d g}	t dtjd g}
t||gd|	g|
g|gd}t	|}t
|}| t|d tjdgtjd}|d d|id }ttjdgtjd| tjdgtjd}|d d|id }ttjdgtjd| d S )NCConstantrn   ro   )value_floatsgthenr   gelsezeror   rR  r   GIfrQ  )then_branchelse_branchrS  r   zReferenceEvaluator(X) -> Zr   )r   r   r   r   r    rv   rw   r   r   r   r!   r   r   r   r
   )r   r]  bthen
bthen_bodybelse
belse_bodyrb  greaternode_ifr   rQ  r   	model_defr   r   r  rD   rD   rE   test_if  sJ   zTestReferenceEvaluator.test_ifc                 C  s  t dtjdg}t dtjdg}tg dtj}tg dtj}tdg dgt|d}tdg dgt|d}t	|gdg |g}t	|gd	g |g}td
dgdg||d}	t
 }
d|
_d|
_|
jdg |
jdg |
j|	g t }|
jtd|g t	tdddgdgdgdt dtjg gt dtjdggd}t|dtd|tddgd}|j|
g t|}|d dtdi}tjg dtjd}t|d | d S )Nthen_outr   else_outrn   rf   r   r   r   )r   r   r   rf   rn   r^  r   outputsvalue	then_body	else_bodyrd  f_condf_resr   rs  re  rf  r9  rC   rW   condr   )r[   r   rs  r   )nodesrR   r   rs  testrn   )producer_namer   Tro   r   )r   r   r   rv   rw   r+  r   r   r    r   r   r[   rR   r  extendr  r  r   rZ   r   BOOLr   r=  r!   r   r
   )r   ro  rp  r   r   then_const_nodeelse_const_noderu  rv  if_noder   rc   r   r   r   r  r   rD   rD   rE   test_if_functionJ  sV   z'TestReferenceEvaluator.test_if_functionc                 C  s  t  }d}td|t|dg}tdg dg}t }d|_d|_tj|_|j	| tdd	d
gdg}tdddgdg}t
|dd	d
gdg|||g|dg}td	tjd d g}	td
tjd d g}
tdtjd g}ttdd	d
gdg|tdtjdgdgdtddgdggd|	|
g|g}t|||gd}t|}tddtj}tjddgtjd}|d ||dd }t|| d }t|| d S )Nr9  rW   rn   r^  r   rt  biasr   r   r   r   r   r   LinearRegressionY1former_Bq=
ףp?)r[   r  Absr;  r<  r   r>  r   ro   r3  r   )r   r   r   r   rR   r?  TENSORrs   rA  rB  r   r   r   r   r   r   r   r!   rv   r*  r   r+  r   rw   r   absr
   )r   rc   rC  r   cstrD  r   r   linear_regressionr   r   r   r   r`   r   r   r   r  r   rD   rD   rE   test_function_attribute}  s\   

z.TestReferenceEvaluator.test_function_attributec                 C  sH  t  }d}td|t|dg}tdg dg}t }d|_d|_tj|_|j	| tdg dg}t }d|_d	|_tj|_|j	| t
dtjd g}t
dtjd g}t|gd
g |g}	t|gdg |g}
tdg dgttjdgtjdd}tddgdg}tdddgdg}tddgdg|	|
d}tdddgdg}tdddgdg}t|dddgdg||||||g|dd	g}t
dtjd d g}t
dtjd d g}t
dtjd g}ttdddgdg|tdtjdgd gtd!tjdgd"gd#td$dgdggd%||g|g}t|||gd&}t| t|}| |jd jjd' | |jd jjjd( |jd j}d)}|jD ]}|jjdrM|jsKtd*t| d+d,}q3|sVtd-td. d/!tj}tjdd0gtjd}|"d |d |d1d }t#|| d  }t$|| |"d |d2 |d1d }t#|| d" }t$|| d S )3Nr9  rW   rn   r^  B1rt  bias1B2bias2ru  rv  rb  r   ro   rr  	ReduceMinr   XminrR  rw  rd  r   ry  r   r   r   r   r   r  r  	former_B1r  	former_B2	  )r[   r  r  r  r;  r<  
OpFunctionr!   FzNested node z2 declares no linked attribute but a subgraph does.TzBNo node 'If' was found, has_linked_attribute could not be checked.r   r>  r   r3  r   )%r   r   r   r   rR   r?  r  rs   rA  rB  r   r   r   r   r    rv   rw   r   r   r   r   r   r!   r   r  r  r  impl_
startswithhas_linked_attributer   r*  r   r+  r   r  r
   )r   rc   rC  r   cst1rD  cst2ro  rp  ru  rv  rb  minirw  r  r   r   r  r   r   r   r   r`   r   fctcheckedr  r   r   r  r   rD   rD   rE   $test_function_attribute_nested_graph  s   


z;TestReferenceEvaluator.test_function_attribute_nested_graphc                  C  s  t  }d}td|t|dg}tdg dg}t }d|_d|_tj|_|j	| tdg dg}t }d|_d	|_tj|_|j	| t
dtjd g}t
dtjd g}t|gd
g |g}	t|gdg |g}
tdg dgttjdgtjdd}tdddgdg}tddgdg|	|
d}tdg dg}t }d|_d|_tj|_|j	| t
dtjd g}t|gd
g |g}t
dtjd g}t|||gdg |g}tdg dgttjdgtjdd}tddgdg}tdddgdg}tddgdg||d}tddd gd!g}td"d!dgd#g}t|d$dd gd#g||||||g|g d%}t
dtjd d g}t
d tjd d g}t
d#tjd g}ttd$dd gd&g|td'tjdgd(gtd)tjdgd*gtd+tjdgd,gd-td.d&gd#ggd/||g|g}t|||gd0}t| t|}td1d2tj}tjdd3gtjd}|d |d |d4d }t|| d* }t|| |d |d5 |d4d }t|| d6 }t|| |d |d7 |d4d }t|| d( }t|| d S )8Nr9  rW   rn   r^  r  rt  r  r  r  ru  rv  c100d   ro   rr  rR  r  
f_cond_100rd  B4ry  B3bias3rb  r   r  r   Lessf_cond_zeror   r   r   r   r   r   r  )r  r  r  r  r  r  r  r  	former_B3i)r[   r  r  r  r  r;  r<  r   r>  r   r3  r   ix  i  )r   r   r   r   rR   r?  r  rs   rA  rB  r   r   r   r   r    rv   rw   r   r   r   r   r   r!   r*  r   r+  r   r  r
   ) r   rc   rC  r   r  rD  r  ro  rp  
then_body1
else_body1r  rw  r  cst3
then_body2
else_body2rb  r  r   r   r  r   r   r   r   r`   r   r   r   r  r   rD   rD   rE   +test_function_attribute_nested_nested_graph"  s   	
	

zBTestReferenceEvaluator.test_function_attribute_nested_nested_graphc                 C  sD  G dd d}G dd dt }G dd dt }tdtjd d g}tdtjd g}tddgdgd	d
d}t|gd|g|g}t|td
dgd}t	d
dtjd }	| t t| W d    n1 siw   Y  tddgdgd	d
d}t|gd|g|g}t|td
dgd}| t t||gd W d    n1 sw   Y  tddgdgd	d
d}t|gd|g|g}t|td
dgd}| t t||gd W d    n1 sw   Y  tddgdgd	d
d}t|gd|g|g}t|td
dgd}t|||gd}
|
d d|	id }d|	d	  }t|| d S )Nc                   @  s    e Zd ZdZdd Zdd ZdS )z:TestReferenceEvaluator.test_custom_node.<locals>._InvAlphar9  c                 S  s   || _ || _d S rO   )	onnx_node
run_params)r   r  r  rD   rD   rE   __init__  s   
zCTestReferenceEvaluator.test_custom_node.<locals>._InvAlpha.__init__c                 S     d|| j   fS Nrn   alphar   r   rD   rD   rE   _run     z?TestReferenceEvaluator.test_custom_node.<locals>._InvAlpha._runN)r  
__module____qualname__	op_domainr  r  rD   rD   rD   rE   	_InvAlpha  s    r  c                   @  s   e Zd Zdd ZdS )z:TestReferenceEvaluator.test_custom_node.<locals>.InvAlpha2c                 S  r  r  r  r  rD   rD   rE   r    r  z?TestReferenceEvaluator.test_custom_node.<locals>.InvAlpha2._runN)r  r  r  r  rD   rD   rD   rE   	InvAlpha2  s    r  c                   @     e Zd ZdZdddZdS )z9TestReferenceEvaluator.test_custom_node.<locals>.InvAlphar9  Nc                 S  s   |p| j }d||  fS r  r  r   r   r  rD   rD   rE   r    s   
z>TestReferenceEvaluator.test_custom_node.<locals>.InvAlpha._runrO   r  r  r  r  r  rD   rD   rD   rE   InvAlpha      r  r   r         ?r9  r  r[   r$  rn   r   r%  r&  new_opsr   )r"   r   r   r   r   r   r   r   rv   r*  r   r+  r   r   NotImplementedErrorr!   rr   r   r
   )r   r  r  r  r   r   r   r   r`   r   r   r  r   rD   rD   rE   test_custom_node  s>   

z'TestReferenceEvaluator.test_custom_nodec           	      C     G dd dt }tdtjd d g}tdtjd g}tddgdgddd}t|gd|g|g}t|tdd	gd
}t	d
dtjd	 }t||gd}| t |d d|i W d    d S 1 sfw   Y  d S )Nc                   @  r  )zDTestReferenceEvaluator.test_custom_no_output_tuple.<locals>.InvAlphar9  Nc                 S  s   |p| j }d||  S r  r  r  rD   rD   rE   r    s   
zITestReferenceEvaluator.test_custom_no_output_tuple.<locals>.InvAlpha._runrO   r  rD   rD   rD   rE   r    r  r  r   r   r  r9  r  r$  rn   r   r%  r&  r  r"   r   r   r   r   r   r   r   rv   r*  r   r+  r   r!   r   rr   r   	r   r  r   r   r   r   r`   r   refrD   rD   rE   test_custom_no_output_tuple     "z2TestReferenceEvaluator.test_custom_no_output_tuplec           	      C  r  )Nc                   @  r  )zATestReferenceEvaluator.test_custom_empty_output.<locals>.InvAlphar9  Nc                 S  s   ~~dS )NrD   rD   r  rD   rD   rE   r    s   zFTestReferenceEvaluator.test_custom_empty_output.<locals>.InvAlpha._runrO   r  rD   rD   rD   rE   r    r  r  r   r   r  r9  r  r$  rn   r   r%  r&  r  )r"   r   r   r   r   r   r   r   rv   r*  r   r+  r   r!   r   ru   r   r  rD   rD   rE   test_custom_empty_output  r  z/TestReferenceEvaluator.test_custom_empty_outputc           	      C  r  )Nc                   @  r  )z@TestReferenceEvaluator.test_custom_tuple_tuple.<locals>.InvAlphar9  Nc                 S  sF   |p| j }ttd||  gg}t|tsJ t|d ts!J |S )Nrn   r   )r  rq   rP   r   r   r  r   rD   rD   rE   r    s
   
zETestReferenceEvaluator.test_custom_tuple_tuple.<locals>.InvAlpha._runrO   r  rD   rD   rD   rE   r    r  r  r   r   r  r9  r  r$  rn   r   r%  r&  r  r  r  rD   rD   rE   test_custom_tuple_tuple  s   
"z.TestReferenceEvaluator.test_custom_tuple_tuplec           	        s   G dd d G  fdddt }tdtjd d g}tdtjd g}tddgdgddd	}t|gd
|g|g}t|tddgd}t	d
dtjd }t||gd}| t |d d|i W d    d S 1 sow   Y  d S )Nc                   @     e Zd ZdS )zLTestReferenceEvaluator.test_custom_tuple_unexpected_type.<locals>.CustomTypeNr  r  r  rD   rD   rD   rE   
CustomType      r  c                      s   e Zd ZdZd fdd	ZdS )zJTestReferenceEvaluator.test_custom_tuple_unexpected_type.<locals>.InvAlphar9  Nc                   s0   ~~  f}t |tsJ t |d  sJ |S )Nr   )rP   rq   r  r  rD   rE   r    s
   zOTestReferenceEvaluator.test_custom_tuple_unexpected_type.<locals>.InvAlpha._runrO   r  rD   r  rD   rE   r    s    r  r   r   r  r9  r  r$  rn   r   r%  r&  r  r  r  rD   r  rE   !test_custom_tuple_unexpected_type  s   
"z8TestReferenceEvaluator.test_custom_tuple_unexpected_typec                 C  sb  t dtjg }t dtjg }t dtjg }tdtjd }tdtjd }tg dtj	}t
dg dgtd	tj|j| td
d}t
dg dgtdtjddgd
d}t
dg dgtdtjddgd
d}	t
dg dgtdtjddgd
d}
t
dddgdgd}t
dddgdgd}t
dg ddgd}t
dddgdgd}t
ddgdgd}t||||	||
|||g	d |||g||g}t
d!g d"d#g|d$}t
d%d#gd&gddd'}td(tj}g }tdtj}ttd)t d*tj|jt d+tj|jtd,tjg gt d&tjd g||gd-d.}tjg d/tj	d0}t|}|||d"}|d |}t|d | d S )1Ncond_incond_out
iter_countseq_inseq_outrq  r^  r   const_tensor_x)rR   	data_typedimsvalsrr  oneconst_tensor_onerD   rn   slice_startconst_tensor_zerorn   r   r"  const_tensor_axesr   endr   rs  	Unsqueeze	slice_endSlice)r   r  r  	slice_outSequenceInsertr  	loop_bodyLoop)
trip_countrz  	seq_emptyseq_res)r   rs  bodyConcatFromSequencer   )r   rs  r(  new_axisr   	loop_testr  rz  r  )rR   r   rs  r{  )r   )r   r          @r   r        @r   r  r        @r   r  r  r        @ro   )r   r   r  r5  r   r   rv   rw   r+  r   r   r   rT   flattenfloatr   r6  bool_r   rV   r!   r   r
   )r   r  r  r  r  r  r   x_const_nodeone_const_nodezero_const_node	axes_nodeadd_nodeend_unsqueeze_node
slice_nodeinsert_nodeidentity_noder  r  node_concatr  r  rz  rm  r   oinfr   r  rD   rD   rE   	test_loop#  s   
z TestReferenceEvaluator.test_loopc                 C  s   t dtjd g}t dtjd g}tddgdgdd}t|gd|g|g}t|}t| t|}|d dt	j
dt	jdd	 id
 }| |jd | |jt	j | | d | | d d S )Nr   r   	Bernoulli        seedrS  rf   r   ro   r  r   gh㈵grZ|
 ?r   r   r   r   r   r   r   r!   r   rv   rz   r   r   rT   rp   assertGreaterr   
assertLessr   r   r   r   r   r   r`   r   r  rD   rD   rE   test_onnxt_runtime_bernoulli  s   $z3TestReferenceEvaluator.test_onnxt_runtime_bernoullic                 C  s   t dtjd g}tdg dgdddgd}t|gdg |g}t|}t| t|}|d i d }| 	|j
d	 | 	|jtj | | d | | d
 d S )Nr   RandomUniformr  rf   r   r  rT   rS  r   r  rn   )r   r   r   r   r   r   r   r!   r   r   rT   rp   rv   r   r  r   r  r   r   r   r   r   r`   r   r  rD   rD   rE   !test_onnxt_runtime_random_uniform  s   z8TestReferenceEvaluator.test_onnxt_runtime_random_uniformc                 C  s   t dtjd g}t dtjd g}tddgdgdd}t|gd|g|g}t|}t| t|}|d dt	j
dt	jdid	 }| |jd | |jt	j | | d	 | | d
 d S )Nr   r   RandomUniformLiker  r  rS  r  ro   r   rn   r  r  rD   rD   rE   &test_onnxt_runtime_random_uniform_like  s    z=TestReferenceEvaluator.test_onnxt_runtime_random_uniform_likec                 C  s   t dtjd g}tdg dgdddgd}t|gdg |g}t|}t| t|}|d i d }| 	|j
d	 | 	|jtj d S )
Nr   RandomNormalr  rf   r   r  rS  r   r  )r   r   r   r   r   r   r   r!   r   r   rT   rp   rv   r   r  rD   rD   rE    test_onnxt_runtime_random_normal  s   z7TestReferenceEvaluator.test_onnxt_runtime_random_normalc                 C  s   t dtjd g}t dtjd g}tddgdgdd}t|gd|g|g}t|}t| t|}|d dt	j
dt	jdid	 }| |jd | |jt	j d S )
Nr   r   RandomNormalLiker  r  rS  r  ro   r   )r   r   r   r   r   r   r   r!   r   rv   rz   r   r   rT   rp   r  rD   rD   rE   %test_onnxt_runtime_random_normal_like  s    z<TestReferenceEvaluator.test_onnxt_runtime_random_normal_likec                 C  s^   t jdd}| |jd tjddgddggtjd}t j|dd}t|dd}t	|| d S )Nr  r  r   rn   r   rf   ro   )
r(   creater   r  rv   rw   r   evalr+   r
   )r   instr   r   r   rD   rD   rE   test_eval_celu  s   z%TestReferenceEvaluator.test_eval_celuc                 C  sN   t jddgddggt jd}tj|tjd}tj|tjd}|}t|| d S )Nr   rn   r   rf   ro   to)	rv   rw   r   r'   r!  r   FLOAT8E4M3FNr   r
   )r   r   r   dyr   rD   rD   rE   test_eval_cast  s
   z%TestReferenceEvaluator.test_eval_castc                 C  sv   t dd}| |jd |jdd}| |jd tjddgddggtjd	}|j|dd}t	|dd}t
|| d S )
NrW   r(   r  r  r   rn   r   rf   ro   )r$   r   r  r   r  rv   rw   r   r!  r+   r
   )r   celur"  r   r   r   rD   rD   rE   test_eval_celu_load_op  s   
z-TestReferenceEvaluator.test_eval_celu_load_opc                 C  s   t jdd}| |jd d S )Nr  r  )r)   r   r   r  )r   r"  rD   rD   rE   test_create_adam  s   z'TestReferenceEvaluator.test_create_adamc              	   C  s2  t dtjg d}t dtjg d}t dtjg d}t dtjg d}tdg ddgg dd	d	gd
d
gd}t|gd|||g|g}t|tddgd}t|}|d u rWd S t|dd}	| 	|	j
d t t|tgdd}
| 	|
j
d t t|dd}| 	|j
d t d\}}t|D ]}t|D ]}tjd	d	||ftjd}d|dd||f< tjdtjd}td
tdd d|ddd d d d f< tjdggggtjd}|d |||dd }|	d |||dd }t|| |
d |||dd }t|| |d |||dd }t|| qqd S )Nr   NNNNr   r   Wr.   r   r-  r   rn   rn   rn   rn   rn   rf   )rl   r~   r   rS  rW      r   F)	optimizedr   )r  r1  T)r   r   ro   r   rn   rn   r   r   	   r   r      )r   r   r   r   r   r   r   rd   r!   r   r  r.   ConvOptimizedrx   rv   rz   r   minimumr*  r   rw   r   r
   )r   r   r   r   r-  r  r   r`   sess1sess2sess3sess4sHsWri   r   r   r  got3got4rD   rD   rE   	test_conv	  sP   0

z TestReferenceEvaluator.test_convc                 C  s*  t dtjg d}t dtjg d}t dtjg d}t dtjd g}t dtjd g}t dtjd g}t dtjd g}t d	tjd g}t d
tjd g}	tdg ddg}
t|
gd||||||||	g|g}t|tddgd}t|}|d u ryd S t	|}d\}}t
|D ]}t
|D ]}tjdd||ftjd}d|dd||f< | jd||de tjdtjd}d|ddd d d d f< |tjdgtjdtjdgtjd|tjdgtjdtjdgtjdtjdgtjdtdgtjd}|d |d }|d |d }t|| W d    n	1 sw   Y  | jd||dq tjdtjd}tdtdd d|ddd d d d f< |tjdgtjdtjdgtjd|tjdgtjdtjdgtjdtjdgtjdtdgtjd}|d |d }|d |d }t|| W d    n	1 sw   Y  | jd||de tjdtjd}d|ddd d d d f< |tjdgtjdtjd gtjd|tjd!gtjdtjd"gtjdtjd#gtjdtd gtjd}|d |d }|d |d }t|| W d    n	1 sw   Y  qqd S )$Nr   r,  wr   x_scalew_scaley_scalex_zero_pointw_zero_pointy_zero_pointQLinearConvr   rB  rE  rA  rC  rF  rD  rG  rS  rW   r0  r   r   r   rn   ro   r   r   1x1)rA  ri   r   r/  3x3r2  rf   r3  r4     칟>n?   gO Y@   {XZ?)r   r   UINT8r   r   r   r   r   rd   r!   rx   rv   rz   r  r   rw   r   r   r
   r7  r*  r   )r   r   rA  r   rB  rC  rD  rE  rF  rG  r  r   r`   r8  r9  r<  r=  ri   r   feedsr   r  rD   rD   rE   test_qlinearconv4  s   

0

z'TestReferenceEvaluator.test_qlinearconvc                 C  s  t dtjg d}t dtjg d}t dtjg d}t dtjd g}t dtjd g}t dtjd g}t dtjd g}t d	tjd g}t d
tjd g}	tdg ddg}
t|
gd||||||||	g|g}t|tddgd}t|}| 	d t
jg dg dg dg dg dg dg dgt
jdd}t
jdgt
jd}t
jdgt
jd}t
jdgt
jdd}t
jdgt
jd}t
jd gt
jd}t
jd!gt
jd}t
jd"gt
jd}	||||||||	d}g d#g d$g d%g d&g d'g d(g d)ggg}|d |d }t|| W d    n	1 sw   Y  | 	d* t
jg dg dg dg dg dg dg dgt
jdd}t
jd+gt
jd}t
jdgt
jd}t
jg d,d-t
jd}d.|d/< d0|d1< t
jd+d2gt
jd}t
jd-d-gt
jd}t
jd!gt
jd}t
jd"gt
jd}	||||||||	d}g d3g d4g d5g d6g d7gg d8g d9g d:g d;g d<ggg}|d |d }t|| W d    n	1 sw   Y  | 	d= t
jdt
jd}t
jd+gt
jd}t
jdgt
jd}t
jg d,d-t
jd}t
jd+d2gd>d>ggt
jd}t
jd-d-gt
jd}t
jd!gt
jd}t
jd"gt
jd}	||||||||	d}| td? |d |d  W d    n	1 sRw   Y  W d    n	1 sbw   Y  | 	d@ t
jdt
jd}t
jd+gt
jd}t
jdgt
jd}t
jg d,d-t
jd}t
jg dAt
jd}t
jd-d-gt
jd}t
jd!gt
jd}t
jd"gt
jd}	||||||||	d}| tdB |d |d  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )CNr   r,  rA  r   rB  rC  rD  rE  rF  rG  rH  rI  rS  rW   r0  r   single_channel)rP                 :   )r   ;      _      r   @   )8            rZ        )            r]  rW  r]  )   '   |   M   P   f   +   )         S   )   (      )rP     \      *         ro   rn   rn   r   r   rN  rO  r   r/  gO\?rP  rQ  {   )r   Q   ]   rs  4   W      )      rG     ~   rP     )   r2  rp  "   r     Y   )   rn  E   r%  rG  r  rG  )C         rh     rc     )rM  rX              y   )r   e      r      k      multiple_output_channels      p?)rf   rn   r   r   rM     )r   r   rn   rf   rf   )rn   r   rn   r         `?)rP        r  rf  )   rP     r     )   rP  rP  rg  rP  )   r           )            r  )r  X   r   r  /   )Z   r   !   r      )r   rG  r2  r  r   )re  r  2   rn  L   )0   r   o   J   c   fails_with_w_scale_2Drn   z(w_scale must be a scalar or a 1-D tensorfails_with_w_scale_wrong_length)r  r  rn   z+w_scale elements must match output channels)r   r   rR  r   r   r   r   r   r!   r   rv   rw   r  r   r   r   r
   fullrz   assertRaisesRegexru   )r   r   rA  r   rB  rC  rD  rE  rF  rG  r  r   r`   r   rS  r   r  rD   rD   rE   test_qlinearconv_w_scale_vector  sJ  
	0	7

 $z6TestReferenceEvaluator.test_qlinearconv_w_scale_vectorc                 C  s  t dtjg d}t dtjg d}t dtjg d}t dtjg d}tdddgdg|||d}	tddgd	g}
td
dd	gdg|||dd}tddgdg}tdddgdg}t|	|
|||gd||g||g}t|tddtddgd}t|	gd||g|g}t|tddgd}t|}zt	|}|d u rW d S W n t
y   d }Y nw d\}}t|}t|D ]}t|D ]}tjdd||ftjd}d|dd||f< tjddg|R tjd}tdt||d df d|ddd d d d f< |d ||d}|d ur|d ||dd }t|d  |  zt|d  |d   W q tyU } ztd| d| d | d!| d"|d  d#|d  |d }~ww qd S )$Nr   r,  r  Y2r-  r.   rl   r   r~   ShaperT   Im2Colximexperimental)rl   r   r~   r[   Flattenwflatr   rS  rW   r0  rn   r   )r   r   ro   r   r   rf   r   r5  )r   r-  zDiscrepancies: pads=z, dilations=z
, strides=z, kernel_shape=r   
!=
)r   r   r   r   r   r   r   r   r!   rd   ImportErrorrv   r{   rx   rz   r   r7  r*  r   r   r
   ravelr   )r   r}   rl   r   r~   r   r  r  r-  r  
node_shapenode_im	node_flatnode_gemr   r`   
graph_convonnx_model_convr   	sess_convr<  r=  nkerri   r   r  ort_resr   rD   rD   rE   common_test_im2colL  s   	

z)TestReferenceEvaluator.common_test_im2colc                 C  "   | j dg dddgddgd d S )Nrn   rn   rn   rn   rn   rf   rn   r  r  r   rD   rD   rE   test_im2col_1x1     
z&TestReferenceEvaluator.test_im2col_1x1c                 C  r  )NrT  r  rn   r  r  r  rD   rD   rE   test_im2col_2x2  r  z&TestReferenceEvaluator.test_im2col_2x2c                 C  r  )NrJ  r  rn   r  r  r  rD   rD   rE   test_im2col_3x3  r  z&TestReferenceEvaluator.test_im2col_3x3c                 C  r  )NrJ  )r   rn   rf   r   rn   r  r  r  rD   rD   rE   test_im2col_3x3_pads  r  z+TestReferenceEvaluator.test_im2col_3x3_padsc                 C  s"   | j dg dddgddgd d S )NrJ  )r   rn   rn   rn   rn   rf   r  r  r  rD   rD   rE   test_im2col_3x3_strides  r  z.TestReferenceEvaluator.test_im2col_3x3_stridesc                 C  r  )Nr   r   r  rn   r  r  r  rD   rD   rE   test_im2col_5x5  r  z&TestReferenceEvaluator.test_im2col_5x5c                 C  sP  dd l }tdtjg d}tdtjg d}tdtjd g}tdtjd g}tdg ddgg d	d
d
gd
d
gd}t|gd|||g|g}t|tddgd}t	|}	t
g dg dg dg dg dggt
j}t
ddgt
j}
t
d
dgt
j}|jjt|
|d}|	d |||
d}||| }t||d  d S )Nr   r   NNNr   Ir   Col2Imr   r  r   r   r   r   r   rn   r  rS  rW   r0  r   )r         @      &@      0@      5@)r        @      (@      1@      6@)r         @      *@g      2@      7@)r        "@      ,@      3@      8@)r  r        .@g      4@g      9@r   )output_sizer   r   r   r  )rK   r   r   r   r5  r   r   r   r   r!   rv   rw   r+  r   r6  nnFoldrq   r   
from_numpynumpyr
   )r   rK   r   r   ISBSr  r   r`   r   image_shapeblock_shapefoldr  r  rD   rD   rE   test_col2im  sB   
z"TestReferenceEvaluator.test_col2imc              	   C  sf  dd l }tdtjg d}tdtjg d}	tdtjd g}
tdtjd g}tdg ddg|||d	}t|gd
||
|g|	g}t|tddgd}t	|}|j
jt|t|t|t|t|d}t|}t|D ]E}t|D ]>}tjd||ftjd}d|d||f< tj|tjd}tj|tjd}||| }|d |||d}t||d  qqqkd S )Nr   r   r  r   r  r   r  r  r  rS  rW   r0  r   )r  r   dilationpaddingstridern   ro   r   r  )rK   r   r   r   r5  r   r   r   r   r!   r  r  rq   r   rv   r{   rx   rz   r   rw   r6  r  r  r   r
   )r   sizer  r  rl   r   r~   rK   r   r   r   r  r  r   r`   r   r  r  ri   r   i_shapeb_shaper  r  rD   rD   rE   common_test_col2im  sF   
z)TestReferenceEvaluator.common_test_col2imc                 C  &   | j dddg dddgddgd d S )Nr   r   r   rf   r   r  rn   r  r  r  rD   rD   rE   test_col2im_2x3      
z&TestReferenceEvaluator.test_col2im_2x3c                 C  r  )N   r  r  r/  rn   r  r  r  rD   rD   rE   test_col2im_2x3_pads  r  z+TestReferenceEvaluator.test_col2im_2x3_padsc           	      C  s   t jddgt jd}d|d d< t ddgdt ddgt g d	t ddgf\}}}}}t||||||}t||||||}t|| d S )
Nr   r  ro   r   r   r   r  rn   r/  )rv   rz   r   rw   r,   r-   r
   )	r   r|   r  r}   r~   rl   r  r1r2rD   rD   rE   test_col2im_2d  s   z%TestReferenceEvaluator.test_col2im_2dc              
   C  s,  t dtjg d}t dtjg d}t dtjdg}t dtjg d}tdg d	dgdd
d
gddgg dd
d
gd}t|gd|||g|g}t|tddgd}td	d
tjtjg dg dg dggg dg dg dggg dg dg dggg dg dg dgggtjdtjg d tjdd	}d!|d d d < |d }|d }|d }tjd|jd}t|jd! D ]C}	tdD ]<}
||	|	d
 |
|
d
 f }||
 }t|d"d
d
gg dd
d
g}t|| }|||
  }|||	|
d d d d f< qqt|}|d |}t||d! d#d$ d S )%Nr   )rf   r   r   r   r-  )r   rn   r   r   r   r   r   r.   r.  rn   r   r/  groupr~   r}   rl   r   rS  rW   r0  r   i   )g    ޚg   ]?g    ~n)g   `cKg   @A?g   ,?)g   $w?g   ʩ?g   @)g   ug    ?g   )g    ?g    ?g   )g   
?g   
g   @V?)g    ?g   Jg     )g   ¿g   i_g   ?)g    c?g   ?g   r)g    sg   g    N{)g   @ʲ?g   m?g    @?)g   X?g    Ug   `Ζro   )g   @[¿g   &g   (g   `䠾r   rJ  h㈵>atol)r   r   r   r   r   r   r   rv   r*  r   r+  r   rw   r   rp   rx   rT   r   matmulr  r!   r   r
   )r   r   r-  r   r   r  r   r`   rS  r   rS  r   rA  c2mulref1got1rD   rD   rE   test_conv_im2col_group4  s~   
NQ]z.TestReferenceEvaluator.test_conv_im2col_group4c              
   C  sH  t dtjg d}t dtjg d}t dtjdg}t dtjg d}td	g d
dgdddgddgg dddgd}t|gd|||g|g}t|tddgd}td	d
tjd tjdtjdtjdtjdd
}d|d d< t|}	|	d |}
tjg dg dg dgg dg dg dgggtjd}t|
d | d S )Nr   rn   r   r   r   r-  rf   r   r   r   r   rf   r   r,  r.   r.  rn   r   r/  r  rS  rW   r0  r   l   ro   rf   )r   r   r   rn   )r  r  r  )r  r  r  )r  r  r  r   )r   r   r   r   r   r   r   rv   r*  r   r+  r   rz   r!   r   rw   r
   r   r   r-  r   r   r  r   r`   rS  r   r!  r   rD   rD   rE   test_conv_strides  s>   

z(TestReferenceEvaluator.test_conv_stridesc           
      C  s   t dtjg d}t dtjg d}tddgdgddgg dddgd}t|gd	|g|g}t|td
dgd}dtdd d d 	d
tji}tjg dg dg dg dgggtjd}t|}|d |}	t|	d | d S )Nr   r,  r   MaxPoolr   r/  rf   r}   rl   r   rS  rW   r0  r   1   r   r  )g      H@g     G@g     F@g     E@)g     D@g      D@g      C@g      B@)g      ;@g      :@r  r  )r  r        $@r  ro   r   r   r   r   r   r   r   r   rv   r*  r   r+  r   rw   r!   r   r
   
r   r   r   r  r   r`   rS  r   r   r!  rD   rD   rE   test_max_pool_2d_1  s4   &
z)TestReferenceEvaluator.test_max_pool_2d_1c           
   
   C  s  t dtjg d}t dtjg d}tddgdgddgg dddgd}t|gd	|g|g}t|td
dgd}dtjg dg dg dg dg dg dg dgggtj	di}tjg dg dg dg dgggtj	d}t
|}|d |}	t|	d | d S )Nr   r,  r   r)  r   r/  rf   r*  rS  rW   r0  r   )i  if  i  iB  i  i  r  )i  i  i  r   r  rP  iF  )iB  B   i  ix  iT  i  i  )r  i  is  iL  i  iJ  i  )i  r  i  r  i'  i;  ih  )  i>  r  i  i  i  i  )i|  i  K   iA  r1  i  i  ro   )g     X@g     @     @r3  )g     8@g     x@g     @     P@)     `@g     @r4  r4  )r5  g     @r5  g      @r   )r   r   r   r   r   r   r   rv   rw   r   r!   r   r
   r.  rD   rD   rE   test_max_pool_2d_2  sN   
z)TestReferenceEvaluator.test_max_pool_2d_2c                 C  s  t dtjd d g}t dtjd d g}t dtjd d g}t dtjd d g}tdg ddgddd	}t|gd
|||g|g}t|tddgd}tj	g dgtj
dt	ddggtj	ddggtj
dd}t|}	|	d |}
tj	g dgtj
d}t|
d | d S )Nr   r  Ur   ScatterElementsr   r  r7  rn   r   r(  	reductionrS  rW   r0  r   )r   r  r  r  r  ro   皙?g @)r   r<  r  r  r  r   r   r   r   r5  r   r   r   r   rv   rw   r   r!   r   r
   r   r   Indr7  r   r  r   r`   rS  r   r!  r   rD   rD   rE   test_scatter_elements	  s*   z,TestReferenceEvaluator.test_scatter_elementsc                 C  s   t dtjd d g}t dtjd d g}t dtjd g}t dtjd d g}tdg ddg}t|gd|||g|g}t|tdd	gd
}tj	ddggtj
dt	ddggtj	dgtj
dd}t|}	|	d |}
tj	ddggtj
d}t|
d | d S )Nr   r  r7  r   	ScatterNDr9  rS  rW   r0  r   r   r  ro   r   r  r=  r>  rD   rD   rE   test_scatternd9	  s&   z%TestReferenceEvaluator.test_scatterndc              
   C  s  t dtjg d}t dtjg d}t dtjd g}t dtjg d}tdg ddgddgd	d	gd
d
gg dddgd}t|gd|||g|g}t|tddgd}td	d
tjtd	d
tjtjg dtjdd}t|}	|	d |}
tjg dg dg dg dg dgggtjd}t|
d
 | |d  d
9  < d|d d< t|}	|	d |}
tjg dg dg dg dg dgggtjd}t|
d
 | d S )Nr   r,  r-  r   r   ConvTransposer.  rn   r   r   r/  )r~   r}   output_paddingrl   r   rS  rW   r0  r   r%  )rn   r   r   r      )r   rn   r   r   r  ro   )i  i  i  iA  )id  i.  id/  i!  )i   i3  i4  i$  )il$  i8  i\:  i(  )i  i+  i,  i#  )r   r   r   r   )r   r  r   r   r-  r'  rD   rD   rE   test_conv_transpose_2dQ	  sd   
z-TestReferenceEvaluator.test_conv_transpose_2dc              	   C  sV  t dtjg d}t dtjg d}t dtjd g}t dtjg d}tdg ddgdd	d	gd
}t|gd|||g|g}t|tddgd}td	d
tjtd	d
tjtjg dtjdd}tjg dg dg dg dg dg dgg dg dg dg dg dg d gggtjd}	t|}
|
d |}t|d! |	 d S )"Nr   r,  r-  r   r   rC  r.  
SAME_UPPERrf   )auto_padr   rS  rW   r0  r   r3  r2  rG  )rn   rf   r   r   r  ro   )r   r   r   rn   rf   rf   )r   r   r   r   r   r  )r   r   re  r   r     )r3  re  rE  r0  #      )rG  rE  r%  rJ  r  rq  )rG  r  3   r  r\      )r   r   r3  r      rK  )r   r   re  r2  &      )rE     T   ra     R   )$   rl  r  r  t   A   )r  r%  r  rx  i$  r  )H   N   rZ  [      h   r   r-  )r   r   r-  r   r   r  r   r`   rS  r   r   r!  rD   rD   rE   test_conv_transpose_2d_upper	  sN   	z3TestReferenceEvaluator.test_conv_transpose_2d_upperc                 C  s  t dtjg d}t dtjd g}t dtjd g}t dtjg d}tdg ddg}t|gd	|||g|g}t|td
dgd}t	d
dtjtjdtjdtjdtjdd}|d }t|d }t|d }|d d }	|d jd | | d }
tjd|
|	dgtjd}t|
D ].}|| }|| | }tj|d||df }|d|	 }tj|j|jfdd|d|f< qt|}|d |}t|d | d S )Nsignalr  
frame_stepframe_lengthr   r,  STFT)r^  r_  rW   r`  rS  rW      r   rM  rn   rM  rn   r  ro   r0  )r^  r_  r`  rf   rn   r   r(  )r   r   r   r5  r   r   r   r   rv   r*  r   r+  r   rw   r6  rQ   rT   r   rx   fftstackrealimagr!   r   r
   )r   r^  r_  r`  r   r  r   r`   rS  onesided_lengthnstftsr   ri   startstopcomplex_outc_outr   r!  rD   rD   rE   	test_stft	  s<    z TestReferenceEvaluator.test_stftc                 C  s  t dtjg d}t dtjd g}t dtjd g}t dtjd g}t dtjg d}tdg d	dg}t|gd
||||g|g}t|tddgd}t	d
dtjtjdtjdddtdtj tj	dddtjd d   tjdtjdd	}	|	d }t|	d }|	d }t|	d }|d d }
d|jd |jd  d  }tjd||
dgtjd}t|D ]4}|| }|| | }tj|d||df | d|
 }|d|
 }tj|j|jfdd|d|f< qt|}|d |	}t|d | d S )Nr^  r  r_  windowr`  r   r,  ra  )r^  r_  rp  r`  rS  rW   rb  r   rM  rc  r  ro   r  rf   r   r0  rn   rd  )r   r   r   r5  r   r   r   r   rv   r*  r   r+  r   rw   r6  cospirQ   rT   r   rx   re  rf  rg  rh  r!   r   r
   )r   r^  r_  rp  r`  r   r  r   r`   rS  ri  rj  r   ri   rk  rl  rm  rn  r   r!  rD   rD   rE   test_stft_with_window	  sJ   * z,TestReferenceEvaluator.test_stft_with_windowc                 C  s   t dtjg d}t dtjd d g}t dtjg d}t dtjd g}tdg ddgddd	d
d|d	}t|gd|||g|g}t|tddgdS )Nr   r,  roisr   r  RoiAlignr   rt  r  r   rf   r   output_half_pixel)output_heightoutput_widthsampling_ratiospatial_scalecoordinate_transformation_modemoderS  rW   rb  r   )r   r   r   r5  r   r   r   r   )r   r}  r   rt  r   r   r  r   rD   rD   rE   get_roi_align_model
  s"   z*TestReferenceEvaluator.get_roi_align_modelc                 C  sp   |  |}t \}}}|||d}t|}|d u rd S |d |}t|}	|	d |}
t|
d |d dd d S )Nrv  r   r  r  )r~  r   rd   r   r!   r
   )r   r}  r`   r   batch_indicesrt  rS  r   r   r  r  rD   rD   rE   common_test_roi_align%
  s   
z,TestReferenceEvaluator.common_test_roi_alignc                 C  sr   | j dd | d W d    n1 sw   Y  | j dd | d W d    d S 1 s2w   Y  d S )Navgr}  r   )r   r  r  rD   rD   rE   test_roi_align1
  s   "z%TestReferenceEvaluator.test_roi_alignc                 C  s   dd l }ddlm} | |}t|}t \}}}|d |||d}	|dddd}
|
||||g}t|	d |dd	 d S )
Nr   )RoIAlignrv  r  r   rf   )r{  rz  r  r  )	rK   torchvision.opsr  r~  r!   r   r   r  r
   )r   r}  rK   r  r`   r   r   r  rt  r  r   r   rD   rD   rE   common_test_roi_align_torch9
  s   
z2TestReferenceEvaluator.common_test_roi_align_torchc                 C  s<   | j dd | d W d    d S 1 sw   Y  d S )Nr  r  )r   r  r  rD   rD   rE   test_roi_align_torchF
  s   "z+TestReferenceEvaluator.test_roi_align_torchc                 C  s0  t dtjd g}t dtjd g}t dtjd g}t dtjd g}t dtjd g}tddgg ddd	}t|gd
|g||||g}t|tddgd}dtd	tj
i}	tjg dtj
dtjg dtj
dtjg dtj
dtjdgtj
dg}
t|}|d |	}tdD ]}tj|| |
|  qd S Nr   r  r  Y3Y4Splitr  r  r  r  r   )num_outputsrS  rW   rG  r   r   r   rn   rf   ro   r&  )r   r   r  r3  )r   r   r   r   r   r   r   rv   r*  r+  r   rw   r!   r   rx   testingassert_equalr   r   r  r  r  r  r  r   r`   rS  r   r   r!  ri   rD   rD   rE   
test_splitO
  s&   z!TestReferenceEvaluator.test_splitc                 C  s>  t dtjd g}t dtjd g}t dtjd g}t dtjd g}t dtjd g}tdddgg d}t|gd	|g||||g}t|td
dgd}td	tj
tjg dtjdd}	tjg dtj
dtjg dtj
dtjddgtj
dtjddgtj
dg}
t|}|d |	}tdD ]}t|| |
|  qd S )Nr   r  r  r  r  r  splitr  rS  rW   rG  r   r   )r   r   rf   rf   ro   )r   r  r  r&  r   r   r  r3  r   )r   r   r   r   r   r   r   rv   r*  r+  r   rw   r6  r!   r   rx   r
   r  rD   rD   rE   test_split_2g
  s*   z#TestReferenceEvaluator.test_split_2c                 C  s  t dtjd g}t dtjd g}t dtjd g}t dtjd g}t dtjd g}tddgg ddd	}t|gd
|g||||g}t|tddgd}dtd	tj
i}	tjg dtj
dtjg dtj
dtjg dtj
dtjdgtj
dg}
t|}|d |	}tdD ]}t|| |
|  qdtd	tj
i}	tjg dtj
dtjg dtj
dtjg dtj
dtjg tj
dg}
t|}|d |	}tdD ]}t|| |
|  qd S r  )r   r   r   r   r   r   r   rv   r*  r+  r   rw   r!   r   rx   r
   r  rD   rD   rE   test_split_num_outputs_4
  s:   z/TestReferenceEvaluator.test_split_num_outputs_4c           
      C     t dtjd d g}t dtjd g}tddgdgdd}t|gd|g|g}t|tddgd	}dt	d

dtji}t|}|d |}tjg dtjd
d}	| |d  |	  d S )Nr   r   ArgMinrn   rd  rS  rW   rG  r   re  r   r   )r   r   r   ro   r   rn   r   r   r   r   r5  r   r   r   r   rv   r*  r   r+  r   r!   r   rw   r6  r   tolist
r   r   r   r  r   r`   rS  r   r!  r   rD   rD   rE   test_argmin
     z"TestReferenceEvaluator.test_argminc           
      C  r  )Nr   r   ArgMaxrn   rd  rS  rW   rG  r   re  r  r   r   r   ro   r  r   r  r  rD   rD   rE   test_argmax
  r  z"TestReferenceEvaluator.test_argmaxc                 C  s,  t dtjd d g}t dtjd g}t dtjd g}t dtjd g}t dtjd g}tdg ddgtd	ddgdgg}t|d
||||g|g}t|tddgd}tj	dggtj
dtj	dgtj
dtj	dgtj
dtj	dgtj
dd}	t|}
|
d |	}tj	dgtj
d}| |d  |  d S )Nr   startsendsr"  r   r  )r   r  r  r"  TSqueezerS  rW   rG  r   r   ro   rn   r   r   r   r5  r   r   r   r   rv   rw   r6  r!   r   r   r  )r   r   r  r  r"  r   r{  r   r`   rS  r   r!  r   rD   rD   rE   test_slice_squeeze
  s&   z)TestReferenceEvaluator.test_slice_squeezec           
      C  s   t dtjd d g}t dtjd g}tddgdgdgdgdgdtddgdgdgd	g}t|d
|g|g}t|tddgd}dtj	dggtj
di}t|}|d |}tj	dgtj
d}	| |d  |	  d S )Nr   r   r  r  r   rn   )r"  r  r  r  )r"  rS  rW   r   r   ro   r  )
r   r   r   r{  r   r`   rS  r   r!  r   rD   rD   rE   test_slice_squeeze_6
  s   z+TestReferenceEvaluator.test_slice_squeeze_6c           	      C  sD  t dtjd d g}t dtjd d g}tddgdg}t|gd|g|g}t|tddgd}t| t|}|j	d }| 
|jjd	 |d dtjd
tjdid }| 
|jd | 
|d d t|tddgd}t| t|}|j	d }| 
|jjd |d dtjd
tjdid }| 
|jd | 
|d d d S )Nr   r   
ReduceMeanrS  rW   rb  r   r   ReduceMean_1r  ro   r  r   r   rn   rG  ReduceMean_18)r   r   r   r   r   r   r   r   r!   r  r   r  r  r   rv   onesr   rT   )	r   r   r   r   r   r`   r   clsr  rD   rD   rE   test_onnxrt_reduce_mean
  s(   
 
 z.TestReferenceEvaluator.test_onnxrt_reduce_meanr/  c           	      C  s   g }t dtjd dgt dtjd gg}t dtjd d gt dtjd gg}| dkrE|ttjdgtjdd	d
 t|dd	gdgddd}nt|dgdgddgdd}tddgdgdd
tdddgdgdd
|tddgdgdd
g}t	|d|||}g }g d}|ttj|tj
dddd
 |ttjdgtjddd
 t dtjd dgg}t dtjd dgt dtjd dgg}tdddgd d!gd"|dd#td$d!gd%gd&ddgd'td(d%gd)gd*d
td+d)dgddgd,ddd-g}t	|d.|||}t|td/| gd0S )1Nnext_inr   nextnext_outscan_outrG  rn   ro   axis_redr   cdistdf_17_C0cdistdf_17_reduced0cdistdf_17_ReduceSumSquarer   )rR   r#  )rR   r"  r#  r  cdistd_17_IdentitySubcdistdf_17_Subcdistdf_17_IdentityOnnxIdentity)Pg   @:?g   g   g    ?g   `?g   9?g   `Ƕٿg   Jg    Og   3?g   h	ܿg    sg   g   @`6?g   dg    Lg   ?g   @_ÿg   @Eg   g?g   lg   пg   q?g    v?g   C?g   3?g   `~?g   @Q?g   ˄g   ڞg   @׿g   `Kg    g    ?g   g    zӿg   @E?g   Xӿg   <?g   `ؿg    u(@g    ǿg    Eg    m?g   g    ?g   @?g   T?g   ?g   Tg   @Bʿg    M	?g    9?g   `Y@g    -?g   `Q?g   E?g   &7׿g    [?g   ]Lg    Xg    i?g   g   `ۜg   g   ?g   ;˿g   g   kZ?g   Z?g    &?g   `Ah?g    lg   @D?g    ?G?g    p?g   hg   @>?g   Wg   `1Dֿ)rK  r   
Sc_Scancstrf   
To_TopKcstr  valuesindicesScanUU032UUUU033UUSc_Scan)rR   r  num_scan_inputs	TransposeTr_transposed0Tr_Transpose)rR   permSqrtSq_Y0Sq_SqrtTopKTo_TopK)rR   largestsorteddummyrW   r   )r   r   r   rB  r    rv   rw   r6  r   r   r   r   r5  r   r   )	rc   	reduce_opinitializersr   rs  node_reducer{  r   
list_valuerD   rD   rE   _cdist_model
  s   
Rz#TestReferenceEvaluator._cdist_modelr  g]l,@g.s,&2@ro   rf   r   r   r   ReduceL1gQ@gK-J3@g%s}N@gZOc10@rG  r   r2  ReduceL2g&?gq#i?giE@g=@r   ReduceLogSumgd?gUU?g(?gQOIR?ReduceLogSumExpg?g?g9z%4~@g	Y;@	ReduceMaxgS?gsn`{?go@g@r  gύ]`?gJ?g%s}N @gZOc10@gNs	@ghi
@gXE!@gHg`y#@
ReduceProdrb  rc   rQ   c                   st  |\ }t ddt j}i }| | }t|}|d d|i}||d|f<  fdd|jd j	jD }	|	d j
}
t |	d jfd|
i}t||gd	}|d d|i}||d
|f< d}| D ]S\}}tt|t|ddD ]C\}}|j|jkrtd d| d|j d| d|j dt ||  }|dkrtd| d d| d| d| d| qsqdd S )Nr  )r   r   r  r  c                   s   g | ]}|j j r|qS rD   )r  r  r  )rh   r   r  rD   rE   rm   #  s    z9TestReferenceEvaluator.test_op_reduce.<locals>.<listcomp>r   	op_schemar  ref_clconstantTstrictzShape mismatch for z, :z != re   gư>zDiscrepancies (max=z) for r   r  )rv   r*  r   r+  r   r  r!   r   r  r  _schemars   r  itemszipreversedrT   r   r  r   )r   reduce_op_expectedrc   r   r   resultsr	  r   r  clschemanew_clbaselinekvr   r   diffrD   r  rE   test_op_reduce  s<   `

&&z%TestReferenceEvaluator.test_op_reduce)r2  )rb  )rG  	ref_opsetc                 C  s   t dtjg d}t dtjg d}tddgdgg}t|d|g|g}tjddddtj	}t
|td|gd	}t|}	|	d d|id
 }
t
|td|gd	}t|}|d d|id
 }| |
j|j t|
| d S )Nr   r,  r   MeanVarianceNormalizationrS  r   rn   rW   r   r   )r   r   r   r   r   rv   randomrandr+  r   r   r   r!   r   r   rT   r
   )r   rc   r  r   r   r{  r   r   r`   r  r  ref_onnx_modelref_expectedr   rD   rD   rE   test_mvn;  s   zTestReferenceEvaluator.test_mvnc           
      C  s   dd }| }t jddgddggt jd}t jdd	ggt jd}t jd
dggt jd}t |||g}t|}|||d}|d |}	t||	d  d S )Nc                  S  s8  g } g }g }g }t  dd}g }tdddgdgddd	}|| d
d | D }tddddgdg||}|| |tdtjg  |tdtjg  |tdtjg  |tdtjg  tdddgdgddd	}| | tdddgdgddd	}| | dd | D }	t| d||}
t	|
|	|dS )Nrn   )rW   custom_domainConcatzx:0zx:1r__0r   rW   )r(  r[   c                 S  &   g | ]\}}t ||d u rdn|qS r  r   rh   r[   r\   rD   rD   rE   rm   b      zZTestReferenceEvaluator.test_concat_in_a_function.<locals>.create_model.<locals>.<listcomp>r  concat_2I__0I__1I__2r__4r__3c                 S  r  r  r  r  rD   rD   rE   rm   }  r   numpyxr<  )
r   r   rB  r  r   r   r   DOUBLEr   r   )r{  r   rs  r=  r   	nodes_fctr  opset_imports_fctr  r   r   rD   rD   rE   create_modelW  sJ   



zFTestReferenceEvaluator.test_concat_in_a_function.<locals>.create_modelr   r   r   r   ro   rn   rf   r   )r  r  r  r   )rv   rw   float64vstackr!   r   r
   )
r   r  r`   x1x2x3r   r  rS  r  rD   rD   rE   test_concat_in_a_functionV  s   /z0TestReferenceEvaluator.test_concat_in_a_functionc              	   C  s   t dtjd g}t dtjd g}tttddgdgtjdgd|g|g}t|}t	dddtj
g}|d d|id	 }| |t	dddtj
gtjk  d S )
Nr   r   Castr$  rS  Clp?Q}>ʈÿr  r   )r   r   r   STRINGr   r   r   r!   rv   rw   nanr   
assertTruer+  str_allr   r   r   r	  r  r|   r  rD   rD   rE   test_cast_float_to_string  s"   
"z0TestReferenceEvaluator.test_cast_float_to_stringc              	   C  s   t dtjd g}t dtjd g}tttddgdgtjdtddgdgtjdgd|g|g}t|}t	ddd	tj
g}|d d|id
 }t|t	ddd	tj
g d S )Nr   r   r  rQ  r$  rS  r  r  r  r   )r   r   r   r   r   r   r  r!   rv   rw   r  r   r
   r  rD   rD   rE   "test_cast_float_to_string_and_back  s    z9TestReferenceEvaluator.test_cast_float_to_string_and_backc                 C  sR  t dtjd }t dtjd }t dtjd }tdddgdgddg}tt|d||g|g}t|}t	
dd	t	j}t	jdt	jd
}|d ||d}	t	jddgddgddgggt	jd
t	jddgddgddgggt	jd
t	jddgddgddgggt	jd
gg}
| t|
d t|	d  t|
d |	d dd D ]	\}}t|| qd S )!Nr   r   rQ  SplitToSequencerf   rd  rS  rG  rn   r   r   ro   rU  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r,  r  r  r  r   Tr  r   r   r   r5  	UNDEFINEDr   r   r   r!   rv   r*  r   r+  r   rw   r6  r   r   rt   r  r
   r   r   r   rQ  r{  r	  r  r|   r  r  r   r   r   rD   rD   rE   test_split_to_sequence  s$   """z-TestReferenceEvaluator.test_split_to_sequencec                 C  sV  t dtjd }t dtjd }t dtjd }tdddgdgddg}tt|d||g|g}t|}t	
dd	t	j}t	jg d
t	jd}|d ||d}	t	jddgddgddgggt	jdt	jddgddgddgggt	jdt	jddgddgddgggt	jdgg}
| t|
d t|	d  t|
d |	d d d!D ]	\}}t|| qd S )"Nr   r   rQ  r  rf   rd  rS  rG  r  rf   rf   rf   ro   rU  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r,  r  r  r  r   Tr  r   r"  rD   rD   rE   test_split_to_sequence_1d  s$   """z0TestReferenceEvaluator.test_split_to_sequence_1dc           
        s   t dtjd }t dtjd }tddgdgdddg}tt|d|g|g}t|}t	d
d	tj |d d i} fd
dt jd D g}| t|d t|d  t|d |d ddD ]	\}}	t||	 qed S )Nr   rQ  r  rf   r   r'  rS  rG  r  c                   s"   g | ]} d d d d |f qS rO   rD   rg   r|   rD   rE   rm     s   " zTTestReferenceEvaluator.test_split_to_sequence_nokeepdims_noinput.<locals>.<listcomp>Tr  )r   r   r   r!  r   r   r   r!   rv   r*  r   r+  r   r   rx   rT   r   rt   r  r
   )
r   r   rQ  r{  r	  r  r  r   r   r   rD   r&  rE   )test_split_to_sequence_nokeepdims_noinput  s   z@TestReferenceEvaluator.test_split_to_sequence_nokeepdims_noinputc                 C  s  t dtjd g}t dtjd g}t dtjd g}t dtjd g}t dtjd g}tttddgdgtjdtddgd	gtjdtd
g dgtdtjdgg ddtd
g dgtdtjdgg ddtddgdgtjdtdd	gdgtjdtddgdgtjdtddgdgtjdgd|g||||g}t	|}t
jg dt
jd}tj|tjt
j}	tj|tjt
j}
|d d|i}t|d |	 t|d |
 t|d |	 t|d |
 d S )Nr   F1F2F3F4r  f81r$  f82r^  C1r   r   rn   rf   g?r  rt  C2rS  ro   r   rn   rf   r   )r   r   r   r   r   r   r&  
FLOAT8E5M2r   r!   rv   rw   r   onnxnumpy_helpersaturate_cast	ml_dtypesfloat8_e4m3fnr+  float8_e5m2r   r
   )r   r   r(  r)  r*  r+  r	  r  r|   	expected1	expected2r  rD   rD   rE   test_cast_float8  sd   
z'TestReferenceEvaluator.test_cast_float8z2.0z9assert_allclose does not support ml_dtypes in numpy < 2.0c           	   
   C  s   t dtjd g}t dtjd g}tttddgdgtjdtdddgdgdd	tddgdgtjdgd
|g|g}tjddgtj	d}|
tj}t|}|d d|i}t|d | G dd dt}t||gd}|d d|i}t|d | d S )Nr   r   r  f8r$  CastLikef32r   )saturaterS  g    cAro   c                   @     e Zd ZdZdS )z>TestReferenceEvaluator.test_cast_like_float8.<locals>.CastLikerW   Nr  r  r  r  rD   rD   rD   rE   r=  =      r  )r   r   r   r   r   r   FLOAT8E4M3FNUZrv   rw   r   r+  r6  float8_e4m3fnuzr!   r   r
   r#   )	r   r   r   r	  r|   r   r  r  r=  rD   rD   rE   test_cast_like_float8"  s,   z,TestReferenceEvaluator.test_cast_like_float8c           
   	   C  s   t dtjd g}t dtjd g}t dtjd g}tttddgdgtjdtddgdgtjdgd|g||g}t|}t	j
g dt	jd}tj|tj}tj|tj}|d d|i}	| |	d	  |  | |	d
  |  d S )Nr   r(  r)  r  r$  rS  r/  ro   r   rn   )r   r   r   r&  r2  r   r   r   r!   rv   rw   r   r3  r4  r5  r6  r7  r8  r   r   r  )
r   r   r(  r)  r	  r  r|   r9  r:  r  rD   rD   rE   test_cast_float8_outputD  s(   z.TestReferenceEvaluator.test_cast_float8_outputc           	      C  s  t jddddddddd	d
dddt jt j t jgt jd}tjt jdddddddddddddddt jgt jdtjt jdddddddddddddddt jgt jdtjt jdddddddddddddddt jgt jdtj	t jddddddddd ddddddt jgt jdi}d!d" }|
 D ]A\}}| j|d#/ ||}t|}|d d$|id% }t|| | |j|j | |j|j W d    n1 sw   Y  qd S )&Ng	?i`  i  iP  i0  i  ig-C6?g{Gz?i       j@ro   g      ?g      v@g      z@g      t@g      p@g      pg      Xr  g      ?g      |@g      |g      n@g      ng      ?g      x@g      ?g      @g      g?c                 S  st   t dtjd g}t dtjd g}tddgdg| d}tddgdgtjd}t||gd|g|g}t|}t| |S )Nr   r   r  r  r$  r   )r   r   r   r   r   r   r   )r%  r   r   r   r   r   r`   rD   rD   rE   model_cast_cast  s   zCTestReferenceEvaluator.test_float8_4_types.<locals>.model_cast_castr$  r   r   )rv   rw   infr  r   r   r&  rC  r2  FLOAT8E5M2FNUZr  r   r!   r   r
   r   rT   rp   )	r   r   r   rI  r%  expectr`   r  r   rD   rD   rE   test_float8_4_types[  s   W

z*TestReferenceEvaluator.test_float8_4_typesc                 C  s   t dtjd g}t dtjd g}tttddgdgtjdgd|g|g}t|}tj	g dtj
d}|tj}|d d|i}tj|d | d S )	Nr   r   r  r$  rS  r   rn   rf   rH  r  ro   r   )r   r   r   BFLOAT16r   r   r   r!   rv   rw   r   r+  r6  bfloat16r   r  assert_array_equalr   r   r   r	  r  r|   r   r  rD   rD   rE   test_cast_bfloat16_output  s    
z0TestReferenceEvaluator.test_cast_bfloat16_outputc                 C     t dtjd g}t dtjd g}tttdg dgtdtjdgdgdtdg dgtdtjdgd	gdtd
g ddgtdddgdgddgd|g|g}t|}t	j
g dt	jd}t	j
g dt	jd}|d d|i}t|d | d S )Nr   r   r^  scalern   r  r0  rb  r  QuantizeLinearr   rU  rb  r  DequantizeLinearr   rd  rS  rN  ro   r   rn   rf   i  r  r   r   r   r   r   r   r   r&  r!   rv   rw   r   r   r
   rR  rD   rD   rE   test_quantize_linear_e4m3  :   z0TestReferenceEvaluator.test_quantize_linear_e4m3c                 C  s   t dtjd g}t dtjd g}tttdg ddgtdddgdgdd	gd
|g|gtdtjdgdgtdtjdgdgg}t|}t	j
g dt	jd}t	j
g dt	jd}|d d|i}t|d | d S )Nr   r   rV  rW  r  rX  rU  r   rd  rS  rn   r  rb  r  rN  ro   rY  rZ  rR  rD   rD   rE   %test_quantize_linear_e4m3_initializer  s(   z<TestReferenceEvaluator.test_quantize_linear_e4m3_initializerc                 C  rT  )Nr   r   r^  rU  rn   r  r0  rb  r  rV  rW  r  rX  r   rd  rS  rN  ro   )r   rn   rf   i  r  )r   r   r   r   r   r   r   r2  r!   rv   rw   r   r   r
   rR  rD   rD   rE   test_quantize_linear_e5m2&  r\  z0TestReferenceEvaluator.test_quantize_linear_e5m2c                 C     t dtjd g}t dtjd g}tttdg ddggd|g|gtdtjdgdgtd	tjdgd
gg}t|}t	j
g dt	jd}t	j
g dt	jd}|d d|i}t|d | d S )Nr   r   rV  rW  rS  rU  rn   r  rb    )r  g      `r        333333@333333@g      @g         @     ro   )r`  i         i  rh  ri    r   rk  r   r   )r   r   r   UINT16r   r   r   r   r!   rv   rw   r   uint16r   r
   rR  rD   rD   rE   test_quantize_linear_uint16F  s2   z2TestReferenceEvaluator.test_quantize_linear_uint16c                 C  r_  )Nr   r   rV  rW  rS  rU  rn   r  rb  r5  )r  g     r  ra  rb  rc  rd  re  g    @g    g    @g    g     @g      rf  rg  ro   )r5  r        i  rP  ro  rp  r`  ir`   r`  rq  r`  rq  r   )r   r   r   INT16r   r   r   r   r!   rv   rw   r   int16r   r
   rR  rD   rD   rE   test_quantize_linear_int16  s2   z1TestReferenceEvaluator.test_quantize_linear_int16c                 C     t dtjd g}t dtjd g}tttdg ddgddgd|g|gtdtjd	gd
gtdtjd	gdgg}t|}t	j
g dt	jd}t	j
g dt	jd}|d d|i}t|d | d S )Nr   r   rX  rW  r   rd  rS  rU  rn   r  rb  r`  )i0u  iy  rj  i  ro   )g     g     r  g      }@)r   r   rl  r   r   r   r   r   r!   rv   rw   rm  r   r   r
   rR  rD   rD   rE   test_dequantize_linear_uint16  *   z4TestReferenceEvaluator.test_dequantize_linear_uint16c                 C  ru  )Nr   r   rX  rW  r   rd  rS  rU  rn   r  rb  i )iiii  ro   )g     @g     @g       g     @)r   r   rr  r   r   r   r   r   r!   rv   rw   rs  r   r   r
   rR  rD   rD   rE   test_dequantize_linear_int16  rw  z3TestReferenceEvaluator.test_dequantize_linear_int16re  r   rn   r   r>  )r   r   r   r   )r   r   r   r   )r   r   r   r   )rn   r   r   r   )r   r  r   r  )r   r  r  r  r  r  )      ?r  rn   rJ  )r   r   r  r   r  r   r   r   )rM  rU  rw     r  rP     r   )r`  D   rX  rO  rw  r|  rz  r  ry  r  r   r  r   )r   r   r   r   r   r  )r3  re  r  )r   r   r   r   c                 C  s   t dtjd g}t dtjd g}tj|tjd}	tj|tjd}
tt	t
dg ddg||dgd|g|gtdtj|	j|	td	tj|	j|
g}t|}tj|tjd}|d urptj|tjd}|d d|i}t|d
 | d S | t |d d|i W d    d S 1 sw   Y  d S )Nr   r   ro   rV  rW  r(  
block_sizerS  rU  rb  r   )r   r   r   INT8rv   rw   r   int8r   r   r   r   rT   r!   r   r
   r   ru   r   r   rU  
zero_pointr(  r~  r   r   r   
scale_datazp_datar	  r  r|   r  rD   rD   rE   test_blocked_quantize_linear  sB   ;	"z3TestReferenceEvaluator.test_blocked_quantize_linear)r   rn   r   r   )re  r   r  r  )rw  -   r%  r0  )r   r   rf   r   )r3  re  rK  r  )rJ  rw  6   r%  r   r$  r  )rn   rn   r   r   )r   r   re  re  )r3  r3  rt  rt  )rf   rn   r   )r   rf   r   r   r   r   rG  rt  )r0  rG  rK  r   re  r2  r|  r  )rM  r  rU  rI  rK  rt  r0  r  )r  r   rf   r   r   r3  c                 C  s   t dtjd g}t dtjd g}tj|tjd}	tj|tjd}
tt	t
dg ddg||dgd|g|gtdtj|	j|	td	tj|	j|
g}t|}tj|tjd}|d urptj|tjd}|d d|i}t|d
 | d S | t |d d|i W d    d S 1 sw   Y  d S )Nr   r   ro   rX  rW  r}  rS  rU  rb  r   )r   r   r  r   rv   rw   r   r  r   r   r   r   rT   r!   r   r
   r   ru   r  rD   rD   rE   test_blocked_dequantize_linearZ  sB   E	"z5TestReferenceEvaluator.test_blocked_dequantize_linearc              	   C  s   dd }d}d}d}d}t dtjg d}t d	tjd }td
dgd	g||||dg}tt|d|g|g}	t|	}
tj	
ddddtj}|
d d|i}||||||}| t|d t| d S )Nc           
      S  s   t dt j}t | jD ]4\}}}}	t| |td|t	|d d  t
d|t|d d  d ||	f d |||||	f< q| ||| |  |  S )N)r   r   r   r   r   rn   rf   r   )rv   rz   r+  r   ndindexrT   r,  r   mathfloorr   ceil)
r   r  betar  r	  
square_sumr   r   hrA  rD   rD   rE   	_expected  s    z2TestReferenceEvaluator.test_lrn.<locals>._expectedg-C6*?r  r  r   r   )r   r   r  r  rQ  LRN)r  r  r  r	  rS  r   r   )r   r   r   r!  r   r   r   r!   rv   r  r  r+  r   r   r   rt   )r   r  r  r  r  r	  r   rQ  r{  r	  r  r|   r  r   rD   rD   rE   test_lrn  s   zTestReferenceEvaluator.test_lrnc                 C  s   t ddt jd t ddt jt jdt jdd}tddgdgddgdgd	d
}tdi ||}tdi ||}t	|| d S )Nr   )rn   rn   r   rn   r   r  r  ro   r.  NOTSETr  r~   r}   rl   r   rH  rD   
rv   r*  r   r+  r   rz   r   r/   r0   r
   r   rS  rA   r   r  rD   rD   rE   test_conv_im2col_1d     z*TestReferenceEvaluator.test_conv_im2col_1dc                 C  s   t ddt jd t ddt jt jdt jdd}tddgdgd	d	gdgd
d}tdi ||}tdi ||}t	|| d S )Nr  )rf   r   r   rn   )r   r   r   r  ro   r.  r   r   r  r  rD   r  r  rD   rD   rE   test_conv_im2col_1d_pad0  r  z/TestReferenceEvaluator.test_conv_im2col_1d_pad0c                 C  s   t ddt jd t ddt jt jdt jdd}tdddgd	d	gg d
ddgdd}tdi ||}tdi ||}t	|| d S )N   )rn   rn   r   r  rn   r3  r2  r  ro   r.  r   r/  r  r  rD   r  r  rD   rD   rE   test_conv_im2col_2d  s"   z*TestReferenceEvaluator.test_conv_im2col_2dc                 C  s   t ddt jd dt ddt j t jdt jdd	}tdddgddgg d
ddgdd}tdi ||}tdi ||}t	|| d S )Nr%  )rf   r   r   r   rn   rf   rG  )r   r   rn   rf   r  ro   r.  r  r  r  rD   r  r  rD   rD   rE   test_conv_im2col_2d_pad0  s"   z/TestReferenceEvaluator.test_conv_im2col_2d_pad0c                 C  s   t ddt jd dt ddt j t jdt jdd	}tdddgd
d
gddgd dd}tdi ||}tdi ||}t	|| d S )NrX  )rn   rn   r   r   rn   rf   r3  r2  r  ro   r.  r   
SAME_LOWER)r  r~   r}   r   rl   rH  rD   r  r  rD   rD   rE   test_conv_im2col_2d_autopad1  s   z2TestReferenceEvaluator.test_conv_im2col_2d_autopadc                 C  s   t ddt jd t ddt jt jdt jdd}tdg d	g d
g dg d	dd}tdi ||}tdi ||}t	|| d S )Ni  )rn   rn   r   r   r2  rn   rE  )rn   rn   r   r   r   r  ro   r.  rn   rn   rn   r  )rn   rn   rn   rn   rn   rn   r  r  rD   r  r  rD   rD   rE   test_conv_im2col_3dC  s&   z*TestReferenceEvaluator.test_conv_im2col_3dc                 C  s   t ddt jd t ddt jt jdt jdd}tdddgd	d	gg d
ddgdd}tdi ||}tdi ||}t	|| d S )Nr%  r#  rn   r  r$  r&  ro   r.  r   r/  rf   r  r  rD   r  r  rD   rD   rE   test_conv_im2col_2d_stridesX     z2TestReferenceEvaluator.test_conv_im2col_2d_stridesc                 C  s   t ddt jd t ddt jt jdt jdd}tdd	dgd
d
gg dd	d	gdd}tdi ||}tdi ||}t	|| d S )Nr%  r#  rn   r  r$  r&  ro   r.  rf   r   r/  r  r  rD   r  r  rD   rD   rE   test_conv_im2col_2d_dilationsj  r  z4TestReferenceEvaluator.test_conv_im2col_2d_dilations))r   )r  )r  )r  )r  )r  r/  c           
      C  s   t dtjd }t dtjd }tddtj}t|dgdgddg}t	t
|d|g|g}t|}|d d|i}|d }	| |	tj | |	jd d S )	Nr   r   r   )rn   r   rf   r   r1  rS  rD   )r   r   r   rv   r*  r   r+  r   r   r   r   r!   r   r   ndarrayr   rT   )
r   opr   r   r|   r{  r	  r  r  rrD   rD   rE   test_reduce_op_no_axis|  s   z-TestReferenceEvaluator.test_reduce_op_no_axis)r  r&  r   r   )r   )r   c                 C  sH  t dtjd }t dtjd }t dtjd }t dtjd }tjdgtjd}tdg ddgd	d
}tt	|gd|||g|g}t
|}	tjdgtjdd| }
tjddg| tjd}|	d |
||dd }| |jd|  | |jtj tddg|tj}|	d |
||dd }| |jd|  | |jtj d S )Nr   PVr   r   ro   Pad)r   r  r  r  )r   rs  r}  rS  rn   r  r   r  r   r   )r   )r   r   r   r5  rv   rw   r   r   r   r   r!   r   r6  r   r   rT   rp   repeatr+  )r   dimr   r  r  r   rt  r  r	  r  r   pr  rD   rD   rE   test_pad  s"   zTestReferenceEvaluator.test_padc              
   C  s   t dtjd }t dtjd }tddgdgdtddgdgtdtjdgdgd	g}tt|d
|g|g}t|}t	j
dt	jd}|d d|id }| |jd | |jt	j tt	j
dt	jd| d S )Nr   r   r  rT   r  ConstantOfShapert  rn   rr  rS  ro   r   rD   )r   r   r   r   r   rl  r   r   r!   rv   rw   r   r   r   rT   rp   rm  r
   r   r   r   r{  r	  r  r   r  rD   rD   rE   test_constant_of_shape  s"   	z-TestReferenceEvaluator.test_constant_of_shapec                 C  s   t dtjd }t dtjd }tdg dgtdtjdgdgdtd	dgd
gdtdd
gdgtdtjdgdgdtdddgdgg}tt|d|g|g}t	|}t
jdt
jd}|d d|id }| |jd | |jt
j tt
jdt
jd| d S )Nr   r   r^  liker   rn   rf   r0  r  rT   r  r  r  rt  rr  r=  rS  ro   r   rD   )r   r   r   r   r   rl  r5  r   r   r!   rv   rw   r   r   r   rT   rp   rm  r
   r  rD   rD   rE   test_constant_of_shape_castlike  s0   z6TestReferenceEvaluator.test_constant_of_shape_castlikec                 C  sB  dt jg dg dg dg dg dgt jdi}t jg dg d	g d
g dg dgt jdt jdt jdt jdt jdg}tdtjd }tdtjd }tdtjd }tdtjd }tddgg dg}t	t
|d|g|||gtdt d gd}t|}	|	d |}
| t|
d tdddD ]}t|
| ||  qd S )Nr   )dg6`gQs[ؿgq2 d!?ggc%^?gQF
?g2o?g?gܝ>G?gG@b?gpA?g/ʿg`Y`?g??g@@?gߥ.gt?>P?g<0?ge~% 9g"?gf<߉xgs nY?gA?gOd* ǼgɀqgZ9?g} ixg`?g«kgY Ȧgd?JKg>Y?g LQ?gu@gc0@"?gZֈɾ?g.ykj?g}Ͽh?g2_ѿgg``m?gVHϿgO?g ?g2 vE?g~ۺg?Ͽg:h T?g(ۿ㣿gp}L?g& ׿gӿg֟?gj@@[?g(SHcÿgR,^Rgͼӟ(ɷ?g'U?gם՟P?g2ÿgk{?g; ȿgW^U0?gn ޒgGgĿg3ſ2ѿgT) 8?g^ҿgSQg=vpp?gS_ſgxпgK/Zeg)4$w?g_!@r?g8z?g0(Ngグg|p=fugoҿgN ?gPL2 ?gɗ֓?gtY?g؁?g"cٿF?ge] d`?gut~g/!?g:'?gS*gH?g=T@Au1?gH{?g_@?ggi- BI?gU?q?gHT`EϿgi4-ٿg" ?gʃ)dg9Ͽg3ֿg3d?gP>g@Ӫg- ,Ggk?g d;mgKT?g8?giz_?gဉDοg0+?g ¬?gO?gy_?g%D?g&j'?g+[gu?gv `˿g	?m?g{A>?gggCv?g4.&?g#?g>ġ@?gTg xg"Ug@F?gZ 7?g$s4`?g?u~ؿg~`ӽ?g?sZgs#|?gZ&!?g|Zzɿg(Ϳ?g^stS$ſg+q9gL>?gUo?gR^Igɿg?V??g蒷?g8-?g_ֿg@}\οgcg)?gĿgOɿg9Z?gWK v]?g>@{?gsVg14 @[n?gEc@ѿgVAg;?r?gj &;g#% ÿg:`i?gB@oƿgf_Xjg=?gHCſgk @]ſgG5?g	. ?gr{?g*8⮤g3Z  ,Zgä?g{`b?gjxvԿg^?g1?g?g 7gzPl߅h?g|?gdy1?g$ 9¿gtՉ?g0_?ge߿gx?X?gI??gG]t?gߛgfϾ"Z?g&@?g̅vʿgҿ@ſg?	?gyW?)dg?FgEFI@3Կg?gZa}gѠ 
:?g5 g)?g~ ?g69q?g?g6XCg|8ҿg?Ԫοg  [0?g.,?g_gԻ?g՟E:g@Ŀg@T?g|iͿgf k̿gE& ?g'@gu^ eŮgP{?gSh?5og=6% ?gg]~:gv!g MgB	 |?g6`r?g]ſgB7?g%Q?g7ف?gg g))L?g*- Jӿg9;ґ?gCr?g>Yͱ?g(?KĿgu gSV?gޟNZ?gE?g?_Sݿg|k`HѿgRS?gۨe?g#@ſg4׶gդϟ?g!5n?g]y ?g-?g}a ?g7_1ԿgrXƿg(;?gQ㿠Kg[#g9*X_4V?go@¿g<~?	ѿgVH?g`2J¿g}3?gڒ ?g.K?ÓgGd?gӕ`?g#K@+g1 ߷?g!?gב ǿg\!>?gmCl7\?gCn~W?g9hgW?2L?gM?gXp?go, 
ǿgs̠?gFė 1?g?ݿg?gTԄ?g	 %ag"d?gg=!p?g?qgAEȿg
?g9c"Vպ?g{wXk?)dgƣg-@ɧӿgˬ?0)?gcſgc fgR˷䤿g	 ?gu9e?glû?g!H?g1?j?gDXԿg7Z??g߄ gs?g%`g%(hg f?g)1ƿg0c@?gU
g`?֠9g=?Nn?gle lgᩱg0@}gK>?gw4򟌆?gWkByEgt??gCU?g2 v?g邀?g; ۿgW\md?g^?ս?gmg,@?gT }ĿgN?gGb Dտgu?gg4\m?gVKן?g7$@g?¿gE?gfFS?g~P?gBMӿgTzտg(?g?Ԏ?g2~>͌?g}8_g$9 ?g?gﲿf?gÑ!`zg@\ F?g~@eǿg8EU?gsC Y?gg ĿgP?go	 
geʿg_ ?g\u8hg Cɿgz]ڈgu% ?gyd*?gf* xq?gZ߿ǥ?g1_9?g^?gQÄɰͿg!`Tg?gԓͧgs)@ig?grJ?gB?gIzgq"?gt:꾿gJd`k?gu=>R?g gr?gu]?gc?gTyf?gH*?gf?g1g&o}пgG`?gxKu?)dgu@?gnO~ҿgJ_!g9 kg +g-nt?g[?g _ÿg2Z?n?g_S`?gA 0cu?gwsRֿgܣgaS˭?gI?g-a`bпg(???g]["=gLֿ#~ѿgZG`?gvϿVڿge?ꖿg|?g2MԿg^;?gX_?g3o-߱?gFV߼?g9ǿgqM&gj,??g:Y+?g?g&@.g(䟑w?gl_{gΧr ?g-f??g g] (?g]v	 Oݿgj`PKӿg$ߏ?gyB@BX?g*gS>ϿgY?geƿg4@?g,P &ݿgz`ҿg	~?gf?	?g?1gq^{пg?g)`$?gHo}?gqyF?g> G?g87@Eɿgɷg	_Ng^E`g)˿gkd`?gjF_g}пgzη?gL@ĿgSؿg>&`e<?gB`h٤?g> gWmN?gb_gtߏvgA gb9?տg7B篿g?g '-\?g>+Ʃ?gzi_`?gbP?gHWo?g!/gw?gEf@
?ge$5g@?gW ?gh<g; ?g g?gbj@ÿg#@`5g%`|?gR`Rro   )dr_  rX  rZ  rM     rc  r  r  rh     rZ  i   rV           r  r        w   r     z   r        rg  r  r  r_        r         r  r  r     a   r  r  rP  rm  r  r  rS     r  U         s   rm  r     r  r  r  r        q   rz  r  r        r  ^      r  r  r}  r  r  r  r  r  r  r     r     r  r     r  rG     r  r  r  r  rj  r  F   r  r{  )db   r  rf  x   r  r  r  r        r  r     rc     r     rc  rm  r  g   r}  r  rr     r  r  rj  rS  }   r     r  rX  r  r     r  j   r  p   r  r  r  r  r  ri  r  r  rn  r  rx  rV  r  r  r  r  rd  r  r  rZ  r  r  rO  r     n   rr  r  r  r  rV  r  rV  rS  rM  r  rV  rR  r  rc  r  r  rZ  r  r  u   r  r  rL  r  r  r  rO  r     r\  r  r  rZ  )dr  ru  r  r  r  r  ri  r  r  r  r  r  r  r  r  rx  r  r  r  r  r  rp  r  r  rO     r{  r  r  rr  r{        r  r  r  r  r  rS  r  r  r        r     r  r     r[  r  r  r  r  r  r  r}  r  r  r  rR  r  r  r  r  r  r  r  r  rV  r  r     r  r  r  r  r  r%  ry  r  rW  r  r  r[  r  r  r  r  r\  r  r  r{  r  r  r  r%  r  rW  r  )drS  V   r  r  r  r  r  r  rf  r  r  r  rZ  rM  r  r  r{  r  r  r  r  r  r  r  r  r  r     rm     r  r  r  >   ry  r  r  r  r  r  r  rh  r  r  r  rV  r  r}  r  r  ro  r  r  r  rr  r     r  r  r  m   rc  r  r  r     r  r\  r  v   r  r{  r  rs  r  r  r  r  r  rM  r  rx  r  rW  r  r  r  r  rV  rQ  r  r  r  r  r  r  r  r^  r  r}  )dr  r  r  r  rx  r  rh  r  r  r  r  rn  rS  ry  r  `   r  rx  rz  r  r  r  r  rT  r  rh  r  r  r  r  r  r     rU  r  r  rh  r  r  r  r[  r  r  r  rm  r  r  r  r  9   r  r  r  rr  r^  ri  r  r  r  r  r  r  r{  r  r  r  r  r  r  r  G   r  r  r  r  r  r  rS  ro  r     r  r  rh  r  r  r  r  rc  r+  r  r  r  r  rS  r  r  r  r  rx  g    v?r  r   rU  zpDynamicQuantizeLinear)r   rU  r  rS  rW   rn   r   r   rf   r   )rv   rw   r   r  r   r   r   rR  r   r   r   r   r   r!   r   r   rt   rx   r
   )r   rS  r   r   r   ScaleZpr{  r	  r  r  ri   rD   rD   rE   test_dynamic_quantize_linear  s   ffff               ffff                       z3TestReferenceEvaluator.test_dynamic_quantize_linearabcdefz.comz.netzabc.comzdef.netr&  )catdogsnakes)catsdogssnakesr  )r
  r  r  rD   )r      ßr   )aau   ßßyyc                 C  s   t dtjd }t dtjd }t dtjd }tdddgdgd}tt|gd||g|g}	t|	}
|
d t	|t	|d^}}tj
|| | |jjdd	h | |j| d S )
Nr   r   r   StringConcatr  rS  )r   r   Or7  )r   r   r  r   r   r   r!   r   rv   rw   r  rQ  r  rp   kindr   rT   )r   r   r   r   expected_shaper   r   r   r  r	  r  r  r   rD   rD   rE   test_string_concat   s   	"z)TestReferenceEvaluator.test_string_concatz1,2,34,5,6,)123)456)1,4,6rW   r  rW   r  r   )rf   rf   rn   )r  r"  r  z5,6)rn   rf   rf   )r!  r"  r  )r  rW   rW   )r  r   rW   )rf   rf   r   )zhello world !z  hello   world !z hello world   ! )helloworld!r  z	o-n-n--x-z	o-n----nx-)or   r   rW   r   rW   )r'  r   rW   rW   rW   nx r  c                 C  s   t dtjd }t dtjd }t dtjd }tddgddg||d}	tt|	gd|g||g}
t|
}tj	|t
d}|d d|i^}}}tj|tj	|t
d tj|tj	|tjd d S )Nr   Splits	MaxSplitsStringSplit)r   rs  	delimitermaxsplitrS  ro   )r   r   r  INT32r   r   r   r!   rv   rw   objectr   r  rQ  r6  )r   r   r-  r.  expected_splitexpected_num_splitsr   r*  r+  r  r	  r  r  
num_splitsr   rD   rD   rE   test_string_split  s$   Oz(TestReferenceEvaluator.test_string_splitc                 C  s  t dg ddgd}t|gdtdtjd d gtdtjdgtd	tjdgtd
tjd d gtdtjdgtdtjdgtdtjdgtdtjdggtdtjd d gg}t|tddgdd}t|}t	
g dg dg}|d8 }|t	j}t	j
dgt	jd}t	j
dgt	jd}t	
g dg dg dg dg}|d8 }|t	j}t	j
dgt	jd}	t	j
dgt	jd}
t	j
dgt	jd}t	j
d gt	jd}|d t|||||	|
||d}t	jt	j
g d!g d"gt	jd|d#  d S )$NQLinearMatMulr   a_scalea_zero_pointr   b_scaleb_zero_pointrD  rG  r   r  rS  r   r7  rn   r8  r   r9  r:  rD  rG  rW   rK  r3  r   r]   )r  r  r      )r   r  rP  rN  rr  gF%u{?ro   )r  rL     )r%  rP  rP  )r   rr     )rr  rp  r~  g!u|?ig'?)rv  ir@  )rn   ir   )r   r   r   r   r   r  r   r   r!   rv   rw   r+  r  r   r   r   r  rQ  )r   r  r   r`   r   r   r7  r8  r   r9  r:  rD  rG  r  rD   rD   rE   test_qlinearconv_int8v  sf   

" z,TestReferenceEvaluator.test_qlinearconv_int8r  g?rP  rG  rA  c                 C  sF  t dg ddgd}t|gdtd|ddgtdtjdgtd	|dgtd
|ddgtdtjdgtd|dgtdtjdgtd|dggtd|ddgg}t|tddgdd}	t|	}
tj	dg|d}|

d tj	||dtj	dgtjd|tj	||dtj	dgtjd|tj	|gtjd|d}tjtj	||d|d  d S )Nr5  r6  r   r  rS  r   rn   r7  r8  r   r9  r:  rD  rG  rW   rK  r3  r;  r   ro   r   )r   r   r   r   r   r   r   r!   rv   rw   r   r   r  rQ  )r   rp   tensor_typea_valuesb_valuesy_scale_valueexpected_valuesr  r   r`   r   r  r  rD   rD   rE   #test_qlinearmatmul_saturates_output  sJ   	

 z:TestReferenceEvaluator.test_qlinearmatmul_saturates_output)zwww.google.comzwww.facebook.comzwww.bbc.co.ukzwww\.[\w.-]+\.\bcom\b)TTF)Onnx
tensorflowNumpy)PytorchCythonnumbaz^[A-Z][a-z]*$)TFTr  )zaccount@gmail.comzaccount@hotmail.comz	not emailzaccount2@yahoo.comz,(\W|^)[\w.\-]{0,25}@(yahoo|gmail)\.com(\W|$))TFFTr  c                 C  s   t dtjd }t dtjd }tddgdg|d}tt|gd|g|g}t|}	|	d dt	
|i^}
}t	j|
| | |
jjd | |
j| d S )Nr   r   RegexFullMatchr   rs  patternrS  r   )r   r   r  r  r   r   r   r!   r   rv   rw   r  rQ  r   rp   r  rT   )r   r   rQ  r   r  r   r   r  r	  r  r  r   rD   rD   rE   test_regex_full_match  s   z,TestReferenceEvaluator.test_regex_full_matchc                 C  s   t dtjd }t dtjd }tddgdgdd}tt|gd|g|g}t|}| t	 |
d dtdgi W d    d S 1 sEw   Y  d S )Nr   r   rO  zx)rP  rS  r   )r   r   r  r  r   r   r   r!   r   ru   r   rv   rw   )r   r   r   r  r	  r  rD   rD   rE   test_regex_invalid_pattern  s   "z1TestReferenceEvaluator.test_regex_invalid_pattern)r   r         ?rf   ffffff
@r   rK  rw  )r   r   rf   rf   r   r   r   r   )r   r   rT  rf   rU  r   rw  )r   r   rf   rf   r   r   r   )      -r   rT  rf   rU  r   rK  )r   r   r   rf   rf   rf   rf   rf   )rV  rW  r   rT  rf   rU  r   )r   r   r   rf   rf   rf   rf   c           	      C     t dtjd g}t dtjd g}tttdg dgtdtjdgdgdtdg dgtd|dgd	gdtd
g ddgtdddgdgd	dgd|g|g}t|}|d dt	
|i}t|d	 | d S Nr   r   r^  rU  rn   r  r0  rb  r   rV  rW  r  rX  rd  rS  r   r   r   r   r   r   r   r!   r   rv   asarrayr
   	r   qtyper|   r   r   r   r	  r  r  rD   rD   rE   test_quantize_linear_int2'  6   z0TestReferenceEvaluator.test_quantize_linear_int2c           
      C     t d|d g}t d|d g}tttddgdg|dgd|g|g}t|}tjg dtj	|d}|
tj	|}|d d|i}	| |	d  |  d S 	Nr   r   r  r$  rS  )r   rn   g333333@g@r   r   ro   r   r   r   r   r   r!   rv   rw   r3  helpertensor_dtype_to_np_dtyper+  r   r   r  
r   	cast_fromcast_tor   r   r	  r  r|   r   r  rD   rD   rE   test_cast_int2_output[  &   

z,TestReferenceEvaluator.test_cast_int2_outputrf  TensorProto.DataTyperg  c           
      C     t d|d g}t d|d g}tttddgdgtjdgd|g|g}t|}tjt	dtj
d}|tj|}|d d|i}	tj|	d | d S )	Nr   r   r  r$  rS  rf   ro   r   r   r   r   r   r   r   r!   rv   rw   rx   r   r+  r3  rc  rd  r   r  rQ  re  rD   rD   rE   test_cast_int2_inputw      	
z+TestReferenceEvaluator.test_cast_int2_input)r   r   rf   rf   r   r   rK  rQ  )r   r   rf   rf   r   r   rQ  )r=  r   rf   rf   r   r   r{  )ro  r=  r   rf   rf   r   r   c           	      C  rX  rY  rZ  r\  rD   rD   rE   test_quantize_linear_int4  r_  z0TestReferenceEvaluator.test_quantize_linear_int4c           
      C  r`  ra  rb  re  rD   rD   rE   test_cast_int4_output  ri  z,TestReferenceEvaluator.test_cast_int4_outputc           
      C  rk  )	Nr   r   r  r$  rS  r   ro   r   rl  re  rD   rD   rE   test_cast_int4_input  rn  z+TestReferenceEvaluator.test_cast_int4_inputc           
      C  s  t dtjdg}t dtjdg}t dtjdg}tdddgdgtdg dgd	gd
dtdddgdgddgtddgd}tdddgdgtdg dgd	gddtdddgdgtddgdgttddgdgddgdg |gttdddgdgddgdg |gddgtddtddgd}tttddgdgddgd|g|gdtddtddg||gd }dtj	d!gtj
d"i}t|}|d |}	tjtj	d#gtj
d"|	d$  d S )%Nr   Nr  thisfctaddinput2r^  r  r   CC0r_  rR   r   A1r   rW   r   r   r  r  CCrR  rz  rd  r[   r`  ra  :IFre  rf  rR   rn   r|  r   r]   r   r=  r   ro   r   r   r   r   r   r   r   r   r   r   rv   rw   r   r!   r   r  r  
r   r   r  rQ  func_def_addfunc_defrm  rS  r
  r   rD   rD   rE   'test_a_function_calling_a_function_once  sz   
!$z>TestReferenceEvaluator.test_a_function_calling_a_function_oncec           
      C  s  t dtjdg}t dtjdg}t dtjdg}tdddgdgtdg dgd	gd
dtdddgdgddgtddgd}tdddgdgtdg dgd	gddtdddgdgtddgdgttddgdgddgdg |gttdddgdgddgdg |gddgtddtddgd}tttddgdgddtddgdgddgd|g|gd tddtddg||gd!}dtj	d"gtj
d#i}t|}|d |}	tjtj	d$gtj
d#|	d%  d S )&Nr   rs  r  rt  ru  rv  r^  r  r   rw  rx  r   ry  r   rW   r   r   r  r  rz  rR  rz  rd  r{  r`  ra  r|  r}  rn   ztmpr|  r   r~  r   ro   r   r  r  rD   rD   rE   )test_a_function_calling_a_function_doubleK  s|   
!	$z@TestReferenceEvaluator.test_a_function_calling_a_function_doublec           
      C  s  t dtjdg}t dtjdg}t dtjdg}tdddgdgtdg dgd	gd
dtdddgdgddgtddgd}tdddgdgtdg dgd	gddtdddgdgtddgdgttddgdgddgdg |gttdddgdgddgdg |gddgtddtddgd}tttddgdgddtddgdgddgd|g|gd tddtddg||gd!}G d"d# d#t}||}|j	
 D ]}	| |	| qd S )$Nr   rs  r  rt  ru  rv  r^  r  r   rw  rx  r   ry  r   rW   r   r   r  r  rz  rR  rz  rd  r{  r`  ra  r|  r}  rn   r  r|  r   r~  c                   @  r  )z[TestReferenceEvaluator.test_overload_reference_implementation.<locals>.MyReferenceEvaluatorNr  rD   rD   rD   rE   MyReferenceEvaluator  r  r  )r   r   r   r   r   r   r   r   r!   
functions_r  r   )
r   r   r  rQ  r  r  rm  r  r
  r  rD   rD   rE   &test_overload_reference_implementation  s~   
!	z=TestReferenceEvaluator.test_overload_reference_implementation))r&  q=
ףp?)rC  r  )r2  333333?)rK  r  )r  r   )r   r   )FLOAT16gMb`?)rO  g{Gz?styper  r  c                 C  s  t t|}tttddgdg|dtddgdg|dtdddgdgtddgd	gtjdgd
tdtjg dtdtjg dgtd	tjg dgtddgdd}t|dd}t	
dd dt	j}t	
dd dt	j}t||d}|| }	|d |d }
t|
|	|d d S )Nr  r   Xcr$  r   Ycr   ZcrQ  r   r  rW   rG  r3  r;  r   r   r   rf   r   r   rU  r  )getattrr   r   r   r   r   r   r   r!   rv   r*  r   r+  r   r   r   r
   )r   r  r  ityper	  r  r   r   rS  r   r  rD   rD   rE   test_add_custom_dtype  s0   

z,TestReferenceEvaluator.test_add_custom_dtype))r  )r   )r  )rO  )r&  )rC  )r2  )rK  )INT4)UINT4)INT2)UINT2c           
      C  s  t t|}tttddgdg|dtddgdg|dtdddgdgtddgd	gtjdgd
tdtjg dtdtjg dgtd	tjg dgtddgdd}t	|}t
dd dt
j}t
dd d dt
j}t||d}||k}|d |d }	t
j|	| d S )Nr  r   r  r$  r   r  r[  r  rQ  r   r  rW   rG  r3  r;  r  rU  r   )r  r   r   r   r   r  r   r   r   r!   rv   r*  r   r+  r   r   r   r  r  )
r   r  r  r	  r  r   r   rS  r   r  rD   rD   rE   test_cmp_custom_dtype  s0   

 z,TestReferenceEvaluator.test_cmp_custom_dtypec              
   C  s   t ttdg ddgdddgdtdtjd td	tjd td
tjd gtdtjd gtddgd}tj	dtj
dd}tjdggggtjd}tjdggggtj
d}tjg dtj
dd}t|}|d |||d}t|d | d S )Nr8  )r|   r  updatesrQ  r   addr:  rR   r|   r  r  rW   rG  r   r0  ro   )rf   rf   rf   rf   r   rn   )rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r5  r   rv   rz   r   r   rw   r6  r!   r   r
   )r   r	  r|   r  r  r   r  r  rD   rD   rE   test_scatter_elements_4d=  s<   	

z/TestReferenceEvaluator.test_scatter_elements_4dc                 C  sP   |  d}t|}tjdtdd}|dgd|gid }| d|j d S )	Na  
        <
            ir_version: 8,
            opset_import: [ "" : 21 ]
        >
        preprocess (seq(float[X, Y]) images) => (float[N, 5, 5] preprocessed)
        {
            seq = SequenceMap<
                body=preprocess_single(float[X, Y] image) => (float[5, 5] resized)
                {
                    size = Constant<value=int64[2] {5, 5}>()

                    resized = Resize<
                        mode="linear",
                        axes=[0, 1]
                    >(image, , , size)
                }
            >(images)
            preprocessed = ConcatFromSequence<axis=0, new_axis=1>(seq)
        }
        )r   r   r   ro   preprocessedimagesr   )rn   r   r   )r   r!   rv   rz   rp   r   r   rT   )r   r	  	evaluatorimageInr  rD   rD   rE   test_sequence_axis]  s   z)TestReferenceEvaluator.test_sequence_axisc              	   C  s   t ttddgdgddgdtdtjd gtdtjd gtddgd	}tj	d
d
tj}t|}|d d|i}| |j|d j d S )N	LeakyRelur   r   rT  r  rR   rW   rG  r   r   r   r   )r   r   r   r   r   r  r   rv   r  randnr+  r  r!   r   r   rp   )r   r	  r   r  r  rD   rD   rE   test_convert_ml_dtypesz  s   
	z-TestReferenceEvaluator.test_convert_ml_dtypesc                 C  s   t jdt jd}t|d | |jt j tt jdt j t j gddt j gg dg|jd| t j	dt jd}t|d | |jt j tt jddt j t j gdddt j gg dg|jd| d S )NrJ  ro   r   rn   r  r  r  )
rv   r  float16r*   r   rp   r
   rw   rJ  rz   )r   r   rD   rD   rE   test_apply_causal  s&   
(
(z(TestReferenceEvaluator.test_apply_causalc                 C  s   t dtjg d}t dtjdg}t dtjg d}tdddgdg}t|gd||g|g}t|tdd	gd
}t| t	
ddt	j}t	jg dt	jd}|ddddddf }	t|}
|
d||dd }t||	 | |jd dS )zTest CenterCropPad when target shape equals current dimension.

        Validates the fix where comparison should be 'if sh == dim' not 'if sh == a'.
        Uses input (5, 5, 1) with target [1, 1, 1] to test axis 2 where dim=1, sh=1, a=2.
        r   r  rT   r   r   CenterCropPadrS  rW   rG  r   rX  )r   r   rn   r  ro   rf   N)r   rT   r   )r   r   r   r5  r   r   r   r   r   rv   r*  r   r+  r   rw   r6  r!   r   r
   r   rT   )r   r   rT   r   r  r   r`   r   target_shaper   r   r  rD   rD   rE   4test_center_crop_pad_no_change_when_shape_equals_dim  s   
zKTestReferenceEvaluator.test_center_crop_pad_no_change_when_shape_equals_dimc                 C  s4  t dtjdg}t dtjdg}t dtjdg}ttdddgdggd||g|g}t dtjdg}t dtjd	dg}t d
tjdg}tdddgd
gd|d}t|gd||g|g}	t|	tddgd}
t|
 t|
}t	j
dt	jd}t	jddgd	dgddggt	jd}|d ||d\}t||jdd d S )Ns_inrf   x_ins_outr   	scan_body
init_state
scan_inputr   final_stater  rn   r  r  rS  rW   rt  r   ro   r   r   r   )r  r  r   rd  )r   r   r   r   r   r   r   r   r!   rv   rz   r   rw   r   r
   r,  )r   body_state_inbody_scan_inbody_state_outr  r  r  r  	scan_noder   r`   r   initxsr  rD   rD   rE   test_scan_zero_scan_outputs  s6   "z2TestReferenceEvaluator.test_scan_zero_scan_outputsc              
   C  sN  t tdddgdgtddgdggdtdtjdgtdtjdggtdtjdgtdtjdgg}t td	d
dgddgd|dgdtd
tjdgtdtjd dggtdtjdgtdtjd dgg}t|tddgd}t| t|}t	j
dt	jd}t	j
dt	jd}| td |d ||d W d    d S 1 sw   Y  d S )Nr   r  r  r  r  r  r  rf   r  r  r  finalysrn   r  rS  rW   rt  r   ro   )r   rf   zzero scan-input lengthr  r  )r   r   r   r   r   r   r   r   r!   rv   rz   r   r  RuntimeErrorr   )r   r  r   r`   r   r  r  rD   rD   rE   test_scan_max_iter_zero  sJ   	"z.TestReferenceEvaluator.test_scan_max_iter_zeroc                 C  s   t d}t| t|}tjdtjd}tjddgddgddggtjd}|d ||d	\}}}t	||j
d
d t	|tj|d
d t	|||  d S )Na  
            <ir_version: 10, opset_import: [ "": 21 ]>
            g (float[2] init, float[3, 2] xs)
                => (float[2] final, float[3, 2] ys_a, float[3, 2] ys_b)
            {
                final, ys_a, ys_b = Scan <
                    num_scan_inputs = 1,
                    body = scan_body (float[2] s_in, float[2] x_in)
                        => (float[2] s_out, float[2] scan_out_a, float[2] scan_out_b)
                    {
                        s_out = Add(s_in, x_in)
                        scan_out_a = Identity(s_out)
                        scan_out_b = Mul(x_in, x_in)
                    }
                > (init, xs)
            }
            rf   ro   rn   r   r   r   r   r  r   rd  )r   r   r   r!   rv   rz   r   rw   r   r
   r,  cumsum)r   r`   r   r  r  r  ys_ays_brD   rD   rE   test_scan_k_neq_m  s   "z(TestReferenceEvaluator.test_scan_k_neq_mc                 C  sl   t d}t| t|}tjdtjd}tjdtjd}|d ||d\}t|tj	ddgtjd d S )Na  
            <ir_version: 10, opset_import: [ "": 21 ]>
            g (float[2] init, float[3, 2] xs) => (float[2] final)
                <float[2] bias = {10, 100}>
            {
                final = Scan <
                    num_scan_inputs = 1,
                    body = scan_body (float[2] s_in, float[2] x_in)
                        => (float[2] s_out)
                    {
                        s_out = Add(s_in, bias)
                    }
                > (init, xs)
            }
            rf   ro   r>  r  rQ  i,  )
r   r   r   r!   rv   rz   r   r   r
   rw   )r   r`   r   r  r  r  rD   rD   rE   )test_scan_body_captures_outer_initializer1  s   z@TestReferenceEvaluator.test_scan_body_captures_outer_initializerc                 C  s  d\}}}}t dtj|||g}t dtj|d|g}t dtj|g}t dtj|||d g}t dtj|||g}	t dtj|||d g}
td	g d
ddgdd}tt|gd||||g|	|
gtddgd}t| tj	
d}||||ftj}||d|ftj}||ftj}||||d ftj}||||d
}t|}|d |\}}G dd	 d	t}t||gd}|d |\}}t|| t|| d S )N)rf   r   r  r   r  weightrn   r  
past_stater  present_stateCausalConvWithState)r  r  r  r  silu)
activationrS  rW   rE  r   r   c                   @  r@  )zgTestReferenceEvaluator.test_causal_conv_with_state_silu_fp16_function_body.<locals>.CausalConvWithStaterW   NrA  rD   rD   rD   rE   r    rB  r  )r   r   r  r   r   r   r   r   rv   r  default_rngstandard_normalr+  r  r!   r   r#   r
   )r   r   r]  Lr  input_vi	weight_vibias_vipast_vi	output_vi
present_vir  r	  rnginput_r  r  r  rS  r  expected_outputexpected_stater  
ref_expand
got_output	got_staterD   rD   rE   3test_causal_conv_with_state_silu_fp16_function_bodyR  sX   

	
zJTestReferenceEvaluator.test_causal_conv_with_state_silu_fp16_function_body)r   r   r   r   )FNr   r   r  )rc   rQ   r  )rc   rQ   r  rQ   )rf  rj  rg  rj  )r  r   r  r  )r  r  r  r   staticmethodr   r   r   r   r   r   r   r  r  r  r  r  r.  r0  r8  rF  rH  rI  rJ  rO  rP  rX  rZ  r\  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r(  r*  r+  rI   r@  rT  r  r  r  r  r  r  r  r  rL   r  r  r  r  r  r"  r(  r/  r6  r@  rB  rF  r]  ro  rs  r~  r  r  r  rN   r  r  r  r  r  r  r  r  r  r  parameterizedexpand	itertoolsproductrv   rw   r  r   r6  r  r  r  r  r  r#  r%  r'  r;  r=   skipIfversion_utilsnumpy_older_thanrE  rF  rM  rS  r[  r]  r^  rn  rt  rv  rx  r*  r   rz   r  r  dstackr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r4  rB  r  r   rR  r  r  rH  rR  rS  r  r  r^  r   r  rh  rm  r  r  rp  rq  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rD   rD   rD   rE   r      s   8T
%/43	,37n}3 


*
\ <E
')

 (!2?2%+
' :
Z_#:3
 
  <D
	
	



	


	

8*
	
	:
&	




	

B)"        -$

  
GF&&6	







NOK %2#!r   __main__rf   )	verbosity)r   r   r}   r   r~   r   rl   r   r   r   r   r   )c__doc__
__future__r   r:   r  r  r=   
contextlibr   	functoolsr   ior   osr   textwrapr   typingr	   r6  r  rv   r  r  numpy.testingr
   r3  r   r   r   r   r   r   $onnx.backend.test.case.node.roialignr   onnx.checkerr   	onnx.defsr   onnx.helperr   r   r   r   r   r   r   r   r   r   r   r   onnx.numpy_helperr    onnx.referencer!   onnx.reference.op_runr"   r#   onnx.reference.opsr$   %onnx.reference.ops._op_common_indicesr%   r&   onnx.reference.ops._op_listr'   r(   3onnx.reference.ops.aionnx_preview_training._op_listr)   onnx.reference.ops.op_attentionr*   onnx.reference.ops.op_celur+   onnx.reference.ops.op_col2imr,   r-   onnx.reference.ops.op_convr.   r/   onnx.reference.ops_optimizedr6  .onnx.reference.ops_optimized.op_conv_optimizedr0   collections.abcr1   rQ   r2   r4   rI   rL   rN   rV   rd   r   r   TestCaser   r  mainrD   rD   rD   rE   <module>   s    8



0                                                 
j