§
    kŠtj;  ã                   óÊ   — d dl Z d dlZd dlZddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZ  G d„ de¦  «        Z	  G d	„ d
e¦  «        Z	  G d„ de¦  «        Z G d„ de¦  «        ZdS )é    Né   )ÚFLOAT8_TYPESÚTENSOR_NAME_QUANT_SUFFIXÚQuantizedValueÚQuantizedValueTypeÚfind_by_nameÚget_mul_nodeé   )ÚQuantOperatorBase)ÚQDQOperatorBasec                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú	QOpMatMulc                 óL   •— t          ¦   «                              ||¦  «         d S ©N©ÚsuperÚ__init__©ÚselfÚonnx_quantizerÚ	onnx_nodeÚ	__class__s      €úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/operators/matmul.pyr   zQOpMatMul.__init__   ó#   ø€ Ý‰Œ×Ò˜¨Ñ3Ô3Ð3Ð3Ð3ó    c                 óJ  — | j                              | j        ¦  «        s$t          j        d| j        j        › d�¦  «         dS | j                              | j        j        d         ¦  «        sN| j                              | j        j        d         ¦  «        s$t          j        d| j        j        › d�¦  «         dS | j         j	        r[| j          
                    | j        j        d         ¦  «        s1t          j        d| j         j        › d| j        j        › d�¦  «         dS d	S )
NzIgnore MatMul ú]Fr
   r   z&Ignore MatMul due to non float inputs z%Ignore MatMul due to non constant B: ú[T)Ú	quantizerÚshould_quantize_nodeÚnodeÚloggingÚdebugÚnameÚis_float_tensorÚinputÚinfoÚq_matmul_const_b_onlyÚfind_initializer_in_pathÚgraph_scope)r   s    r   Úshould_quantizezQOpMatMul.should_quantize   s  € ØŒ~×2Ò2°4´9Ñ=Ô=ð 	ÝŒMÐ<¨4¬9¬>Ð<Ð<Ð<Ñ=Ô=Ð=Ø�5à”×.Ò.¨t¬y¬¸qÔ/AÑBÔBð 	Ø”×.Ò.¨t¬y¬¸qÔ/AÑBÔBð	õ ŒLÐSÀ$Ä)Ä.ÐSÐSÐSÑTÔTÐTØ�5ð Œ>Ô/ð 	Ø”>×:Ò:¸4¼9¼?È1Ô;MÑNÔNð Ý”ÐsÀTÄ^ÔE_ÐsÐsÐbfÔbkÔbpÐsÐsÐsÑtÔtÐtØ�uØˆtr   )Ú__name__Ú
__module__Ú__qualname__r   r+   Ú__classcell__©r   s   @r   r   r      sG   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðð ð ð ð ð ð r   r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚMatMulIntegerc                 óL   •— t          ¦   «                              ||¦  «         d S r   r   r   s      €r   r   zMatMulInteger.__init__/   r   r   c                 ó˜  — | j         }|j        dk    sJ ‚| j                             |dg¦  «        \  }}}}| j                             |dgdd¬¦  «        \  }}}}	|                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |	¦  «         |j        d         dz   }
|j        r
|j        dz   nd}t          j	         
                    d	||z   |
g|¦  «        }|                     |¦  «         |
d
z   }| j                             |j        d         d¬¦  «        }t          j	         
                    d|
g|g|
dz   |¬¦  «        }|                     |¦  «         t          |¦  «        dk    sJ ‚|r|dz   n|d         dz   |d         z   dz   }t          || j        j        ¦  «        }|€)t!          ||dz   |¦  «        }|                     |¦  «         |j        d         }d}|r|dz   }|                     t!          ||g|j        d         |¦  «        ¦  «         | j        xj        |z  c_        d S )NÚMatMulr   r
   T©Úreduce_rangeÚop_level_per_channelÚ_output_quantizedÚ_quantÚ r2   Ú_cast_output)Ú	mandatoryÚCastÚ_cast)Útor   Ú_scales_mulÚ_Ú_mulz:0Ú_output_scale_mul)r!   Úop_typer   Úquantize_activationÚquantize_weightÚextendÚoutputr$   ÚonnxÚhelperÚ	make_nodeÚappendÚget_tensor_typeÚlenr   Ú	new_nodesr	   )r   r!   Úquantized_input_namesÚzero_point_namesÚscale_namesÚnodesÚquantized_input_names_weightÚzero_point_names_weightÚscale_names_weightÚnodes_weightÚmatmul_integer_outputÚmatmul_integer_nameÚmatmul_integer_nodeÚcast_op_outputÚotypeÚ	cast_nodeÚscales_mul_opÚscales_mul_nodeÚscales_mul_op_outputÚoutput_scale_mul_ops                       r   ÚquantizezMatMulInteger.quantize2   sÁ  € ØŒyˆØŒ|˜xÒ'Ð'Ð'Ð'ð ŒN×.Ò.¨t°a°SÑ9Ô9ñ	
