U
    qhy                     @  sz   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rvejdd	 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dddg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Zdtypevaluenamer   truec                  S  sZ  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 )NZinfinite_loopr   r
   TZAddr   ZT_0Z	ReduceSumtmpr	   Z	int64_m10ir   r   r   r   ZCastLikeZint64_m10_castZGreaterZcond_1ZIdentityZcond_outZ	loop_bodyZsparse_initializer)appendohmake_tensor_value_infoonnxTensorProtoZINT64ZBOOL	UNDEFINED	make_nodeonh
from_arraynparrayZint64
make_graph)inputsoutputsnodesinitializerssparse_initializersgraph r&   L/tmp/pip-unpacked-wheel-xnis5xre/onnx/test/reference_evaluator_model_test.py_make_local_graph_bodyC   sL    z,create_model.<locals>._make_local_graph_bodyZLoopZT_2)bodyZloop_range_cond_onlyr   )	functionsopset_imports)r   Zmake_opsetidr   r   r   r   FLOATr   r   r   r   r   Zbool_r   Z
make_model)r+   r    r!   r"   r#   r$   r*   r(   r)   r%   modelr&   r&   r'   create_model   sR    
	( r.   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   
   )r.   orfZReferenceEvaluatorrunr   ZarangeZastypeZfloat32)selfr-   sessionr&   r&   r'   test_loop_fft}   s    
z)TestReferenceEvaluatorModel.test_loop_fftN)__name__
__module____qualname__r5   r&   r&   r&   r'   r/   |   s   r/   __main__   )	verbosity)
__future__r   ZunittestZnumpyr   r   Zonnx.helperhelperr   Zonnx.numpy_helperZnumpy_helperr   Zonnx.reference	referencer1   r.   ZTestCaser/   r6   mainr&   r&   r&   r'   <module>   s   k