o
    wi                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlZd dlZd dlZd dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZ d dlmZmZ e	rbd dlm Z  G dd	 d	ej!Z"e#d
did
digG dd de"Z$e#d
did
digG dd de"Z%e#d
did
digG dd dej!Z&e#d
did
digG dd dej!Z'G dd de"Z(ej)ej*dkddG dd de(Z+G dd de&Z,G dd de'Z-G d d! d!ej!Z.e/d"kre0  dS dS )#    )annotationsN)TYPE_CHECKINGAny)
ModelProto	NodeProtoTensorProtocheckerhelperparsershape_inference) convert_model_from_external_dataconvert_model_to_external_dataload_external_data_for_modelload_external_data_for_tensorset_external_data)
from_arrayto_array)Sequencec                   @  s`   e Zd ZU dZdZded< dddZdd	d
ZdddZ	ddddZ	ddddZ
dddZdS )TestLoadExternalDataBasezBase class for testing external data related behaviors.

    Subclasses should be parameterized with a serialization format.
    protobufstrserialization_formatreturnNonec                 C  b   t  | _| jj| _tdddtj	d | _
tdddtj	d | _|  | _d S N         i      )tempfileTemporaryDirectory_temp_dir_objnametemp_dirnparangereshapeastypefloat32initializer_valueattribute_valuecreate_test_modelmodel_filenameself r0   Y/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnx/test/test_external_data.pysetUp0   
   

  zTestLoadExternalDataBase.setUpc                 C     | j   d S Nr"   cleanupr.   r0   r0   r1   tearDown7      z!TestLoadExternalDataBase.tearDownc                 C     t j| jtt d S Nz.onnxospathjoinr$   r   uuiduuid4r.   r0   r0   r1   get_temp_model_filename:      z0TestLoadExternalDataBase.get_temp_model_filename value	list[Any]tensor_namelocationr   c                 C  s   t t|}||_|p| d}t||d ttj| j	|d}|
|j W d    n1 s3w   Y  |d tjj|_|S )N.binrH   wbraw_data)r   r%   arrayr#   r   openr=   r>   r?   r$   writerL   
ClearFieldonnxr   EXTERNALdata_location)r/   rE   rG   rH   tensortensor_filename	data_filer0   r0   r1   create_external_data_tensor=   s   

z4TestLoadExternalDataBase.create_external_data_tensorc                 C  s   t jjdg dg| | jdd}| | jd|g}tdt jj| jj	g}tj
|gd|g |d}t|}tj| jd}t ||| j |S )	NConstantvaluesr+   inputsoutputsrE   input_value
test_graphr[   r\   initializer
model.onnx)rQ   r	   	make_noderW   r+   r*   make_tensor_value_infor   FLOATshape
make_graph
make_modelr=   r>   r?   r$   
save_modelr   )r/   rH   constant_nodeinitializersr[   graphmodelr-   r0   r0   r1   r,   K   s<   
z*TestLoadExternalDataBase.create_test_modelc                 C  s$   | j dkr
| d t| j d S )Nr   zDcheck_model supports protobuf only as binary when provided as a path)r   skipTestr   check_modelr-   r.   r0   r0   r1   test_check_modelq   s
   
z)TestLoadExternalDataBase.test_check_modelNr   r   )r   r   rD   rE   rF   rG   r   rH   r   r   r   )rH   r   r   r   )__name__
__module____qualname____doc__r   __annotations__r2   r8   rB   rW   r,   ro   r0   r0   r0   r1   r   (   s   
 


&r   r   r   	textprotoc                   @  s*   e Zd Zd
ddZd
ddZd
ddZd	S )TestLoadExternalDatar   r   c                 C  \   t | j| j}|jjd }tjt	|| j
 |jjd jd j}tjt	|| j d S Nr   rQ   
load_modelr-   r   rk   r`   r%   testingassert_allcloser   r*   node	attributetr+   r/   rl   initializer_tensorattribute_tensorr0   r0   r1   test_load_external_data   s
   z,TestLoadExternalData.test_load_external_datac                 C  sl   t j| j| jdd}t|| j |jjd }tj	
