
    hx]                     f    S SK Jr  S SKrS SKJr  S SKJr  S SK	J
r
  SSKJrJr  S r " S S5      rg)	    )PathN)
ModelProto   )attribute_to_kwargfind_by_namec                    [        5       nUR                  S U R                   5       5        UR                  S U R                   5       5        / nU R                   GH  nUnUR                   Vs/ s HW  nUR
                  [        R                  R                  :X  d*  UR
                  [        R                  R                  :X  d  MU  UPMY     nnU(       GaT  0 nUR                   H  n0 n	UR
                  [        R                  R                  :X  a9  [        UR                  U5      u  n
nUR                  U
0n	UR                  U5        OUR
                  [        R                  R                  :X  aT  / nUR                   H3  n[        X5      u  n
nUR                  U
5        UR                  U5        M5     UR                  U0n	O[        U5      n	UR                  U	5        GM     [         R"                  " UR$                  UR&                  UR                  4SUR                  0UD6nUR                  U5        GM     U R)                  S5        U R                  R+                  U5        UR-                  S U R                   5       5        / nU R.                   HA  nUR                  U;   a  UR1                  UR                  5        M0  UR                  U5        MC     U R&                   Vs0 s H  nUR                  U_M     nnU HY  nU R.                  R1                  U5        UR                  U;   d  M0   U R&                  R1                  UUR                     5        M[     UR-                  S	 U R&                   5       5        X4$ s  snf s  snf ! [2         a0    UR4                  S:  a  [7        SUR                   S35         M   M  f = f)
zClean unused initializers from graph.

Returns:
    A cleaned graph without unused initializers
    A list of tensor names, which are not produced by this graph and its subgraphes
c              3   \   #    U  H"  oR                     H  o"(       d  M  Uv   M     M$     g 7fN)input).0node
input_names      ]/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/onnx_model.py	<genexpr>-_clean_initializers_helper.<locals>.<genexpr>   s"     "p*$WaWaeo::Wa:*s   ,,c              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7fr
   name)r   g_outs     r   r   r      s     "V<%:::5::<s   --r   r   c              3   J   #    U  H  oR                     H  o"v   M     M     g 7fr
   )output)r   r   r   s      r   r   r   @   s     -fZeZePVfZefs   !#   zWarning: invalid weight name z' found in the graph (not a graph input)c              3   8   #    U  H  oR                   v   M     g 7fr
   r   )r   r   s     r   r   r   T   s     -RkUjjks   )setupdater   r   	attributetypeonnxAttributeProtoGRAPHGRAPHS_clean_initializers_helpergr   graphsappendr   onnx_helper	make_nodeop_typer   
ClearFieldextenddifference_updateinitializerremoveStopIteration
ir_versionprint)graphmodelrequesting_tensor_names	new_nodesr   new_nodeattrgraph_attrskwargsnew_attributecleaned_sub_graphsub_requesting_tensor_namescleaned_graphessubgraphunused_initializerr,   r   name_to_inputs                     r   r"   r"      sD    "e"""p%**"pp"""V5<<"VVI

 
&yyD//555dFYFYF`F`9` & 	 

 F "99 3 3 9 99 34665A)3%)YY0A$BM+223NOYY$"5"5"<"<<&(O$(KK 7xG-7'../@A/667RS %0 &*YY$@M$6t$<Mm,+ ', #,,T\\4::t{{mY]YbYbmflmH"A D 
V	JJi ---f-ff((66#**;+;+;< %%k2 ) 5:KK@K5UZZ&KM@)  -},u""=1A1A#BC	 * ---Rekk-RR))s
Z A ! u##a'9+:J:J9KKrst (us%   1AN	N2N>(N3OOc                      \ rS rSrS\4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS\4S jrS rS rS rS rS rS rS rS7S jrS7S jrS7S jr S  r!S! r"S" r#S# r$\%S$ 5       r&\%S% 5       r'S& r(S8S' jr)\%S( 5       r*S) r+S* r,\%S+ 5       r-S, r.S- r/S. r0S/ r1S\S0\24S1 jr3S2 r4S3 r5S7S4 jr6S5 r7S6r8g)9	ONNXModelY   r2   c                     Xl         g r
   r2   )selfr2   s     r   __init__ONNXModel.__init__Z   s    
    c                 B    U R                   R                  R                  $ r
   )r2   r1   r   rE   s    r   nodesONNXModel.nodes]   s    zz$$$rH   c                 B    U R                   R                  R                  $ r
   )r2   r1   r,   rJ   s    r   r,   ONNXModel.initializer`   s    zz+++rH   c                    [        U5      S:X  a  [        S5      eU R                  5        H  nU R                  US5        M     U HC  nU R                  U5        U R                  R
                  R                  R                  U5        ME     g )Nr   zCan add an empty list.gain)len
ValueErrorr,   _check_initr2   r1   r%   )rE   initsinits      r   initializer_extendONNXModel.initializer_extendc   sr    u:?566$$&DT6* 'DT"JJ((//5 rH   c                 .    U R                   R                  $ r
   )r2   r1   rJ   s    r   r1   ONNXModel.graphl   s    zzrH   c                 .    U R                   R                  $ r
   )r2   r/   rJ   s    r   r/   ONNXModel.ir_versiono   s    zz$$$rH   c                 .    U R                   R                  $ r
   )r2   opset_importrJ   s    r   r]   ONNXModel.opset_importr   s    zz&&&rH   c                     U R                   R                   H  nUR                  U:X  d  M  X#l          g    U R                   R                  R	                  [
        R                  " X5      /5        g r
   )r2   r]   domainversionr*   r&   make_opsetid)rE   r`   ra   opsets       r   set_opset_importONNXModel.set_opset_importu   sR    ZZ,,E||v% ' -
 	

&&(@(@(Q'RSrH   c                     XR                   R                  R                  ;   a0  U R                   R                  R                  R                  U5        g g r
   )r2   r1   r   r-   rE   r   s     r   remove_nodeONNXModel.remove_node}   s;    ::##(((JJ!!((. )rH   c                 8    U H  nU R                  U5        M     g r
   )rh   )rE   nodes_to_remover   s      r   remove_nodesONNXModel.remove_nodes   s    #DT" $rH   c                     U R                   R                  R                  R                  U R	                  U5      /5        g r
   )r2   r1   r   r*   _check_noderg   s     r   add_nodeONNXModel.add_node   s.    

