Ë
    ÝÍ:jc  ã                  óŒ   — d dl mZ d dlmZ d dlZd dlZddl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y)é    )Úannotations)ÚAnyNé   )ÚTENSOR_NAME_QUANT_SUFFIXÚQuantizedValueÚQuantizedValueTypeÚattribute_to_kwargÚquantize_nparrayé   )ÚQuantOperatorBase)ÚQDQOperatorBasec                  ó(   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ xZS )ÚQPadc                ó&   •— 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/pad.pyr   zQPad.__init__   ó   ø€ Ü‰Ñ˜¨Õ3ó    c                óŒ	  •— | j                   }|j                  dk(  sJ ‚| j                  j                  dk  s%|j                  d   | j                  j
                  vrt        ‰| �  «        y | j                  j
                  |j                  d      }i }|j                  D ]  }t        |«      }|j                  |«       Œ  d|vs	|d   dk(  �r-t        |j                  «      dkD  �r©|j                  d   dk7  �r–| j                  j                  j                  |j                  «      }| j                  j                  j                  |j                  «      }|�|€t        ‰| �  «        y | j                  j                  j                  |j                  d   «      }|��Xt         j"                  j%                  |«      }	|	j&                  dk(  r|	j)                  «       n|	d   }
t         j"                  j%                  |«      }|j&                  dk(  r|j)                  «       n|d   }t         j"                  j%                  |«      }t+        | j                  j,                  |||
«      }|j                  d   t.        z   }t         j"                  j1                  ||«      }| j                  j                  j3                  |«       | j                  j                  j5                  |«       ||j                  d<   �n| j                  j7                  |d| j                  j,                  |j                  |j                  |j8                  ¬«      }| j                  j:                  j=                  |«       |d   j>                  d   |j                  d<   nkt        |j                  «      dk(  r&|j                  jA                  |j                  «       n-|j                  d   dk(  sJ ‚|j                  |j                  d<   tC        |j>                  d   |j>                  d   t.        z   |j                  |j                  tD        jF                  «      }|| j                  j
                  |j>                  d   <   |jH                  |j                  d<   |jH                  |j>                  d<   | j                  xj:                  |gz  c_        y )	NÚPadé   r   Úmodeó   constantr   Ú )Úinitial_type)%ÚnodeÚop_typeÚ	quantizerÚopset_versionÚinputÚquantized_value_mapr   ÚquantizeÚ	attributer	   ÚupdateÚlenÚmodelÚget_initializerÚzp_nameÚ
scale_nameÚonnxÚnumpy_helperÚto_arrayÚndimÚitemr
   Úactivation_qTyper   Ú
