
     Ng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dS )    )annotationsN)MutableMapping)	dataclass)Any   )	QuantTypec                  x    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dS )QuantTypeInfozB
    The quantization type information for a tensor override.
    r   
quant_typeNbool | None	symmetricreduce_rangez
int | Noneaxisotherobjectc                   t          |t                    rd| j        |j        k    oS| j        d u p|j        d u p| j        |j        k    o1| j        d u p|j        d u p| j        |j        k    o| j        |j        k    S t          S N)
isinstancer
   r   r   r   r   NotImplemented)selfr   s     k/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/quantization/tensor_quant_overrides.py__eq__zQuantTypeInfo.__eq__   s    e]++ 	5#33 .^t+ku$/Fk$.\a\kJk.&$.w%2D2LwPTPaejewPw. Y%*,	     raw_dictdict[str, Any]default_qtypeQuantType | Nonedefault_symmetricdefault_reduce_rangereturnc                    t          |                     d|          |                     d|          |                     d|          |                     d                    S Nr   r   r   r   )r
   get)r   r   r   r   s       r   load_from_dictzQuantTypeInfo.load_from_dict'   sZ     LL}55LL&788LL)=>>LL  	
 
 	
r   c                    | j         |d<   | j        
| j        |d<   | j        
| j        |d<   | j        | j        |d<   d S d S r"   )r   r   r   r   )r   r   s     r   save_to_dictzQuantTypeInfo.save_to_dict5   sZ    !%>%$(NH[!('+'8H^$9 #yHV ! r   )r   r   )NNN)
r   r   r   r   r   r   r   r   r    r
   )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                       e Zd ZdZd>dZd?d	Zd?d
Zd?dZ	 d@dAdZ	 d@dBdZ	dCdZ
dDdZdEdZdFdZ	 	 dGdHd%Z	 d@dId,Z	 	 dJdKd0Zd@dLd1ZdMd2ZdNd3ZdOd7ZdPd8ZdQd9Zd: Zd; ZdLd<ZdL fd=Z xZS )RTensorQuantOverridesHelperzZ
    Utility wrapper over the tensor quantization overrides passed via extra_options.
    raw_overridesdict[str, list[dict[str, Any]]]c                4    || _         d | _        h d| _        d S )N>   rmaxrminr   r   )	overridesquant_typeskeys_unsupported_with_scale_zp)r   r0   s     r   __init__z#TensorQuantOverridesHelper.__init__D   s%    &.[.[.[+++r   tensor_namestrr    boolc                N    | j                             |          }|o	d|d         vS Nr   r   r5   r#   r   r9   overrides_lists      r   has_per_tensor_overridesz3TensorQuantOverridesHelper.has_per_tensor_overridesI   s,    ++K88A&q0A"AAr   c                N    | j                             |          }|o	d|d         v S r=   r>   r?   s      r   has_per_channel_overridesz4TensorQuantOverridesHelper.has_per_channel_overridesM   s,    ++K88=&N1,="==r   c                b    | j                             |          }|od|d         v o	d|d         v S )Nscaler   
zero_pointr>   r?   s      r   overrides_scale_zpz-TensorQuantOverridesHelper.overrides_scale_zpQ   s=    ++K88h7nQ.?#?hlVdefVgFghr   Ndefault_valdict[str, Any] | Nonec                    ||gnd }| j                             ||          }|rd|d         v rt          d| d          |r|d         nd S )Nr   r   Expected tensor 'zL' to use per-tensor quantization overrides, but found per-channel overrides.r5   r#   
ValueError)r   r9   rH   default_list_valr@   s        r   get_per_tensor_overridesz3TensorQuantOverridesHelper.get_per_tensor_overridesU   s    
 -8,CK==++K9IJJ 	fq(9994K 4 4 4  
 %3<~a  <r   list[dict[str, Any]] | Nonec                ~    | j                             ||          }|sd S d|d         vrt          d| d          |S )Nr   r   rK   zE' to have per-channel quantization overrides (axis value is missing).rL   )r   r9   rH   r@   s       r   get_per_channel_overridesz4TensorQuantOverridesHelper.get_per_channel_overridesd   s`    
 ++KEE 	4***vKvvv   r   set[QuantType]c                R   | j         | j         S t                      | _         | j        ry| j                                        D ]_}|D ]Z}d|v r | j                             |d                    d|v r0d|d         v r&| j                             |d         d                    [`| j         S )Nr   convert)r6   setr5   valuesadd)r   quant_overrides_listquant_overridess      r   get_quant_typesz*TensorQuantOverridesHelper.get_quant_typesu   s    '##55> 	W(,(=(=(?(? W W$'; W WO#66(,,_\-JKKK O33XaHb8b8b(,,_Y-G-UVVVW r   rZ   r   tuple[bool, str | None]c                (   t          |t                    sdd| dfS ||v }|                    d          }|r| j                            |           d|v }d|v }|r|r|r|sdS |rD| j                            t          |                    }	|	rddd	                    |	           d
fS d|v r	|sdd| fS d|v r|rdS 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 |rM| j                            t          |d                             }	|	rddd	                    |	           d| dfS | j                            |
           dS )NF#Tensor quantization overrides for '' are not in a dictr   rE   rF   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 rU   )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#   r6   rX   r7   intersectionrV   join)r   initializersdefault_activation_qtyper9   rZ   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   s    /400 	VkVVV 
 %4$((66
 	-  ,,,.	%8 	n 	. 	 	 
  	6CCCDXDXYYD n$))D//nnn 
 _,,^,m`kmm 
 '' ONN?9#===gKggggg!;;;qdoqq 
 "1!;L!I0:0F**Ld!%888iZeiii 
 !(?9+E E%1_Y5O%O"! *@ F\ ev ~oz~~~ 
 ! :GGO\eLfHgHghh 4diioo 4 4$/4 4 4    !3444zr   rY   list[dict[str, Any]]c                :   ||v }|sdd| dfS |d                              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k    r=t          |          ||         k    r$dd| d| d||          dt          |           d	fS d|d         v rdd| dfS |d                              d          }	|	r| j                            |	           |d                              d          }