t|| j |jjd jd j}tj	
t|| j d S )NFload_external_datar   )rQ   r}   r-   r   r   r$   rk   r`   r%   r~   r   r   r*   r   r   r   r+   r   r0   r0   r1   !test_load_external_data_for_model   s   
z6TestLoadExternalData.test_load_external_data_for_modelc                 C     t | j| j}tj| jd}t| tj|d}t 	||| j t || j}|j
jd }tjt|| j |j
jd jd j}tjt|| j d S N	save_copyra   r   rQ   r}   r-   r   r=   r>   r?   r$   mkdirrh   rk   r`   r%   r~   r   r   r*   r   r   r   r+   r/   rl   r$   new_model_filename	new_modelr   r   r0   r0   r1   test_save_external_data      
z,TestLoadExternalData.test_save_external_dataNrp   )rs   rt   ru   r   r   r   r0   r0   r0   r1   ry   y   s    

ry   c                   @  sH   e Zd ZdddZddd	Zdd
dZeje	dddddZ
dS )TestLoadExternalDataSingleFiletensors_datalist[tuple[list[Any], Any]]r   list[TensorProto]c           	      C  s   d}g }t tj| j|dX}|D ]L\}}tt|}| }|d dkr:|	dd|d    |d |d  }|	|j
 t|||| | d ||_|d tjj|_|| qW d    |S 1 sjw   Y  |S )Ntensors.binab   r       )rH   offsetlengthrL   )rN   r=   r>   r?   r$   r   r%   rM   tellrO   rL   r   r#   rP   rQ   r   rR   rS   append)	r/   r   rU   tensorsrV   rE   rG   rT   r   r0   r0   r1   create_external_data_tensors   s2   



z;TestLoadExternalDataSingleFile.create_external_data_tensorsr   c                 C  rz   r{   r|   r   r0   r0   r1   #test_load_external_single_file_data   s
   zBTestLoadExternalDataSingleFile.test_load_external_single_file_datac                 C  r   r   r   r   r0   r0   r1   #test_save_external_single_file_data   r   zBTestLoadExternalDataSingleFile.test_save_external_single_file_data)TFuse_absolute_pathbooluse_model_pathc                 C  s@  t | j| j}tj| jd}t| tj| jd}t| |r,tj|d}nd}tj| jd}t| tj|d}ddd}	|	||d t 	||| j |rx| 
t jj t || j}
W d    d S 1 sqw   Y  d S t j|| jdd}| 
t jj t|| W d    d S 1 sw   Y  d S )Nr   invlid_external_datar   z#../invlid_external_data/tensors.binexternal_datara   rl   r   rH   r   c                 S  s&   | j jD ]}|drt|| qd S )NrL   )rk   r`   HasFieldr   )rl   rH   rT   r0   r0   r1   'convert_model_to_external_data_no_check   s
   

zTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check.<locals>.convert_model_to_external_data_no_checkrJ   Fr   )rl   r   rH   r   )rQ   r}   r-   r   r=   r>   r?   r$   r   rh   assertRaisesr   ValidationErrorr   )r/   r   r   rl   	model_dirtraversal_external_data_dir traversal_external_data_locationexternal_data_dirnew_model_filepathr   _
onnx_modelr0   r0   r1   5test_save_external_invalid_single_file_data_and_check   s>   



""zTTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_checkNr   r   r   r   rp   )r   r   r   r   r   r   )rs   rt   ru   r   r   r   parameterizedexpand	itertoolsproductr   r0   r0   r0   r1   r      s    


	r   c                   @  s   e Zd ZU dZded< d.ddZdd	 Zd/ddZd0ddZe	
