
     Ng]                     n    d dl mZ d dlZd dlmZ d dlmZ d dl	m
Z
 ddlmZmZ d Z G d d          ZdS )	    )PathN)
ModelProto   )attribute_to_kwargfind_by_namec                    t                      }|                    d | j        D                        |                    d | j        D                        g }| j        D ]H}|}d |j        D             }|ri }|j        D ]}i }	|j        t          j        j        k    r7t          |j
        |          \  }
}|j        |
i}	|                    |           n||j        t          j        j        k    rSg }|j        D ]?}t          ||          \  }
}|                    |
           |                    |           @|j        |i}	nt          |          }	|                    |	           t!          j        |j        |j        |j        fd|j        i|}|                    |           J|                     d           | j                            |           |                    d | j        D                        g }| j        D ];}|j        |v r|                    |j                   &|                    |           <d | j        D             }|D ]}| j                            |           |j        |v rZ	 | j                            ||j                            L# t2          $ r& |j        dk     rt7          d	|j         d
           Y {w xY w|                    d | j        D                        | |fS )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   2   K   | ]}|j         D ]}||V  	d S N)input).0node
input_names      _/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/quantization/onnx_model.py	<genexpr>z-_clean_initializers_helper.<locals>.<genexpr>   s9      "p"p$W[Wa"p"peo"p:"p"p"p"p"p"p"p    c              3   2   K   | ]}|j         	|j         V  d S r
   name)r   g_outs     r   r   z-_clean_initializers_helper.<locals>.<genexpr>   s+      "V"V%5:"V5:"V"V"V"V"V"Vr   c                 z    g | ]8}|j         t          j        j        k    s|j         t          j        j        k    6|9S  )typeonnxAttributeProtoGRAPHGRAPHSr   attrs     r   
<listcomp>z._clean_initializers_helper.<locals>.<listcomp>   sG     
 
 
yD/555dFYF`9`9` 9`9`9`r   r   r   c              3   .   K   | ]}|j         D ]}|V  d S r
   )output)r   r   r!   s      r   r   z-_clean_initializers_helper.<locals>.<genexpr>@   s4      -f-fZ^Ze-f-fPVf-f-f-f-f-f-f-fr   c                     i | ]
}|j         |S r   r   r   r   s     r   
<dictcomp>z._clean_initializers_helper.<locals>.<dictcomp>J   s    @@@5UZ@@@r      zWarning: invalid weight name z' found in the graph (not a graph input)c              3   $   K   | ]}|j         V  d S r
   r   r#   s     r   r   z-_clean_initializers_helper.<locals>.<genexpr>T   s$      -R-RUej-R-R-R-R-R-Rr   )setupdater   r!   	attributer   r   r   r   _clean_initializers_helpergr   r   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graph_attrskwargsr   new_attributecleaned_sub_graphsub_requesting_tensor_namescleaned_graphessubgraphunused_initializerr4   name_to_inputs                    r   r*   r*      s    "ee"""p"p%*"p"p"pppp"""V"V5<"V"V"VVVVI
  #  #
 

 
 

  	nF - - "9 3 999 3465AA)3%)Y0A$BM+223NOOOOY$"5"<<<&(O$(K T T 7xGG-7'../@AAA/667RSSSS%)Y$@MM$6t$<$<Mm,,,,",T\4:t{mmY]YbmflmmH""""	V	Ji   ---f-f-f-f-ffff( 3 3666#**;+;<<<< %%k2222@@EK@@@M) u u  ---},,u""=1A#BCCCC  u u u#a''s+:Jssstttu - ---R-Rek-R-R-RRRR)))s   ;%J!!-KKc                      e Zd ZdefdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdefdZd Zd Zd Zd Zd Zd Zd Zd6dZd6dZd6dZd Z d  Z!d! Z"d" Z#e$d#             Z%e$d$             Z&d% Z'd7d'Z(e$d(             Z)d) Z*d* Z+e$d+             Z,d, Z-d- Z.d. Z/d/ Z0ded0e1fd1Z2d2 Z3d3 Z4d6d4Z5d5 Z6dS )8	ONNXModelr:   c                     || _         d S r
   )r:   )selfr:   s     r   __init__zONNXModel.__init__Z   s    


r   c                 $    | j         j        j        S r
   )r:   r9   r   rJ   s    r   nodeszONNXModel.nodes]   s    z$$r   c                 $    | j         j        j        S r
   r:   r9   r4   rM   s    r   r4   zONNXModel.initializer`   s    z++r   c                     t          |          dk    rt          d          |                                 D ]}|                     |d           |D ];}|                     |           | j        j        j                            |           <d S )Nr   zCan add an empty list.gain)len
ValueErrorr4   _check_initr:   r9   r-   )rJ   initsinits      r   initializer_extendzONNXModel.initializer_extendc   s    u::??5666$$&& 	+ 	+DT6**** 	6 	6DT"""J(//5555	6 	6r   c                     | j         j        S r
   )r:   r9   rM   s    r   r9   zONNXModel.graphl   s    zr   c                     | j         j        S r
   )r:   r7   rM   s    r   r7   zONNXModel.ir_versiono   s    z$$r   c                     | j         j        S r
   )r:   opset_importrM   s    r   r\   zONNXModel.opset_importr   s    z&&r   c                     | j         j        D ]}|j        |k    r
