
    bIg+                    2   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ej>                        Z  ejB                  d	d
id	dig       G d de              Z" ejB                  d	d
id	dig       G d de              Z# ejB                  d	d
id	dig       G d dej>                               Z$ ejB                  d	d
id	dig       G d dej>                               Z% G d de       Z& ejN                  ejP                  dk7  d       G d de&             Z) G d de$      Z* G d de%      Z+ G d d ej>                        Z,e-d!k(  r ej\                          yy)"    )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                  d    e Zd ZU dZdZded<   ddZddZddZ	 d	 	 	 	 	 	 	 ddZ	ddd	Z
dd
Zy)TestLoadExternalDataBasezBase class for testing external data related behaviors.

    Subclasses should be parameterized with a serialization format.
    protobufstrserialization_formatc                   t        j                         | _        | j                  j                  | _        t        j                  d      j                  dd      j                  t
        j                        dz   | _
        t        j                  d      j                  dd      j                  t
        j                        dz   | _        | j                         | _        y N         i      )tempfileTemporaryDirectory_temp_dir_objnametemp_dirnparangereshapeastypefloat32initializer_valueattribute_valuecreate_test_modelmodel_filenameselfs    Y/var/www/html/answerous/venv/lib/python3.12/site-packages/onnx/test/test_external_data.pysetUpzTestLoadExternalDataBase.setUp-   s    %88:!//44!#1!5!5a!;!B!B2::!NQT!T!yy|33Aq9@@LsR"446    c                8    | j                   j                          y Nr!   cleanupr-   s    r/   tearDownz!TestLoadExternalDataBase.tearDown4       ""$r1   c                    t         j                  j                  | j                  t	        t        j                               dz         S Nz.onnxospathjoinr#   r   uuiduuid4r-   s    r/   get_temp_model_filenamez0TestLoadExternalDataBase.get_temp_model_filename7   +    ww||DMM3tzz|+<w+FGGr1   c                   t        t        j                  |            }||_        |xs | d}t	        ||       t        t        j                  j                  | j                  |      d      5 }|j                  |j                         d d d        |j                  d       t        j                  j                  |_        |S # 1 sw Y   ;xY w)N.binlocationwbraw_data)r   r$   arrayr"   r   openr;   r<   r=   r#   writerG   
ClearFieldonnxr   EXTERNALdata_location)r.   valuetensor_namerE   tensortensor_filename	data_files          r/   create_external_data_tensorz4TestLoadExternalDataBase.create_external_data_tensor:   s     BHHUO,!":T&:&?;"'',,t}}o>E 	-OOFOO,	-*%#//88		- 	-s   0CCc           	     <   t         j                  j                  dg dg| j                  | j                  d            }| j                  | j
                  d|      g}t        j                  dt         j                  j                  | j
                  j                        g}t        j                  |gd|g |      }t        j                  |      }t        j                  j                  | j                  d      }t        j                   ||| j"                         |S )	NConstantvaluesr*   inputsoutputsrO   input_value
test_graphrY   rZ   initializer
model.onnx)rL   r
   	make_noderT   r*   r)   make_tensor_value_infor   FLOATshape
make_graph
make_modelr;   r<   r=   r#   
save_modelr   )r.   rE   constant_nodeinitializersrY   graphmodelr,   s           r/   r+   z*TestLoadExternalDataBase.create_test_modelH   s   --J22$$&7	 . 
 ,,&&x
 ))t//55t7M7M7S7S
 !!O$
 !!%(dmm\B~t/H/HIr1   c                    | j                   dk7  r| j                  d       t        j                  | j                         y )Nr   zDcheck_model supports protobuf only as binary when provided as a path)r   skipTestr	   check_modelr,   r-   s    r/   test_check_modelz)TestLoadExternalDataBase.test_check_modelk   s5    $$
2MMV 	D//0r1   NreturnNone)rp   r    rO   z	list[Any]rP   r   rE   r   rp   r   )rE   r   rp   r   )__name__
__module____qualname____doc__r   __annotations__r0   r6   r@   rT   r+   rn    r1   r/   r   r   %   s[    
 !+#*7%H CE-0<?	!F1r1   r   r   r   	textprotoc                  $    e Zd ZddZddZddZy)TestLoadExternalDatac                   t        j                  | j                  | j                        }|j                  j
                  d   }t        j                  j                  t        |      | j                         |j                  j                  d   j                  d   j                  }t        j                  j                  t        |      | j                         y Nr   rL   
