+
    ‹°³jÙ-  ã                   ó:   € R t ^ RIt ! R R4      t ! R R4      tR# )aN  
Helper classes for working with low precision floating point types that
align with the opencompute (OCP) microscaling (MX) specification.
  * MXFP4Tensor: 4-bit E2M1 floating point data
  * MXScaleTensor: 8-bit E8M0 floating point data
Reference: https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
Nc                   óH   a € ] tR t^t o R	R ltR tR tR tR tR t	Rt
V tR# )
ÚMXFP4TensorNc                ó  € W0n         VeQ   \        V\        P                  4      '       g   Q R4       hVP                   V n         V P	                  V4      V n        R# Ve#   \        V\        4      '       d   TMV3V n        R# \        R4      h)a<  
Tensor class for working with four bit E2M1 floating point data as defined by the
opencompute microscaling specification.


Parameters:
- data: A torch tensor of float32 numbers to convert to fp4e2m1 microscaling format.
- size: The size of the tensor to create.
- device: The device on which to create the tensor.
Nú%Parameter data must be a torch tensorú.Either parameter data or size must be provided©	ÚdeviceÚ
isinstanceÚtorchÚTensorÚ_from_floatÚdataÚtupleÚsizeÚ
ValueError©Úselfr   r   r   s   &&&&ÚR/home/luca/screen-checking/.venv/lib/python3.14/site-packages/triton/tools/mxfp.pyÚ__init__ÚMXFP4Tensor.__init__   sr   € ð ŒØÒÜ˜d¤E§L¡L×1Ò1ÐZÐ3ZÓZÐ1ØŸ+™+ˆDŒKØ×(Ñ(¨Ó.ˆDŽIØÒÜ *¨4´× 7Ò 7™¸d¸XˆDŽIäÐMÓNÐNó    c                óô  € \         P                  ! ^ ^V P                  \         P                  V P                  R7      p\         P                  ! ^ ^V P                  \         P                  V P                  R7      p\         P                  ! ^ ^V P                  \         P                  V P                  R7      pV^,          V^,          ,          V,          P                  \         P                  4      V n        V # )é    ©r   Údtyper   )r
   Úrandintr   Úuint8r   Útyper   )r   ÚSÚEÚMs   &   r   ÚrandomÚMXFP4Tensor.random#   s•   € Ü�MŠM˜!˜Q T§Y¡Y´e·k±kÈ$Ï+É+ÔVˆÜ�MŠM˜!˜Q T§Y¡Y´e·k±kÈ$Ï+É+ÔVˆÜ�MŠM˜!˜Q T§Y¡Y´e·k±kÈ$Ï+É+ÔVˆà˜1•f  a¥Õ(¨1Õ,×2Ñ2´5·;±;Ó?ˆŒ	Øˆr   c                óF  € V\         P                  8X  g   Q R4       hV P                  pV^,	          ^,          P                  V4      pV^,	          ^,          P                  V4      pV^,          P                  V4      p\         P                  ! V4      pV^ 8H  V^ 8H  ,          pV( pVP                  4       '       dª   W8,          p	WH,          p
WX,          p\         P                  ! RV	4      p\         P                  ! V
^ 8H  Wª^,
          4      p\         P                  ! V
^ 8H  VR,          RVR,          ,           4      pV\         P                  ! ^V4      ,          V,          pWöV&   WgV^8H  ,          ;;,          R,          uu&   VP                  \         P                  4      # )zj
Convert fp4e2m1 data to float32.

Returns:
- A torch tensor of type dtype representing the fp4e2m1 data.
zCCurrently only float32 is supported for fp4e2m1 to float conversionç      à?ç      ð?éÿÿÿÿ)r
   Úfloat32r   r   Ú
zeros_likeÚanyÚpowÚwhere)r   r   r   r   r   r    ÚvalueÚis_zeroÚnon_zero_maskÚS_nzÚE_nzÚM_nzÚsignÚexponentÚmantissaÚvalue_nzs   &&              r   ÚtoÚMXFP4Tensor.to+   sV  € ð œŸ™Ô%ÐlÐ'lÓlÐ%à�y‰yˆØ�a�i˜3Õ×$Ñ$ UÓ+ˆØ�a�i˜3Õ×$Ñ$ UÓ+ˆØ�C�Z×Ñ˜eÓ$ˆô × Ò  Ó#ˆØ˜‘6˜a 1™fÕ%ˆØ ˜ˆØ×Ñ×ÒØÕ#ˆDØÕ#ˆDØÕ#ˆDä—9’9˜R Ó&ˆDä—{’{ 4¨1¡9¨d¸1µHÓ=ˆHÜ—{’{ 4¨1¡9¨d°S­j¸#ÀÀsÅ
Õ:JÓKˆHØœeŸiši¨¨8Ó4Õ4°xÕ?ˆHà#+�-Ñ ð 	˜˜a™Õ ×! RÕ'Ó!Ø�z‰zœ%Ÿ-™-Ó(Ð(r   c                ó4  € \         P                  ! V4      P                  \         P                  4      p\         P                  ! V4      pV^ 8H  p\         P
                  ! V4      \         P                  ! V4      ,          p\         P                  ! . RO\         P                  V P                  R7      p\         P                  ! ^ ^.\         P                  V P                  R7      p. p. p	. p