||_         d S | j         j                            t          j        ||          g           d S r
   )r:   r\   domainversionr2   r.   make_opsetid)rJ   r^   r_   opsets       r   set_opset_importzONNXModel.set_opset_importu   sg    Z, 	 	E|v%% ' & 	
&&(@(Q(Q'RSSSSSr   c                 x    || j         j        j        v r&| j         j        j                            |           d S d S r
   )r:   r9   r   r5   rJ   r   s     r   remove_nodezONNXModel.remove_node}   s?    4:#(((J!((..... )(r   c                 :    |D ]}|                      |           d S r
   )re   )rJ   nodes_to_remover   s      r   remove_nodeszONNXModel.remove_nodes   s2    # 	# 	#DT""""	# 	#r   c                 v    | j         j        j                            |                     |          g           d S r
   )r:   r9   r   r2   _check_noderd   s     r   add_nodezONNXModel.add_node   s5    
$$d&6&6t&<&<%=>>>>>r   c                 :    |D ]}|                      |           d S r
   )rk   )rJ   nodes_to_addr   s      r   	add_nodeszONNXModel.add_nodes   s0      	  	 DMM$	  	 r   c                     t          |j        | j        j        j                  <|                     |           | j        j        j                            |g           d S d S r
   )r   r   r:   r9   r4   rU   r2   )rJ   tensors     r   add_initializerzONNXModel.add_initializer   s]    TZ%5%ABBJV$$$J(//99999 KJr   c                 L    | j         j        j        D ]}|j        |k    r|c S d S r
   )r:   r9   r4   r   )rJ   r   rp   s      r   get_initializerzONNXModel.get_initializer   s9    j&2 	 	F{d"" #tr   c                 L    | j         j        j        D ]}|j        |k    r|c S d S r
   )r:   r9   r   r   )rJ   r   r   s      r   find_graph_inputzONNXModel.find_graph_input   s9    Z%+ 	 	EzZ'' (tr   c                 L    | j         j        j        D ]}|j        |k    r|c S d S r
   )r:   r9   r!   r   )rJ   output_namer!   s      r   find_graph_outputzONNXModel.find_graph_output   s9    j&- 	 	F{k)) *tr   tensor_namec                     d | j         j        j        D             }||v r||         j        S |                     |          }|r|j        j        S |                     |          }|r|j        j        S d S )Nc                 (    i | ]}|j         |j        S r   )r   r   )r   objs     r   r$   z-ONNXModel.get_tensor_type.<locals>.<dictcomp>   s    UUU#38SXUUUr   )r:   r9   