edkdd.ddZd.ddZd.ddZd.ddZd.ddZd.ddZd.dd Zd.d!d"Zd.d#d$Zd.d%d&Zd.d'd(Zd.d)d*Zd.d+d,Zd-S )1 TestSaveAllTensorsAsExternalDatar   r   r   r   r   c                 C  r   r   )r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   create_test_model_protorl   r.   r0   r0   r1   r2     r3   z&TestSaveAllTensorsAsExternalData.setUpc                 C  r:   r;   r<   r.   r0   r0   r1   rB     rC   z8TestSaveAllTensorsAsExternalData.get_temp_model_filenamer   r   r   c                 C  s4   g }|D ]\}}t t|}||_|| q|S r5   )r   r%   rM   r#   r   )r/   r   r   rE   rG   rT   r0   r0   r1   create_data_tensors   s   z4TestSaveAllTensorsAsExternalData.create_data_tensorsr   c                 C  sr   |  | jdf| jdfg}tjjdg dg|d d}tdtjj| jj	g}tj
|gd|g |d gd	}t|S )
Nr+   r]   rX   rY   r   rZ   r^      r_   )r   r+   r*   rQ   r	   rb   rc   r   rd   re   rf   rg   )r/   r   ri   r[   rk   r0   r0   r1   r   +  s(   
z8TestSaveAllTensorsAsExternalData.create_test_model_proto:check_model supports protobuf only when provided as a pathc                 C     t | j d S r5   r   rn   rl   r.   r0   r0   r1   ro   F     z1TestSaveAllTensorsAsExternalData.test_check_modelc                 C  sV   |   }t| jdd t| j|| j t|| j}|jjd }| 	|
d d S )N   size_thresholdr   rS   )rB   r   rl   rQ   rh   r   r}   rk   r`   assertFalser   r/   model_file_pathrl   r   r0   r0   r1   7test_convert_model_to_external_data_with_size_thresholdM  s   zXTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_with_size_thresholdc                 C  sj   |   }t| jdd t| j|| j t|| j}|jjd }| 	|
d tjt|| j d S )Nr   r   rS   )rB   r   rl   rQ   rh   r   r}   rk   r`   
assertTruer   r%   r~   r   r   r*   r   r0   r0   r1   :test_convert_model_to_external_data_without_size_thresholdW  s   z[TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_without_size_thresholdc                 C  s  |   }tt }t| jdd|d t| j|| j | 	t
jt
j| j| t|| j}t| |   }t||| j t|| j}|jjd }| t|j | |jtj tjt|| j |jjd j d j!}| t|j | |jtj tjt|| j" d S )Nr   T)r   all_tensors_to_one_filerH   )#rB   r   r@   rA   r   rl   rQ   rh   r   r   r=   r>   isfiler?   r$   r}   r   rk   r`   r   lenr   assertEqualrS   r   DEFAULTr%   r~   r   r   r*   r   r   r   r+   )r/   r   external_data_filerl   r   r   r0   r0   r1   ?test_convert_model_to_external_data_from_one_file_with_locationa  s.   z`TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_with_locationc                 C  s^   |   }t| jddd t| j|| j | tj	| | tj	tj
| j| d S )Nr   T)r   r   rB   r   rl   rQ   rh   r   r   r=   r>   r   r?   r$   r/   r   r0   r0   r1   Rtest_convert_model_to_external_data_from_one_file_without_location_uses_model_name  s   "zsTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_without_location_uses_model_namec                 C  s~   |   }t| jdddd t| j|| j | tj	| | tj	tj
| jd | tj	tj
| jd d S )Nr   Fr   r   convert_attributer]   r+   )rB   r   rl   rQ   rh   r   r   r=   r>   r   r?   r$   r   r   r0   r0   r1   Itest_convert_model_to_external_data_one_file_per_tensor_without_attribute     "zjTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_without_attributec                 C  s~   |   }t| jdddd t| j|| j | tj	| | tj	tj
| jd | tj	tj
| jd d S )Nr   FTr   r]   r+   r   r   r0   r0   r1   Ftest_convert_model_to_external_data_one_file_per_tensor_with_attribute  r   zgTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_with_attributec                 C  s   |   }t| jdddd t| j|| j | tj	tj
| jd | tj	tj
| jd t|| j}|jjd }| |d |jjd jd j}| |d d S )Nr   F)r   r   r   r]   r+   rS   )rB   r   rl   rQ   rh   r   r   r=   r>   r   r?   r$   r   r}   rk   r`   r   r   r   r   r/   r   rl   r   r   r0   r0   r1   Etest_convert_model_to_external_data_does_not_convert_attribute_values  s   zfTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_does_not_convert_attribute_valuesc                 C  s   |   }t| jddd t| j|| j t|| j}|jjd }t	j
t|| j | |d |jjd jd j}t	j
t|| j | |d d S )Nr   Tr   r   rS   )rB   r   rl   rQ   rh   r   r}   rk   r`   r%   r~   r   r   r*   r   r   r   r   r   r+   r   r0   r0   r1   =test_convert_model_to_external_data_converts_attribute_values  s   z^TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_converts_attribute_valuesc                 C  s   |   }tj| j|| jdd | tj| t	|| j}|j
jd }| |d |j
jd jd j}| |d d S )NF)save_as_external_datar   rS   )rB   rQ   rh   rl   r   r   r=   r>   r   r}   rk   r`   r   r   r   r   r   r   r0   r0   r1   Etest_save_model_does_not_convert_to_external_data_and_saves_the_model  s   zfTestSaveAllTensorsAsExternalData.test_save_model_does_not_convert_to_external_data_and_saves_the_modelc              
   C  s   |   }tj| j|| jddd ddd t|| j}|jjd }| |	d t
jt|| j |jjd jd j}| |	d t
jt|| j d S )NTr   Fr   r   rH   r   r   rS   rB   rQ   rh   rl   r   r}   rk   r`   r   r   r%   r~   r   r   r*   r   r   r   r   r+   r   r0   r0   r1   0test_save_model_does_convert_and_saves_the_model  s$   zQTestSaveAllTensorsAsExternalData.test_save_model_does_convert_and_saves_the_modelc              	   C  s   |   }tj| j|| jdd ddd tj|| jdd}tj||| jdd ddd t|| j}|jjd }| |	d t
jt|| j |jjd jd j}| |	d t
jt|| j d S )NTr   F)r   rH   r   r   r   rS   r   r   r0   r0   r1   -test_save_model_without_loading_external_data  s:   