V FÖ  pV^ 8X  dZ   ^ pV FO  pVR,          pV^V,          ,          pVP                  V4       V	P                  V4       V
P                  V4       KQ  	  Kc  VP                  4       ^,
          pV FV  pRVR,          ,           pV^V,          ,          pVP                  V4       V	P                  V4       V
P                  V4       KX  	  KØ  	  \         P                  ! V\         P                  V P                  R7      p\         P                  ! V	\         P                  V P                  R7      p	\         P                  ! V
\         P                  V P                  R7      p
VP                  R	4      pVP                  ^ ,          pVP                  ^4      pVP                  4       P                  4       pVVVP                  R	4      &   \         P                  ! VVP                  ^ 4      ,
          4      p\         P                   ! V^RR7      w  ppVV8H  pVP#                  4       ^8”  dT   V
P                  ^ 4      P%                  VR	4      pV^ 8H  P                  \         P&                  4      pVVR,          ,
          p\         P(                  ! V^R7      pV	V,          pV
V,          pVP                  VP                  4      pVP                  VP                  4      p^ W´&   ^ WÔ&   V^,          V^,          ,          V,          P                  \         P                  4      # )
aå  
Convert float32 numbers to mxf4 e2m1 format.
* No encodings are reserved for Inf or NaN in mxf4.
* Conversion from float supports roundTiesToEven rounding mode.
* If a value exceeds the mxf4 representable range after rounding,
  clamps to the maximum mxf4 magnitude, preserving the sign.
* If a value has magnitude less than the minimum subnormal magnitude
  in mxf4 after rounding, converts to zero.

Parameters:
- values: A torch tensor of float32 numbers to convert to fp4 format.
©r   r   r$   r%   T)ÚdimÚkeepdimg�íµ ÷Æ°>©r:   )r   é   é   é   r&   )r
   Úsignbitr   r   ÚabsÚisnanÚisinfÚtensorr   ÚappendÚitemr'   ÚviewÚshapeÚ	unsqueezeÚmaxÚminÚsumÚexpandÚint32Úargmin)r   Úvaluesr   Ú