value_infotensor_typeru   r   rx   )rJ   ry   tensor_type_mapg_inputg_outputs        r   get_tensor_typezONNXModel.get_tensor_type   s    UU9I9TUUU/))";/;;''44 	,<++))+66 	-=,,tr   c                     | j         j        j        D ]P}|j        dk    rC|j        d         |k    r2|j        D ]*}|j        dk    rt          j        |j	                  c c S +Q| 
                    |          }|t          j        |          S d S )NConstantr   value)r:   r9   r   r0   r!   r)   r   onnx_numpy_helperto_arraytrs   )rJ   rw   r   r   r4   s        r   get_constant_valuezONNXModel.get_constant_value   s    J$) 	F 	FD|z));q>[00 $ F F9//#4#=df#E#EEEEEE 0 **;77"$-k:::tr   c                 8    d | j         j        j        D             S )Nc                     h | ]	}|j         
S r   r   )r   r4   s     r   	<setcomp>z5ONNXModel.get_initializer_name_set.<locals>.<setcomp>   s    QQQ[ QQQr   rP   rM   s    r   get_initializer_name_setz"ONNXModel.get_initializer_name_set   s    QQDJ4D4PQQQQr   c                    || j         j        j        v ro| j         j        j                            |           | j         j        j        D ];}|j        |j        k    r'| j         j        j                            |            d S :d S d S r
   )r:   r9   r4   r5   r   r   )rJ   rp   r   s      r   remove_initializerzONNXModel.remove_initializer   s    TZ%111J(//777)/  :,,J$*11%888EE - 21 r   c                 :    |D ]}|                      |           d S r
   )r   )rJ   init_to_remover4   s      r   remove_initializerszONNXModel.remove_initializers   s2    ) 	1 	1K##K0000	1 	1r   c                     |                                  }t                      }| j        j        j        D ]%}|j        |vr|                    |j                   &|S r
   )r   r'   r:   r9   r   r   add)rJ   initializer_namesnon_initializer_inputsr   s       r   get_non_initializer_inputsz$ONNXModel.get_non_initializer_inputs   s`     99;;!$Z%+ 	7 	7Ez!222&**5:666%%r   c                     i }| j         j        j        D ]4}|j        D ]*}|r&||vr|g||<   ||                             |           +5|S r
   )r:   r9   r   r   r-   )rJ   input_name_to_nodesr   r   s       r   r   zONNXModel.input_name_to_nodes   s     J$) 	E 	ED"j E E
 E!)<<<;?&+J77+J7>>tDDDE #"r   c                 T    i }| j         j        j        D ]}|j        D ]	}|r|||<   
|S r
   )r:   r9   r   r!   )rJ   output_name_to_noder   rw   s       r   r   zONNXModel.output_name_to_node   sQ     J$) 	< 	<D#{ < < <7;'4< #"r   Nc                     ||                                  }g }|j        D ]&}||v r ||         D ]}|                    |           '|S r
   )r   r!   r-   )rJ   r   r   childrenr!   s        r   get_childrenzONNXModel.get_children   sk    &"&":":"<"<k 	* 	*F,,,/7 * *DOOD))))r   c                     ||                                  }g }|j        D ]!}||v r|                    ||                    "|S r
   )r   r   r-   )rJ   r   r   parentsr   s        r   get_parentszONNXModel.get_parents   sZ    &"&":":"<"<Z 	; 	;E+++259:::r   c                     ||                                  }t          |j                  |k    rd S |j        |         }||vrd S ||         S r
   )r   rS   r   )rJ   r   idxr   r   s        r   
get_parentzONNXModel.get_parent  sY    &"&":":"<"<tz??c!!4
3+++4"5))r   c                 x    t          |j                  }|                    |           t          ||          }|S )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   r2   r   )rJ   	node_namenew_nodes_listr9   graph_nodes_listr   s         r   find_node_by_namezONNXModel.find_node_by_name  s=      
++///I'788r   c                 
   d}| j         j        j        D ]n}|j        re|j                            |          rK	 t          |j        t          |          d                   }t          ||          }^# t          $ r Y jw xY wo|S )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)	r:   r9   r   r   
startswithintrS   maxrT   )rJ   node_name_prefixsuffixr   indexs        r   get_largest_node_name_suffixz&ONNXModel.get_largest_node_name_suffix  s    
 J$) 	 	Dy TY112BCC 	#.>*?*?*A*A BCCE //FF!   H s   9A22
A?>A?c                     d}| j         j        j        D ]g}|j                            |          rK	 t          |j        t          |          d                   }t          ||          }W# t          $ r Y cw xY wh|S )ab  
        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)	r:   r9   r4   r   r   r   rS   r   rT   )rJ   initializer_name_prefixr   r4   r   s        r   #get_largest_initializer_name_suffixz-ONNXModel.get_largest_initializer_name_suffix+  s     :+7 	 	K**+BCC  05L1M1M1O1O PQQE //FF!   H	 s   9A++
A87A8c                 r    g }|j         D ],}|j        D ]"}||j        k    r|                    |           #-|S )zD
        Find all nodes with given initializer as an input.
        )r   r   r   r-   )rJ   r9   r4   rN   r   