Ø!ØØØð ŒN×*Ò*¨4°!°À4Ð^bÐ*ÑcÔcñ	
Ø(Ø#ØØà×$Ò$Ð%AÑBÔBÐBØ×ÒÐ 7Ñ8Ô8Ð8Ø×ÒÐ-Ñ.Ô.Ð.Ø�Š�\Ñ"Ô"Ð"à $¤¨A¤Ð1DÑ DÐØ6:´iÐG˜dœi¨(Ñ2Ð2ÀRÐÝ"œk×3Ò3ØØ!Ð$4Ñ4Ø"Ð#Øñ	
ô 
Ðð 	�ŠÐ(Ñ)Ô)Ð)ð /°Ñ?ˆØ”×.Ò.¨t¬{¸1¬~ÈÐ.ÑNÔNˆÝ”K×)Ò)ØØ"Ð#ØÐØ! GÑ+Øð *ñ 
ô 
ˆ	ð 	�Š�YÑÔÐõ �;ÑÔ 1Ò$Ð$Ð$Ð$ð #ð@Ð -Ñ/Ð/à˜Q” #Ñ%¨°A¬Ñ6¸Ñ?ð 	õ ' }°d´nÔ6NÑOÔOˆØÐ"Ý*¨;¸ÈÑ8LÈmÑ\Ô\ˆOØ�LŠL˜Ñ)Ô)Ð)à.Ô5°aÔ8Ðð !ÐØð 	LØ"5Ð8KÑ"KÐØ�ŠÝØÐ!5Ð6Ø”˜A”Ø#ñô ñ	
ô 	
ð 	
ð 	ŒÐ Ô  EÑ)Ð Ô Ð Ð r   ©r,   r-   r.   r   rc   r/   r0   s   @r   r2   r2   .   sN   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðG*ð G*ð G*ð G*ð G*ð G*ð G*r   r2   c                   ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )ÚQLinearMatMulc                 óL   •— t          ¦   «                              ||¦  «         d S r   r   r   s      €r   r   zQLinearMatMul.__init__‚   r   r   c                 ó<  •— | j         }|j        dk    sJ ‚| j                             |dg¦  «        \  }}}}| j                             |dgdd¬¦  «        \  }}}}	|                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |	¦  «         | j                             |j        d         ¦  «        \  }
}}}}|
r|€ t          ¦   «          	                    ¦   «         S |j        d         t          z   }|j        r
|j        dz   nd}g }|                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |¦  «         |                     |¦  «         | j        j        t          v rdnd}t          j                             d	||g||¬
¦  «        }|                     |¦  «         t%          |j        d         |||t&          j        ¦  «        }|| j        j        |j        d         <   | j        xj        |z  c_        d S )Nr5   r   r
   Tr6   r:   r;   zcom.microsoftrf   )Údomain)r!   rE   r   rF   rG   rH   Ú_get_quantization_paramsrI   r   rc   r   r$   rM   Úweight_qTyper   rJ   rK   rL   r   r   ÚInputÚquantized_value_maprP   )r   r!   rQ   rR   rS   rT   rU   rV   rW   rX   Ú
