
    
gQ                        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	Z	ddl
mZ e G d d	             Z G d
 de      Zy)    )annotationsN)MutableMapping)	dataclass)Any   )	QuantTypec                      e Zd ZU dZded<   dZded<   dZded<   dZded	<   dd
Ze		 	 	 d	 	 	 	 	 	 	 	 	 dd       Z
ddZy)QuantTypeInfozB
    The quantization type information for a tensor override.
    r   
quant_typeNbool | None	symmetricreduce_rangez
int | Noneaxisc                   t        |t              r| j                  |j                  k(  xr | j                  d u xs) |j                  d u xs | j                  |j                  k(  xrT | j                  d u xs) |j                  d u xs | j                  |j                  k(  xr | j
                  |j
                  k(  S t        S N)
isinstancer
   r   r   r   r   NotImplemented)selfothers     d/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/quantization/tensor_quant_overrides.py__eq__zQuantTypeInfo.__eq__   s    e]+5#3#33 .^^t+ku$/Fk$..\a\k\kJk.&&$.w%2D2D2LwPTPaPaejewewPw. YY%**,	     c                    t        | j                  d|      | j                  d|      | j                  d|      | j                  d            S Nr   r   r   r   )r
   get)raw_dictdefault_qtypedefault_symmetricdefault_reduce_ranges       r   load_from_dictzQuantTypeInfo.load_from_dict'   sI     LL}5LL&78LL)=>LL 	
 	
r   c                    | j                   |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   y y r   )r   r   r   r   )r   r   s     r   save_to_dictzQuantTypeInfo.save_to_dict5   sa    !%>>%$(NNH[!('+'8'8H^$99 #yyHV !r   )r   object)NNN)
r   dict[str, Any]r   QuantType | Noner   r   r   r   returnr
   )r   r$   )__name__
__module____qualname____doc____annotations__r   r   r   r   staticmethodr    r"    r   r   r
   r
      s     !I{! $L+$D*  +/)-,0	
 
'
 '
 *	

 

 
)r   r
   c                  X    e Zd ZdZddZddZddZddZ	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	ddZ
	 	 	 	 	 	 dd	Z	 	 	 	 	 	 d d
Z	 	 	 	 	 	 d!dZ	 	 d"	 	 	 	 	 	 	 	 	 d#dZ	 d	 	 	 	 	 	 	 d$dZ	 	 d%	 	 	 	 	 	 	 	 	 	 	 d&dZdd'dZd(dZd)dZd*dZd+dZd,dZd Zd Zd'dZd' fdZ xZS )-TensorQuantOverridesHelperzZ
    Utility wrapper over the tensor quantization overrides passed via extra_options.
    c                2    || _         d | _        h d| _        y )N>   rmaxrminr   r   )	overridesquant_typeskeys_unsupported_with_scale_zp)r   raw_overridess     r   __init__z#TensorQuantOverridesHelper.__init__D   s    &.[+r   c                N    | j                   j                  |      }|xr d|d   vS Nr   r   r3   r   r   tensor_nameoverrides_lists      r   has_per_tensor_overridesz3TensorQuantOverridesHelper.has_per_tensor_overridesI   s+    ++K8A&q0A"AAr   c                N    | j                   j                  |      }|xr d|d   v S r9   r:   r;   s      r   has_per_channel_overridesz4TensorQuantOverridesHelper.has_per_channel_overridesM   s+    ++K8=&N1,="==r   c                `    | j                   j                  |      }|xr d|d   v xr d|d   v S )Nscaler   