node_inputs         r   find_nodes_by_initializerz#ONNXModel.find_nodes_by_initializer?  sX     J 	' 	'D"j ' '
!111LL&&&' r   c                     t          t          |          dz
  dd          D ]'}||         }|j        D ]}|j        | k    r||fc c S (dS )Nr   r   )NN)rangerS   r4   r   )r   
graph_pathgidr9   rp   s        r   __get_initializerzONNXModel.__get_initializerJ  sw    Z1,b"55 	) 	)CsOE+ ) );$&&!5=((((( ') zr   c           	         g }| d         }|j         D ]"}d |j        D             }t          |          ri }|j        D ]}|j        dk    r<|                     |j                   |j        t                              |           i}ns|j        dk    rYg }|j	        D ]E}	|                     |	           |
                    t                              |           g           F|j        |i}nt          |          }|                    |           t          j        |j        |j        |j        fd|j        i|}|j        dk    rd}
d}d}d}|j        D ]}|j        d	k    rt          j        |          }
"|j        d
k    rt          j        |          }B|j        dk    rt          j        |          }b|j        dk    rt          j        |          }|
dk    r)|dk    r"|dk    r|j        d         }|dk    rt                              |j        d         |           \  }}|rt)          j        |          }t)          j        |j                  }|j        |_        |j                            |           |j        D ])}|j        |k    r|j                            |            n*|j        
                    |g           nP|dz  }t          j        d|j        d         g|g|j        r
|j        dz   nd          }|                    |           t          j        d|j        d         |g|j        d         t          |j                  dk    rdndz   g|j        r
|j        dz   nd          }|                    |           t          |j                  dk    r^t          j        d|j        d         dz   |j        d         g|j        |j        r
|j        dz   nd          }|                    |           |                    |           |                    |           $|                    d           |j         
                    |           |                                  |S )Nr   c                 >    g | ]}|j         d k    s|j         dk    |S )   
   )r   r   s     r   r   z8ONNXModel.__replace_gemm_with_matmul.<locals>.<listcomp>X  s1    ```Ddi1nnPTPY]_P_P_4P_P_P_r   r   r   r   Gemmg      ?r   alphabetatransAtransBr   _Transposed	Transpose
_Transpose )inputsoutputsr   MatMul   _MatMulAdd_Addr   )r   r)   rS   r   r-   r+   r   rH   $_ONNXModel__replace_gemm_with_matmulr,   r2   r   r(   r.   r/   r0   r   r!   get_attribute_value_ONNXModel__get_initializerr   r   
from_arrayTr4   r5   r1   pop)r   r<   r9   r   r>   r?   r   kvr   rD   r   r   r   r   inputBBBs_graphB_arrayB_transr   transpose_nodematmul_noderk   s                          r   __replace_gemm_with_matmulz$ONNXModel.__replace_gemm_with_matmulS  s   	2J S	' S	'D``DN```K;  N & &DyA~~"))$&111"i)M)Mj)Y)YZb "(, ] ]H&--h777!LL)*N*Nz*Z*Z)[\\\\"i//55MM"%%%%",L$*dk @D	MS  |v%% N G GDyG++ + ? E Ef,,*>tDDh..!,!@!F!Fh..!,!@!F!FC<<DCKKFaKK!Z]F{{&/&A&A$*Q-Q[&\&\8 =&7&@&C&CG&7&B79&M&MG+,6GL$077:::)1 * *#(:#7#7$,N$9$9%$@$@$@$)E $8 %077	BBBB"m3F-8-B +(,
1)/AE%RTY%=%=PR	. . .N &,,^<<<"-"7  $
1v6!%QDJRS@S@S99Y[!\ ]6:iGTY22R	# # #K $$[1114:**#.#8!$(KNY$>
1#N$(K7;y!HV!3!3b	$ $ $ "((222 $$T****   &&&&   
)$$$r   c                 d    |                                  g}t                              |           d S r
   )r9   rH   r   )rJ   r   s     r   replace_gemm_with_matmulz"ONNXModel.replace_gemm_with_matmul  s+    jjll^
,,Z88888r   Fc                 4   |                                   |r=t          j                            | j        dt          |          j        dz   d           | j        j        j        D ]}| 	                    |d           t          j
        | j        |           dS )zS
        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_datar:   r   r   r9   r4   rU   