$$d&6&6t&<%=>rH   c                 8    U H  nU R                  U5        M     g r
   )rp   )rE   nodes_to_addr   s      r   	add_nodesONNXModel.add_nodes   s     DMM$ !rH   c                     [        UR                  U R                  R                  R                  5      cB  U R                  U5        U R                  R                  R                  R                  U/5        g g r
   )r   r   r2   r1   r,   rS   r*   )rE   tensors     r   add_initializerONNXModel.add_initializer   sW    TZZ%5%5%A%ABJV$JJ((//9 KrH   c                 z    U R                   R                  R                   H  nUR                  U:X  d  M  Us  $    g r
   r2   r1   r,   r   )rE   r   rw   s      r   get_initializerONNXModel.get_initializer   s2    jj&&22F{{d" 3 rH   c                 z    U R                   R                  R                   H  nUR                  U:X  d  M  Us  $    g r
   )r2   r1   r   r   )rE   r   r   s      r   find_graph_inputONNXModel.find_graph_input   s2    ZZ%%++EzzZ' , rH   c                 z    U R                   R                  R                   H  nUR                  U:X  d  M  Us  $    g r
   )r2   r1   r   r   )rE   output_namer   s      r   find_graph_outputONNXModel.find_graph_output   s2    jj&&--F{{k) . rH   tensor_namec                 t   U R                   R                  R                   Vs0 s H  o"R                  UR                  _M     nnX;   a  X1   R
                  $ U R                  U5      nU(       a  UR                  R
                  $ U R                  U5      nU(       a  UR                  R
                  $ g s  snf r
   )r2   r1   
value_infor   r   tensor_typer   r   )rE   r   objtensor_type_mapg_inputg_outputs         r   get_tensor_typeONNXModel.get_tensor_type   s    9=9I9I9T9TU9T#88SXX-9TU)"/;;;''4<<+++))+6==,,, Vs    B5c                    U R                   R                  R                   Hq  nUR                  S:X  d  M  UR                  S   U:X  d  M*  UR
                   H7  nUR                  S:X  d  M  [        R                  " UR                  5      s  s  $    Ms     U R                  U5      nUb  [        R                  " U5      $ g )NConstantr   value)r2   r1   r   r(   r   r   r   onnx_numpy_helperto_arraytr|   )rE   r   r   r6   r,   s        r   get_constant_valueONNXModel.get_constant_value   s    JJ$$))D||z);;q>[0 $99/#4#=#=dff#EE !/ * **;7"$--k::rH   c                     U R                   R                  R                   Vs1 s H  oR                  iM     sn$ s  snf r
   r{   )rE   r,   s     r   get_initializer_name_set"ONNXModel.get_initializer_name_set   s0    48JJ4D4D4P4PQ4P[  4PQQQs   ;c                    XR                   R                  R                  ;   a  U R                   R                  R                  R                  U5        U R                   R                  R                   HN  nUR
                  UR
                  :X  d  M  U R                   R                  R                  R                  U5          g    g g r
   )r2   r1   r,   r-   r   r   )rE   rw   r   s      r   remove_initializerONNXModel.remove_initializer   s    ZZ%%111JJ((//7))//::,JJ$$**11%8 0 2rH   c                 8    U H  nU R                  U5        M     g r
   )r   )rE   init_to_remover,   s      r   remove_initializersONNXModel.remove_initializers   s    )K##K0 *rH   c                     U R                  5       n[        5       nU R                  R                  R                   H0  nUR
                  U;  d  M  UR                  UR
                  5        M2     U$ r
   )r   r   r2   r1   r   r   add)rE   initializer_namesnon_initializer_inputsr   s       r   get_non_initializer_inputs$ONNXModel.get_non_initializer_inputs   sZ     99;!$ZZ%%++Ezz!22&**5::6 , &%rH   c                     0 nU R                   R                  R                   H>  nUR                   H+  nU(       d  M  X1;  a  U/X'   M  X   R	                  U5        M-     M@     U$ r
   )r2   r1   r   r   r%   )rE   input_name_to_nodesr   r   s       r   r   ONNXModel.input_name_to_nodes   s_     JJ$$))D"jj
