U
    q±Ëh+‡  ã                   @  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 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rÚe .¡  dS )"é    )ÚannotationsN)ÚAnyÚSequence)Ú
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_arrayc                   @  s~   e Zd ZU dZdZded< ddœdd„Zddœd	d
„Zddœdd„Zddddddœdd„Z	ddddœdd„Z
d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ÚNone©Úreturnc                 C  sb   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© r/   ú@/tmp/pip-unpacked-wheel-xnis5xre/onnx/test/test_external_data.pyÚsetUp-   s
    

  zTestLoadExternalDataBase.setUpc                 C  s   | j  ¡  d S ©N©r!   Úcleanupr-   r/   r/   r0   ÚtearDown4   s    z!TestLoadExternalDataBase.tearDownc                 C  s   t j | jtt ¡ ƒd ¡S ©Nz.onnx©ÚosÚpathÚjoinr#   r   ÚuuidÚuuid4r-   r/   r/   r0   Úget_temp_model_filename7   s    z0TestLoadExternalDataBase.get_temp_model_filenameÚ ú	list[Any]r   ©ÚvalueÚtensor_nameÚlocationr   c              	   C  st   t t |¡ƒ}||_|p |› d}t||d ttj | j	|¡dƒ}| 
|j¡ W 5 Q R X | d¡ tjj|_|S )Nú.bin©rC   ÚwbÚraw_data)r   r$   Úarrayr"   r   Úopenr8   r9   r:   r#   ÚwriterG   Ú
ClearFieldÚonnxr   ÚEXTERNALÚdata_location)r.   rA   rB   rC   ÚtensorÚtensor_filenameÚ	data_filer/   r/   r0   Úcreate_external_data_tensor:   s    

z4TestLoadExternalDataBase.create_external_data_tensor)rC   r   c                 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ÚoutputsrA   Úinput_valueÚ
test_graph©rV   rW   Úinitializerú
model.onnx)rL   r	   Ú	make_noderR   r*   r)   Úmake_tensor_value_infor   ÚFLOATÚshapeÚ
make_graphÚ
make_modelr8   r9   r:   r#   Ú
save_modelr   )r.   rC   Úconstant_nodeZinitializersrV   ÚgraphÚmodelr,   r/   r/   r0   r+   H   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   ZskipTestr   Úcheck_modelr,   r-   r/   r/   r0   Útest_check_modelk   s
    
ÿz)TestLoadExternalDataBase.test_check_modelN)r>   )r>   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r1   r5   r=   rR   r+   rh   r/   r/   r/   r0   r   %   s   
 ÿ#r   r   r   Z	textprotoc                   @  s6   e Zd Zddœdd„Zddœdd„Zddœdd„Zd	S )
ÚTestLoadExternalDatar   r   c                 C  s\   t  | j| j¡}|jjd }tj t	|ƒ| j
¡ |jjd jd j}tj t	|ƒ| j¡ d S ©Nr   ©rL   Ú
load_modelr,   r   re   r[   r$   ÚtestingÚassert_allcloser   r)   ÚnodeÚ	attributeÚtr*   ©r.   rf   Úinitializer_tensorÚattribute_tensorr/   r/   r0   Útest_load_external_dataz   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©Zload_external_datar   )rL   rq   r,   r   r   r#   re   r[   r$   rr   rs   r   r)   rt   ru   rv   r*   rw   r/   r/   r0   Ú!test_load_external_data_for_model‚   s      ÿz6TestLoadExternalData.test_load_external_data_for_modelc                 C  s¢   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_copyr\   r   ©rL   rq   r,   r   r8   r9   r:   r#   Úmkdirrc   re   r[   r$   rr   rs   r   r)   rt   ru   rv   r*   ©r.   rf   r#   Znew_model_filenameZ	new_modelrx   ry   r/   r/   r0   Útest_save_external_data   s    
z,TestLoadExternalData.test_save_external_dataN)ri   rj   rk   rz   r|   r‚   r/   r/   r/   r0   rn   s   s   rn   c                   @  s^   e Zd Zdddœdd„Zddœdd	„Zddœd
d„Zej e 	dd¡¡ddddœdd„ƒZ
dS )ÚTestLoadExternalDataSingleFileúlist[tuple[list[Any], Any]]úlist[TensorProto]©Útensors_datar   c           	   	   C  sÌ   d}g }t tj | j|¡dƒ¤}|D ]˜\}}tt |¡ƒ}| ¡ }|d dkrt| 	dd|d   ¡ |d |d  }| 	|j
¡ t|||| ¡ | d ||_| d¡ tjj|_| |¡ q$W 5 Q R X |S )Nútensors.binÚabé   r   ó    )rC   ÚoffsetÚlengthrG   )rI   r8   r9   r:   r#   r   r$   rH   ÚtellrJ   rG   r   r"   rK   rL   r   rM   rN   Úappend)	r.   r‡   rP   ÚtensorsrQ   rA   rB   rO   rŒ   r/   r/   r0   Úcreate_external_data_tensors¤   s*    
ü