|d                              d          }d|d         v }d|d         v }|o|}|r|r|r|sdS |rJ| j                            t          |d                             }|rddd	                    |           dfS d|d         v }d|d         v }|o|}|r|r|s|rdS 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         k    r d"S d|v r||d         k    r||d         k    r d#S d|v r|
|d         k    r d$S d|v r||d         k    r d%S d|v od|v }|r|sdd&| d'| dfc S |rF| j                            t          |                    }|rddd	                    |           dfc S d|v od|v }|r|sdd(| d'| dfc S 
d)S )*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 .rU   z8Cannot use 'convert' override for initializers, such as r   r   r   rE   rF   r`   ra   rb   rc   r4   r3   )Fz6Must provide both 'rmin' and 'rmax' if one is providedz'Tensor quantization overrides at index z for 'r_   )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 'rd   )r#   listdimslenr6   rX   r7   rf   rV   rg   	enumerater   re   )r   rh   r9   rY   rj   r   weight_shapeweight_rank	norm_axisr   r   r   rk   rl   has_scale_zprm   has_rminhas_rmaxhas_rmin_rmaxindexrZ   chan_has_scale_zpchan_has_rmin_rmaxs                          r   _is_valid_per_channelz0TensorQuantOverridesHelper._is_valid_per_channel   s    %4 	^;^^^ 
 $A&**622<0K 0 0 0  L5:;;,''	q==$Iq==I\):):::k;kkWZ[gWhWhkkk 
 #$$q((S1E-F-F,W`Ja-a-aYK Y YX\ Y Y(.Y Y<?@T<U<UY Y Y  ,Q///cU`ccccc)!,00>>
 	-  ,,,(+//<<	+A.22>BB3A66	%)=a)@@ 3^ 	n 	. 	 	 
  	6CCCH\]^H_D`D`aaD n$))D//nnn 
 1!441!44 -X 	X 	x 	H 	 
 '00DQRR0H&I&I ;	 ;	"E?ot44 kekk;kkk   
 O++gYdggggggg
 ..:Q]A^3^3^   ((T_V5L-L-LQZ^mnt^uQuQu   o--){?[2[2[   00\_UcEd5d5d   !(? : ^|?^ $5 T#.T TKPT T T    ! :GGOH\H\]] rdiioorrr    "(?!:!Xv?X %7 T#.T TKPT T T    zr   rh   dict[str, onnx.TensorProto]activation_namesset[str]c                   t                      | _        | j        r| j                                        D ]\  }}||vr||vr
dd| dfc S t	          |t
                    s
dd| dfc S |s9t	          |d         t                    s
dd| dfc S |d         sg|d                             d	          }t          |          d
k    p|d u}|r| 	                    |||          c S | 
                    ||||d                   c S dS )NFru   z5' in TensorQuantOverrides is not present in the modelr^   z' are not in a listr   z.Tensor quantization overrides at index 0 for 'r_   r   r   rd   )rV   r6   r5   itemsr   rx   re   r#   rz   r   rr   )r   rh   r   ri   r9   rY   r   is_per_channels           r   is_validz#TensorQuantOverridesHelper.is_validi  s    55 > 	59^5I5I5K5K  11l22{JZ7Z7Z "o["o"o"ooooo!"6== i "h"h"h"hhhhh+ !"6q"94@@ t "sS^"s"s"sssss+A. +A.226::!$%9!:!:Q!>!R$dBR! g55lKQefffff00 ":KI]^_I`     zr   Tnew_valschannelslist[int] | None	overwritec                   |sdS |t          |          nd }| j                            |          }d}|s\|rZt          | j        |                   D ]?\  }}|||vrt          |                              t          |                    rd} n@|rI|si g| j        |<   t          | j        |                   D ]!\  }}|||vr|                    |           "|S )NFT)rV   r5   r#   r{   rf   update)	r   r9   r   r   r   have_overrides	do_updatechannelr5   s	            r   update_tensor_overridesz2TensorQuantOverridesHelper.update_tensor_overrides  s*     	5$,$83x===d++K88 	 	^ 	&/{0K&L&L  "'G8,C,Cx==--c)nn==  %IE
  	+! 3/1d{+&/{0K&L&L + +"'G8,C,C  ****r   output_namer   r   r   r   r
   c                    || j         vrt          ||          S | j         |         d         }t          |                    d|          |                    d|                    S )Nr   r   r   )r5   r
   r#   )r   r   r   r   tensor_overridess        r   get_node_output_qtype_infoz5TensorQuantOverridesHelper.get_node_output_qtype_info  sm     dn,, 0ABBB>+6q9  }==  .?@@
 
 	
r   
input_name	node_namer   c                   || j         vs| j         |         st          |||          S | j         |         d         }|                    d|          }d|vrMt          ||                    d|          |                    d|          |                    d                    S |d         }t          ||                    d|                    }	d|vs
||d         v r|d         |	_        |	S )Nr   r   rU   r   r   r   
recv_nodes)r5   r
   r#   r   )
