
    h0Q                        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	r	SSK
Jr  \ " S S	5      5       r " S
 S\5      rg)    )annotationsN)MutableMapping)	dataclass)Any   )	QuantTypec                      \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS	\S
'   SS jr	\
   S         SS jj5       rSS jrSrg)QuantTypeInfo   z:
The quantization type information for a tensor override.
r   
quant_typeNbool | None	symmetricreduce_rangez
int | Noneaxisc                   [        U[        5      (       a  U R                  UR                  :H  =(       a    U R                  S L =(       d.    UR                  S L =(       d    U R                  UR                  :H  =(       ac    U R                  S L =(       d.    UR                  S L =(       d    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ [        $ N)
isinstancer
   r   r   r   r   NotImplemented)selfothers     i/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/quantization/tensor_quant_overrides.py__eq__QuantTypeInfo.__eq__   s    e]++5#3#33 .^^t+ku$/Fk$..\a\k\kJk.&&$.w%2D2D2LwPTPaPaejewewPw. YY%**,	     c                    [        U R                  SU5      U R                  SU5      U R                  SU5      U R                  S5      5      $ Nr   r   r   r   )r
   get)raw_dictdefault_qtypedefault_symmetricdefault_reduce_ranges       r   load_from_dictQuantTypeInfo.load_from_dict'   sI     LL}5LL&78LL)=>LL 	
 	
r   c                    U R                   US'   U R                  b  U R                  US'   U R                  b  U R                  US'   U R                  b  U R                  US'   g g r   )r   r   r   r   )r   r   s     r   save_to_dict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____firstlineno____doc____annotations__r   r   r   r   staticmethodr"   r%   __static_attributes__r'   r   r   r
   r
      s     !I{! $L+$D*  +/)-,0	
 
'
 '
 *	

 

 
)r   r
   c                    ^  \ rS rSrSrSS jrSS jrSS jrSS jr S     SS jjr	 S     SS jjr
S S	 jr      S!S
 jr      S"S jr      S#S jr  S$         S%S jjr S       S&S jjr  S'           S(S jjrSS)S jjrS*S jrS+S jrS,S jrS-S jrS.S jrS rS rS)S jrS)U 4S jjrSrU =r$ )/TensorQuantOverridesHelper?   zR
Utility wrapper over the tensor quantization overrides passed via extra_options.
c                0    Xl         S U l        1 SkU l        g )N>   rmaxrminr   r   )	overridesquant_typeskeys_unsupported_with_scale_zp)r   raw_overridess     r   __init__#TensorQuantOverridesHelper.__init__D   s    &.[+r   c                Z    U R                   R                  U5      nU=(       a    SUS   ;  $ Nr   r   r:   r   r   tensor_nameoverrides_lists      r   has_per_tensor_overrides3TensorQuantOverridesHelper.has_per_tensor_overridesI   s+    ++K8A&q0A"AAr   c                Z    U R                   R                  U5      nU=(       a    SUS   ;   $ rA   rB   rC   s      r   has_per_channel_overrides4TensorQuantOverridesHelper.has_per_channel_overridesM   s+    ++K8=&N1,="==r   c                x    U R                   R                  U5      nU=(       a    SUS   ;   =(       a    SUS   ;   $ )Nscaler   
zero_pointrB   rC   s      r   overrides_scale_zp-TensorQuantOverridesHelper.overrides_scale_zpQ   s<    ++K8h7nQ.?#?hlVdefVgFghr   c                    Ub  U/OS nU R                   R                  X5      nU(       a  SUS   ;   a  [        SU S35      eU(       a  US   $ S $ )Nr   r   Expected tensor 'zL' to use per-tensor quantization overrides, but found per-channel overrides.r:   r   
ValueError)r   rD   default_valdefault_list_valrE   s        r   get_per_tensor_overrides3TensorQuantOverridesHelper.get_per_tensor_overridesU   sh    
 -8,CK=++KJfq(99#K= 13 4 
 %3~a <<r   c                |    U R                   R                  X5      nU(       d  g SUS   ;  a  [        SU S35      eU$ )Nr   r   rQ   zE' to have per-channel quantization overrides (axis value is missing).rR   )r   rD   rT   rE   s       r   get_per_channel_overrides4TensorQuantOverridesHelper.get_per_channel_overridesd   sM    
 ++KE**#K=0uv  r   c                   U R                   b  U R                   $ [        5       U l         U R                  (       a  U R                  R                  5        Hd  nU H[  nSU;   a  U R                   R	                  US   5        SU;   d  M/  SUS   ;   d  M:  U R                   R	                  US   S   5        M]     Mf     U R                   $ )Nr   convert)r;   setr:   valuesadd)r   quant_overrides_listquant_overridess      r   get_quant_types*TensorQuantOverridesHelper.get_quant_typesu   s    '###5>>(,(=(=(?$';O#6((,,_\-JK O3XaHb8b((,,_Y-G-UV (< )@ r   c                   [        U[        5      (       d  SSU S34$ X1;   nUR                  S5      nU(       a  U R                  R	                  U5        SU;   nSU;   nU(       a  U(       a  U(       a  U(       d  gU(       aB  U R
                  R                  [        U5      5      n	U	(       a  SSS	R                  U	5       S
34$ SU;   a  U(       d  SSU 34$ SU;   a  U(       a  gSUS   ;  a  SSU S34$ SUS   ;   a  SSU 34$ US   S   n
Ub  UOUnX:X  a  SSU S34$ SUS   ;   nSUS   ;   nU(       a  U(       a  U(       a  U(       d  SSU S34$ U(       aH  U R
                  R                  [        US   5      5      n	U	(       a  SSS	R                  U	5       SU S34$ U R                  R	                  U
5        g)NF#Tensor quantization overrides for '' are not in a dictr   rL   rM   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 r\   )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   r;   r_   r<   intersectionr]   join)r   initializersdefault_activation_qtyperD   ra   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_tensor/TensorQuantOverridesHelper._is_valid_per_tensor   s@    /40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YZeYffhi 
 !(?9+E E%1_Y5O%O"!*@F\evnozn{{}~ 
 !::GGO\eLfHgh5diio5F G$$/=4    !34r   c                b   X!;   nU(       d  SSU S34$ US   R                  S5      nUc  SSU S34$ [        X   R                  5      n[        U5      nUnUS:  a  X-  nUS:  d  U[        U5      :  a  SSU S	[        U5       S
34$ [        U5      S:  a-  [        U5      Xh   :w  a  SSU SU SXe    S[        U5       S3	4$ SUS   ;   a  SSU S34$ US   R                  S5      n	U	(       a  U R                  R                  U	5        US   R                  S5      n
US   R                  S5      nSUS   ;   nSUS   ;   nU=(       a    UnU(       a  U(       a  U(       a  U(       d  gU(       aE  U R                  R                  [        US   5      5      nU(       a  SSSR                  U5       S34$ SUS   ;   nSUS   ;   nU=(       a    UnU(       a  U(       a  U(       d  U(       a  g[        USS  5       GH,  u  nn[        U[        5      (       d  SSU S U S!34s  $ SU;   a
  SSU S34s  $ SU;   a  U	US   :w  a    g"SU;   a  UUS   :w  a  UUS   :w  a    g#SU;   a  U
US   :w  a    g$SU;   a  UUS   :w  a    g%SU;   =(       a    SU;   nU(       a  U(       d  SS&U S'U S34s  $ U(       aD  U R                  R                  [        U5      5      nU(       a  SSSR                  U5       S34s  $ SU;   =(       a    SU;   nU(       d  GM  U(       a  GM"  SS(U S'U S34s  $    g))*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 .r\   z8Cannot use 'convert' override for initializers, such as r   r   r   rL   rM   rg   rh   ri   rj   r9   r8   )Fz6Must provide both 'rmin' and 'rmax' if one is providedz'Tensor quantization overrides at index z for 'rf   )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 'rk   )r   listdimslenr;   r_   r<   rm   r]   rn   	enumerater   rl   )r   ro   rD   r`   rq   r   weight_shapeweight_rank	norm_axisr   r   r   rr   rs   has_scale_zprt   has_rminhas_rmaxhas_rmin_rmaxindexra   chan_has_scale_zpchan_has_rmin_rmaxs                          r   _is_valid_per_channel0TensorQuantOverridesHelper._is_valid_per_channel   s6    %4;-']^ 
 $A&**62<3K= A0 0  L5::;,'	q=$Iq=I\)::B;-wWZ[gWhViijk 
 #$q(S1E-F,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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%7##.-/J5'QRT o 'Jz r   c                   [        5       U l        U R                  (       a  U R                  R                  5        H  u  pEXA;  a  XB;  a
  SSU S34s  $ [	        U[
        5      (       d
  SSU S34s  $ U(       d  MA  [	        US   [        5      (       d
  SSU S34s  $ US   (       d  Mo  US   R                  S	5      n[        U5      S
:  =(       d    US LnU(       a  U R                  XU5      s  $ U R                  XXES   5      s  $    g)NFr|   z5' in TensorQuantOverrides is not present in the modelre   z' are not in a listr   z.Tensor quantization overrides at index 0 for 'rf   r   r   rk   )r]   r;   r:   itemsr   r   rl   r   r   r   ry   )r   ro   activation_namesrp   rD   r`   r   is_per_channels           r   is_valid#TensorQuantOverridesHelper.is_validi  s    5 >>59^^5I5I5K12{7Z 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5lQeff00 K^_I` - 6L4 r   c                   U(       d  gUb  [        U5      OS nU R                  R                  U5      nSnU(       d^  U(       aW  [        U R                  U   5       H;  u  pxUb  Xs;  a  M  [        U5      R	                  [        U5      5      (       d  M9  Sn  O   U(       aS  U(       d  0 /U R                  U'   [        U R                  U   5       H   u  pxUb  Xs;  a  M  UR                  U5        M"     U$ )NFT)r]   r:   r   r   rm   update)	r   rD   new_valschannels	overwritehave_overrides	do_updatechannelr:   s	            r   update_tensor_overrides2TensorQuantOverridesHelper.update_tensor_overrides  s     $,$83x=d++K8 	^&/{0K&L"'G,Cx=--c)n== %I 'M !/1d{+&/{0K&L"'G,C  * 'M
 r   c                    XR                   ;  a  [        X#5      $ U R                   U   S   n[        UR                  SU5      UR                  SU5      5      $ )Nr   r   r   )r:   r
   r   )r   output_namer   r    tensor_overridess        r   get_node_output_qtype_info5TensorQuantOverridesHelper.get_node_output_qtype_info  s[     nn, BB>>+6q9  }=  .?@
 	
r   c                   XR                   ;  d  U R                   U   (       d  [        X4U5      $ U R                   U   S   nUR                  SU5      nSU;  a=  [        UUR                  SU5      UR                  SU5      UR                  S5      5      $ US   n[        UUR                  SU5      5      n	SU;  d  X(S   ;   a
  US   U	l        U	$ )Nr   r   r\   r   r   r   
recv_nodes)r:   r
   r   r   )
r   
input_name	node_namer   r    r!   r   producer_typeconvert_dict
qtype_infos
             r   get_node_input_qtype_info4TensorQuantOverridesHelper.get_node_input_qtype_info  s     ^^+4>>*3M CWXX  >>*5a8(,,\=I,,  $$[2CD $$^5IJ $$V,	  (	2"[*;<

 ,)L?Y2Y$0$>J!r   c                J    [         R                  " U R                  [        US9$ )N)defaultindent)jsondumpsr:   str)r   r   s     r   
pprint_str%TensorQuantOverridesHelper.pprint_str  s    zz$..#fEEr   c                $    U R                   (       + $ r   r:   r   s    r   empty TensorQuantOverridesHelper.empty  s    >>!!r   c                    U R                   $ r   r   r   s    r   get_dict#TensorQuantOverridesHelper.get_dict  s    ~~r   c                     X R                   U'   g r   r   )r   keyvalues      r   __setitem__&TensorQuantOverridesHelper.__setitem__  s    #sr   c                     U R                   U   $ r   r   r   r   s     r   __getitem__&TensorQuantOverridesHelper.__getitem__  s    ~~c""r   c                    U R                   U	 g r   r   r   s     r   __delitem__&TensorQuantOverridesHelper.__delitem__  s    NN3r   c                ,    [        U R                  5      $ r   )iterr:   r   s    r   __iter__#TensorQuantOverridesHelper.__iter__  s    DNN##r   c                ,    [        U R                  5      $ r   )r   r:   r   s    r   __len__"TensorQuantOverridesHelper.__len__      4>>""r   c                ,    [        U R                  5      $ r   )r   r:   r   s    r   __str__"TensorQuantOverridesHelper.__str__  r   r   c                @   > [         TU ]  5        SU R                   S3$ )Nz, TensorQuantOverridesHelper(r}   )super__repr__r:   )r   	__class__s    r   r   #TensorQuantOverridesHelper.__repr__  s&    '"$%%B4>>BRRSTTr   )r<   r:   r;   )r=   dict[str, list[dict[str, Any]]])rD   r   r+   boolr   )rD   r   rT   dict[str, Any] | Noner+   r   )rD   r   rT   list[dict[str, Any]] | Noner+   r   )r+   zset[QuantType])rD   r   ra   r)   r+   tuple[bool, str | None])rD   r   r`   zlist[dict[str, Any]]r+   r   )ro   zdict[str, onnx.TensorProto]r   zset[str]r+   r   )NT)
rD   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/   r0   r>   rF   rI   rN   rV   rY   rb   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   __classcell__)r   s   @r   r5   r5   ?   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   r5   )
__future__r   r   collections.abcr   dataclassesr   typingr   onnxquant_utilsr   r
   r5   r'   r   r   <module>r      sF    #  * !   " )) )) ))XIU IUr   