z;TestLoadExternalDataSingleFile.create_external_data_tensorsr   r   c                 C  s\   t  | j| j¡}|jjd }tj t	|ƒ| j
¡ |jjd jd j}tj t	|ƒ| j¡ d S ro   rp   rw   r/   r/   r0   Ú#test_load_external_single_file_dataÀ   s
    zBTestLoadExternalDataSingleFile.test_load_external_single_file_datac                 C  s¢   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 r}   r   r   r/   r/   r0   Ú#test_save_external_single_file_dataÉ   s    
zBTestLoadExternalDataSingleFile.test_save_external_single_file_data)TFÚbool)Úuse_absolute_pathÚuse_model_pathr   c              	   C  s  t  | j| j¡}tj | jd¡}t |¡ tj | jd¡}t |¡ |rXtj |d¡}nd}tj | jd¡}t |¡ tj |d¡}ddd	œd
d„}	|	||d t  	||| j¡ |rÞ|  
t jj¡ t  || j¡}
W 5 Q R X n6t j|| jdd}|  
t jj¡ t||ƒ W 5 Q R X d S )Nr~   Zinvlid_external_datarˆ   z#../invlid_external_data/tensors.binÚexternal_datar\   r   r   )rf   rC   c                 S  s&   | j jD ]}| d¡rt||ƒ qd S )NrG   )re   r[   ÚHasFieldr   )rf   rC   rO   r/   r/   r0   Ú'convert_model_to_external_data_no_checkñ   s    
z…TestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check.<locals>.convert_model_to_external_data_no_checkrE   Fr{   )rL   rq   r,   r   r8   r9   r:   r#   r€   rc   ÚassertRaisesr   ÚValidationErrorr   )r.   r•   r–   rf   Z	model_dirZtraversal_external_data_dirZ traversal_external_data_locationZexternal_data_dirZnew_model_filepathr™   Ú_Z
onnx_modelr/   r/   r0   Ú5test_save_external_invalid_single_file_data_and_checkØ   sB    
 ÿ
 ÿ
þ  ÿzTTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_checkN)ri   rj   rk   r‘   r’   r“   ÚparameterizedÚexpandÚ	itertoolsÚproductr   r/   r/   r/   r0   rƒ      s
   	rƒ   c                   @  s  e Zd ZU dZded< ddœdd„Zdd	„ Zd
ddœdd„Zddœdd„Ze	 
edkd¡ddœdd„ƒZddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd „Zddœd!d"„Zddœd#d$„Zddœd%d&„Zddœd'd(„Zddœd)d*„Zddœd+d,„Zd-S ).Ú TestSaveAllTensorsAsExternalDatar   r   r   r   r   c                 C  sb   t  ¡ | _| jj| _t d¡ dd¡ tj	¡d | _
t d¡ dd¡ tj	¡d | _|  ¡ | _d S r   )r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Úcreate_test_model_protorf   r-   r/   r/   r0   r1     s
    

  z&TestSaveAllTensorsAsExternalData.setUpc                 C  s   t j | jtt ¡ ƒd ¡S r6   r7   r-   r/   r/   r0   r=     s    z8TestSaveAllTensorsAsExternalData.get_temp_model_filenamer„   r…   r†   c                 C  s4   g }|D ]&\}}t t |¡ƒ}||_| |¡ q|S r2   )r   r$   rH   r"   r   )r.   r‡   r   rA   rB   rO   r/   r/   r0   Ú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*   rX   rS   rT   r   rU   rY   é   rZ   )r¤   r*   r)   rL   r	   r]   r^   r   r_   r`   ra   rb   )r.   r   rd   rV   re   r/   r/   r0   r£   %  s2    þÿ   ÿ  ÿÿûz8TestSaveAllTensorsAsExternalData.create_test_model_protoú:check_model supports protobuf only when provided as a pathc                 C  s   t  | j¡ d S r2   ©r   rg   rf   r-   r/   r/   r0   rh   @  s    z1TestSaveAllTensorsAsExternalData.test_check_modelc                 C  sV   |   ¡ }t| jdd t | j|| j¡ t || j¡}|jjd }|  	| 