save_model)rJ   output_pathuse_external_data_formatrW   s       r   save_model_to_filezONNXModel.save_model_to_file  s     	# 	%DD
(,k**/'9"&	 E    J$0 	* 	*DT5))))
K00000r   c                     t          |t                    rt          |t                    sJ t          t          | j                            D ]}| j        |         |k    r
|| j        |<   d S r
   )
isinstancestrr   rS   r   )r   old_input_namenew_input_namejs       r   replace_node_inputzONNXModel.replace_node_input  sm    .#..R:nc3R3RRRRs4:'' 	/ 	/Az!}.. .
1	/ 	/r   c                 f    | j         j        j        D ]}t                              |||           d S r
   )r:   r9   r   rH   r   )rJ   r   r   r   s       r   replace_input_of_all_nodesz$ONNXModel.replace_input_of_all_nodes  sB    J$) 	O 	OD((~~NNNN	O 	Or   c                 x    | j         j        j        D ]'}|j        |v rt                              |||           (d S r
   )r:   r9   r   r   rH   r   )rJ   r   r   node_names_setr   s        r   replace_input_of_nodesz ONNXModel.replace_input_of_nodes  sM    J$) 	S 	SDyN**,,T>>RRR	S 	Sr   c                     t          |t                    rt          |t                    sJ t          t          | j                            D ]}| j        |         |k    r
|| j        |<   d S r
   )r   r   r   rS   r!   )r   old_output_namenew_output_namer   s       r   replace_node_outputzONNXModel.replace_node_output  sp    /3//TJPS4T4TTTTs4;''(( 	1 	1A{1~00!0A	1 	1r   c                 f    | j         j        j        D ]}t                              |||           d S r
   )r:   r9   r   rH   r   )rJ   r   r   r   s       r   replace_output_of_all_nodesz%ONNXModel.replace_output_of_all_nodes  sB    J$) 	R 	RD))$QQQQ	R 	Rr   c                 x    | j         j        j        D ]'}|j        |v rt                              |||           (d S r
   )r:   r9   r   r   rH   r   )rJ   r   r   r   r   s        r   replace_output_of_nodesz!ONNXModel.replace_output_of_nodes  sM    J$) 	V 	VDyN**--dO_UUU	V 	Vr   c                    |                                  }g }|                                 }|D ]Q}|j        dk    rD|                     |j        d                   s$|j        d         |vr|                    |           R|                     |           g }|                                 D ]}|j        |vr|                     |j                  sm|                    |           | 	                                j
        D ]>}|j        |j        k    r,| 	                                j
                            |           ?|                     |           d S )Nr   r   )r   rN   r0   is_graph_outputr!   r-   rh   r4   r   r9   r   r5   r   )rJ   r   unused_nodesrN   r   ununsed_weightswgraph_inputs           r   remove_unused_constantz ONNXModel.remove_unused_constant  sW   "6688 

 	* 	*D