r   r   r   r   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X  >*5a8(,,\=II,,,  $$[2CDD $$^5IJJ $$V,,	   (	2"[*;<<
 

 ,,)|L?Y2Y2Y$0$>J!r   c                D    t          j        | j        t          |          S )N)defaultindent)jsondumpsr5   r:   )r   r   s     r   
pprint_strz%TensorQuantOverridesHelper.pprint_str  s    z$.#fEEEEr   c                    | j          S r   r5   r   s    r   emptyz TensorQuantOverridesHelper.empty  s    >!!r   c                    | j         S r   r   r   s    r   get_dictz#TensorQuantOverridesHelper.get_dict  s
    ~r   keyvalue
list[dict]c                    || j         |<   d S r   r   )r   r   r   s      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         |= d S r   r   r   s     r   __delitem__z&TensorQuantOverridesHelper.__delitem__  s    N3r   c                *    t          | j                  S r   )iterr5   r   s    r   __iter__z#TensorQuantOverridesHelper.__iter__  s    DN###r   c                *    t          | j                  S r   )rz   r5   r   s    r   __len__z"TensorQuantOverridesHelper.__len__      4>"""r   c                *    t          | j                  S r   )r:   r5   r   s    r   __str__z"TensorQuantOverridesHelper.__str__  r   r   c                Z    t                                                       d| j         dS )Nz, TensorQuantOverridesHelper(rv   )super__repr__r5   )r   	__class__s    r   r   z#TensorQuantOverridesHelper.__repr__  s,    ''""$$TT4>TTTTr   )r0   r1   )r9   r:   r    r;   r   )r9   r:   rH   rI   r    rI   )r9   r:   rH   rP   r    rP   )r    rS   )r9   r:   rZ   r   r    r\   )r9   r:   rY   rs   r    r\   )rh   r   r   r   r    r\   )NT)
r9   r:   r   r   r   r   r   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    r1   )r   r:   r   r   )r   r:   r    r   )r   r:   )r'   r(   r)   r*   r8   rA   rC   rG   rO   rR   r[   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r/   r/   ?   sZ        \ \ \ \
B B B B> > > >i i i i .2= = = = =$ 48    "       "S S S SjL L L L\$ $ $ $T &*! ! ! ! !N *.	
 
 
 
 
, *.,0% % % % %NF F F F F" " " "   
$ $ $ $# # # #       $ $ $# # ## # # #U U U U U U U U U Ur   r/   )
__future__r   r   collections.abcr   dataclassesr   typingr   onnxquant_utilsr   r
   r/   r-   r   r   <module>r      s    # " " " " "  * * * * * * ! ! ! ! ! !        " " " " " " )) )) )) )) )) )) )) ))XIU IU IU IU IU IU IU IU IU IUr   