
    4)dib#                     X   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZ de	de
dee	         fdZ G d d	          Z ed
ddd          Z ed
ddd          Z edd
dd          Z edddd          Z edd
dd          Z edddd          Z edd
dd          Zd ZdS )    N)mxfp_luts_compressed)Optionallowerfreturnc                     |dz   }|dk    rdn| |         }| |         }||k     r||}}||}}||k    r|S ||k    r|S ||cxk     r|k     r*n n'||z
  }||z
  }||k     r|S ||k     r|S |dz  dk    r|n|S d S )N                 r    )lut_int_to_floatr   r   upperlower_floatupper_floatd1d2s           U/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/bitstring/mxfp.pyround_to_nearest_ties_to_evenr   
   s    AIE###+;E+BK"5)K[  eu#.[KKQ$$$$$$$$$_1_77L77L	QuuE14    c                   ~    e Zd ZdZdedededefdZd Zd Zd	 Z	d
e
defdZd
e
defdZdej        fdZdefdZdS )
MXFPFormatz4Defining an MXFP micro-scaling floating point formatexp_bitsmantissa_bitsbiasmxfp_overflowc                    || _         || _        || _        || _        d| j         | j        z   z  dz
  | _        dd| j         z   | j        z   z  dz
  | _        | j         dk    r3| j        dk    r(| j        dk    rd| _        d| _        ndx| _        | _        | j         dk    r3| j        d	k    r(| j        dk    rd
| _        d| _        nd| _        d| _        d | _        d | _        d S )Nr	         saturate~            r   {      |      )r   r   r   r   pos_clamp_valueneg_clamp_valuelut_float16_to_mxfpr   )selfr   r   r   r   s        r   __init__zMXFPFormat.__init__$   s    *	* !dmd6H&H IQN !a$-&7$:L&L MQRR =A$"4"9"9!Z//'1$'1$$>HH$t';=A$"4"9"9!Z//'1$'1$$'1$'1$ $(  $r   c           	      H    d| j          d| j         d| j         d| j         d	S )NzMXFPFormat(exp_bits=z, mantissa_bits=z, bias=z, mxfp_overflow='z')r   r   r   r   r,   s    r   __str__zMXFPFormat.__str__@   sa     Sdm  S  STEW  S  S`d`i  S  S  }A  }O  S  S  S  	Sr   c                    t           | j        | j        | j        | j        f         \  }}t          j        |          | _        t          j        |          }t          j	        dt          |          dz   d|          | _        d S )N<r   r   )r   r   r   r   r   zlib
decompressr+   structunpacklenr   )r,   int_to_float_compressedfloat16_to_mxfp_compresseddecs       r   decompress_lutszMXFPFormat.decompress_lutsC   s    >RTXTacgcuw{  xA  CG  CU  TV  ?W;!;#'?3M#N#N o566 &.B#c((a-.B.B.BC H Hr   c                 j    |                                  | _        |                                 | _        d S N)createLUT_for_int_to_floatr   createLUT_for_float16_to_mxfpr+   r0   s    r   create_lutszMXFPFormat.create_lutsI   s0     $ ? ? A A#'#E#E#G#G   r   r   r   c                     	 t          j        d|          }n0# t          t           j        f$ r |dk    r| j        n| j        cY S w xY wt                              |d          }| j        |         S )z]Given a Python float convert to the best mxfp float (expressed as an int) that represents it.>er   big)	byteorder)	r6   packOverflowErrorerrorr)   r*   int
from_bytesr+   )r,   r   bf16_ints       r   float_to_intzMXFPFormat.float_to_intM   s    	KD!$$AAv|, 	K 	K 	K+,q554''d6JJJJ	K ..e.44'00s    *AAc                 $   d| j         z   | j        z   }d|z  }t          j        |          r
|dk    rdS dS t          j        d|          dk    }|r`t          |dz  dz
            D ]C}| j        |dz            }|t          d          k    r nt          | j        ||          }||c S D| j	        S t          |dz  |dz
            D ]C}| j        |dz            }|t          d          k    r nt          | j        ||          }||c S D| j
        S )Nr	      r#         ?r   infz-inf)r   r   mathisnancopysignranger   floatr   r)   r*   )	r,   r   lengthvaluesis_positiveir   xr   s	            r   slow_float_to_intzMXFPFormat.slow_float_to_intZ   sT    T]"T%77f:a== 	{{t4mC++s2 	(6Q;?++  -a!e4E%LL((E1$2GANN=HHH !'' 6Q;
33  -a!e4E&MM))E1$2GANN=HHH ! ''r   c                 J   g }d| j         z   | j        z   }t          d|z            D ]g}t          j                            ||dd          }|d         }t          j                            |dd| j         z                      }|d| j         z   d         }|dk    r#t          j        d          |z   }| j         dz   }n!t          j        d          |z   }|| j        z  }t          t          j                            |                    d	| j        z  z  }|d
|z  z  }|dk    rO| j         dk    r&|dv rt          d          }|dv rt          d          }| j         dk    r|dv rt          d          }|	                    |s|n|            it          j
        d|          S )zOCreate a LUT to convert an int in representing a MXFP float into a Python floatr	   rD   F)rW   endiansignedr   N01g       @r   rO   r$   )r'   r(   rQ   )}      r!   r"      r#   nanr   )rd   r#   r   )r   r   rU   bitarrayutilint2baba2intr   rV   appendarray)	r,   i2frW   rZ   rK   signexponentsignificandr   s	            r   r?   z%MXFPFormat.createLUT_for_int_to_float}   s   T]"T%77qF{## 	. 	.A$$QveE$RRAQ4D}++AaDM0A.A,BCCHA-../K1}}&/44{B I:>&/44{BDI%hm**;7788C4CU<UVAhA{{=A%%444!%LLddd!%LL=A%%444!%LLJJ,qq1"----{3$$$r   c                 
   d| j         z   | j        z   }|dk    rddl}ddlm}m} | j         dk    r|n|}t          d          }t          d          D ]}t          j	        d|          }t          j
        d	|          \  }	|                    ||	| j        d
k              }
t          j        |
          rd}n<|
dk    rt          j        d|
          dk    rd}n| j                            |
          }|||<   t%          |          S |dv sJ t          d          }t          d          D ]H}t          j	        d|          }t          j
        d	|          \  }	|                     |	          }|||<   It%          |          S )z4Create a LUT to convert a float16 into a MXFP formatr	   rO   r   N)format_info_ocp_e5m2format_info_ocp_e4m3r$   i   z>HrC   r    )satr#   r   rP   g      r
   )r      )r   r   gfloatgfloat.formatsrq   rr   	bytearrayrU   r6   rF   r7   round_floatr   rR   rS   rT   r   indexbytesr\   )r,   rW   ru   rq   rr   fifp16_to_fp8rZ   rK   r   fpfp8_is               r   r@   z(MXFPFormat.createLUT_for_float16_to_mxfp   s    T]"T%77Q;;MMMQQQQQQQQ)-!););%%AUB#G,,K7^^ ' 'Ka((]4++''A43E3S'TT:b>> @&EE SyyT]3%;%;t%C%C * $ 5 ; ;B ? ?!&A%%%V#####G,,K7^^ ' 'Ka((]4++..q11!&A%%%r   N)__name__
__module____qualname____doc__rI   strr-   r1   r<   rA   rV   rM   r\   rk   r?   rz   r@   r   r   r   r   r   !   s        >>% %S % %TW % % % %8S S SI I IH H H1e 1 1 1 1 1!(5 !(S !( !( !( !(F%EK % % % %< &u  &  &  &  &  &  &r   r   r   r	   r    r/   r   r      r$      overflowc                  d   t                                            t                                           t                                           t                                           t
                                           t                                           t                                           d S r>   )e2m1mxfp_fmtr<   e2m3mxfp_fmte3m2mxfp_fmte4m3mxfp_saturate_fmte5m2mxfp_saturate_fmte4m3mxfp_overflow_fmte5m2mxfp_overflow_fmtr   r   r   r<   r<      s      """  """  """))+++))+++))+++))+++++r   )rk   rR   r6   rf   bitstring.lutsr   r4   typingr   rI   rV   r   r   r   r   r   r   r   r   r   r<   r   r   r   <module>r      s       / / / / / /       3 5 XVY]    .Z& Z& Z& Z& Z& Z& Z& Z&z z1AAZXXXz1AAZXXXz1AAZXXX"
AQQV`aaa "
AQRWabbb "
AQQV`aaa "
AQRWabbb , , , , ,r   