zero_pointr:   r;   s      r   overrides_scale_zpz-TensorQuantOverridesHelper.overrides_scale_zpQ   s<    ++K8h7nQ.?#?hlVdefVgFghr   c                    ||gnd }| j                   j                  ||      }|rd|d   v rt        d| d      |r|d   S d S )Nr   r   Expected tensor 'zL' to use per-tensor quantization overrides, but found per-channel overrides.r3   r   
ValueError)r   r<   default_valdefault_list_valr=   s        r   get_per_tensor_overridesz3TensorQuantOverridesHelper.get_per_tensor_overridesU   sk    
 -8,CK=++K9IJfq(99#K= 13 4 
 %3~a <<r   c                p    | j                   j                  ||      }|sy d|d   vrt        d| d      |S )Nr   r   rF   zE' to have per-channel quantization overrides (axis value is missing).rG   )r   r<   rI   r=   s       r   get_per_channel_overridesz4TensorQuantOverridesHelper.get_per_channel_overridesd   sO    
 ++KE**#K=0uv  r   c                l   | j                   | j                   S t               | _         | j                  rv| j                  j                         D ]Y  }|D ]R  }d|v r| j                   j	                  |d          d|v s*d|d   v s2| j                   j	                  |d   d          T [ | j                   S )Nr   convert)r4   setr3   valuesadd)r   quant_overrides_listquant_overridess      r   get_quant_typesz*TensorQuantOverridesHelper.get_quant_typesu   s    '###5>>(,(=(=(?$';O#6((,,_\-JK O3XaHb8b((,,_Y-G-UV (< )@ r   c                   t        |t              sdd| dfS ||v }|j                  d      }|r| j                  j	                  |       d|v }d|v }|r|r|r|sy|r=| j
                  j                  t        |            }	|	rddd	j                  |	       d