from_arrayÚremove_initializerÚadd_initializerÚ_get_quantize_input_nodesÚ	data_typeÚ	new_nodesÚextendÚoutputÚappendr   r   ÚInputÚq_name)r   r$   Úquantized_input_valueÚkwargsr+   ÚkvÚ	zp_tensorÚscale_tensorÚpadding_constant_initializerÚzp_arrayÚzp_valueÚscale_arrayÚscale_valueÚpadding_constant_arrayÚ quantized_padding_constant_arrayÚquantized_padding_constant_nameÚ&quantized_padding_constant_initializerÚpad_value_qnodesÚquantized_output_valuer   s                      €r   r*   zQPad.quantize   sô  ø€ Ø�y‰yˆØ�|‰|˜uÒ$Ð$Ð$ð �N‰N×(Ñ(¨2Ò-°4·:±:¸a±=ÈÏÉ×HjÑHjÑ3jÜ‰GÑÔØØ $§¡× BÑ BÀ4Ç:Á:ÈaÁ=Ñ QÐàˆØŸ™ò 	ˆIÜ# IÓ.ˆBØ�M‰M˜"Õð	ð ˜Ñ 6¨&¡>°[Ó#@Ü�4—:‘:‹ Ó" t§z¡z°!¡}¸Ó':Ø ŸN™N×0Ñ0×@Ñ@ÐAV×A^ÑA^Ó_�	Ø#Ÿ~™~×3Ñ3×CÑCÐDY×DdÑDdÓe�ØÐ$¨Ð(<Ü‘GÑ$Ô&Øà/3¯~©~×/CÑ/C×/SÑ/SÐTX×T^ÑT^Ð_`ÑTaÓ/bÐ,Ø/Ñ;Ü#×0Ñ0×9Ñ9¸)ÓD�HØ2:·-±-À1Ò2D˜xŸ}™}œÈ(ÐSTÉ+�HÜ"&×"3Ñ"3×"<Ñ"<¸\Ó"J�KØ8C×8HÑ8HÈAÒ8M +×"2Ñ"2Ô"4ÐS^Ð_`ÑSa�KÜ-1×->Ñ->×-GÑ-GÐHdÓ-eÐ*Ü7GØŸ™×7Ñ7Ø.Ø#Ø ó	8Ð4ð 7;·j±jÀ±mÔF^Ñ6^Ð3Ü=A×=NÑ=N×=YÑ=YØ8Ø7ó>Ð:ð
 —N‘N×(Ñ(×;Ñ;Ð<XÔYØ—N‘N×(Ñ(×8Ñ8Ð9_Ô`Ø$C�D—J‘J˜q“Mð (,§~¡~×'OÑ'OØØØŸ™×7Ñ7Ø-×8Ñ8Ø-×5Ñ5Ø%1×%;Ñ%;ð (Pó (Ð$ð —N‘N×,Ñ,×3Ñ3Ð4DÔEØ$4°QÑ$7×$>Ñ$>¸qÑ$A�D—J‘J˜q’Mô �t—z‘z“? aÒ'à—J‘J×%Ñ%Ð&;×&CÑ&CÕDð  Ÿ:™: a™=¨BÒ.Ð.Ð.Ø$9×$AÑ$A�D—J‘J˜q‘Mô "0Ø�K‰K˜‰NØ�K‰K˜‰NÔ5Ñ5Ø!×,Ñ,Ø!×)Ñ)Ü×$Ñ$ó"
Ðð >Tˆ�‰×*Ñ*¨4¯;©;°q©>Ñ:à-×4Ñ4ˆ�
‰
�1‰Ø/×6Ñ6ˆ�‰�A‰Ø�‰× Ò  T FÑ*Ö r   )Ú__name__Ú
__module__Ú__qualname__r   r*   Ú__classcell__©r   s   @r   r   r      s   ø„ ô4÷S+ð S+r   r   c                  ó4   ‡ — e Zd Zˆ fd„Zdd„Zdd„Zd„ Zˆ xZS )ÚQDQPadc                ó&   •— t         ‰| �  ||«       y r   r   r   s      €r   r   zQDQPad.__init__r   r   r   c                ó~  — d}| j                   j                  j                  | j                  j                  d   «      }|€yt
        j                  j                  |j                  «      }| j                   j                  dk  r)t        j                  |j                  dd«      |¬«      }|S t        | j                  j                  «      dk\  rW| j                  j                  d   r>| j                   j                  j                  | j                  j                  d   «      }|S t        j                  d|¬«      }|S )z›
        Returns the Pad's constant padding value. Returns `None` if the padding value is
        not constant (i.e., comes from a dynamic input).
        Nr   r   Úvalue)Údtypeé   r   )r&   r.   Úget_tensor_typer$   r(   r2   ÚhelperÚtensor_dtype_to_np_dtypeÚ	elem_typer'   ÚnpÚarrayÚgetr-   Úget_constant_value)r   Ú
attrs_dictÚ	const_valÚonnx_tensor_typeÚnp_dtypes        r   Ú_get_pad_const_valzQDQPad._get_pad_const_valu   sù   € ð
 ˆ	ØŸ>™>×/Ñ/×?Ñ?ÀÇ	Á	ÇÁÐPQÑ@RÓSÐØÐ#Øä—;‘;×7Ñ7Ð8H×8RÑ8RÓSˆØ�>‰>×'Ñ'¨"Ò,ÜŸ™ §¡°¸Ó!;À8ÔLˆIð Ðô �—‘—‘Ó! QÒ&¨4¯9©9¯?©?¸1Ò+=ØŸ™×,Ñ,×?Ñ?ÀÇ	Á	ÇÁÐPQÑ@RÓSˆIð Ðô Ÿ™ ¨(Ô3ˆIàÐr   c                ód  — i }| j                   j                  D ]  }t        |«      }|j                  |«       Œ  |j	                  dd«      }|dv ry|dk(  r[| j                  |«      }|�H|j                  t        j                  t        j                  fv rt        |j                  «       «      dk(  S y)zf
        Returns true if Pad's output should use the same quantization parameters as input[0]
        r    r!   )s   reflects   edges   wrapTr   F)r$   r+   r	   r,   re   rk   r]   rc   Úfloat32Úfloat16Úfloatr6   )r   rg   r+   rE   Úpad_modeÚpad_vals         r   Ú%_should_quantize_output_same_as_inputz,QDQPad._should_quantize_output_same_as_input‰   s«   € ð ˆ
ØŸ™×,Ñ,ò 	"ˆIÜ# IÓ.ˆBØ×Ñ˜bÕ!ð	"ð —>‘> &¨+Ó6ˆØÐ5Ñ5ð ð �{Ò"Ø×-Ñ-¨jÓ9ˆGØÐ" w§}¡}¼¿¹ÄRÇZÁZÐ8PÑ'PÜ˜WŸ\™\›^Ó,°Ñ1Ð1àr   c                ó
  — | j                   j                  dk(  sJ ‚| j                   j                  D ]   }|sŒ| j                  j	                  |«       Œ" | j
                  s£| j                  «       r`| j                  j                  | j                   j                  d   | j                   j                  d   | j                   j                  «       y | j                  j	                  | j                   j                  d   «       y y )Nr   r   )
r$   r%   r(   r&   Úquantize_activation_tensorÚdisable_qdq_for_node_outputrr   Úquantize_output_same_as_inputr?   Úname)r   Ú
input_names     r   r*   zQDQPad.quantize¡   sÊ   € Ø�y‰y× Ñ  EÒ)Ð)Ð)àŸ)™)Ÿ/™/ò 	FˆJÚØ—‘×9Ñ9¸*ÕEð	Fð ×/Ò/Ø×9Ñ9Ô;Ø—‘×<Ñ<¸T¿Y¹Y×=MÑ=MÈaÑ=PÐRV×R[ÑR[×RaÑRaÐbcÑRdÐfj×foÑfo×ftÑftÕuà—‘×9Ñ9¸$¿)¹)×:JÑ:JÈ1Ñ:MÕNð	 0r   )rg   zdict[str, Any]Úreturnznp.ndarray | None)ry   Úbool)rS   rT   rU   r   rk   rr   r*   rV   rW   s   @r   rY   rY   q   s   ø„ ô4óó(ö0Or   rY   )Ú
__future__r   Útypingr   Únumpyrc   r2   Úquant_utilsr   r   r   r	   r
   Úbase_operatorr   Úqdq_base_operatorr   r   rY   © r   r   ú<module>r‚      sC   ðõ
 #å ã Û ÷õ õ -Ý .ôW+Ðô W+ôt;Oˆ_õ ;Or   