d¡¡ d S )Né   ©Úsize_thresholdr   rN   )r=   r   rf   rL   rc   r   rq   re   r[   ÚassertFalser˜   ©r.   Úmodel_file_pathrf   rx   r/   r/   r0   Ú7test_convert_model_to_external_data_with_size_thresholdG  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©   rN   )r=   r   rf   rL   rc   r   rq   re   r[   Ú
assertTruer˜   r$   rr   rs   r   r)   r¬   r/   r/   r0   Ú:test_convert_model_to_external_data_without_size_thresholdQ  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_filerC   )#r=   r   r;   r<   r   rf   rL   rc   r   r¯   r8   r9   Úisfiler:   r#   rq   r   re   r[   r«   Úlenr—   ÚassertEqualrN   r   ÚDEFAULTr$   rr   rs   r   r)   rt   ru   rv   r*   )r.   r­   Zexternal_data_filerf   rx   ry   r/   r/   r0   Ú?test_convert_model_to_external_data_from_one_file_with_location[  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±   ©r=   r   rf   rL   rc   r   r¯   r8   r9   r²   r:   r#   ©r.   r­   r/   r/   r0   ÚRtest_convert_model_to_external_data_from_one_file_without_location_uses_model_namez  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_attributerX   r*   )r=   r   rf   rL   rc   r   r¯   r8   r9   r²   r:   r#   r«   r¸   r/   r/   r0   ÚItest_convert_model_to_external_data_one_file_per_tensor_without_attribute‡  s    ü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º   rX   r*   r·   r¸   r/   r/   r0   ÚFtest_convert_model_to_external_data_one_file_per_tensor_with_attribute˜  s    ü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±   rX   r*   rN   )r=   r   rf   rL   rc   r   r¯   r8   r9   r²   r:   r#   r«   rq   re   r[   r˜   rt   ru   rv   ©r.   r­   rf   rx   ry   r/   r/   r0   Ú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»   rN   )r=   r   rf   rL   rc   r   rq   re   r[   r$   rr   rs   r   r)   r¯   r˜   rt   ru   rv   r*   r¾   r/   r/   r0   Ú=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   rN   )r=   rL   rc   rf   r   r¯   r8   r9   r²   rq   re   r[   r«   r˜   rt   ru   rv   r¾   r/   r/   r0   Ú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±   rC   rª   r»   rN   ©r=   rL   rc   rf   r   rq   re   r[   r¯   r˜   r$   rr   rs   r   r)   rt   ru   rv   r«   r*   r¾   r/   r/   r0   Ú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Â   rC   rª   r»   r{   rN   rÅ   r¾   r/   r/   r0   Ú-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)r=   rf   re   r[   rG   rL   rc   r   r¯   r8   r9   r²   rq   r   r#   r´   )r.   r­   Zoriginal_raw_datarf   rx   r/   r/   r0   Ú6test_save_model_with_existing_raw_data_should_override  s&    û  ÿzWTestSaveAllTensorsAsExternalData.test_save_model_with_existing_raw_data_should_overrideN)ri   rj   rk   r   rm   r1   r=   r¤   r£   ÚunittestÚskipIfrh   r®   r°   r¶   r¹   r¼   r½   r¿   rÁ   rÃ   rÆ   rÇ   rÈ   r/   r/   r/   r0   r¢     s,   
þ