load_modelr,   r   ri   r^   r$   testingassert_allcloser   r)   node	attributetr*   r.   rj   initializer_tensorattribute_tensors       r/   test_load_external_dataz,TestLoadExternalData.test_load_external_dataz   s     3 3T5N5NO"[[44Q7


""8,>#?AWAWX ;;++A.88;==


""8,<#=t?S?STr1   c                   t        j                  | j                  | j                  d      }t	        || j
                         |j                  j                  d   }t        j                  j                  t        |      | j                         |j                  j                  d   j                  d   j                  }t        j                  j                  t        |      | j                          y )NFload_external_datar   )rL   r   r,   r   r   r#   ri   r^   r$   r   r   r   r)   r   r   r   r*   r   s       r/   !test_load_external_data_for_modelz6TestLoadExternalData.test_load_external_data_for_model   s    !:!:u
 	%UDMM:"[[44Q7


""8,>#?AWAWX ;;++A.88;==


""8,<#=t?S?STr1   c                   t        j                  | j                  | j                        }t        j
                  j                  | j                  d      }t	        j                  |       t        j
                  j                  |d      }t        j                  ||| j                         t        j                  || j                        }|j                  j                  d   }t        j                  j                  t        |      | j                          |j                  j"                  d   j$                  d   j&                  }t        j                  j                  t        |      | j(                         y N	save_copyr_   r   rL   r   r,   r   r;   r<   r=   r#   mkdirrf   ri   r^   r$   r   r   r   r)   r   r   r   r*   r.   rj   r#   new_model_filename	new_modelr   r   s          r/   test_save_external_dataz,TestLoadExternalData.test_save_external_data        3 3T5N5NO77<<{;
WW\\(LA143L3LMOO$68Q8QR	&__88;


""8,>#?AWAWX$??//2<<Q?AA


""8,<#=t?S?STr1   Nro   )ru   rv   rw   r   r   r   rz   r1   r/   r}   r}   s   s    U	UUr1   r}   c                      e Zd Z	 	 	 	 ddZddZddZej                  j                   ej                  dd            	 	 	 	 	 	 d	d       Z
y)
TestLoadExternalDataSingleFilec           	     t   d}g }t        t        j                  j                  | j                  |      d      5 }|D ]  \  }}t        t        j                  |            }|j                         }|dz  dk7  r%|j                  dd|dz  z
  z         |dz   |dz  z
  }|j                  |j                         t        ||||j                         |z
         ||_        |j                  d       t        j                  j                   |_        |j%                  |        	 d d d        |S # 1 sw Y   |S xY w)Ntensors.binab   r       )rE   offsetlengthrG   )rI   r;   r<   r=   r#   r   r$   rH   tellrJ   rG   r   r"   rK   rL   r   rM   rN   append)	r.   tensors_datarR   tensorsrS   rO   rP   rQ   r   s	            r/   create_external_data_tensorsz;TestLoadExternalDataSingleFile.create_external_data_tensors   s    ("'',,t}}o>E 	'&2 '"{#BHHUO4")D=A%OOETFTM-A$BC#d]Vd]:F0!,!$>>+f4	 *!!*-'+'7'7'@'@$v&#'	'( )	'( s   C)D--D7c                   t        j                  | j                  | j                        }|j                  j
                  d   }t        j                  j                  t        |      | j                         |j                  j                  d   j                  d   j                  }t        j                  j                  t        |      | j                         y r   r   r   s       r/   #test_load_external_single_file_datazBTestLoadExternalDataSingleFile.test_load_external_single_file_data   s     3 3T5N5NO"[[44Q7


""8,>#?AWAWX ;;++A.88;==