:!<;?&+7+7>>tD ) * #"rH   c                     0 nU R                   R                  R                   H#  nUR                   H  nU(       d  M  X!U'   M     M%     U$ r
   )r2   r1   r   r   )rE   output_name_to_noder   r   s       r   r   ONNXModel.output_name_to_node   sE     JJ$$))D#{{;7;4  + * #"rH   Nc                     Uc  U R                  5       n/ nUR                   H&  nXB;   d  M
  X$    H  nUR                  U5        M     M(     U$ r
   )r   r   r%   )rE   r   r   childrenr   s        r   get_childrenONNXModel.get_children   sP    &"&":":"<kkF,/7DOOD) 8 " rH   c                     Uc  U R                  5       n/ nUR                   H  nXB;   d  M
  UR                  X$   5        M     U$ r
   )r   r   r%   )rE   r   r   parentsr   s        r   get_parentsONNXModel.get_parents   sG    &"&":":"<ZZE+29:   rH   c                     Uc  U R                  5       n[        UR                  5      U::  a  g UR                  U   nXC;  a  g X4   $ r
   )r   rQ   r   )rE   r   idxr   r   s        r   
get_parentONNXModel.get_parent  sI    &"&":":"<tzz?c!

3+"))rH   c                 h    [        UR                  5      nUR                  U5        [        X5      nU$ )zFind out if a node exists in a graph or a node is in the
new set of nodes created during quantization.

