o
    toiQ                     @  s~   d dl mZ d dlZd dlZd dlZd dlmZ d dl	m
Z d dlmZ dd ZG dd dejZedkr=ejdd	 dS dS )
    )annotationsNc            
      C  s  t ddg} g }g }g }g }g }g }|t jdtjjdd |t jdg dgtj	t
jdgt
jd	d
dd |t jdg dgtj	t
jdt
jd	d
dd dd }| }|t jdg ddg|d |t jdtjjdd t j|d||||d}	t j|	|| dS )a  The following model is equivalent to the following function.

    .. code-block:: python

        from onnx importonnx.TensorProto
        from onnx.helper import oh.make_tensor

        from onnxscript import script
        from onnxscript.onnx_opset import opset15 as op
        from onnxscript.onnx_types import FLOAT

        @script()
        def loop_range_cond_only(A: FLOAT["N"]) -> FLOAT["N"]:
            T = A
            cond = op.Constant(value=make_tensor("true",onnx.TensorProto.BOOL, [1], [1]))
            while cond:
                T = T + A
                cond = op.ReduceSum(T) > -10
            return T

        model = loop_range_cond_only.to_model_proto()
        A)NshapeConstantcondTdtypevaluenamer   truec                  S  sV  g } g }g }g }g }|  tjdtjjg d |  tjdtjjg d |  tdtjjg  | tdddgdg | tddgd	g | tjd
g dgt	j
tjdtjdddd | tddd	gdg | tdd	dgdg | tddgdg | tjdtjjg d | tdtjjg  tj|d| |||dS )Ninfinite_loopr   r
   TAddr   T_0	ReduceSumtmpr	   	int64_m10ir   r   r   r   CastLikeint64_m10_castGreatercond_1Identitycond_out	loop_bodysparse_initializer)appendohmake_tensor_value_infoonnxTensorProtoINT64BOOL	UNDEFINED	make_nodeonh
from_arraynparrayint64
make_graph)inputsoutputsnodesinitializerssparse_initializers r6   \/home/ubuntu/.local/lib/python3.10/site-packages/onnx/test/reference_evaluator_model_test.py_make_local_graph_bodyC   sJ   z,create_model.<locals>._make_local_graph_bodyLoop)r   r   r   T_2)bodyloop_range_cond_onlyr    )	functionsopset_imports)r#   make_opsetidr"   r$   r%   r&   FLOATr*   r+   r,   r-   r.   bool_r0   
make_model)
r>   r1   r2   r3   r4   r5   r=   r8   r;   graphr6   r6   r7   create_model   sP   
	'rD   c                   @  s   e Zd Zdd ZdS )TestReferenceEvaluatorModelc                 C  s4   t  }t|}|d dtdtj i d S )Nr   
   )rD   orfReferenceEvaluatorrunr-   arangeastypefloat32)selfmodelsessionr6   r6   r7   test_loop_fft{   s   
$z)TestReferenceEvaluatorModel.test_loop_fftN)__name__
__module____qualname__rP   r6   r6   r6   r7   rE   z   s    rE   __main__   )	verbosity)
__future__r   unittestnumpyr-   r%   onnx.helperhelperr#   onnx.numpy_helpernumpy_helperr+   onnx.reference	referencerG   rD   TestCaserE   rQ   mainr6   r6   r6   r7   <module>   s   i