fS d|v r	|sdd| fS d|v r|ryd|d   vrdd| dfS d|d   v rdd| fS |d   d   }
||n|}|
|k(  rdd| dfS d|d   v }d|d   v }|r|r|r
|sdd| dfS |rC| j
                  j                  t        |d               }	|	rddd	j                  |	       d| dfS | j                  j	                  |
       y)NF#Tensor quantization overrides for '' are not in a dictr   rB   rC   FzNMust provide both 'scale' and 'zero_point' if one of the overrides is providedTensor override option(s) [, +] are invalid with 'scale' and 'zero_point'r   zMOption 'reduce_range' is only supported for initializers, not for activation rO   )Fz.Cannot use 'convert' override for initializersz'convert' options (tensor 'z') must specify a 'quant_type'zC'convert' quant_type must differ from original quant_type (tensor 'z')zXMust provide both 'scale' and 'zero_point' if one of the overrides is provided (tensor 'z5] are invalid with 'scale' and 'zero_point' (tensor 'TN)	r   dictr   r4   rR   r5   intersectionrP   join)r   initializersdefault_activation_qtyper<   rT   is_initializerr   	has_scalehas_zero_pointkeysconvert_quant_typeoriginal_quant_typeconvert_has_scaleconvert_has_zero_points                 r   _is_valid_per_tensorz/TensorQuantOverridesHelper._is_valid_per_tensor   sB    /405k]BUV 
 %4$((6
  ,.	%8n.
 66CCCDXYD1$))D/1BBmn 
 _,^_`k_lm 
 'N?9#== ;K=Hfggg!;;cdocpq 
 "1!;L!I0:0F*Ld!%88YZeYffhi 
 !(?9+E E%1_Y5O%O"!*@F\evnozn{{}~ 
 !::GGO\eLfHgh5diio5F G$$/=4    !34r   c                :   ||v }|sdd| dfS |d   j                  d      }|dd| dfS t        ||   j                        }t        |      }|}|dk  r||z  }|dk  s|t        |      k\  rdd| d	t        |       d
fS t        |      dkD  r.t        |      ||   k7  rdd| d| d||    dt        |       d	fS d|d   v rdd| dfS |d   j                  d      }	|	r| j                  j                  |	       |d   j                  d      }
|d   j                  d      }d|d   v }d|d   v }|xr |}|r|r|r|sy|r@| j                  j                  t        |d               }|rdddj                  |       dfS d|d   v }d|d   v }|xr |}|r|r|s|ryt        |dd        D ]  \  }}t        |t              sdd| d | d!fc S d|v r
dd| dfc S d|v r
|	|d   k7  r y"d|v r||d   k7  r
||d   k7  r y#d|v r
|
|d   k7  r y$d|v r
||d   k7  r y%d|v xr d|v }|r|sdd&| d'| dfc S |r?| j                  j                  t        |            }|rdddj                  |       dfc S d|v xr d|v }|s|rdd(| d'| dfc S  y))*NFTensor 'z6' has per-channel overrides, but is not an initializerr   r   z!Per-channel overrides for tensor z< is missing an 'axis' value in the first channel dictionary.z0Axis override value is out-of-bounds for tensor z (rank )r   z1Incorrect number of channel overrides for tensor z (axis z), expected z, but found .rO   z8Cannot use 'convert' override for initializers, such as r   r   r   rB   rC   rY   rZ   r[   r\   r2   r1   )Fz6Must provide both 'rmin' and 'rmax' if one is providedz'Tensor quantization overrides at index z for 'rX   )FzTChannel quantization types for tensor '{tensor_name}' do not match at index {index}.)FzHChannel axis for tensor '{tensor_name}' does not match at index {index}.)FzSChannel symmetric value for tensor '{tensor_name}' does not match at index {index}.)FzVChannel reduce_range value for tensor '{tensor_name}' does not match at index {index}.z]Per-channel overrides that specify scale/zero_point must do so for all channels, but tensor 'z' is missing them at index zVPer-channel overrides that specify rmin/rmax must do so for all channels, but tensor 'r]   )r   listdimslenr4   rR   r5   r_   rP   r`   	enumerater   r^   )r   ra   r<   rS   rc   r   weight_shapeweight_rank	norm_axisr   r   r   rd   re   has_scale_zprf   has_rminhas_rmaxhas_rmin_rmaxindexrT   chan_has_scale_zpchan_has_rmin_rmaxs                          r   _is_valid_per_channelz0TensorQuantOverridesHelper._is_valid_per_channel   s9    %4;-']^ 
 $A&**62<3K= A0 0  L5::;,'	q=$Iq=I\)::B;-wWZ[gWhViijk 
 #$q(S1E-F,W`Ja-aCK=PWX\W] ^(./|C@T<U;VVWY  ,Q//TU`Taabccc)!,00>
  ,(+//<	+A.22>B3A66	%)=a)@@ 3^n.
 66CCCH\]^H_D`aD1$))D/1BBmn 
 1!441!44 -XXxH
 '00DQR0H&I"E?ot4=eWF;-Wjk 
 O+ XYdXeefggg
 .:Q]A^3^ (T_V5L-LQZ^mnt^uQu o-){?[2[ 0\_UcEd5d !(? : ^|?^$5##.-/J5'QRT  !::GGOH\]5diio5FFqr  "(?!:!Xv?X%7##.-/J5'QRT o 'Jz r   c                   t               | _        | j                  r| j                  j                         D ]  \  }}||vr||vr
dd| dfc S t	        |t
              s
dd| dfc S |s5t	        |d   t              s
dd| dfc S |d   sX|d   j                  d	      }t        |      d
kD  xs |d u}|r| j                  |||      c S | j                  ||||d         c S  y)NFrm   z5' in TensorQuantOverrides is not present in the modelrW   z' are not in a listr   z.Tensor quantization overrides at index 0 for 'rX   r   r   r]   )rP   r4   r3   itemsr   rp   r^   r   rr   r~   rk   )r   ra   activation_namesrb   r<   rS   r   is_per_channels           r   is_validz#TensorQuantOverridesHelper.is_validi  s%    5 >>59^^5I5I5K11l2{JZ7Z H[M9n"ooo!"6= $G}Tg"hhh+!"6q"94@ $RS^R__r"sss+A.+A.226:!$%9!:Q!>!R$dBR!55lKQeff00 ":KI]^_I` - 6L4 r   c                   |sy|t        |      nd }| j                  j                  |      }d}|sP|rNt        | j                  |         D ]3  \  }}|||vrt        |      j	                  t        |            s1d} n |rJ|si g| j                  |<   t        | j                  |         D ]  \  }}|||vr|j                  |        |S )NFT)rP   r3   r   rs   r_   update)	r   r<   new_valschannels	overwritehave_overrides	do_updatechannelr3   s	            r   update_tensor_overridesz2TensorQuantOverridesHelper.update_tensor_overrides  s     $,$83x=d++K8 	^&/{0K&L"'G8,Cx=--c)n= %I 'M !/1d{+&/{0K&L"'G8,C  * 'M
 r   c                    || j                   vrt        ||      S | j                   |   d   }t        |j                  d|      |j                  d|            S )Nr   r   r   )r3   r
   r   )r   output_namer   r   tensor_overridess        r   get_node_output_qtype_infoz5TensorQuantOverridesHelper.get_node_output_qtype_info  s`     dnn, 0ABB>>+6q9  }=  .?@
 	
r   c                   || j                   vs| j                   |   st        |||      S | j                   |   d   }|j                  d|      }d|vr=t        ||j                  d|      |j                  d|      |j                  d            S |d   }t        ||j                  d|            }	d|vs||d   v r
|d   |	_        |	S )Nr   r   rO   r   r   r   
recv_nodes)r3   r
   r   r   )
r   
input_name	node_namer   r   r   r   producer_typeconvert_dict
qtype_infos
             r   get_node_input_qtype_infoz4TensorQuantOverridesHelper.get_node_input_qtype_info  s     T^^+4>>*3M 0ACWXX  >>*5a8(,,\=I,,  $$[2CD $$^5IJ $$V,	  (	2"[*;<

 ,)|L?Y2Y$0$>J!r   c                N    t        j                  | j                  t        |      S )N)defaultindent)jsondumpsr3   str)r   r   s     r   
pprint_strz%TensorQuantOverridesHelper.pprint_str  s    zz$..#fEEr   c                    | j                    S r   r3   r   s    r   emptyz TensorQuantOverridesHelper.empty  s    >>!!r   c                    | j                   S r   r   r   s    r   get_dictz#TensorQuantOverridesHelper.get_dict  s    ~~r   c                "    || j                   |<   y r   r   )r   keyvalues      r   __setitem__z&TensorQuantOverridesHelper.__setitem__  s    #sr   c                     | j                   |   S r   r   r   r   s     r   __getitem__z&TensorQuantOverridesHelper.__getitem__  s    ~~c""r   c                    | j                   |= y r   r   r   s     r   __delitem__z&TensorQuantOverridesHelper.__delitem__  s    NN3r   c                ,    t        | j                        S r   )iterr3   r   s    r   __iter__z#TensorQuantOverridesHelper.__iter__  s    DNN##r   c                ,    t        | j                        S r   )rr   r3   r   s    r   __len__z"TensorQuantOverridesHelper.__len__      4>>""r   c                ,    t        | j                        S r   )r   r3   r   s    r   __str__z"TensorQuantOverridesHelper.__str__  r   r   c                @    t         |           d| j                   dS )Nz, TensorQuantOverridesHelper(rn   )super__repr__r3   )r   	__class__s    r   r   z#TensorQuantOverridesHelper.__repr__  s&    '"$%%B4>>BRRSTTr   )r6   dict[str, list[dict[str, Any]]])r<   r   r&   boolr   )r<   r   rI   dict[str, Any] | Noner&   r   )r<   r   rI   list[dict[str, Any]] | Noner&   r   )r&   zset[QuantType])r<   r   rT   r$   r&   tuple[bool, str | None])r<   r   rS   zlist[dict[str, Any]]r&   r   )ra   zdict[str, onnx.TensorProto]r   zset[str]r&   r   )NT)
r<   r   r   r$   r   zlist[int] | Noner   r   r&   r   )r   r   r   r%   r   r   r&   r
   )NN)r   r   r   r   r   r%   r   r   r   r   r&   r
   )r&   r   )r&   r   )r&   r   )r   r   r   
list[dict])r   r   r&   r   )r   r   )r'   r(   r)   r*   r7   r>   r@   rD   rK   rM   rU   rk   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r/   r/   ?   s   \
B>i .2== += 
	=$ 48 1 
%	" "S 	S
 (S 
!SjL L 3	L
 
!L\$1$ #$
 
!$T &*!! !! #	!
 ! 
!N *.	

 (
 '	

 

, *.,0%% % (	%
 '% *% 
%NF"
$# $##U Ur   r/   )
__future__r   r   collections.abcr   dataclassesr   typingr   onnxquant_utilsr   r
   r/   r-   r   r   <module>r      sF    #  * !   " )) )) ))XIU IUr   