abs_valuesr-   Ú
is_invalidÚE_bitsÚM_bitsÚcandidate_valuesÚcandidate_EÚcandidate_Mr   r3   r    Úsignificandr,   Ú
candidatesÚabs_values_flatÚNÚabs_values_expandedÚmax_candidate_valueÚerrorsÚ
min_errorsÚ_Úis_tieÚM_bits_expandedÚtie_breakerÚbest_indicesÚ
E_selectedÚ
M_selecteds   &&                            r   r   ÚMXFP4Tensor._from_floatN   s$  € ô �MŠM˜&Ó!×&Ñ&¤u§{¡{Ó3ˆÜ—Y’Y˜vÓ&ˆ
à ‘?ˆÜ—[’[ Ó(¬5¯;ª;°vÓ+>Õ>ˆ
ô
 —’šl´%·+±+ÀdÇkÁkÔRˆÜ—’˜q !˜f¬E¯K©KÀÇÁÔLˆàÐØˆØˆãˆAØ�AŒvà�Û�AØ"# c¥'�KØ'¨1¨h­;Õ7�EØ$×+Ñ+¨EÔ2Ø×&Ñ& qÔ)Ø×&Ñ& qÖ)ó  ð Ÿ6™6›8 a�<�Û�AØ"%¨¨C­¥-�KØ'¨1¨h­;Õ7�EØ$×+Ñ+¨EÔ2Ø×&Ñ& qÔ)Ø×&Ñ& qÖ)ó  ñ ô( —\’\Ð"2¼%¿-¹-ÐPT×P[ÑP[Ô\ˆ
Ü—l’l ;´e·k±kÈ$Ï+É+ÔVˆÜ—l’l ;´e·k±kÈ$Ï+É+ÔVˆà$Ÿ/™/¨"Ó-ˆØ×!Ñ! !Õ$ˆØ-×7Ñ7¸Ó:Ðð )Ÿn™nÓ.×3Ñ3Ó5ÐØ/Bˆ˜
Ÿ™¨Ó+Ñ,ô —’Ð.°×1EÑ1EÀaÓ1HÕHÓIˆô
 Ÿ	š	 &¨a¸Ô>‰ˆ
�AØ˜JÑ&ˆà�:‰:‹<˜!ÔØ)×3Ñ3°AÓ6×=Ñ=¸aÀÓDˆOØ*¨aÑ/×5Ñ5´e·k±kÓBˆKà˜{¨TÕ1Õ2ˆFä—|’| F°Ô2ˆà  Õ.ˆ
Ø  Õ.ˆ
Ø�O‰O˜J×,Ñ,Ó-ˆØ�O‰O˜J×,Ñ,Ó-ˆàˆ‰
Øˆ‰
à�a•˜A �FÕ# aÕ'×-Ñ-¬e¯k©kÓ:Ð:r   c                óº  € V P                   p^ Tu;8:  d   VP                  8  g   Q R4       h Q R4       hVP                  V4      pV^,           ^,          pV^,          ^ 8w  dt   ^ .^VP                  ,          ,          pVP                  V,
          ^,
          ^,          ^,           p^WV&   \        P                  P
                  P                  W%R^ R7      p\        VP                  4      pWGV&   VP                  V^,           ^4       VP                  ! V!  pVP                  V^,           ^ 4      pVP                  V^,           ^4      p	V	^,          V,          p
V
# )zè
Packs two e2m1 elements into a single uint8 along the specified dimension.

Parameters:
- dim: The dimension along which to pack the elements.

Returns:
- A torch tensor of dtype uint8 with two e2m1 elements packed into one uint8.
zHThe dimension to pack along is not within the range of tensor dimensionsÚconstant)Úmoder,   )r   Úndimr   r
   ÚnnÚ
functionalÚpadÚlistrH   ÚinsertÚreshapeÚselect)r   r:   r   Úsize_along_dimÚnew_size_along_dimÚ	pad_sizesÚ	pad_indexÚ	new_shapeÚlowÚhighÚpackeds   &&         r   Úto_packed_tensorÚMXFP4Tensor.to_packed_tensor¦   s<  € ð �y‰yˆØ�CÖ#˜$Ÿ)™)Ô#ð 	WØVó	WÑ#ð 	WØVó	WÐ#ð Ÿ™ 3›ˆØ,¨qÕ0°QÕ6Ðð ˜AÕ Ô"Ø˜˜q 4§9¡9�}Õ-ˆIØŸ™ S�¨1Õ,°Õ1°AÕ5ˆIØ#$ˆIÑ Ü—8‘8×&Ñ&×*Ñ*¨4ÀÐSTÐ*ÓUˆDä˜Ÿ™Ó$ˆ	Ø+�#‰Ø×Ñ˜˜q� !Ô$Ø�|Š|˜YÑ'ˆà�k‰k˜# �' 1Ó%ˆØ�{‰{˜3 �7 AÓ&ˆØ˜!•)˜sÕ"ˆàˆr   c                óþ  € V^,	          ^,          pV^,          p\         P                  ! WT3V^,           R7      p\        VP                  4      pVRV Wr,          ^,          .,           Wr^,           R ,           pVP                  ! V!  p	W2,          ^,          ^ 8w  dD   \        R4      .V	P                  ,          p
\        ^ W2,          4      W¢&   V	\        V
4      ,          p	V	P                  \         P                  4      # )a}  
Unpacks a tensor where two fp4 elements are packed into a single uint8.

Parameters:
- packed_tensor: The packed tensor
- dim: The dimension along which the tensor was packed.
- original_shape: The shape of the original tensor before packing.

Returns:
- A tensor with the original data unpacked into uint8 elements containing one
  fp4e2m1 element in the least significant bits.
r<   N)
r
   Ústackro   rH   rq   Úslicerk   r   r   r   )r   Úpacked_tensorr:   Úoriginal_shapery   rx   ÚstackedrH   rw   r   Úindicess   &&&&       r   Úunpack_packed_tensorÚ MXFP4Tensor.unpack_packed_tensorÉ   sÏ   € ð  Õ" cÕ)ˆØ˜cÕ!ˆä—+’+˜s˜k¨s°Q­wÔ7ˆô �W—]‘]Ó#ˆØ˜$˜3�K 5¥:°¥>Ð"2Õ2°UÀ½7¸8°_ÕDˆ	Ø�Š 	Ñ*ˆð Õ Õ" aÔ'Ü˜T“{�m d§i¡iÕ/ˆGÜ   NÕ$7Ó8ˆG‰LØœ˜g›Õ'ˆDà�y‰yœŸ™Ó%Ð%r   ©r   r   r   ©NNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r!   r6   r   r{   r„   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s-   ø‡ € ôOò*ò!)òFV;òp!÷F&ð &r   r   c                   ó@   a € ] tR t^ét o RR ltRR ltR tR tRtV t	R# )	ÚMXScaleTensorNc                ó  € W0n         VeQ   \        V\        P                  4      '       g   Q R4       hVP                   V n         V P	                  V4      V n        R# Ve#   \        V\        4      '       d   TMV3V n        R# \        R4      h)a  