""8,<#=t?S?STr1   c                   t        j                  | j                  | j                        }t        j
                  j                  | j                  d      }t	        j                  |       t        j
                  j                  |d      }t        j                  ||| j                         t        j                  || j                        }|j                  j                  d   }t        j                  j                  t        |      | j                          |j                  j"                  d   j$                  d   j&                  }t        j                  j                  t        |      | j(                         y r   r   r   s          r/   #test_save_external_single_file_datazBTestLoadExternalDataSingleFile.test_save_external_single_file_data   r   r1   )TFc                T   t        j                  | j                  | j                        }t        j
                  j                  | j                  d      }t	        j                  |       t        j
                  j                  | j                  d      }t	        j                  |       |r!t        j
                  j                  |d      }nd}t        j
                  j                  | j                  d      }t	        j                  |       t        j
                  j                  |d      }dd}	 |	||       t        j                  ||| j                         |rS| j                  t         j                  j                        5  t        j                  || j                        }
d d d        y t        j                  || j                  d	
      }| j                  t         j                  j                        5  t        ||       d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY w)Nr   invlid_external_datar   z#../invlid_external_data/tensors.binexternal_datar_   c                v    | j                   j                  D ]   }|j                  d      st        ||       " y )NrG   )ri   r^   HasFieldr   )rj   rE   rQ   s      r/   'convert_model_to_external_data_no_checkzTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check.<locals>.convert_model_to_external_data_no_check   s1    ++11 8??:.%fh78r1   rD   Fr   )rj   r   rE   r   )rL   r   r,   r   r;   r<   r=   r#   r   rf   assertRaisesr	   ValidationErrorr   )r.   use_absolute_pathuse_model_pathrj   	model_dirtraversal_external_data_dir traversal_external_data_locationexternal_data_dirnew_model_filepathr   _
onnx_models               r/   5test_save_external_invalid_single_file_data_and_checkzTTestLoadExternalDataSingleFile.test_save_external_invalid_single_file_data_and_check   s     3 3T5N5NOGGLL<	
&(ggllMM1'
# 	,-/1ww||+]0, 0U,GGLLH
"#WW\\)\B	8
 	05	

 	143L3LM""4<<#?#?@ SOO$68Q8QRS S "D$=$=RWJ ""4<<#?#?@ L,Z9JKL LS SL Ls   !H<HHH'Nr   zlist[tuple[list[Any], Any]]rp   zlist[TensorProto]ro   )r   boolr   r   rp   rq   )ru   rv   rw   r   r   r   parameterizedexpand	itertoolsproductr   rz   r1   r/   r   r      sv    7	8UU   ''(9	(9(9-(WX+L!%+L7;+L	+L Y+Lr1   r   c                      e Zd ZU dZded<   ddZd Z	 	 	 	 ddZddZ e	j                  edk7  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ZddZddZy) TestSaveAllTensorsAsExternalDatar   r   r   c                   t        j                         | _        | j                  j                  | _        t        j                  d      j                  dd      j                  t
        j                        dz   | _
        t        j                  d      j                  dd      j                  t
        j                        dz   | _        | j                         | _        y r   )r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   create_test_model_protorj   r-   s    r/   r0   z&TestSaveAllTensorsAsExternalData.setUp  s    %88:!//44!#1!5!5a!;!B!B2::!NQT!T!yy|33Aq9@@LsR113
r1   c                    t         j                  j                  | j                  t	        t        j                               dz         S r9   r:   r-   s    r/   r@   z8TestSaveAllTensorsAsExternalData.get_temp_model_filename  rA   r1   c                    g }|D ];  \  }}t        t        j                  |            }||_        |j	                  |       = |S r3   )r   r$   rH   r"   r   )r.   r   r   rO   rP   rQ   s         r/   create_data_tensorsz4TestSaveAllTensorsAsExternalData.create_data_tensors  sI     ". 	#E;0F%FKNN6"	#
 r1   c                   | j                  | j                  df| j                  dfg      }t        j                  j                  dg dg|d         }t	        j                  dt        j                  j                  | j                  j                        g}t	        j                  |gd|g |d   g	      }t	        j                  |      S )
