Ë
    ÝÍ:j×&  ã                   óš   — 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y)é    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                 ó&   •— t         ‰| �  ||«       y ©N©ÚsuperÚ__init__©ÚselfÚonnx_quantizerÚ	onnx_nodeÚ	__class__s      €ú|/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/quantization/operators/conv.pyr   zConvInteger.__init__   ó   ø€ Ü‰Ñ˜¨Õ3ó    c                 ó6  — | j                   }| j                  j                  }t        |j                  d   |j                  «       «      }|€t        d|j                  d   › d�«      ‚|j                  d   }|j                  d   }|dz   }|dz   }	t        j                  t        |j                  «      t        j                  ¬	«      }
d
|
d<   t        j                  j                  |t         j"                  j$                  t        |j                  «      g|
«      }|j'                  |«       t        j                  j)                  d||g|	g«      }|j+                  |«       t        j                  j)                  d||	g|g|dz   «      }|j+                  |«       y)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   sb  € ð �y‰yˆØ—‘×$Ñ$ˆä˜dŸj™j¨™m¨U×->Ñ->Ó-@ÓAˆØˆ>Ü˜y¨¯©°A©¨Ð7LÐMÓNÐNð —‘˜Q‘ˆØ!ŸZ™Z¨™]ÐØ$Ð'<Ñ<ÐØÐ"8Ñ8ˆä—‘œ˜VŸ[™[Ó)´"·(±(Ô;ˆØˆˆa‰Ü—[‘[×,Ñ,Ø¤×!7Ñ!7×!=Ñ!=ÄÀFÇKÁKÓ@PÐ?QÐSXó
ˆ
ð 	×Ñ˜jÔ)ä—{‘{×,Ñ,¨YÐ9KÐM`Ð8aÐdrÐcsÓtˆØ�‰�\Ô"ô —;‘;×(Ñ(¨°ÀÐ0OÐRXÐQYÐ[aÐdoÑ[oÓpˆØ�‰�XÕr   c                 ó”  — | j                   }|j                  dk(  sJ ‚| j                  j                  |dg«      \  }}}}| j                  j	                  |dg| j                  j
                  ¬«      \  }}}}	|j                  |«       |j                  |«       |j                  |«       |j                  |	«       |j                  d   dz   }
|j                  r|j                  dz   nd}i }|j                  D ]  }|j                  t        |«      «       Œ t        j                  j                  d||z   |
g|fi |¤Ž}|j                  |«       | j                  j!                  |j                  d   d	¬
«      }|
dz   }t        j                  j                  d|
g|g|
dz   |¬«      }|j                  |«       t#        |«      dk(  sJ ‚|r|dz   }n|d   dz   |d   z   dz   }t%        || j                  j&                  «      }|€!t)        ||dz   |«      }|j                  |«       |j                  d   }t#        |j*                  «      dk(  }|s|j                  d   n|j                  d   dz   }|r|dz   nd}|j                  t)        ||g||«      «       |r| j-                  ||«       | j                  xj&                  |z  c_        y )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:   sÙ  € Ø�y‰yˆØ�|‰|˜vÒ%Ð%Ð%ð �N‰N×.Ñ.¨t°a°SÓ9ñ	
Ø!ØØØð �N‰N×*Ñ*¨4°!°À4Ç>Á>×C^ÑC^Ð*Ó_ñ	
Ø(Ø#ØØà×$Ñ$Ð%AÔBØ×ÑÐ 7Ô8Ø×ÑÐ-Ô.Ø�‰�\Ô"à"Ÿk™k¨!™nÐ/BÑBÐØ48·I²I˜DŸI™I¨Ò0À2ÐàˆØŸ™ò 	9ˆIØ�M‰MÔ,¨YÓ7Õ8ð	9ä ŸK™K×1Ñ1ØÐ0Ð3CÑCÐFYÐEZÐ\mñ
Øqwñ
Ðð 	�‰Ð&Ô'ð —N‘N×2Ñ2°4·;±;¸q±>ÈTÐ2ÓRˆ	Ø,¨~Ñ=ˆÜ—K‘K×)Ñ)ØØ Ð!ØÐØ 'Ñ)Øð *ó 
ˆ	ð 	�‰�YÔô �;Ó 1Ò$Ð$Ð$ÙØ-°Ñ=‰Mà'¨™N¨SÑ0°;¸q±>ÑAÀFÑJˆMä& }°d·n±n×6NÑ6NÓOˆØÐ"Ü*¨;¸ÈÑ8LÈmÓ\ˆOØ�L‰L˜Ô)à.×5Ñ5°aÑ8Ðä�t—z‘z“? aÑ'ˆÙ3;˜TŸ[™[¨š^ÀÇÁÈQÁÐRgÑAgÐñ J[Ð/Ð2EÒEÐ`bÐØ�‰ÜØÐ!5Ð6Ø"Ø#óô	
ñ Ø�M‰M˜%Ð!3Ô4à�‰× Ò  EÑ)Ö r   )Ú__name__Ú
__module__Ú__qualname__r   rD   rt   Ú__classcell__©r   s   @r   r   r      s   ø„ ô4ò#öJL*r   r   c                   ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )ÚQLinearConvc                 ó&   •— t         ‰| �  ||«       y r   r   r   s      €r   r   zQLinearConv.__init__Š   r   r   c                 ód  •— | j                   }|j                  dk(  sJ ‚| j                  j                  |j                  d   «      \  }}}}}| j                  j                  |j                  d   «      r»| j                  j                  «       r¡| j                  j                  |dg«      \  }}}}	| j                  j                  |j                  d   t        j                  j                  d«      }
|j                  |
d   «       |j                  |
d   «       |j                  |
d   «       nž| j                  j                  |dg«      \  }}}}	| j                  j                  |dg| j                  j                  ¬«      \  }}}}|j!                  |«       |j!                  |«       |j!                  |«       |	j!                  |«       |r|€t"        ‰| �I  «       S d}d}t'        |j                  «      dk(  r‚| j                  j(                  t        j                  j*                  k(  rt-        d	«      ‚| j                  j/                  |j                  d   |j                  d   |j                  d   «      }d
}|j                  d   t0        z   }|j2                  r|j2                  dz   nd}i }|j4                  D ]  }|j7                  t9        |«      «       Œ g }|j                  |d   «       |j                  |d   «       |j                  |d   «       |j                  |d   «       |j                  |d   «       |j                  |d   «       |j                  |«       |j                  |«       |r|j                  |«       t;        j<                  j>                  d||g|fi |¤Ž}|	j                  |«       tA        |j                  d   |||tB        jD                  «      }|| j                  jF                  |j                  d   <   | j                  xjH                  |	z  c_$        y )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�   sá  ø€ Ø�y‰yˆØ�|‰|˜vÒ%Ð%Ð%ð �N‰N×3Ñ3°D·K±KÀ±NÓCñ	
ØØØØØð �>‰>×0Ñ0°·±¸A±Ô?ÀDÇNÁN×DaÑDaÔDcð —‘×2Ñ2°4¸!¸Ó=ñØ%Ø ØØà!%§¡×!KÑ!KØ—
‘
˜1‘Ü×&Ñ&×+Ñ+Øó"Ðð
 "×(Ñ(Ð);¸AÑ)>Ô?Ø×#Ñ#Ð$6°qÑ$9Ô:Ø×ÑÐ1°!Ñ4Õ5ð —‘×2Ñ2°4¸!¸Ó=ñØ%Ø ØØð —‘×.Ñ.¨t°a°SÀtÇ~Á~×GbÑGbÐ.ÓcñØ,Ø'Ø"Øà!×(Ñ(Ð)EÔFØ×#Ñ#Ð$;Ô<Ø×ÑÐ1Ô2Ø�L‰L˜Ô&áÐ2Ð:Ü‘7Ñ#Ó%Ð%à ÐØˆÜˆt�z‰z‹?˜aÒØ�~‰~×*Ñ*¬j×.DÑ.D×.QÑ.QÒQÜ"Ð#eÓfÐfØ"&§.¡.×"EÑ"EÀdÇjÁjÐQRÁmÐUY×U_ÑU_Ð`aÑUbÐdh×dnÑdnÐopÑdqÓ"rÐØˆLà"Ÿk™k¨!™nÔ/GÑGÐØ48·I²I˜DŸI™I¨Ò0À2ÐàˆØŸ™ò 	9ˆIØ�M‰MÔ,¨YÓ7Õ8ð	9à Ðà×"Ñ"Ð#8¸Ñ#;Ô<Ø×"Ñ" ;¨q¡>Ô2Ø×"Ñ"Ð#3°AÑ#6Ô7à×"Ñ"Ð#8¸Ñ#;Ô<Ø×"Ñ" ;¨q¡>Ô2Ø×"Ñ"Ð#3°AÑ#6Ô7ð 	×"Ñ"Ð#4Ô5Ø×"Ñ" >Ô2áØ×&Ñ&Ð':Ô;ä ŸK™K×1Ñ1ØÐ.Ð1DÐ0EÐGXñ
Ø\bñ
Ðð 	�‰Ð&Ô'ô "Ø�K‰K˜‰NØØØÜ×$Ñ$ó
ˆð >Fˆ�‰×*Ñ*¨4¯;©;°q©>Ñ:à�‰× Ò  EÑ)Ö r   ©ru   rv   rw   r   rt   rx   ry   s   @r   r{   r{   ‰   s   ø„ ô4÷_*ð _*r   r{   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚQDQConvc                 ó&   •— t         ‰| �  ||«       y r   r   r   s      €r   r   zQDQConv.__init__ð   r   r   c                 ó  — | j                   }|j                  dk(  s|j                  dk(  sJ ‚| j                  j                  |j                  d   «       | j
                  s(| j                  j                  |j                  d   «       | j                  j                  |j                  d   |j                  dk(  rdnd¬«      \  }}|r*| j                  j                  |j                  d   |«       n(| j                  j                  |j                  d   «       t        |j                  «      dk(  rP| j                  j                  |j                  |j                  d   |j                  d   |j                  d   «       y y )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ó   s)  € Ø�y‰yˆØ�|‰|˜vÒ%¨¯©¸Ò)HÐHÐHà�‰×1Ñ1°$·*±*¸Q±-Ô@Ø×/Ò/Ø�N‰N×5Ñ5°d·k±kÀ!±nÔEà-1¯^©^×-QÑ-QØ�J‰J�q‰M¨T¯\©\¸VÒ-C©Èð .Ró .
Ñ*Ð˜{ñ !Ø�N‰N×=Ñ=¸d¿j¹jÈ¹mÈ[ÕYà�N‰N×1Ñ1°$·*±*¸Q±-Ô@äˆt�z‰z‹?˜aÒØ�N‰N×/Ñ/°·	±	¸4¿:¹:Àa¹=È$Ï*É*ÐUVÉ-ÐY]×YcÑYcÐdeÑYfÕgð  r   r”   ry   s   @r   r–   r–   ï   s   ø„ ô4ö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¨      sN   ðÛ Û Ý &÷÷ õ -Ý .ôu*Ð#ô u*ôpc*Ð#ô c*ôLhˆoõ hr   