Returns:
    The node found or None.
)listr   r*   r   )rE   	node_namenew_nodes_listr1   graph_nodes_listr   s         r   find_node_by_nameONNXModel.find_node_by_name  s0      

+/I8rH   c                 >   SnU R                   R                  R                   He  nUR                  (       d  M  UR                  R	                  U5      (       d  M8   [        UR                  [        U5      S 5      n[        XB5      nMg     U$ ! [         a     Mx  f = f)z
Gets the largest node name (int) suffix for all node names that begin with `node_name_prefix`.
Example: for nodes my_prefix_0 and my_prefix_3, this method returns 3.
N)	r2   r1   r   r   
startswithintrQ   maxrR   )rE   node_name_prefixsuffixr   indexs        r   get_largest_node_name_suffix&ONNXModel.get_largest_node_name_suffix  s    
 JJ$$))DyyyTYY112BCC		#.>*?*A BCE /F	 *  " s   ,B
BBc                    SnU R                   R                  R                   HR  nUR                  R	                  U5      (       d  M%   [        UR                  [        U5      S 5      n[        XB5      nMT     U$ ! [         a     Me  f = f)a:  
Gets the largest initializer name integer suffix for all initializer names that begin
with `initializer_name_prefix`. This can be used to create unique initializer names.

Example: for initializer names 'my_weight_0' and 'my_weight_3', this method returns 3 if
         `initializer_name_prefix` is 'my_weight_'.
r   N)	r2   r1   r,   r   r   r   rQ   r   rR   )rE   initializer_name_prefixr   r,   r   s        r   #get_largest_initializer_name_suffix-ONNXModel.get_largest_initializer_name_suffix+  s     ::++77K**+BCC 0 05L1M1O PQE /F	 8  " s   	,A;;
B	B	c                     / nUR                    H8  nUR                   H%  nXRR                  :X  d  M  UR                  U5        M'     M:     U$ )z4
Find all nodes with given initializer as an input.
)r   r   r   r%   )rE   r1   r,   rK   r   
node_inputs         r   find_nodes_by_initializer#ONNXModel.find_nodes_by_initializer?  sD     JJD"jj
!1!11LL& )  rH   c                     [        [        U5      S-
  SS5       H1  nX   nUR                   H  nUR                  U :X  d  M  XC4s  s  $    M3     g)Nr   r   )NN)rangerQ   r,   r   )r   