#r¢   c                   @  s˜   e Zd ZU dZded< ddœdd„Zedd	„ ƒZddœd
d„Zddœdd„Z	e
 edkd¡ddœdd„ƒZddœdd„Zddœdd„Zd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 )Nr\   é
   é<   éd   )éÈ   i,  )r   r    r!   r"   r#   r8   r9   r:   Ú_model_file_pathr$   ÚrandomZrandr'   r(   Ú
large_dataÚ
small_datar+   rf   r-   r/   r/   r0   r1   >  s    

zTestExternalDataToArray.setUpc                 C  s   | j S r2   )rÐ   r-   r/   r/   r0   r­   F  s    z'TestExternalDataToArray.model_file_pathc                 C  s   | j  ¡  d S r2   r3   r-   r/   r/   r0   r5   J  s    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"   Z	data_typeZdimsÚvalsÚrawZShapeÚCZReshapeÚY)rV   rW   ZCast)rV   rW   Útoz
test-model)r[   zonnx-example)Zproducer_name)r	   r^   r   r_   rÒ   r`   Zmake_tensorÚtobytesr$   rH   rÓ   Zint64ZINT64rL   r]   ra   rb   )
r.   rÔ   Z
input_initZ
shape_dataZ
shape_initr×   r&   ÚcastZ	graph_defrf   r/   r/   r0   r+   M  sJ    ûûý   ÿûz)TestExternalDataToArray.create_test_modelr¦   c                 C  s   t  | j¡ d S r2   r§   r-   r/   r/   r0   rh   t  s    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{   )Zstrict_mode)
rL   rc   rf   r­   r   Úloadrš   r   ZInferenceErrorZinfer_shapes)r.   Zmodel_without_external_datar/   r/   r0   Ú.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{   )rL   rc   rf   r­   r   rÝ   r   re   r[   r#   r$   rr   rs   rÒ   )r.   rf   Zloaded_large_datar/   r/   r0   Ú 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   rN   r¥   )rL   rc   rf   r­   r   rÝ   re   r[   r¯   r˜   r$   rr   rs   r   r#   rÒ   rÓ   )r.   Zmodel_without_loading_externalZlarge_input_tensorZsmall_shape_tensorr/   r/   r0   Ú1test_save_model_with_external_data_multiple_times¢  sf    ø
  ÿ
 ÿø  ÿ
 ÿ
 ÿzITestExternalDataToArray.test_save_model_with_external_data_multiple_timesN)ri   rj   rk   r   rm   r1   Úpropertyr­   r5   r+   rÉ   rÊ   rh   rÞ   rß   rà   r/   r/   r/   r0   rË   5  s   

'þrË   c                   @  sP   e Zd ZdZddddddœdd„Zd	d
œdd„Zd	d
œdd„Zd	d
œdd„ZdS )Ú3TestNotAllowToLoadExternalDataOutsideModelDirectoryú€Essential test to check that onnx (validate) C++ code will not allow to load external_data outside the model
    directory.
    r>   r?   r   r   r@   c                 C  sF   t t |¡ƒ}||_|p |› d}t||d | d¡ tjj|_	|S )NrD   rE   rG   )
r   r$   rH   r"   r   rK   rL   r   rM   rN   )r.   rA   rB   rC   rO   rP   r/   r/   r0   rR   ß  s    

zOTestNotAllowToLoadExternalDataOutsideModelDirectory.create_external_data_tensorr   r   c              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )úMWe only test the model validation as onnxruntime uses this to load the model.z../../file.binN©r+   r,   rš   rL   r   r›   rg   r-   r/   r/   r0   rh   ì  s    zDTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_modelc              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )úMore relative path test.z../test/../file.binNrå   r-   r/   r/   r0   Útest_check_model_relativeò  s    zMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_relativec              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )úJONNX checker disallows using absolute path as location in external tensor.z
//file.binNrå   r-   r/   r/   r0   Útest_check_model_absoluteø  s    zMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_absoluteN)r>   )ri   rj   rk   rl   rR   rh   rç   ré   r/   r/   r/   r0   râ   Ú  s    ÿrâ   ÚntzSkip Windows test)Úreasonc                   @  s:   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zd
S )Ú<TestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindowsrã   r   r   c              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )rä   z..\..\file.binNrå   r-   r/   r/   r0   rh     s    zMTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_modelc              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )ræ   z..\test\..\file.binNrå   r-   r/   r/   r0   rç     s    zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_relativec              	   C  s6   |   d¡| _|  tjj¡ t | j¡ W 5 Q R X dS )rè   zC:/file.binNrå   r-   r/   r/   r0   ré     s    zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_absoluteN)ri   rj   rk   rl   rh   rç   ré   r/   r/   r/   r0   rì   ÿ  s   rì   c                      s"   e Zd Zddœ‡ fdd„Z‡  ZS )Ú(TestSaveAllTensorsAsExternalDataWithPathúpathlib.Pathr   c                   s   t  tƒ  ¡ ¡S r2   )ÚpathlibÚPathÚsuperr=   r-   ©Ú	__class__r/   r0   r=     s    z@TestSaveAllTensorsAsExternalDataWithPath.get_temp_model_filename)ri   rj   rk   r=   Ú__classcell__r/   r/   rò   r0   rí     s   rí   c                   @  s   e Zd Zeddœdd„ƒZdS )ÚTestExternalDataToArrayWithPathrî   r   c                 C  s   t  | j¡S r2   )rï   rð   rÐ   r-   r/   r/   r0   r­      s    z/TestExternalDataToArrayWithPath.model_file_pathN)ri   rj   rk   rá   r­   r/   r/   r/   r0   rõ     s   rõ   c                   @  sv   e Zd Zddœdd„Zddœdd„Zdddœd	d
„Zdddœdd„Zddddœdd„Zddœdd„Zd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 )Nr\   rŠ   rO   )r   r    r!   r"   r8   r9   r:   rÐ   r$   r%   r'   r(   r   Ú_tensor)r.   r#   rH   r/   r/   r0   r1   &  s
    
zTestFunctionsAndSubGraphs.setUpc                 C  s   | j  ¡  d S r2   r3   r-   r/   r/   r0   r5   -  s    z"TestFunctionsAndSubGraphs.tearDownr   )rO   r   c                 C  s   |   |jtj¡ d S r2   )r´   rN   r   rµ   ©r.   rO   r/   r/   r0   Ú_check_is_internal0  s    z,TestFunctionsAndSubGraphs._check_is_internalc                 C  s   |   |jtj¡ d S r2   )r´   rN   r   rM   rø   r/   r/   r0   Ú_check_is_external3  s    z,TestFunctionsAndSubGraphs._check_is_externalr   zSequence[NodeProto])rf   Únodesr   c                 C  sl   |D ]4}|   |jd¡ |jd j}| | j¡ |  |¡ qt|ddd |D ]}|jd j}|  |¡ qLd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.

        rS   r   TrÀ   N)	r´   Zop_typeru   rv   ZCopyFromr÷   rù   r   rú   )r.   rf   rû   rt   rO   r/   r/   r0   Ú_check6  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_modelrü   Z	functionsrt   )r.   Ú
model_textrf   r/   r/   r0   Útest_functionN  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   )Úgrt   )Ú.0Úattrr/   r/   r0   Ú
<listcomp>r  s     z;TestFunctionsAndSubGraphs.test_subgraph.<locals>.<listcomp>)r
   rý   re   rt   ru   rü   )r.   rþ   rf   Zif_nodeZconstant_nodesr/   r/   r0   Útest_subgraph_  s
    
z'TestFunctionsAndSubGraphs.test_subgraphN)
ri   rj   rk   r1   r5   rù   rú   rü   rÿ   r  r/   r/   r/   r0   rö   %  s   rö   Ú__main__)/Ú
__future__r   r    r8   rï   r   rÉ   r;   Útypingr   r   Znumpyr$   rž   rL   r   r   r   r   r	   r
   r   Zonnx.external_data_helperr   r   r   r   r   Zonnx.numpy_helperr   r   ZTestCaser   Zparameterized_classrn   rƒ   r¢   rË   râ   rÊ   r"   rì   rí   rõ   rö   ri   Úmainr/   r/   r/   r0   Ú<module>   sf   $	Nþÿ$þÿdþÿ  *þÿ  %
ÿQ