Nr*   r[   rV   rW   r   rX   r\      r]   )r   r*   r)   rL   r
   r`   ra   r   rb   rc   rd   re   )r.   r   rg   rY   ri   s        r/   r   z8TestSaveAllTensorsAsExternalData.create_test_model_proto%  s    **%%'89''7
 --rH:WQZ . 

 ))t//55t7M7M7S7S
 !!O 
   ''r1   :check_model supports protobuf only when provided as a pathc                B    t        j                  | j                         y r3   r	   rm   rj   r-   s    r/   rn   z1TestSaveAllTensorsAsExternalData.test_check_model@      
 	DJJ'r1   c                Z   | j                         }t        | j                  d       t        j                  | j                  || j
                         t        j                  || j
                        }|j                  j                  d   }| j                  |j                  d             y )N   size_thresholdr   rN   )r@   r   rj   rL   rf   r   r   ri   r^   assertFalser   r.   model_file_pathrj   r   s       r/   7test_convert_model_to_external_data_with_size_thresholdzXTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_with_size_thresholdG  s}    668&tzz$G

OT5N5NO1J1JK"[[44Q7+44_EFr1   c                   | j                         }t        | j                  d       t        j                  | j                  || j
                         t        j                  || j
                        }|j                  j                  d   }| j                  |j                  d             t        j                  j                  t        |      | j                         y )Nr   r   rN   )r@   r   rj   rL   rf   r   r   ri   r^   
assertTruer   r$   r   r   r   r)   r   s       r/   :test_convert_model_to_external_data_without_size_thresholdz[TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_without_size_thresholdQ  s    668&tzz!D

OT5N5NO1J1JK"[[44Q7*33ODE


""8,>#?AWAWXr1   c                    | j                         }t        t        j                               }t	        | j
                  dd|       t        j                  | j
                  || j                         | j                  t        j                  j                  t        j                  j                  | j                  |                   t        j                  || j                        }t!        |       | j                         }t        j                  ||| j                         t        j                  || j                        }|j"                  j$                  d   }| j'                  t)        |j*                               | j-                  |j.                  t0        j2                         t4        j6                  j9                  t;        |      | j<                         |j"                  j>                  d   j@                  d   jB                  }| j'                  t)        |j*                               | j-                  |j.                  t0        j2                         t4        j6                  j9                  t;        |      | jD                         y )Nr   T)r   all_tensors_to_one_filerE   )#r@   r   r>   r?   r   rj   rL   rf   r   r   r;   r<   isfiler=   r#   r   r   ri   r^   r   lenr   assertEqualrN   r   DEFAULTr$   r   r   r   r)   r   r   r   r*   )r.   r   external_data_filerj   r   r   s         r/   ?test_convert_model_to_external_data_from_one_file_with_locationz`TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_with_location[  s   668 .&JJ$('		
 	

OT5N5NOrww||DMMCU'VWX1J1JK 	)/6680I0IJ1J1JK"[[44Q7/==>?+99;;N;NO


""8,>#?AWAWX ;;++A.88;==-;;<=)779L9LM


""8,<#=t?S?STr1   c                   | j                         }t        | j                  dd       t        j                  | j                  || j
                         | j                  t        j                  j                  |             | j                  t        j                  j                  t        j                  j                  | j                  |                   y )Nr   T)r   r   r@   r   rj   rL   rf   r   r   r;   r<   r   r=   r#   r.   r   s     r/   Rtest_convert_model_to_external_data_from_one_file_without_location_uses_model_namezsTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_from_one_file_without_location_uses_model_namez  s     668&JJq$	
 	

OT5N5NO78rww||DMM?'STUr1   c                `   | j                         }t        | j                  ddd       t        j                  | j                  || j
                         | j                  t        j                  j                  |             | j                  t        j                  j                  t        j                  j                  | j                  d                   | j                  t        j                  j                  t        j                  j                  | j                  d                   y )Nr   Fr   r   convert_attributer[   r*   )r@   r   rj   rL   rf   r   r   r;   r<   r   r=   r#   r   r   s     r/   Itest_convert_model_to_external_data_one_file_per_tensor_without_attributezjTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_without_attribute  s     668&JJ$)#		
 	

OT5N5NO78rww||DMM='QRST]]DU(VWXr1   c                `   | j                         }t        | j                  ddd       t        j                  | j                  || j
                         | j                  t        j                  j                  |             | j                  t        j                  j                  t        j                  j                  | j                  d                   | j                  t        j                  j                  t        j                  j                  | j                  d                   y )Nr   FTr   r[   r*   r   r   s     r/   Ftest_convert_model_to_external_data_one_file_per_tensor_with_attributezgTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_one_file_per_tensor_with_attribute  s     668&JJ$)"		
 	