graph_pathgidr1   rw   s        r   __get_initializerONNXModel.__get_initializerJ  sN    Z1,b"5COE++;;$&!=( , 6
 rH   c           	      
   / nU S   nUR                    GH  nUR                   Vs/ s H&  oDR                  S:X  d  UR                  S:X  d  M$  UPM(     nnU(       Ga+  0 nUR                   H  nUR                  S:X  a=  U R                  UR                  5        UR
                  [        R                  U 5      0nOuUR                  S:X  aZ  / nUR                   H9  n	U R                  U	5        UR                  [        R                  U 5      /5        M;     UR
                  U0nO[        U5      nUR                  U5        M     [        R                  " UR                  UR                  UR                   4SUR
                  0UD6nUR                  S:X  GaU  Sn
SnSnSnUR                   H  nUR
                  S:X  a  [        R"                  " U5      n
M+  UR
                  S	:X  a  [        R"                  " U5      nMS  UR
                  S
:X  a  [        R"                  " U5      nM{  UR
                  S:X  d  M  [        R"                  " U5      nM     U
S:X  Ga  US:X  Gax  US:X  Gaq  UR                  S   nUS:X  GaH  [        R%                  UR                  S   U 5      u  nnU(       a  [&        R(                  " U5      n[&        R*                  " UR,                  5      nUR
                  Ul        UR.                  R1                  U5        UR                   H0  nUR
                  U:X  d  M  UR                  R1                  U5          O   UR.                  R                  U/5        O\US-  n[        R                  " SUR                  S   /U/UR
                  (       a  UR
                  S-   OSS9nUR                  U5        [        R                  " SUR                  S   U/UR                   S   [3        UR                  5      S:  a  SOS-   /UR
                  (       a  UR
                  S-   OSS9nUR                  U5        [3        UR                  5      S:  at  [        R                  " SUR                   S   S-   UR                  S   /UR                   UR
                  (       a  UR
                  S-   OSS9nUR                  U5        GM  GM  UR                  U5        GM  UR                  U5        GM     UR5                  S5        UR                   R                  U5        U R7                  5         U$ s  snf )Nr      
   r   Gemmg      ?r   alphabetatransAtransBr   _Transposed	Transpose
_Transpose )inputsoutputsr   MatMul   _MatMulAdd_Addr   )r   r   r   r%   r#   r   rA   $_ONNXModel__replace_gemm_with_matmulr$   r*   r   r   r&   r'   r(   r   r   get_attribute_value_ONNXModel__get_initializerr   r   
from_arrayTr,   r-   rQ   r)   pop)r   r4   r1   r   r6   r7   r8   kvr   r=   r   r   r   r   inputBBBs_graphB_arrayB_transr   transpose_nodematmul_noderp   s                          r   __replace_gemm_with_matmul$ONNXModel.__replace_gemm_with_matmulS  s>   	2JJD,0NN`NDii1nPTPYPY]_P_4NK` NNDyyA~"))$&&1"ii)M)Mj)YZb "(,H&--h7!LL)*N*Nz*Z)[\ )4 #ii//5MM"% + #,,LL$**dkk@D		MS ||v% NNDyyG+ + ? ? Ef,*>>tDh.!,!@!@!Fh.!,!@!@!F + C<DCKFaK!ZZ]F{&/&A&A$**Q-Q[&\8&7&@&@&CG&7&B&B799&MG+,66GL$0077:)1#(::#7$,NN$9$9%$@$) *8 %0077	B"m3F-8-B-B +(,

1)/AETYY%=PR	.N &,,^<"-"7"7  $

1v6!%QDJJRS@S9Y[!\ ]6:iiTYY2R	#K $$[14::*#.#8#8!$(KKNY$>

1#N$(KK7;yyV!3b	$ "((2 + $$T*   &g j 	 

)$o as   #UUc                 P    U R                  5       /n[        R                  U5        g r
   )r1   rA   r   )rE   r   s     r   replace_gemm_with_matmul"ONNXModel.replace_gemm_with_matmul  s    jjl^
,,Z8rH   c                 f   U R                  5         U(       a@  [        R                  R                  U R                  S[        U5      R                  S-   SS9  U R                  R                  R                   H  nU R                  US5        M     [        R                  " U R                  U5        g)zC
Save model to external data, which is needed for model size > 2GB
Tz.data)all_tensors_to_one_filelocationconvert_attributeendN)topological_sortr   external_data_helperconvert_model_to_external_datar2   r   r   r1   r,   rS   
save_model)rE   output_pathuse_external_data_formatrU   s       r   save_model_to_fileONNXModel.save_model_to_file  s     	#%%DD

(,k*//'9"&	 E  JJ$$00DT5) 1

K0rH   c                     [        U[        5      (       a  [        U[        5      (       d   e[        [        U R                  5      5       H&  nU R                  U   U:X  d  M  X R                  U'   M(     g r
   )
isinstancestrr   rQ   r   )r   old_input_namenew_input_namejs       r   replace_node_inputONNXModel.replace_node_input  sS    .#..:nc3R3RRRs4::'Azz!}. .

1 (rH   c                 ~    U R                   R                  R                   H  n[        R	                  X1U5        M     g r
   )r2   r1   r   rA   r  )rE   r  r  r   s       r   replace_input_of_all_nodes$ONNXModel.replace_input_of_all_nodes  s,    JJ$$))D((~N *rH   c                     U R                   R                  R                   H+  nUR                  U;   d  M  [        R                  XAU5        M-     g r
   )r2   r1   r   r   rA   r  )rE   r  r  node_names_setr   s        r   replace_input_of_nodes ONNXModel.replace_input_of_nodes  s8    JJ$$))DyyN*,,T>R *rH   c                     [        U[        5      (       a  [        U[        5      (       d   e[        [        U R                  5      5       H&  nU R                  U   U:X  d  M  X R                  U'   M(     g r
   )r  r  r   rQ   r   )r   old_output_namenew_output_namer  s       r   replace_node_outputONNXModel.replace_node_output  sU    /3//JPS4T4TTTs4;;'(A{{1~0!0A )rH   c                 ~    U R                   R                  R                   H  n[        R	                  X1U5        M     g r
   )r2   r1   r   rA   r  )rE   r  r  r   s       r   replace_output_of_all_nodes%ONNXModel.replace_output_of_all_nodes  s,    JJ$$))D))$Q *rH   c                     U R                   R                  R                   H+  nUR                  U;   d  M  [        R                  XAU5        M-     g r
   )r2   r1   r   r   rA   r  )rE   r  r  r  r   s        r   replace_output_of_nodes!ONNXModel.replace_output_of_nodes  s8    JJ$$))DyyN*--d_U *rH   c                    U R                  5       n/ nU R                  5       nU H`  nUR                  S:X  d  M  U R                  UR                  S   5      (       a  M:  UR                  S   U;  d  MO  UR                  U5        Mb     U R                  U5        / nU R                  5        H  nUR                  U;  d  M  U R                  UR                  5      (       a  M7  UR                  U5        U R                  5       R                   HH  nUR                  UR                  :X  d  M  U R                  5       R                  R                  U5        MJ     M     U R                  U5        g )Nr   r   )r   rK   r(   is_graph_outputr   r%   rl   r,   r   r1   r   r-   r   )rE   r   unused_nodesrK   r   ununsed_weightswgraph_inputs           r   remove_unused_constant ONNXModel.remove_unused_constant  s   "668 

D
*,,T[[^<<KKN*==##D)  	,'!!#Avv009M9Maff9U9U&&q)#'::<#5#5K"''1661

**11+> $6	 $ 	  1rH   c                 j   ^ [        U4S jU R                  R                  R                   5       5      $ )Nc              3   @   >#    U  H  oR                   T:H  v   M     g 7fr
   r   )r   r   r   s     r   r   ,ONNXModel.is_graph_output.<locals>.<genexpr>  s     T<S&;;+-<S   )anyr2   r1   r   )rE   r   s    `r   r&  ONNXModel.is_graph_output   s$    TDJJ<L<L<S<STTTrH   returnc                 j   ^ [        U4S jU R                  R                  R                   5       5      $ )Nc              3   @   >#    U  H  oR                   T:H  v   M     g 7fr
   r   )r   r   r   s     r   r   +ONNXModel.is_graph_input.<locals>.<genexpr>  s     Q:P::,:Pr0  )r1  r2   r1   r   )rE   r   s    `r   is_graph_inputONNXModel.is_graph_input  s$    Q$**:J:J:P:PQQQrH   c                 4   S/[        U R                  5       5      -  n0 n/ n[        U R                  5       5       H  u  pE[        S UR                   5       5      X'   X   S:X  a$  UR                  U R                  5       U   5        MO  UR                   H+  nU(       d  M  Xb;  a  U/X&'   M  X&   R                  U5        M-     M     U R                  5        Vs/ s H  owR                  PM     nnU R                  R                  R                   V	s/ s H  oR                  PM     n
n	X-   nUR                  5         S nU HS  nX:X  a  M
  UnXb;   d  M  X&    H8  nX   S-
  X'   X   S:X  d  M  UR                  U R                  5       U   5        M:     MU     Sn[        U5      nX:  am  X=   R                   HO  nX;   d  M
  X/    H=  nX   S-
  X'   X   S:X  d  M  UR                  U R                  5       U   5        US-   nM?     MQ     US-   nX:  a  Mm  U[        U R                  5       R                  5      :X  d   S5       eU R                  5       R                  S5        U R                  5       R                  R                  U5        g s  snf s  sn	f )Nr   c              3   6   #    U  H  o(       d  M  S v   M     g7f)r   N )r   _s     r   r   -ONNXModel.topological_sort.<locals>.<genexpr>  s     &B*Qqq*s   
	r   zGraph is not a DAGr   )rQ   rK   	enumeratesumr   r%   r,   r   r2   r1   sortr   r   r)   r*   )rE   
deps_countdeps_to_nodessorted_nodesnode_idxr   r   rU   r   r   graph_input_namesinput_namesprev_input_namestartr  r   s                   r   r  ONNXModel.topological_sort  s[   S3tzz|,,
'

5NH#&&B$**&B#BJ #q(##DJJL$:;"jj
!219
M-!-44X> ) 6 483C3C3EF3E4YY3EF59ZZ5E5E5K5KL5KEZZ5KL';%J,(O* - 9H+5+?!+CJ(!+q0$++DJJL,BC !: & ,k&-44*$1$9/9/Ca/G
,%/14(//

X0FG"%'C	 %: 5 AIE k c$**,++,,B.BB,

'

  .? GLs   JJc                 J    [        U R                  5       U R                  5      $ r
   )r"   r1   r2   rJ   s    r   clean_initializersONNXModel.clean_initializers<  s    )$**,

CCrH   c                    UR                   [        R                  R                  :X  a\  UR	                  S5      (       aF  [        UR                  5      n[        S U 5       5      (       a  [        SUR                  < S35      eU$ )Nraw_datac              3   0   #    U  H  oS -  S :H  v   M     g7f)   Nr;  )r   is     r   r   (ONNXModel._check_init.<locals>.<genexpr>C  s     3ACC's   zInitializer z	 has nan.)
	data_typer   TensorProtoFLOAT8E4M3FNHasFieldr   rN  r1  rR   r   )rE   rU   testbs       r   rS   ONNXModel._check_init?  se    >>T--:::}}Z(('3333$|DII=	%JKKrH   c                 p   UR                   S:X  a  UR                  S   nU R                  U5      nUR                  nU[        R
                  R                  [        R
                  R                  [        R
                  R                  [        R
                  R                  1;   a  [        SU S35      eU$ )z
A quantization to float 8 does not use quantized bias but float 16 bias.
This function checks that DequantizeLinear is not used to
dequantize from float 16.
DequantizeLinearr   z;Unsupported DequantizeLinear operator, dequantization from .)r(   r   r|   rS  r   rT  FLOAT16FLOATDOUBLEBFLOAT16RuntimeError)rE   r   
zero_pointrU   dtypes        r   ro   ONNXModel._check_nodeG  s     <<--AJ''
3DNNE  ((  &&  ''  ))	  #%`af`ggh#ijjrH   rD   r
   )F)9__name__
__module____qualname____firstlineno__r   rF   rK   r,   rV   r1   r/   r]   rd   rh   rl   rp   rt   rx   r|   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r	  r  r  r  r  r   r#  r+  r&  boolr7  r  rK  rS   ro   __static_attributes__r;  rH   r   rA   rA   Y   sY   j %,6 %'T/#? :
3  R1&	##	*
"(	   [ [z91  / /OS
 1 1RV
26UR# R$ R
2/hDrH   rA   )pathlibr   r   onnx.helperhelperr&   onnx.numpy_helpernumpy_helperr   onnx.onnx_pbr   quant_utilsr   r   r"   rA   r;  rH   r   <module>rs     s,   
   ! - # 9G*T rH   