data_foundÚoutput_scale_nameÚoutput_zp_namerB   Úqlinear_matmul_outputÚqlinear_matmul_nameÚqlinear_matmul_inputsri   Úqlinear_matmul_nodeÚq_outputr   s                       €r   rc   zQLinearMatMul.quantize…   sÉ  ø€ ØŒyˆØŒ|˜xÒ'Ð'Ð'Ð'ð ŒN×.Ò.¨t°a°SÑ9Ô9ñ	
Ø!ØØØð ŒN×*Ò*¨4°!°À4Ð^bÐ*ÑcÔcñ	
Ø(Ø#ØØà×$Ò$Ð%AÑBÔBÐBØ×ÒÐ 7Ñ8Ô8Ð8Ø×ÒÐ-Ñ.Ô.Ð.à�Š�\Ñ"Ô"Ð"ð ŒN×3Ò3°D´KÀ´NÑCÔCñ	
ØØØØØàð 	&Ð2Ð:Ý‘7”7×#Ò#Ñ%Ô%Ð%à $¤¨A¤Õ1IÑ IÐØ6:´iÐG˜dœi¨(Ñ2Ð2ÀRÐà "Ðà×$Ò$Ð%:¸1Ô%=Ñ>Ô>Ð>Ø×$Ò$ [°¤^Ñ4Ô4Ð4Ø×$Ò$Ð%5°aÔ%8Ñ9Ô9Ð9à×$Ò$Ð%:¸1Ô%=Ñ>Ô>Ð>Ø×$Ò$ [°¤^Ñ4Ô4Ð4Ø×$Ò$Ð%5°aÔ%8Ñ9Ô9Ð9à×$Ò$Ð%6Ñ7Ô7Ð7Ø×$Ò$ ^Ñ4Ô4Ð4à$(¤NÔ$?Å<Ð$OÐ$O��ÐUWˆÝ"œk×3Ò3ØØ!Ø"Ð#ØØð 4ñ 
ô 
Ðð 	�ŠÐ(Ñ)Ô)Ð)õ "ØŒK˜ŒNØ!ØØÝÔ$ñ
ô 
ˆð >FˆŒÔ*¨4¬;°q¬>Ñ:àŒÐ Ô  EÑ)Ð Ô Ð Ð r   rd   r0   s   @r   rf   rf   �   sZ   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðD*ð D*ð D*ð D*ð D*ð D*ð D*ð D*ð D*r   rf   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú	QDQMatMulc                 óL   •— t          ¦   «                              ||¦  «         d S r   r   r   s      €r   r   zQDQMatMul.__init__Í   r   r   c                 óÜ  — | j         }|j        dk    sJ ‚| j        r|j        }nt	          j        |j        |j        ¦  «        }|D ]¦}t          || j        j	         
                    ¦   «         ¦  «        r^| j                             |d|j        ¬¦  «        \  }}|r| j                             ||¦  «         Œq| j                             |¦  «         ŒŒ| j                             |¦  «         Œ§d S )Nr5   r
   )Údefault_axisrE   )r!   rE   Údisable_qdq_for_node_outputr&   Ú	itertoolsÚchainrI   r   r   ÚmodelÚinitializerÚis_tensor_per_channelÚ"quantize_weight_tensor_per_channelÚquantize_weight_tensorÚquantize_activation_tensor)r   r!   Únodes_to_iterateÚtensor_nameÚis_per_channelÚchannel_axiss         r   rc   zQDQMatMul.quantizeÐ   s  € ØŒyˆØŒ|˜xÒ'Ð'Ð'Ð'àÔ+ð 	HØ#œzÐÐå(œ¨t¬z¸4¼;ÑGÔGÐà+ð 
	Gð 
	GˆKÝ˜K¨¬Ô)=×)IÒ)IÑ)KÔ)KÑLÔLð 	GØ/3¬~×/SÒ/SØ¨a¸¼ð 0Tñ 0ô 0Ñ,� ð "ð GØ”N×EÒEÀkÐS_Ñ`Ô`Ð`Ð`à”N×9Ò9¸+ÑFÔFÐFÐFà”×9Ò9¸+ÑFÔFÐFÐFð
	Gð 
	Gr   rd   r0   s   @r   rw   rw   Ì   sN   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðGð Gð Gð Gð Gð Gð Gr   rw   )r|   r"   rJ   Úquant_utilsr   r   r   r   r   r	   Úbase_operatorr   Úqdq_base_operatorr   r   r2   rf   rw   © r   r   ú<module>rŒ      sr  ðØ Ð Ð Ð Ø €€€à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø .Ð .Ð .Ð .Ð .Ð .ðð ð ð ð Ð!ñ ô ð ð.ð
K*ð K*ð K*ð K*ð K*�Iñ K*ô K*ð K*ð\ð
H*ð H*ð H*ð H*ð H*�Iñ H*ô H*ð H*ðVGð Gð Gð Gð G�ñ Gô Gð Gð Gð Gr   