OT5N5NO78rww||DMM='QRSrww||DMMCT'UVWr1   c                V   | j                         }t        | j                  ddd       t        j                  | j                  || j
                         | j                  t        j                  j                  t        j                  j                  | j                  d                   | j                  t        j                  j                  t        j                  j                  | j                  d                   t        j                  || j
                        }|j                  j                  d   }| j                  |j!                  d             |j                  j"                  d   j$                  d   j&                  }| j                  |j!                  d             y )Nr   F)r   r   r   r[   r*   rN   )r@   r   rj   rL   rf   r   r   r;   r<   r   r=   r#   r   r   ri   r^   r   r   r   r   r.   r   rj   r   r   s        r/   Etest_convert_model_to_external_data_does_not_convert_attribute_valueszfTestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_does_not_convert_attribute_values  s$    668&JJ#$)		
 	

OT5N5NOrww||DMM='QRST]]DU(VWX1J1JK"[[44Q7*33ODE ;;++A.88;==)22?CDr1   c                   | j                         }t        | j                  dd       t        j                  | j                  || j
                         t        j                  || j
                        }|j                  j                  d   }t        j                  j                  t        |      | j                         | j                  |j                  d             |j                  j                   d   j"                  d   j$                  }t        j                  j                  t        |      | j&                         | j                  |j                  d             y )Nr   Tr   r   rN   )r@   r   rj   rL   rf   r   r   ri   r^   r$   r   r   r   r)   r   r   r   r   r   r*   r   s        r/   =test_convert_model_to_external_data_converts_attribute_valuesz^TestSaveAllTensorsAsExternalData.test_convert_model_to_external_data_converts_attribute_values  s    668&JJqD	
 	

OT5N5NO1J1JK"[[44Q7


""8,>#?AWAWX*33ODE ;;++A.88;==


""8,<#=t?S?ST(11/BCr1   c                ,   | j                         }t        j                  | j                  || j                  d       | j                  t        j                  j                  |             t        j                  || j                        }|j                  j                  d   }| j                  |j                  d             |j                  j                  d   j                  d   j                   }| j                  |j                  d             y )NF)save_as_external_datar   rN   )r@   rL   rf   rj   r   r   r;   r<   r   r   ri   r^   r   r   r   r   r   r   s        r/   Etest_save_model_does_not_convert_to_external_data_and_saves_the_modelzfTestSaveAllTensorsAsExternalData.test_save_model_does_not_convert_to_external_data_and_saves_the_model  s     668JJ%%"'		
 	781J1JK"[[44Q7+44_EF ;;++A.88;==)22?CDr1   c           
        | j                         }t        j                  | j                  || j                  ddd dd       t        j
                  || j                        }|j                  j                  d   }| j                  |j                  d             t        j                  j                  t        |      | j                         |j                  j                  d   j                   d   j"                  }| j%                  |j                  d             t        j                  j                  t        |      | j&                         y )NTr   Fr   r   rE   r   r   rN   r@   rL   rf   rj   r   r   ri   r^   r   r   r$   r   r   r   r)   r   r   r   r   r*   r   s        r/   0test_save_model_does_convert_and_saves_the_modelzQTestSaveAllTensorsAsExternalData.test_save_model_does_convert_and_saves_the_model  s   668JJ%%"&$(#		
 1J1JK"[[44Q7*33ODE


""8,>#?AWAWX ;;++A.88;==)22?CD


""8,<#=t?S?STr1   c           	     2   | j                         }t        j                  | j                  || j                  dd dd       t        j
                  || j                  d      }t        j                  ||| j                  dd dd       t        j
                  || j                        }|j                  j                  d   }| j                  |j                  d             t        j                  j                  t        |      | j                         |j                  j                  d   j                   d   j"                  }| j%                  |j                  d             t        j                  j                  t        |      | j&                         y )NTr   F)r   rE   r   r   r   rN   r   r   s        r/   -test_save_model_without_loading_external_datazNTestSaveAllTensorsAsExternalData.test_save_model_without_loading_external_data  sF   668JJ%%"&#	
 T665
 	%%"&#	
 1J1JK"[[44Q7*33ODE


""8,>#?AWAWX ;;++A.88;==)22?CD


