§
    kŠtj×&  ã                   ó®   — d dl Zd dlZd dlm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dS )é    N)Úonnx_pbé   )ÚTENSOR_NAME_QUANT_SUFFIXÚQuantizedValueÚQuantizedValueTypeÚattribute_to_kwargÚfind_by_nameÚget_mul_nodeé   )ÚQuantOperatorBase)ÚQDQOperatorBasec                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚConvIntegerc                 óL   •— t          ¦   «                              ||¦  «         d S ©N©ÚsuperÚ__init__©ÚselfÚonnx_quantizerÚ	onnx_nodeÚ	__class__s      €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/operators/conv.pyr   zConvInteger.__init__   ó#   ø€ Ý‰Œ×Ò˜¨Ñ3Ô3Ð3Ð3Ð3ó    c                 ó  — | j         }| j        j        }t          |j        d         |                     ¦   «         ¦  «        }|€t          d|j        d         › d�¦  «        ‚|j        d         }|j        d         }|dz   }|dz   }	t          j	        t          |j        ¦  «        t          j        ¬	¦  «        }
d
|
d<   t          j                             |t           j        j        t          |j        ¦  «        g|
¦  «        }|                     |¦  «         t          j                             d||g|	g¦  «        }|                     |¦  «         t          j                             d||	g|g|dz   ¦  «        }|                     |¦  «         dS )a°  
        Given a node, this function handles bias add by adding a "reshape" node on bias and an "add" node
            parameter nodes: new nodes would be appended into nodes
            parameter node: current node (Conv)
            parameter scaled_output: output of quant conv without bias
            parameter output: output of Conv
            parameter bias_name: bias of Conv
            return: the name of output
        r   Nz	Expected z to be an initializerr   r   Ú_bias_reshape_shapeÚ_bias_reshape_output)ÚdtypeéÿÿÿÿÚReshapeÚAddÚ	_bias_add)ÚnodeÚ	quantizerÚmodelr	   ÚinputÚinitializerÚ