zNTestSaveAllTensorsAsExternalData.test_save_model_without_loading_external_datac                 C  s   |   }| jjjd j}tj| j|| jddd | t	j
| tj|| jdd}|jjd }d|_t|| j | |j| d S )Nr   T)r   r   Fr   s   dummpy_raw_data)rB   rl   rk   r`   rL   rQ   rh   r   r   r=   r>   r   r}   r   r$   r   )r/   r   original_raw_datarl   r   r0   r0   r1   6test_save_model_with_existing_raw_data_should_override%  s"   zWTestSaveAllTensorsAsExternalData.test_save_model_with_existing_raw_data_should_overrideNrp   r   r   r   )rs   rt   ru   r   rw   r2   rB   r   r   unittestskipIfro   r   r   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   r     s.   
 















#r   c                   @  s|   e Zd ZU dZded< dddZedd	 Zdd
dZdddZ	e
edkddddZdddZdddZdddZdS )TestExternalDataToArrayr   r   r   r   r   c                 C  sT   t  | _| jj| _tj| jd| _t	j
dddt	j| _d| _|  | _d S )Nra   
   <   d   )   i,  )r    r!   r"   r#   r$   r=   r>   r?   _model_file_pathr%   randomrandr(   r)   
large_data
small_datar,   rl   r.   r0   r0   r1   r2   D  s   

zTestExternalDataToArray.setUpc                 C  s   | j S r5   )r   r.   r0   r0   r1   r   L  s   z'TestExternalDataToArray.model_file_pathc                 C  r4   r5   r6   r.   r0   r0   r1   r8   P  r9   z TestExternalDataToArray.tearDownr   c           
      C  s   t dtj| jj}t jdtj| jj| j dd}t	| j
tj}t jdtj|j| dd}t dtj| j
}tj jdddgdgd}tj jd	dgdgtjd
}t j||gd|g|g||gd}t j|dd}	|	S )NXT)r#   	data_typedimsvalsrawShapeCReshapeY)r[   r\   Cast)r[   r\   toz
test-model)r`   zonnx-example)producer_name)r	   rc   r   rd   r   re   make_tensortobytesr%   rM   r   int64INT64rQ   rb   rf   rg   )
r/   r   
input_init
shape_data
shape_initr   r'   cast	graph_defrl   r0   r0   r1   r,   S  sD   z)TestExternalDataToArray.create_test_modelr   c                 C  r   r5   r   r.   r0   r0   r1   ro   z  r   z(TestExternalDataToArray.test_check_modelc                 C  sJ   t j| j| j| jdddd t j| j| jdd}| jtjtj	|dd d S )NTFr   r   r   r   r   )strict_mode)
rQ   rh   rl   r   r   loadr   r   InferenceErrorinfer_shapes)r/   model_without_external_datar0   r0   r1   .test_reshape_inference_with_external_data_fail  s"   