**,,T[^<< +KN*===##D))),'''!!## 	? 	?Av0009M9Maf9U9U0&&q)))#'::<<#5 ? ?K"'1611

*11+>>>  11111r   c                 X    t          fd| j        j        j        D                       S )Nc              3   .   K   | ]}|j         k    V  d S r
   r   )r   r!   rw   s     r   r   z,ONNXModel.is_graph_output.<locals>.<genexpr>  s*      TT&6;+-TTTTTTr   )anyr:   r9   r!   )rJ   rw   s    `r   r  zONNXModel.is_graph_output   s.    TTTTDJ<L<STTTTTTr   returnc                 X    t          fd| j        j        j        D                       S )Nc              3   .   K   | ]}|j         k    V  d S r
   r   )r   r   ry   s     r   r   z+ONNXModel.is_graph_input.<locals>.<genexpr>  s*      QQ5:,QQQQQQr   )r  r:   r9   r   )rJ   ry   s    `r   is_graph_inputzONNXModel.is_graph_input  s.    QQQQ$*:J:PQQQQQQr   c                 Z   dgt          |                                           z  }i }g }t          |                                           D ]\  }}t          d |j        D                       ||<   ||         dk    r.|                    |                                 |                    `|j        D ]+}|s||vr|g||<   ||                             |           ,d |                                 D             }d | j        j        j        D             }||z   }	|		                                 d }
|	D ]a}|
|k    r	|}
||v rR||         D ]I}||         dz
  ||<   ||         dk    r-|                    |                                 |                    Jbd}t          |          }||k     rv||         j
        D ]]}||v rW||         D ]N}||         dz
  ||<   ||         dk    r2|                    |                                 |                    |dz   }O^|dz   }||k     v|t          |                                 j                  k    s
J d            |                                                     d           |                                 j                            |           d S )Nr   c              3      K   | ]}|d V  	dS )r   Nr   )r   _s     r   r   z-ONNXModel.topological_sort.<locals>.<genexpr>  s'      &B&BQ&Bq&B&B&B&B&B&Br   c                     g | ]	}|j         
S r   r   )r   rW   s     r   r   z.ONNXModel.topological_sort.<locals>.<listcomp>  s    FFF4TYFFFr   c                     g | ]	}|j         
S r   r   r#   s     r   r   z.ONNXModel.topological_sort.<locals>.<listcomp>  s    LLLEUZLLLr   r   zGraph is not a DAGr   )rS   rN   	enumeratesumr   r-   r4   r:   r9   sortr!   r   r1   r2   )rJ   
deps_countdeps_to_nodessorted_nodesnode_idxr   r   r   graph_input_namesinput_namesprev_input_namestartr   r!   s                 r   r   zONNXModel.topological_sort  s   S3tzz||,,,
'

55 	? 	?NHd#&&B&B$*&B&B&B#B#BJx (#q((##DJJLL$:;;;"j ? ?
! ]2219
M*--!*-44X>>>>? GF43C3C3E3EFFFLLTZ5E5KLLL'*;;% 		D 		DJ*,,(O]** -j 9 D DH+5h+?!+CJx(!(+q00$++DJJLL,BCCC,ckk&u-4 * *]**$1&$9 * */9(/Ca/G
8,%h/144(//

X0FGGG"%'CAIE ckk c$**,,+,,,,,.B,,,

'''

  .....r   c                 P    t          |                                 | j                  S r
   )r*   r9   r:   rM   s    r   clean_initializerszONNXModel.clean_initializers<  s    )$**,,
CCCr   c                     |j         t          j        j        k    r_|                    d          rJt          |j                  }t          t          d |                    rt          d|j
        d          |S )Nraw_datac                     | dz  dk    S )N   r   )is    r   <lambda>z'ONNXModel._check_init.<locals>.<lambda>C  s    a#g#%5 r   zInitializer z	 has nan.)	data_typer   TensorProtoFLOAT8E4M3FNHasFieldr   r%  r  maprT   r   )rJ   rW   testbs       r   rU   zONNXModel._check_init?  sy    >T-:::}}Z(( L''s55q99:: L$%JDI%J%J%JKKKr   c                    |j         dk    r|j        d         }|                     |          }|j        }|t          j        j        t          j        j        t          j        j        t          j        j	        hv rt          d| d          |S )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 .)r0   r   rs   r*  r   r+  FLOAT16FLOATDOUBLEBFLOAT16RuntimeError)rJ   r   
zero_pointrW   dtypes        r   rj   zONNXModel._check_nodeG  s     <---AJ''
33DNE ( & ' )	   ##iaf#i#i#ijjjr   r
   )F)7__name__
__module____qualname__r   rK   rN   r4   rX   r9   r7   r\   rb   re   rh   rk   rn   rq   rs   ru   rx   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  boolr  r   r#  rU   rj   r   r   r   rH   rH   Y   s{       j    % % %, , ,6 6 6     % % %' ' 'T T T/ / /# # #? ? ?     : : :
      3       R R R  1 1 1& & &	# 	# 	## # #	 	 	 	   * * * *
 
 
  "  (	 	 	   \ [ [ \[z9 9 91 1 1 1  / / \/O O OS S S
 1 1 \1R R RV V V
2 2 26U U UR# R$ R R R R
2/ 2/ 2/hD D D       r   rH   )pathlibr   r   onnx.helperhelperr.   onnx.numpy_helpernumpy_helperr   onnx.onnx_pbr   quant_utilsr   r   r*   rH   r   r   r   <module>rG     s   
        ! ! ! ! ! ! - - - - - - # # # # # # 9 9 9 9 9 9 9 9G* G* G*T         r   