ValueErrorÚoutputÚnpÚonesÚlenÚdimsÚint64ÚonnxÚhelperÚmake_tensorÚ
onnx_protoÚTensorProtoÚINT64Úadd_initializerÚ	make_nodeÚappend)r   ÚnodesÚscaled_outputr%   r'   Úweightr+   Úreshape_input_dataÚreshape_input_shapeÚreshape_outputÚshapeÚ
init_shapeÚreshape_nodeÚadd_nodes                 r   Úadd_biaszConvInteger.add_bias   sy  € ð ŒyˆØ”Ô$ˆå˜dœj¨œm¨U×->Ò->Ñ-@Ô-@ÑAÔAˆØˆ>ÝÐM¨¬°A¬ÐMÐMÐMÑNÔNÐNð ”˜Q”ˆØ!œZ¨œ]ÐØ$Ð'<Ñ<ÐØÐ"8Ñ8ˆå”�˜Vœ[Ñ)Ô)µ"´(Ð;Ñ;Ô;ˆØˆˆa‰Ý”[×,Ò,Ø¥Ô!7Ô!=ÅÀFÄKÑ@PÔ@PÐ?QÐSXñ
ô 
ˆ
ð 	×Ò˜jÑ)Ô)Ð)å”{×,Ò,¨YÐ9KÐM`Ð8aÐdrÐcsÑtÔtˆØ�Š�\Ñ"Ô"Ð"õ ”;×(Ò(¨°ÀÐ0OÐRXÐQYÐ[aÐdoÑ[oÑpÔpˆØ�Š�XÑÔÐÐÐr   c                 ó€  — | j         }|j        dk    sJ ‚| j                             |dg¦  «        \  }}}}| j                             |dg| j        j        ¬¦  «        \  }}}}	|                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |	¦  «         |j        d         dz   }
|j        r
|j        dz   nd}i }|j	        D ]$}| 
                    t          |¦  «        ¦  «         Œ%t          j        j        d||z   |
g|fi |¤Ž}|                     |¦  «         | j                             |j        d         d	¬
¦  «        }|
dz   }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         }t#          |j        ¦  «        dk    }|s|j        d         n|j        d         dz   }|r|dz   nd}|                     t)          ||g||¦  «        ¦  «         |r|                      ||¦  «         | j        xj        |z  c_        d S )NÚConvr   r   ©Úreduce_rangeÚ_output_quantizedÚ_quantÚ r   T)Ú	mandatoryÚ_cast_outputÚCastÚ_cast)Útor   Ú_scales_mulÚ_Ú_mulz:0é   Úquant_scaled_outputÚ_output_scale_mul)r%   Úop_typer&   Úquantize_activationÚquantize_weightrH   Úextendr+   ÚnameÚ	attributeÚupdater   r1   r2   r8   r9   Úget_tensor_typer.   r	   Ú	new_nodesr
   r(   rD   )r   r%   Úquantized_input_namesÚzero_point_namesÚscale_namesr:   Úquantized_input_names_weightÚzero_point_names_weightÚscale_names_weightÚnodes_weightÚconv_integer_outputÚconv_integer_nameÚkwargsr\   Úconv_integer_nodeÚ	onnx_typeÚcast_op_outputÚ	cast_nodeÚscales_mul_opÚscales_mul_nodeÚscales_mul_op_outputÚhas_biasÚscaled_output_nameÚoutput_scale_mul_ops                           r   ÚquantizezConvInteger.quantize:   sD  € ØŒyˆØŒ|˜vÒ%Ð%Ð%Ð%ð ŒN×.Ò.¨t°a°SÑ9Ô9ñ	
Ø!ØØØð ŒN×*Ò*¨4°!°À4Ä>ÔC^Ð*Ñ_Ô_ñ	
Ø(Ø#ØØà×$Ò$Ð%AÑBÔBÐBØ×ÒÐ 7Ñ8Ô8Ð8Ø×ÒÐ-Ñ.Ô.Ð.Ø�Š�\Ñ"Ô"Ð"à"œk¨!œnÐ/BÑBÐØ48´IÐE˜DœI¨Ñ0Ð0À2ÐàˆØœð 	9ð 	9ˆIØ�MŠMÕ,¨YÑ7Ô7Ñ8Ô8Ð8Ð8Ý œKÔ1ØÐ0Ð3CÑCÐFYÐEZÐ\mð
ð 
Øqwð
ð 
Ðð 	�ŠÐ&Ñ'Ô'Ð'ð ”N×2Ò2°4´;¸q´>ÈTÐ2ÑRÔRˆ	Ø,¨~Ñ=ˆÝ”K×)Ò)ØØ Ð!ØÐØ 'Ñ)Øð *ñ 
ô 
ˆ	ð 	�Š�YÑÔÐõ �;ÑÔ 1Ò$Ð$Ð$Ð$Øð 	KØ-°Ñ=ˆMˆMà'¨œN¨SÑ0°;¸q´>ÑAÀFÑJˆMå& }°d´nÔ6NÑOÔOˆØÐ"Ý*¨;¸ÈÑ8LÈmÑ\Ô\ˆOØ�LŠL˜Ñ)Ô)Ð)à.Ô5°aÔ8Ðå�t”z‘?”? aÒ'ˆØ3;Ðg˜Tœ[¨œ^˜^ÀÄÈQÄÐRgÑAgÐð J[ÐbÐ/Ð2EÑEÐEÐ`bÐØ�ŠÝØÐ!5Ð6Ø"Ø#ñô ñ	
ô 	
ð 	
ð ð 	5Ø�MŠM˜%Ð!3Ñ4Ô4Ð4àŒÐ Ô  EÑ)Ð Ô Ð Ð r   )Ú__name__Ú
__module__Ú__qualname__r   rD   rt   Ú__classcell__©r   s   @r   r   r      s^   ø€ € € € € ð4ð 4ð 4ð 4ð 4ð#ð #ð #ðJL*ð L*ð L*ð L*ð L*ð L*ð L*r   r   c                   ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )ÚQLinearConvc                 óL   •— t          ¦   «                              ||¦  «         d S r   r   r   s      €r   r   zQLinearConv.__init__Š   r   r   c                 óv  •— | j         }|j        dk    sJ ‚| j                             |j        d         ¦  «        \  }}}}}| j                             |j        d         ¦  «        rÂ| j                             ¦   «         r©| j                             |dg¦  «        \  }}}}	| j         	                    |j        d         t          j        j        d¦  «        }
|                     |
d         ¦  «         |                     |
d         ¦  «         |                     |
d         ¦  «         n¢| j                             |dg¦  «        \  }}}}	| j                             |dg| j        j        ¬¦  «        \  }}}}|                     |¦  «         |                     |¦  «         |                     |¦  «         |	                     |¦  «         |r|€ t#          ¦   «                              ¦   «         S d}d}t'          |j        ¦  «        dk    rm| j        j        t          j        j        k    rt-          d	¦  «        ‚| j                             |j        d         |j        d         |j        d         ¦  «        }d
}|j        d         t0          z   }|j        r
|j        dz   nd}i }|j        D ]$}|                     t9          |¦  «        ¦  «         Œ%g }|                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |d         ¦  «         |                     |¦  «         |                     |¦  «         |r|                     |¦  «         t;          j        j        d||g|fi |¤Ž}|	                     |¦  «         tA          |j        d         |||tB          j"        ¦  «        }|| j        j#        |j        d         <   | j        xj$        |	z  c_$        d S )NrF   r   r   r   rG   rK   FrT   z@Quantization to FLOAT8E4M3FN for operator Conv is not supported.TrJ   r{   )%r%   rW   r&   Ú_get_quantization_paramsr+   Úis_input_a_initializerr(   Úis_per_channelrX   Úquantize_weight_per_channelr4   r5   ÚINT8r9   rY   rH   rZ   r   rt   r.   Úweight_qTypeÚFLOAT8E4M3FNÚRuntimeErrorÚquantize_bias_staticr   r[   r\   r]   r   r1   r2   r8   r   r   ÚInputÚquantized_value_mapr_   )r   r%   Ú
data_foundÚoutput_scale_nameÚoutput_zp_namerR   r`   ra   rb   r:   Úquant_weight_tuplerc   rd   re   rf   Úquantized_bias_nameÚbias_presentÚqlinear_conv_outputÚqlinear_conv_nameri   r\   Úqlinear_conv_inputsÚqlinear_conv_nodeÚq_outputr   s                           €r   rt   zQLinearConv.quantize�   sc  ø€ ØŒyˆØŒ|˜vÒ%Ð%Ð%Ð%ð ŒN×3Ò3°D´KÀ´NÑCÔCñ	
ØØØØØð Œ>×0Ò0°´¸A´Ñ?Ô?ð  	'ÀDÄN×DaÒDaÑDcÔDcð  	'ð ”×2Ò2°4¸!¸Ñ=Ô=ñØ%Ø ØØà!%¤×!KÒ!KØ”
˜1”ÝÔ&Ô+Øñ"ô "Ðð
 "×(Ò(Ð);¸AÔ)>Ñ?Ô?Ð?Ø×#Ò#Ð$6°qÔ$9Ñ:Ô:Ð:Ø×ÒÐ1°!Ô4Ñ5Ô5Ð5Ð5ð ”×2Ò2°4¸!¸Ñ=Ô=ñØ%Ø ØØð ”×.Ò.¨t°a°SÀtÄ~ÔGbÐ.ÑcÔcñØ,Ø'Ø"Øà!×(Ò(Ð)EÑFÔFÐFØ×#Ò#Ð$;Ñ<Ô<Ð<Ø×ÒÐ1Ñ2Ô2Ð2Ø�LŠL˜Ñ&Ô&Ð&àð 	&Ð2Ð:Ý‘7”7×#Ò#Ñ%Ô%Ð%à ÐØˆÝˆtŒz‰?Œ?˜aÒÐØŒ~Ô*­jÔ.DÔ.QÒQÐQÝ"Ð#eÑfÔfÐfØ"&¤.×"EÒ"EÀdÄjÐQRÄmÐUYÔU_Ð`aÔUbÐdhÔdnÐopÔdqÑ"rÔ"rÐØˆLà"œk¨!œnÕ/GÑGÐØ48´IÐE˜DœI¨Ñ0Ð0À2ÐàˆØœð 	9ð 	9ˆIØ�MŠMÕ,¨YÑ7Ô7Ñ8Ô8Ð8Ð8Ø Ðà×"Ò"Ð#8¸Ô#;Ñ<Ô<Ð<Ø×"Ò" ;¨q¤>Ñ2Ô2Ð2Ø×"Ò"Ð#3°AÔ#6Ñ7Ô7Ð7à×"Ò"Ð#8¸Ô#;Ñ<Ô<Ð<Ø×"Ò" ;¨q¤>Ñ2Ô2Ð2Ø×"Ò"Ð#3°AÔ#6Ñ7Ô7Ð7ð 	×"Ò"Ð#4Ñ5Ô5Ð5Ø×"Ò" >Ñ2Ô2Ð2àð 	<Ø×&Ò&Ð':Ñ;Ô;Ð;å œKÔ1ØÐ.Ð1DÐ0EÐGXð