""8,<#=t?S?STr1   c                   | j                         }| j                  j                  j                  d   j                  }t        j                  | j                  || j                  dd       | j                  t        j                  j                  |             t        j                  || j                  d      }|j                  j                  d   }d|_        t        || j                         | j                  |j                  |       y )Nr   T)r   r   Fr   s   dummpy_raw_data)r@   rj   ri   r^   rG   rL   rf   r   r   r;   r<   r   r   r   r#   r   )r.   r   original_raw_datarj   r   s        r/   6test_save_model_with_existing_raw_data_should_overridezWTestSaveAllTensorsAsExternalData.test_save_model_with_existing_raw_data_should_override  s    668 JJ,,88;DDJJ%%"&	
 	78T665
 #[[44Q7&8#%&8$--H+446GHr1   Nro   r   rp   r   )ru   rv   rw   r   ry   r0   r@   r   r   unittestskipIfrn   r   r   r   r   r   r   r   r   r   r   r   r   rz   r1   r/   r   r     s     !+#*4H	7			(6 X__
*D(	(GYU>V	VY	Y"X	X"E	E.D$E	E&U.!UFIr1   r   c                      e Zd ZU dZded<   ddZed        ZddZddZ	 e
j                  edk7  d      dd	       Zdd
ZddZddZy)TestExternalDataToArrayr   r   r   c                   t        j                         | _        | j                  j                  | _        t
        j                  j                  | j                  d      | _        t        j                  j                  ddd      j                  t        j                        | _        d| _        | j!                         | _        y )Nr_   
   <   d   )   i,  )r   r    r!   r"   r#   r;   r<   r=   _model_file_pathr$   randomrandr'   r(   
large_data
small_datar+   rj   r-   s    r/   r0   zTestExternalDataToArray.setUp>  s    %88:!//44%'WW\\$--%N))..R5<<RZZH$++-
r1   c                    | j                   S r3   )r	  r-   s    r/   r   z'TestExternalDataToArray.model_file_pathF  s    $$$r1   c                8    | j                   j                          y r3   r4   r-   s    r/   r6   z TestExternalDataToArray.tearDownJ  r7   r1   c                x   t        j                  dt        j                  | j                  j
                        }t        j                  dt        j                  | j                  j
                  | j                  j                         d      }t        j                  | j                  t        j                        }t        j                  dt        j                  |j
                  |j                         d      }t        j                  dt        j                  | j                        }t        j                   j                  dddgdg      }t        j                   j                  d	dgdgt        j                  
      }t        j                  ||gd|g|g||g      }t        j                   |d      }	|	S )NXT)r"   	data_typedimsvalsrawShapeCReshapeY)rY   rZ   Cast)rY   rZ   toz