zFTestExternalDataToArray.test_reshape_inference_with_external_data_failc                 C  sX   t j| j| j| jdddd t j| j| jdd}t|jjd | j	}t
j|| j d S )NTFr   r  r   )rQ   rh   rl   r   r   r
  r   rk   r`   r$   r%   r~   r   r   )r/   rl   loaded_large_datar0   r0   r1    test_to_array_with_external_data  s   	
z8TestExternalDataToArray.test_to_array_with_external_datac              
   C  s8  t j| j| j| jddd ddd t j| j| jdd}|jjd }| |	d t
jt|| j| j |jjd }| |	d  t
jt|| j t j|| j| jddd ddd t j| j| jdd}|jjd }| |	d t
jt|| j| j |jjd }| |	d t
jt|| j| j d S )	NTFr   r   r   r   rS   r   )rQ   rh   rl   r   r   r
  rk   r`   r   r   r%   r~   r   r   r$   r   r   )r/   model_without_loading_externallarge_input_tensorsmall_shape_tensorr0   r0   r1   1test_save_model_with_external_data_multiple_times  sX   


zITestExternalDataToArray.test_save_model_with_external_data_multiple_timesNrp   r   )rs   rt   ru   r   rw   r2   propertyr   r8   r,   r   r   ro   r  r  r  r0   r0   r0   r1   r   ;  s   
 



'

r   c                   @  s<   e Zd ZdZ	ddd
dZdddZdddZdddZdS )3TestNotAllowToLoadExternalDataOutsideModelDirectoryEssential test to check that onnx (validate) C++ code will not allow to load external_data outside the model
    directory.
    rD   rE   rF   rG   r   rH   r   r   c                 C  sF   t t|}||_|p| d}t||d |d tjj|_	|S )NrI   rJ   rL   )
r   r%   rM   r#   r   rP   rQ   r   rR   rS   )r/   rE   rG   rH   rT   rU   r0   r0   r1   rW     s   

zOTestNotAllowToLoadExternalDataOutsideModelDirectory.create_external_data_tensorr   c                 C  L   |  d| _| tjj t| j W d   dS 1 sw   Y  dS )MWe only test the model validation as onnxruntime uses this to load the model.z../../file.binNr,   r-   r   rQ   r   r   rn   r.   r0   r0   r1   ro        "zDTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_modelc                 C  r  )More relative path test.z../test/../file.binNr  r.   r0   r0   r1   test_check_model_relative  r  zMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_relativec                 C  r  )JONNX checker disallows using absolute path as location in external tensor.z
//file.binNr  r.   r0   r0   r1   test_check_model_absolute  r  zMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_absoluteNrq   rr   rp   )rs   rt   ru   rv   rW   ro   r  r  r0   r0   r0   r1   r    s    

r  ntzSkip Windows test)reasonc                   @  s.   e Zd ZdZdddZdddZddd	Zd
S )<TestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindowsr  r   r   c                 C  r  )r  z..\..\file.binNr  r.   r0   r0   r1   ro     r  zMTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_modelc                 C  r  )r  z..\test\..\file.binNr  r.   r0   r0   r1   r    r  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_relativec                 C  r  )r  zC:/file.binNr  r.   r0   r0   r1   r    r  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_absoluteNrp   )rs   rt   ru   rv   ro   r  r  r0   r0   r0   r1   r"    s
    