ð 
Ø\bð
ð 
Ðð 	�ŠÐ&Ñ'Ô'Ð'õ "ØŒK˜ŒNØØØÝÔ$ñ
ô 
ˆð >FˆŒÔ*¨4¬;°q¬>Ñ:àŒÐ Ô  EÑ)Ð Ô Ð Ð r   ©ru   rv   rw   r   rt   rx   ry   s   @r   r{   r{   ‰   sZ   ø€ € € € € ð4ð 4ð 4ð 4ð 4ð_*ð _*ð _*ð _*ð _*ð _*ð _*ð _*ð _*r   r{   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚQDQConvc                 óL   •— t          ¦   «                              ||¦  «         d S r   r   r   s      €r   r   zQDQConv.__init__ð   r   r   c                 óª  — | j         }|j        dk    s|j        dk    sJ ‚| j                             |j        d         ¦  «         | j        s%| j                             |j        d         ¦  «         | j                             |j        d         |j        dk    rdnd¬¦  «        \  }}|r'| j                             |j        d         |¦  «         n%| j         	                    |j        d         ¦  «         t          |j        ¦  «        dk    rE| j                             |j        |j        d         |j        d         |j        d         ¦  «         d S d S )NrF   ÚConvTransposer   r   )Údefault_axisrT   r   )r%   rW   r&   Úquantize_activation_tensorr(   Údisable_qdq_for_node_outputr+   Úis_tensor_per_channelÚ"quantize_weight_tensor_per_channelÚquantize_weight_tensorr.   Úquantize_bias_tensorr[   )r   r%   Úis_weight_per_channelÚweight_axiss       r   rt   zQDQConv.quantizeó   sH  € ØŒyˆØŒ|˜vÒ%Ð%¨¬¸Ò)HÐ)HÐ)HÐHàŒ×1Ò1°$´*¸Q´-Ñ@Ô@Ð@ØÔ/ð 	FØŒN×5Ò5°d´kÀ!´nÑEÔEÐEà-1¬^×-QÒ-QØŒJ�qŒM¨T¬\¸VÒ-CÐ-C¨¨Èð .Rñ .
ô .
Ñ*Ð˜{ð !ð 	AØŒN×=Ò=¸d¼jÈ¼mÈ[ÑYÔYÐYÐYàŒN×1Ò1°$´*¸Q´-Ñ@Ô@Ð@åˆtŒz‰?Œ?˜aÒÐØŒN×/Ò/°´	¸4¼:Àa¼=È$Ì*ÐUVÌ-ÐY]ÔYcÐdeÔYfÑgÔgÐgÐgÐgð  Ðr   r”   ry   s   @r   r–   r–   ï   sN   ø€ € € € € ð4ð 4ð 4ð 4ð 4ðhð hð hð hð hð hð hr   r–   )Únumpyr,   r1   r   r4   Úquant_utilsr   r   r   r   r	   r
   Úbase_operatorr   Úqdq_base_operatorr   r   r{   r–   © r   r   ú<module>r¨      sH  ðØ Ð Ð Ð Ø €€€Ø &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø .Ð .Ð .Ð .Ð .Ð .ðu*ð u*ð u*ð u*ð u*Ð#ñ u*ô u*ð u*ðpc*ð c*ð c*ð c*ð c*Ð#ñ c*ô c*ð c*ðLhð hð hð hð hˆoñ hô hð hð hð hr   