Tensor class for working with microscaling E8M0 block scale factors.

Parameters:
- data: A torch tensor of float32 numbers to convert to fp8e8m0 microscaling format.
- size: The size of the tensor to create.
- device: The device on which to create the tensor.
Nr   r   r   r   s   &&&&r   r   ÚMXScaleTensor.__init__ë   sr   € ð ŒØÒÜ˜d¤E§L¡L×1Ò1ÐZÐ3ZÓZÐ1ØŸ+™+ˆDŒKØ×(Ñ(¨Ó.ˆDŽIØÒÜ *¨4´× 7Ò 7™¸d¸XˆDŽIäÐMÓNÐNr   c                óò  € ^pVf   ^ MC\        ^ \        \        P                  ! \        P                  ! V4      4      4      V,           4      pVf   ^þMM\        ^þ\        ^ \        \        P                  ! \        P                  ! V4      4      4      V,           4      4      pWE8:  g   Q R4       h\        P                  ! WE^,           V P                  \        P                  V P                  R7      pW`n
        V # )zX
Generate random E8M0 data within a specified range.
* Excludes the NaN encoding (255).
z&Low must be less than or equal to highr   )rJ   Úintr
   Úlog2rD   rK   r   r   r   r   r   )r   rx   ry   ÚbiasÚmin_exponentÚmax_exponentr   s   &&&    r   r!   ÚMXScaleTensor.randomþ   s·   € ð
 ˆàšK‘q¬S°´C¼¿
º
Ä5Ç<Â<ÐPSÓCTÓ8UÓ4VÐY]Õ4]Ó-^ˆØ"šl‘s´°C¼¸QÄÄEÇJÂJÌuÏ|Ê|Ð\`ÓOaÓDbÓ@cÐfjÕ@jÓ9kÓ0lˆØÔ+ÐUÐ-UÓUÐ+ä�MŠM˜,°qÕ(8¸t¿y¹yÔPU×P[ÑP[Ðdh×doÑdoÔpˆØŒ	Øˆr   c                ó(  € V\         P                  8X  g   Q R 4       hV P                  P                  V4      pV^ÿ8H  pVP	                  4       p^ WC&   V^,
          p\         P
                  ! RV4      p\         P                  Wc&   VP                  V4      # )zBCurrently only float32 is supported for f8e8m0 to float conversiong       @)r
   r'   r   r   Úcloner*   Únan)r   r   r   Úis_nanÚe_biasedÚer,   s   &&     r   r6   ÚMXScaleTensor.to  s{   € ØœŸ™Ô%ÐkÐ'kÓkÐ%Ø�y‰y�~‰~˜eÓ$ˆØ˜#‘+ˆØ—:‘:“<ˆØˆÑØ�s�NˆÜ—	’	˜#˜qÓ!ˆÜŸ	™	ˆ‰Ø�z‰z˜%Ó Ð r   c                ó  € \         P                  ! V\         P                  V P                  R7      p\         P                  ! V4      \         P
                  ! V4      ,          V^ 8*  ,          p^ÿW#&   W( ,          p\         P                  ! \         P                  ! V4      4      pV^,           pVP                  \         P                  4      p\         P                  ! V^ ^þ4      pVP                  \         P                  4      W#( &   V# )a  
Convert float32 numbers to E8M0 format.
* Values <= 0, NaNs, and Infs are converted to the NaN encoding (255).
* Positive values are converted by computing the floor of log2(value) to get the exponent.

Parameters:
- values: A torch tensor of float32 numbers to convert to E8M0 format.
r9   )r
   Ú
empty_liker   r   rB   rC   Úfloorr–   r   rN   Úclamp)	r   rP   ÚresultrR   Úvalid_valuesr    rŸ   Úe_biased_intÚe_biased_clampeds	   &&       r   r   ÚMXScaleTensor._from_float  sº   € ô ×!Ò! &´·±ÀDÇKÁKÔPˆä—[’[ Ó(¬5¯;ª;°vÓ+>Õ>À&ÈAÁ+ÕNˆ
Ø ˆÑà˜kÕ*ˆÜ�KŠKœŸ
š
 <Ó0Ó1ˆØ�s•7ˆØ—}‘}¤U§[¡[Ó1ˆÜ Ÿ;š; |°Q¸Ó<ÐØ.×3Ñ3´E·K±KÓ@ˆˆ{Ñàˆr   r†   r‡   )NN)
rˆ   r‰   rŠ   r‹   r   r!   r6   r   rŒ   r�   rŽ   s   @r   r‘   r‘   é   s   ø‡ € ôOô&ò	!÷ð r   r‘   )Ú__doc__r
   r   r‘   © r   r   Ú<module>r­      s(   ðñó ÷Z&ñ Z&÷zDó Dr   