r"  c                      s   e Zd Zd fddZ  ZS )(TestSaveAllTensorsAsExternalDataWithPathr   pathlib.Pathc                   s   t t  S r5   )pathlibPathsuperrB   r.   	__class__r0   r1   rB   !  s   z@TestSaveAllTensorsAsExternalDataWithPath.get_temp_model_filenamer   r$  )rs   rt   ru   rB   __classcell__r0   r0   r(  r1   r#     s    r#  c                   @  s   e Zd ZedddZdS )TestExternalDataToArrayWithPathr   r$  c                 C  s   t | jS r5   )r%  r&  r   r.   r0   r0   r1   r   &  s   z/TestExternalDataToArrayWithPath.model_file_pathNr*  )rs   rt   ru   r  r   r0   r0   r0   r1   r,  %  s    r,  c                   @  sR   e Zd ZdddZdddZdd	d
ZdddZdddZdddZdddZ	dS )TestFunctionsAndSubGraphsr   r   c                 C  sD   t  | _| jj}tj|d| _t	d
tj}t|d| _d S )Nra   r   rT   )r    r!   r"   r#   r=   r>   r?   r   r%   r&   r(   r)   r   _tensor)r/   r$   rM   r0   r0   r1   r2   ,  s
   
zTestFunctionsAndSubGraphs.setUpc                 C  r4   r5   r6   r.   r0   r0   r1   r8   3  r9   z"TestFunctionsAndSubGraphs.tearDownrT   r   c                 C     |  |jtj d S r5   )r   rS   r   r   r/   rT   r0   r0   r1   _check_is_internal6     z,TestFunctionsAndSubGraphs._check_is_internalc                 C  r/  r5   )r   rS   r   rR   r0  r0   r0   r1   _check_is_external9  r2  z,TestFunctionsAndSubGraphs._check_is_externalrl   r   nodesSequence[NodeProto]c                 C  sl   |D ]}|  |jd |jd j}|| j | | qt|ddd |D ]}|jd j}| | q&dS )a  Check that the tensors in the model are externalized.

        The tensors in the specified sequence of Constant nodes are set to self._tensor,
        an internal tensor. The model is then converted to external data format.
        The tensors are then checked to ensure that they are externalized.

        Arguments:
            model: The model to check.
            nodes: A sequence of Constant nodes.

        rX   r   Tr   N)	r   op_typer   r   CopyFromr.  r1  r   r3  )r/   rl   r4  r   rT   r0   r0   r1   _check<  s   z TestFunctionsAndSubGraphs._checkc                 C  s,   d}t |}| ||jd jd g d S )Na|  
           <ir_version: 7,  opset_import: ["": 15, "local": 1]>
           agraph (float[N] X) => (float[N] Y)
            {
              Y = local.add(X)
            }

            <opset_import: ["" : 15],  domain: "local">
            add (float[N] X) => (float[N] Y) {
              C = Constant <value = float[1] {1.0}> ()
              Y = Add (X, C)
           }
        r   )r
   parse_modelr8  	functionsr   )r/   
model_textrl   r0   r0   r1   test_functionT  s   
z'TestFunctionsAndSubGraphs.test_functionc                 C  s:   d}t |}|jjd }dd |jD }| || d S )Na2  
           <ir_version: 7,  opset_import: ["": 15, "local": 1]>
           agraph (bool flag, float[N] X) => (float[N] Y)
            {
              Y = if (flag) <
                then_branch = g1 () => (float[N] Y_then) {
                    B = Constant <value = float[1] {0.0}> ()
                    Y_then = Add (X, C)
                },
                else_branch = g2 () => (float[N] Y_else) {
                    C = Constant <value = float[1] {1.0}> ()
                    Y_else = Add (X, C)
                }
              >
            }
        r   c                 S  s   g | ]}|j jd  qS )r   )gr   ).0attrr0   r0   r1   
<listcomp>x  s    z;TestFunctionsAndSubGraphs.test_subgraph.<locals>.<listcomp>)r
   r9  rk   r   r   r8  )r/   r;  rl   if_nodeconstant_nodesr0   r0   r1   test_subgraphe  s
   
z'TestFunctionsAndSubGraphs.test_subgraphNrp   )rT   r   r   r   )rl   r   r4  r5  r   r   )
rs   rt   ru   r2   r8   r1  r3  r8  r<  rC  r0   r0   r0   r1   r-  +  s    





r-  __main__)1
__future__r   r   r=   r%  r    r   r@   typingr   r   numpyr%   r   rQ   r   r   r   r   r	   r
   r   onnx.external_data_helperr   r   r   r   r   onnx.numpy_helperr   r   collections.abcr   TestCaser   parameterized_classry   r   r   r   r  r   r#   r"  r#  r,  r-  rs   mainr0   r0   r0   r1   <module>   sn   $	Q$d  *  %
Q