
    ig                        S SK r S SKJrJrJrJr  S SKJr  S SKrS SK	rS SK
rS SKr\\\R                  4   r\\   r\\\   \4   r     SS\\\R(                  4   S\\\R(                  4   S\S\\   S\\   S	\\   S
\4S jjrg)    N)ListDictOptionalUnion)OrderedDict	model_opt	model_orin_timesinput_shapes
input_data
custom_libreturnc                 0  ^^^^^^ S[         R                  S[        [           4S jmS[         R                  S[
        S[        [         R                     4S jmS[         R                  S[
        S[        4UU4S jjmS[         R                  S[
        S[        [           4U4S jjmS	[        S[        4S
 jmS[         R                  S[        [
           4S jm SS[        [
        [         R                  4   S[        [           4UUUU4S jjjn SS[        [
        [         R                  4   S[        S[        [
           S[        [
        [        R                  4   4S jjnUc  0 n[         R                  R                  U 5        [!        U5       H  n	[#        SU	 SU S35        Uc  U" XS9n
OUn
U" XU5      nU" X
U5      nUR%                  5        H  n[        R&                  " X   X   SSS9(       a  M%  U(       a  [#        SR)                  U[        R*                  " [        R,                  " X   X   -
  5      5      5      5        [#        S5        [#        X   5        [#        S5        [#        X   5        [#        S5            g   M     g) a5  
:param model_opt: The simplified ONNX model
:param model_ori: The original ONNX model
:param n_times: Generate n random inputs
:param input_shapes: Shapes of generated random inputs
:param input_data: User-given data instead of random generated data
:param custom_lib: ONNX Runtime custom lib for custom ops
vr   c                     U R                   R                  R                  R                   Vs/ s H  oR                  PM     sn$ s  snf N)typetensor_typeshapedim	dim_value)r   r   s     U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxsim/model_checking.pyget_shape_from_value_info_proto0compare.<locals>.get_shape_from_value_info_proto!   s4    )*););)A)A)E)EF)E#)EFFFs   Amnamec                 *   U R                   R                   H  nUR                  U:X  d  M  Us  $    U R                   R                   H  nUR                  U:X  d  M  Us  $    U R                   R                   H  nUR                  U:X  d  M  Us  $    g r   )graph
value_infor   inputoutput)r   r   r   s      r   get_value_info_all#compare.<locals>.get_value_info_all$   su     ##Avv~ $ Avv~  Avv~       c                 ^   > T" X5      nUb  T" U5      $ [        SR                  U5      5      e)zt
Note: This method relies on onnx shape inference, which is not reliable. So only use it on input or output tensors
zCannot get shape of "{}")RuntimeErrorformat)r   r   r   r   r"   s      r   	get_shapecompare.<locals>.get_shape5   s6     q'=21555<<TBCCr$   c                 \   > T" X5      nUb   UR                   R                  R                  $ g r   )r   r   	elem_type)r   r   r   r"   s      r   get_elem_typecompare.<locals>.get_elem_type>   s+    q'=66%%///r$   r+   c                    S [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [        [        [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  4n[!        U5      S:X  d   eX   nUc   eU$ )N   )npfloat32uint8int8uint16int16int32int64strboolfloat16doubleuint32uint64	complex64
complex128len)r+   sizessizes      r   get_np_type_from_elem_type+compare.<locals>.get_np_type_from_elem_typeD   s    JJHHGGIIHHHHHHJJIIIIIILLMMJJ#
& 5zRr$   modelc           	         [        [        U R                  R                   Vs/ s H  oR                  PM     sn5      [        U R                  R
                   Vs/ s H  o"R                  PM     sn5      -
  5      nU$ s  snf s  snf r   )listsetr   r    r   initializer)rE   iptxinput_namess       r   get_input_names compare.<locals>.get_input_names]   sk    U[[%6%67%6c%6785;;#:#:;#:a66#:;<=
  8;s   A?Br   c                   > Uc  0 n[        U [        5      (       a  [        R                  " U SS9n T
" U 5      nU Vs0 s H  o3T" X5      _M     nnS U;  d   eUR	                  U5        UR                  5        Hu  u  pV[        USS   Vs/ s H  owS:*  PM	     sn5      (       a  [        SR                  U5      5      e[        U5      S:  d  MV  US   S::  d  Ma  [        SU S35        SUS'   Mw     U Vs0 s HB  nU[        R                  " [        R                  R                  " XC   6 T" T	" X5      5      S9_MD     nnU$ s  snf s  snf s  snf )	NF)load_external_data   r   zdThe shape of input "{}" has dynamic size, please set an input shape manually with --test-input-shapezshape[0] of input "z" is dynamic, we assume it presents batch size and set it as 1 when testing. If it is not wanted, please set the it manually by --test-input-shape (see `onnxsim -h` for the details).)dtype)
isinstancer8   onnxloadupdateitemsanyr&   r'   r@   printr0   arrayrandomrand)rE   r   rL   rJ   full_input_shapesr   r   r   inputsr,   rM   rC   r(   s            r   generate_rand_input$compare.<locals>.generate_rand_inputd   sp    LeS!!IIe>E%e,CNO;C)E"77;O<'''  .,224KDab	2	1H	233"QQWQWX\Q]  5zA~%(a-+D6  2h  i  ja 5 #

 #	 		 1 670u1JK  # 	 
 ) P 3
s   EE	
7A	Er^   r   c                 ~   [         R                  " 5       nUbP  [        R                  R	                  U5      (       a  UR                  U5        O[        SR                  U5      5      e[         R                  " S5      Ul	        SUl
        [        U [        R                  5      (       a  U R                  5       n [         R                  " U US/S9nUR!                  5        Vs/ s H  oUR"                  PM     nn[         R$                  " 5       nSUl
        ['        [)        XdR+                  XaUS95      5      nU$ s  snf )NzNo such file '{}'r      CPUExecutionProvider)sess_options	providers)run_options)rtSessionOptionsospathexistsregister_custom_ops_library
ValueErrorr'   GraphOptimizationLevelgraph_optimization_levellog_severity_levelrS   rT   
ModelProtoSerializeToStringInferenceSessionget_outputsr   
RunOptionsr   ziprun)	rE   r^   r   rd   sessrK   outputsrf   ress	            r   forwardcompare.<locals>.forward   s   
 ((*!ww~~j))88D !4!;!;J!GHH020I0I!0L-*+'eT__--++-E""%-.

 $(#3#3#56#5a66#56mmo)*&'{KL
 
 7s   #D:z	Checking /z...)r   g-C6?gh㈵>)rtolatolz9Tensor {} changes after optimization. The max diff is {}.zAfter optimization:zBefore optimization:z----------------FTr   )rT   ValueInfoProtor   intrq   r8   r   TensorShaper   TensorShapesTensorsr   r0   ndarraycheckercheck_modelrangerY   keysallcloser'   maxabs)r   r	   r
   r   r   r   verboser_   r{   ir^   res_orires_optr   r,   rM   rC   r(   r   r"   s                 @@@@@@r   comparer      sS   $G4+>+> G49 G??"%	$%%	&"DT__ DC DK D D   c c 2t 49  04S$//)*|, D )-doo-. ! 
c2::o		8 LLY'7^	!AgYc*+(NFF)Z8)Z8LLND;;w}gm$TRRSZZ "&&0M)N"O
 /0'-(01'-(,- # . r$   )   NNNT)ri   typingr   r   r   r   collectionsr   rT   onnx.checkernumpyr0   onnxruntimerg   r8   r   r   r   r   r   rq   r9   r    r$   r   <module>r      s    	 . . #    
sBJJ
3iHSM;./ +/$( $jS$//)*jS$//)*j j <(	j
 !j j 
jr$   