test-model)r^   zonnx-example)producer_name)r
   ra   r   rb   r  rc   make_tensortobytesr$   rH   r  int64INT64rL   r`   rd   re   )
r.   r  
input_init
shape_data
shape_initr  r&   cast	graph_defrj   s
             r/   r+   z)TestExternalDataToArray.create_test_modelM  sm   ))#{/@/@$//BWBWX''!''&&((*

 XXdoorxx8
''!''!!##%

 ))#{/@/@$//R++''>E ( 

 {{$$C53%K4E4E % 
 %%dOCC#Z0
	 !!)>Jr1   r   c                B    t        j                  | j                         y r3   r   r-   s    r/   rn   z(TestExternalDataToArray.test_check_modelt  r   r1   c                0   t        j                  | j                  | j                  | j                  ddd       t        j
                  | j                  | j                  d      }| j                  t        j                  t        j                  |d       y )NTFr   r   r   r   r   )strict_mode)
rL   rf   rj   r   r   loadr   r   InferenceErrorinfer_shapes)r.   model_without_external_datas     r/   .test_reshape_inference_with_external_data_failzFTestExternalDataToArray.test_reshape_inference_with_external_data_fail{  s    JJ  %%"&$)	
 '+ii  $";";PU'
# 	**(('	 	 	
r1   c                |   t        j                  | j                  | j                  | j                  ddd       t        j
                  | j                  | j                  d      }t        |j                  j                  d   | j                        }t        j                  j                  || j                         y )NTFr   r(  r   )rL   rf   rj   r   r   r*  r   ri   r^   r#   r$   r   r   r  )r.   rj   loaded_large_datas      r/    test_to_array_with_external_dataz8TestExternalDataToArray.test_to_array_with_external_data  s    JJ  %%"&$)	
 		  $";";PU
 %U[[%<%<Q%?O


""#4dooFr1   c           
     0   t        j                  | j                  | j                  | j                  ddd dd       t        j
                  | j                  | j                  d      }|j                  j                  d   }| j                  |j                  d             t        j                  j                  t        || j                        | j                         |j                  j                  d   }| j                  |j                  d              t        j                  j                  t        |      | j                          t        j                  || j                  | j                  ddd dd       t        j
                  | j                  | j                  d      }|j                  j                  d   }| j                  |j                  d             t        j                  j                  t        || j                        | j                         |j                  j                  d   }| j                  |j                  d             t        j                  j                  t        || j                        | j                          y )	NTFr   r   r   r   rN   r   )rL   rf   rj   r   r   r*  ri   r^   r   r   r$   r   r   r   r#   r  r  )r.   model_without_loading_externallarge_input_tensorsmall_shape_tensors       r/   1test_save_model_with_external_data_multiple_timeszITestExternalDataToArray.test_save_model_with_external_data_multiple_times  s    	JJ  %%"&$)"		
 *.  $";";PU*
& <AAMMaP*33ODE


""'7	
 <AAMMaP.77HHI


""8,>#?Q 	*  %%"&$)"		
 *.  $";";PU*
& <AAMMaP*33ODE


""'7	
 <AAMMaP*33ODE


""'7	
r1   Nro   r   )ru   rv   rw   r   ry   r0   propertyr   r6   r+   r   r  rn   r.  r1  r6  rz   r1   r/   r  r  5  sm     !+#*. % %%%N X__
*D(	(
,G"5
r1   r  c                  B    e Zd ZdZ	 d	 	 	 	 	 	 	 ddZd	dZd	dZd	dZy)
3TestNotAllowToLoadExternalDataOutsideModelDirectoryEssential test to check that onnx (validate) C++ code will not allow to load external_data outside the model
    directory.
    c                    t        t        j                  |            }||_        |xs | d}t	        ||       |j                  d       t        j                  j                  |_	        |S )NrC   rD   rG   )
r   r$   rH   r"   r   rK   rL   r   rM   rN   )r.   rO   rP   rE   rQ   rR   s         r/   rT   zOTestNotAllowToLoadExternalDataOutsideModelDirectory.create_external_data_tensor  s_     BHHUO,!":T&:&?;*%#//88r1   c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)MWe only test the model validation as onnxruntime uses this to load the model.z../../file.binNr+   r,   r   rL   r	   r   rm   r-   s    r/   rn   zDTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model  sW    "445EFt||;;< 	5 3 34	5 	5 	5     A))A2c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)More relative path test.z../test/../file.binNr>  r-   s    r/   test_check_model_relativezMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_relative  sW    "445JKt||;;< 	5 3 34	5 	5 	5r?  c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)JONNX checker disallows using absolute path as location in external tensor.z
//file.binNr>  r-   s    r/   test_check_model_absolutezMTestNotAllowToLoadExternalDataOutsideModelDirectory.test_check_model_absolute  sV    "44\Bt||;;< 	5 3 34	5 	5 	5r?  Nrr   rt   ro   )ru   rv   rw   rx   rT   rn   rB  rE  rz   r1   r/   r9  r9    sB    
 CE-0<?	555r1   r9  ntzSkip Windows test)reasonc                  (    e Zd ZdZddZddZddZy)<TestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindowsr:  c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)r=  z..\..\file.binNr>  r-   s    r/   rn   zMTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model  sW    "445GHt||;;< 	5 3 34	5 	5 	5r?  c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)rA  z..\test\..\file.binNr>  r-   s    r/   rB  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_relative  sW    "445MNt||;;< 	5 3 34	5 	5 	5r?  c                    | j                  d      | _        | j                  t        j                  j
                        5  t	        j                  | j                         ddd       y# 1 sw Y   yxY w)rD  zC:/file.binNr>  r-   s    r/   rE  zVTestNotAllowToLoadExternalDataOutsideModelDirectoryOnWindows.test_check_model_absolute  sV    "44]Ct||;;< 	5 3 34	5 	5 	5r?  Nro   )ru   rv   rw   rx   rn   rB  rE  rz   r1   r/   rI  rI    s    555r1   rI  c                        e Zd Zd fdZ xZS )(TestSaveAllTensorsAsExternalDataWithPathc                F    t        j                  t        |                S r3   )pathlibPathsuperr@   )r.   	__class__s    r/   r@   z@TestSaveAllTensorsAsExternalDataWithPath.get_temp_model_filename  s    ||EG;=>>r1   rp   zpathlib.Path)ru   rv   rw   r@   __classcell__)rS  s   @r/   rN  rN    s    ? ?r1   rN  c                      e Zd Zedd       Zy)TestExternalDataToArrayWithPathc                @    t        j                  | j                        S r3   )rP  rQ  r	  r-   s    r/   r   z/TestExternalDataToArrayWithPath.model_file_path   s    ||D1122r1   NrT  )ru   rv   rw   r7  r   rz   r1   r/   rW  rW    s    3 3r1   rW  c                  D    e Zd Zd	dZd	dZd
dZd
dZddZd	dZd	dZ	y)TestFunctionsAndSubGraphsc                2   t        j                         | _        | j                  j                  }t        j
                  j                  |d      | _        t        j                  d      j                  t        j                        }t        |d      | _        y )Nr_   r   rQ   )r   r    r!   r"   r;   r<   r=   r	  r$   r%   r'   r(   r   _tensor)r.   r#   rH   s      r/   r0   zTestFunctionsAndSubGraphs.setUp&  se    %88:%%**%'WW\\(L%I		$&&rzz2!%2r1   c                8    | j                   j                          y r3   r4   r-   s    r/   r6   z"TestFunctionsAndSubGraphs.tearDown-  r7   r1   c                X    | j                  |j                  t        j                         y r3   )r   rN   r   r   r.   rQ   s     r/   _check_is_internalz,TestFunctionsAndSubGraphs._check_is_internal0  s    --{/B/BCr1   c                X    | j                  |j                  t        j                         y r3   )r   rN   r   rM   r_  s     r/   _check_is_externalz,TestFunctionsAndSubGraphs._check_is_external3  s    --{/C/CDr1   c                R   |D ]c  }| j                  |j                  d       |j                  d   j                  }|j	                  | j
                         | j                  |       e t        |dd       |D ],  }|j                  d   j                  }| j                  |       . y)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.

        rV   r   Tr   N)	r   op_typer   r   CopyFromr\  r`  r   rb  )r.   rj   nodesr   rQ   s        r/   _checkz TestFunctionsAndSubGraphs._check6  s      	,DT\\:6^^A&((FOODLL)##F+		, 	'uQRVW 	,D^^A&((F##F+	,r1   c                    d}t        j                  |      }| j                  ||j                  d   j                  d   g       y )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_modelrg  	functionsr   )r.   
model_textrj   s      r/   test_functionz'TestFunctionsAndSubGraphs.test_functionN  s@    
 "":.EEOOA.33A678r1   c                    d}t        j                  |      }|j                  j                  d   }|j                  D cg c]  }|j
                  j                  d    }}| j                  ||       y c c}w )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   )r   ri  ri   r   r   grg  )r.   rk  rj   if_nodeattrconstant_nodess         r/   test_subgraphz'TestFunctionsAndSubGraphs.test_subgraph_  sh    
  "":.++""1%5<5F5FGT$&&++a.GGE>* Hs    A4Nro   )rQ   r   rp   rq   )rj   r   rf  zSequence[NodeProto]rp   rq   )
ru   rv   rw   r0   r6   r`  rb  rg  rl  rr  rz   r1   r/   rZ  rZ  %  s'    3%DE,09"+r1   rZ  __main__)/
__future__r   r   r;   rP  r   r   r>   typingr   r   numpyr$   r   rL   r   r   r   r	   r
   r   r   onnx.external_data_helperr   r   r   r   r   onnx.numpy_helperr   r   TestCaser   parameterized_classr}   r   r   r  r9  r  r"   rI  rN  rW  rZ  ru   mainrz   r1   r/   <module>r|     s   #  	             3K1x00 K1\ #""	,	-!U3 !U!UH #""	,	-aL%= aLaLH #""	,	-eIx'8'8 eIeIP	 #""	,	-\
h// \
\
~"5:R "5J D)<=575 >54?/O ?
3&= 3N+ 1 1 N+b zHMMO r1   