§
    [�’jE  ã                   óà  — d Z ddlZddlmZ ddlmZmZ ddlmZ ddlm	Z	  ej
        e¦  «        Zd„ Z G d	„ d
e¦  «        Zej        Z ej        e¦  «        j        Z ej        e¦  «        j        Zdej        fd„Z	 ddej        dej        dej        dej        dej        dej        dz  dej        fd„Z G d„ dej        ¦  «        Zdd„Zd„ Z G d„ de¦  «        Z G d„ de¦  «        ZdS )z"CompressedTensors integration fileé    N)Únné   )ÚConversionOpsÚ_IdentityOp)Úlogging)Úis_torch_greater_or_equalc                 óú   — t          | j                             ¦   «         ¦  «        }|D ]$}t          d„ |j        D ¦   «         ¦  «        r|c S Œ%|D ]$}t          d„ |j        D ¦   «         ¦  «        r|c S Œ%|d         S )a/  Resolve which config group quantizes the MoE experts. Mixed configs quantize
    different layers with different schemes (e.g. Kimi: FP8 attention + INT4 experts), so
    the experts' scheme cannot be assumed global: the experts' group is the one whose
    `re:` targets mention the expert modules.
    c              3   óH   K  — | ]}|                      d ¦  «        od|v V — ŒdS )úre:ÚexpertsN©Ú
startswith©Ú.0Útargets     úZC:\Projects\DSCons\.venv\Lib\site-packages\transformers\integrations\compressed_tensors.pyú	<genexpr>z%get_experts_scheme.<locals>.<genexpr>#   s:   è è € Ð\Ð\ÀFˆv× Ò  Ñ'Ô'Ð?¨I¸Ð,?Ð\Ð\Ð\Ð\Ð\Ð\ó    c              3   óB   K  — | ]}|                      d ¦  «         V — ŒdS )r   Nr   r   s     r   r   z%get_experts_scheme.<locals>.<genexpr>(   s3   è è € ÐHÐH°�6×$Ò$ UÑ+Ô+Ð+ÐHÐHÐHÐHÐHÐHr   r   )ÚlistÚconfig_groupsÚvaluesÚanyÚtargets)Úquantization_configÚgroupsÚgroups      r   Úget_experts_schemer      s©   € õ Ð%Ô3×:Ò:Ñ<Ô<Ñ=Ô=€FØð ð ˆÝÐ\Ð\ÈeÌmÐ\Ñ\Ô\Ñ\Ô\ð 	ØˆLˆLˆLð	ð ð ð ˆÝÐHÐH¸%¼-ÐHÑHÔHÑHÔHð 	ØˆLˆLˆLð	à�!Œ9Ðr   c                   ó¤   — e Zd ZdZdd„Z	 ddeeej        f         de	e         de	e         dedz  deeej        f         f
d	„Z
edd„¦   «         ZdS )ÚDecompressExpertsa�  
    Dequantize MoE layers when they are in new layout, because they aren't `nn.Module` anymore!

    Takes packed weights and scales from the loaded state dict, creates a dummy Module
    to take advantage of higher-lvl API `decompress_module` and dequantizes all weights.

    Requires MoE conversion to be defined on conversion mapping, so that decompressed weights
    are stacked/merged for all experts.
    Nc                 ó"   — || _         || _        d S ©N)Úhf_quantizerÚscheme)Úselfr#   r$   s      r   Ú__init__zDecompressExperts.__init__8   s   € Ø(ˆÔð ˆŒˆˆr   Ú
input_dictÚsource_patternsÚtarget_patternsÚfull_layer_nameÚreturnc                 ó   — ddl m} ddlm} | j        j        j        }| j        pt          |¦  «        }	|	j	        }
|
j
        dk    �rm|
j        dk    �rai }|                     ¦   «         D �]G\  }}d|v rŒ|                     dd¦  «        }||vr|||<   Œ+t          |t          ¦  «        r|n|g}||         }t          |t          ¦  «        r|n|g}d }t!          t#          ||¦  «        ¦  «        D ]¹\  }\  }}|                     t&          j        ¦  «        |                     t&          j        ¦  «        z                       t&          j        ¦  «        }|€7t'          j        t/          |¦  «        g|j        ¢R |j        |j        ¬	¦  «        }||                              |¦  «         ~Œº|�|||<   �ŒI|S |	j        p |t:          j        |	¦  «        }|                     |¦  «        } G d
„ dt:          j         ¦  «        }d|	j	        j        z  }i }|                     ¦   «         D �]i\  }}d|vrŒ|}||                     dd¦  «                 }| !                    |                     dd¦  «        ¦  «        }d }t!          t#          ||¦  «        ¦  «        D ]î\  }\  }}|€d n||         }|�| "                    ¦   «         r|}n/t'          j#        |j        d         |j        d         |z  g¦  «        } ||||¦  «        }|	|_$        | %                    |¦  «         |€Ft'          j        t/          |¦  «        g|j&        j        ¢R |j&        j        |j&        j        ¬	¦  «        }||                              |j&        ¦  «         ~Œï~~|�|||<   �Œk|S )Nr   )ÚBaseCompressor)Úinfer_module_formatÚfloaté   Úweight_scalez.weightz.weight_scale)ÚdtypeÚdevicec                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ú.DecompressExperts.convert.<locals>.DummyModulec                 óê   •— t          ¦   «                              ¦   «          t          j        |d¬¦  «        | _        t          j        |d¬¦  «        | _        t          j        |d¬¦  «        | _        d S )NF)Úrequires_grad)Úsuperr&   r   Ú	ParameterÚweight_packedr1   Úweight_shape)r%   ÚweightÚscaleÚshapeÚ	__class__s       €r   r&   z7DecompressExperts.convert.<locals>.DummyModule.__init__m   sd   ø€ Ý‘”× Ò Ñ"Ô"Ð"Ý%'¤\°&ÈÐ%NÑ%NÔ%N�Ô"Ý$&¤L°ÀeÐ$LÑ$LÔ$L�Ô!Ý$&¤L°ÀeÐ$LÑ$LÔ$L�Ô!Ð!Ð!r   )Ú__name__Ú
__module__Ú__qualname__r&   Ú__classcell__©r?   s   @r   ÚDummyModuler5   l   sA   ø€ € € € € ðMð Mð Mð Mð Mð Mð Mð Mð Mr   rE   é    r:   r;   é   )'Úcompressed_tensors.compressorsr-   Ú%compressed_tensors.compressors.formatr.   r#   Ú
compressorr   r$   r   ÚweightsÚtypeÚnum_bitsÚitemsÚreplaceÚ
isinstancer   Ú	enumerateÚzipÚtoÚtorchÚfloat32Úbfloat16ÚemptyÚlenr>   r2   r3   Úcopy_Úformatr   ÚLinearÚget_value_from_registryÚModuleÚgetÚnumelÚtensorÚquantization_schemeÚdecompress_moduler<   )r%   r'   r(   r)   r*   Úkwargsr-   r.   Úct_quantization_configra   Úweights_argsÚprocessed_outÚkeyÚvalueÚ	scale_keyÚ	quantizedÚscalesÚoutputÚiÚquantr=   ÚdenserZ   rJ   rE   Úpack_factorÚshapesÚstored_shaper>   Úmodules                                 r   ÚconvertzDecompressExperts.convert>   sý  € ð 	BÐAÐAÐAÐAÐAØMÐMÐMÐMÐMÐMà!%Ô!2Ô!=Ô!QÐà"œkÐWÕ-?Ð@VÑ-WÔ-WÐà*Ô2ˆØÔ Ò'Ñ'¨LÔ,AÀQÒ,FÑ,Fð ˆMØ(×.Ò.Ñ0Ô0ð 0ñ 0‘
��UØ! SÐ(Ð(ØØŸKšK¨	°?ÑCÔC�	Ø JÐ.Ð.à).�M #Ñ&ØÝ%/°µtÑ%<Ô%<ÐI˜E˜EÀ5À'�	Ø# IÔ.�Ý#-¨fµdÑ#;Ô#;ÐI˜˜À&À�Ø�Ý)2µ3°yÀ&Ñ3IÔ3IÑ)JÔ)Jð ð Ñ%�A‘~˜˜uØ"ŸXšX¥e¤mÑ4Ô4°u·x²xÅÄÑ7NÔ7NÑN×RÒRÕSXÔSaÑbÔb�EØ�~å!&¤­c°)©n¬nÐ-K¸u¼{Ð-KÐ-KÐSXÔS^ÐglÔgsÐ!tÑ!tÔ!t˜Ø˜1”I—O’O EÑ*Ô*Ð*Ø˜ØÐ%Ø)/�M #Ñ&ùØ Ð à$Ô+ÐbÐ/BÐ/BÅ2Ä9ÐNaÑ/bÔ/bˆØ#×;Ò;¸FÑCÔCˆ
ð	Mð 	Mð 	Mð 	Mð 	M�"œ)ñ 	Mô 	Mð 	Mð Ð/Ô7Ô@Ñ@ˆð ˆØ$×*Ò*Ñ,Ô,ð (	,ñ (	,‰JˆC�Ø cÐ)Ð)ØØˆIØ §¢¨O¸^Ñ LÔ LÔMˆFØ—^’^ C§K¢K°ÀÑ$PÔ$PÑQÔQˆFð
 ˆFÝ%.­s°9¸fÑ/EÔ/EÑ%FÔ%Fð ð Ñ!�‘>�E˜5ð
 (. ~˜t˜t¸6À!¼9�ØÐ+°×0BÒ0BÑ0DÔ0DÐ+Ø(�E�Eå!œL¨%¬+°a¬.¸%¼+Àa¼.È;Ñ:VÐ)WÑXÔX�EØ$˜ U¨E°5Ñ9Ô9�Ø-@�Ô*Ø×,Ò,¨VÑ4Ô4Ð4à�>å"œ[Ý˜Y™œÐ>¨&¬-Ô*=Ð>Ð>Ø$œmÔ1Ø%œ}Ô3ðñ ô �Fð
 �q”	—’ ¤Ñ.Ô.Ð.à�Fà˜6ØÐ!ð &,�˜cÑ"ùàÐr   r   c                 ó   — t          ¦   «         S r"   )r   ©r%   s    r   Ú
reverse_opzDecompressExperts.reverse_op§   s   € å‰}Œ}Ðr   r"   )r+   r   )r@   rA   rB   Ú__doc__r&   ÚdictÚstrrT   ÚTensorr   rt   Úpropertyrw   © r   r   r    r    -   sÏ   € € € € € ðð ðð ð ð ð '+ðgð gà˜˜eœlÐ*Ô+ðgð ˜cœðgð ˜cœð	gð
 ˜t™ðgð 
ˆc�5”<ÐÔ	 ðgð gð gð gðR ðð ð ñ „Xðð ð r   r    Úxc                 ó¢  — |                       t          j        ¦  «        }|                     ¦   «                              d¬¦  «        }t          j        |dk    |t          j        |¦  «        ¦  «        }|t          z  }t          j        || 	                    d¦  «        z  t          t          ¬¦  «                              t          ¦  «        }||fS )a:  Quantize a 2D tensor to FP8 per-row using pure PyTorch (torch.compile compatible).

    Args:
        x: Input tensor of shape (num_rows, hidden_dim).

    Returns:
        Tuple of (x_fp8, scales) where x_fp8 is the quantized tensor and
        scales is a 1D tensor of shape (num_rows,) with per-row scales.
    éÿÿÿÿ)Údimr   )ÚminÚmax)rS   rT   rU   ÚabsÚamaxÚwhereÚ	ones_likeÚ_FP8_MAXÚclampÚ	unsqueezeÚ_FP8_MINÚ
_FP8_DTYPE)r~   Úx_floatÚrow_maxÚsafe_maxrk   Úx_fp8s         r   Úquantize_fp8_per_rowr‘   ±   s¢   € ð �dŠd•5”=Ñ!Ô!€GØ�kŠk‰mŒm× Ò  RÐ Ñ(Ô(€GåŒ{˜7 Qš;¨µ´ÀÑ1IÔ1IÑJÔJ€HØ�Ñ €FÝŒK˜ &×"2Ò"2°2Ñ"6Ô"6Ñ6½HÍ(ÐSÑSÔS×VÒVÕWaÑbÔb€EØ�&ˆ=Ðr   Úinputr<   Úscale_aÚscale_bÚ	out_dtypeÚbiasr+   c           
      óð   — t          dd¬¦  «        rLt          j        j        j        }t          j        j                             | |||j        ||j        ||¬¦  «        S t          j        | |||||¬¦  «        S )a4  Row-wise scaled FP8 matmul dispatcher that uses the public `torch.nn.functional.scaled_mm`
    (torch >= 2.10) if available, else falls back to `torch._scaled_mm`.

    Args:
        input (`torch.Tensor`): FP8 input of shape (M, K), scaled per-row.
        weight (`torch.Tensor`): FP8 weight of shape (K, N), scaled per-column.
        scale_a (`torch.Tensor`): Input scales of shape (M, 1), float32.
        scale_b (`torch.Tensor`): Weight scales of shape (1, N), float32.
    Returns:
        `torch.Tensor`: Output tensor of shape (M, N) in `out_dtype`.
    z2.10T)Ú
accept_dev)r–   Úoutput_dtype©r“   r”   r•   r–   )r   rT   r   Ú
functionalÚScalingTypeÚ	scaled_mmÚRowWiseÚ
_scaled_mm)r’   r<   r“   r”   r•   r–   rœ   s          r   Ú_scaled_mm_rowwiser    Ä   sˆ   € õ( ! °DÐ9Ñ9Ô9ð 
Ý”hÔ)Ô5ˆÝŒxÔ"×,Ò,ØØØØÔØØÔØØ"ð -ñ 	
ô 	
ð 		
õ Ô˜E 6°7ÀGÐW`ÐgkÐlÑlÔlÐlr   c                   óV   ‡ — e Zd ZdZd
dededefˆ fd„Zdej        dej        fd	„Z	ˆ xZ
S )ÚCompressedTensorsFP8LinearaÏ  Linear layer for compressed-tensors FP8 models.

    Stores weights in FP8 format and uses a row-wise scaled matmul (`_scaled_mm_rowwise`) for FP8 matmul.
    Activations are always dynamically quantized per-row via ``quantize_fp8_per_row``,
    which works for both ``dynamic`` and ``static`` checkpoints (the checkpoint's
    static input scale, if any, is simply not needed). The weight scale (per-channel
    or per-tensor) is stored as ``weight_scale``.
    FÚin_featuresÚout_featuresÚhas_biasc                 óÐ  •— t          ¦   «                              ||¦  «         || _        t          j        t          j        ||t          ¬¦  «        ¦  «        | _        t          j        t          j	        d|ft
          j
        ¬¦  «        ¦  «        | _        | j        r2t          j        t          j        | j        ¦  «        ¦  «        | _        d S |                      dd ¦  «         d S )N)r2   rG   r–   )r8   r&   r¥   r   r9   rT   rW   rŒ   r<   ÚzerosrU   r1   r¤   r–   Úregister_parameter)r%   r£   r¤   r¥   r?   s       €r   r&   z#CompressedTensorsFP8Linear.__init__ñ   s·   ø€ Ý‰Œ×Ò˜ lÑ3Ô3Ð3à ˆŒÝ”l¥5¤;¨|¸[ÕPZÐ#[Ñ#[Ô#[Ñ\Ô\ˆŒÝœL­¬°a¸Ð5FÍeÌmÐ)\Ñ)\Ô)\Ñ]Ô]ˆÔàŒ=ð 	2Ýœ¥U¤[°Ô1BÑ%CÔ%CÑDÔDˆDŒIˆIˆIà×#Ò# F¨DÑ1Ô1Ð1Ð1Ð1r   r’   r+   c                 óV  — g |j         d d…         ¢d‘R }|                     d|j         d         ¦  «        }t          |¦  «        \  }}t          || j                             ¦   «         |                     d¦  «        | j        |j        | j	        ¬¦  «        }|                     |¦  «        S )Nr€   rš   )
r>   Úreshaper‘   r    r<   ÚtrŠ   r1   r2   r–   )r%   r’   Úoutput_shaper~   Úx_quantizedÚx_scalerl   s          r   Úforwardz"CompressedTensorsFP8Linear.forwardý   s¥   € ð /˜œ S b SÔ)Ð.¨2Ð.Ð.ˆØ�MŠM˜"˜eœk¨"œoÑ.Ô.ˆå3°AÑ6Ô6Ñˆ�Wå#ØØŒK�MŠM‰OŒOØ×%Ò% bÑ)Ô)ØÔ%Ø”kØ”ð
ñ 
ô 
ˆð �~Š~˜lÑ+Ô+Ð+r   )F)r@   rA   rB   rx   ÚintÚboolr&   rT   r{   r¯   rC   rD   s   @r   r¢   r¢   ç   s‡   ø€ € € € € ðð ð
2ð 
2 Cð 
2°sð 
2Àdð 
2ð 
2ð 
2ð 
2ð 
2ð 
2ð,˜Uœ\ð ,¨e¬lð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r   r¢   c                 ó¾  — ddl m} ddlm} d}|�d„  || ||¬¦  «        D ¦   «         }g }|                      ¦   «         D ]�\  }}	|�||vrŒ |||¦  «        sŒt          |	t          j        ¦  «        rNt          |	j	        |	j
        |	j        du¬¦  «        }
|                      ||
¦  «         |                     |¦  «         Œ‚|st                               d	¦  «         |S )
uÆ  Replace nn.Linear modules with CompressedTensorsFP8Linear for compressed-tensors FP8 loading.

    Quantization may only cover part of the model: `targets` / `ignore` are the
    compressed-tensors patterns (class names or `re:` regexes) from the config â€” only
    matching modules are replaced, everything else keeps its dense weights.
    `modules_to_not_convert` holds additional transformers-side exclusions
    (e.g. `_keep_in_fp32_modules`).
    r   )Úmatch_named_modulesr   )Úshould_convert_moduleNc                 ó   — h | ]\  }}|’ŒS r}   r}   )r   ÚnameÚ_s      r   ú	<setcomp>z=replace_with_compressed_tensors_fp8_linear.<locals>.<setcomp>!  s   € ÐZÐZÐZ™G˜D !�4ÐZÐZÐZr   )Úignore)r£   r¤   r¥   z†You are loading your model using compressed-tensors FP8 but no linear modules were found. Please double check your model architecture.)Úcompressed_tensors.utils.matchr³   Úquantizers.quantizers_utilsr´   Únamed_modulesrP   r   r[   r¢   r£   r¤   r–   Úset_submoduleÚappendÚloggerÚwarning)Úmodelr   r¹   Úmodules_to_not_convertr³   r´   ÚmatchedÚreplaced_namesÚmodule_namers   Ú
new_modules              r   Ú*replace_with_compressed_tensors_fp8_linearrÇ     sG  € ð CÐBÐBÐBÐBÐBð DÐCÐCÐCÐCÐCà€GØÐØZÐZÐ':Ð':¸5À'ÐRXÐ'YÑ'YÔ'YÐZÑZÔZˆà€NØ$×2Ò2Ñ4Ô4ð /ð /Ñˆ�VØÐ ;°gÐ#=Ð#=ØØ$Ð$ [Ð2HÑIÔIð 	Øå�f�bœiÑ(Ô(ð 		/õ 4Ø"Ô.Ø#Ô0Øœ¨DÐ0ðñ ô ˆJð
 ×Ò ¨ZÑ8Ô8Ð8Ø×!Ò! +Ñ.Ô.Ð.øàð 
Ý�Šð;ñ	
ô 	
ð 	
ð Ðr   c                 ó’   — |                       |                     dd¦  «        d         ¦  «        }t          |t          ¦  «        r|ndS )z»Return the `CompressedTensorsFP8Linear` owning `full_layer_name` (a `weight_scale` key),
    or None if the key belongs to another kind of module (e.g. a non-FP8 group of a mixed config).ú.rG   r   N)Úget_submoduleÚrsplitrP   r¢   )rÁ   r*   rs   s      r   Ú_get_fp8_linearrÌ   =  sF   € ð × Ò  ×!7Ò!7¸¸QÑ!?Ô!?ÀÔ!BÑCÔC€FÝ Õ(BÑCÔCÐMˆ6ˆ6ÈÐMr   c                   ó6   — e Zd ZdZdd„Zedefd„¦   «         ZdS )ÚConvertFP8LinearScalea?  Reshape the checkpoint ``weight_scale`` into the row-wise kernel layout at load time.

    compressed-tensors checkpoints store the dequantization scale as ``(out_features, 1)``
    (channel strategy) or a single element (tensor strategy). The row-wise scaled matmul in
    :class:`CompressedTensorsFP8Linear` needs a contiguous float32 ``(1, out_features)`` scale;
    converting once at load time avoids a transpose + expand + copy on every forward call.
    Scales of modules that were not replaced with :class:`CompressedTensorsFP8Linear` pass
    through untouched.
    Nc                 óÂ  — t          t          |                     ¦   «         ¦  «        ¦  «        \  }}t          |t          ¦  «        r|d         n|}t          ||¦  «        }|€||iS |                     t          j        ¦  «         	                    dd¦  «        }|j
        d         |j        k    r-|                     d|j        ¦  «                             ¦   «         }||iS )Nr   rG   r€   )ÚnextÚiterrN   rP   r   rÌ   rS   rT   rU   rª   r>   r¤   ÚexpandÚ
contiguous)r%   r'   rÁ   r*   rc   rg   r=   rs   s           r   rt   zConvertFP8LinearScale.convertO  sÆ   € Ý�$˜z×/Ò/Ñ1Ô1Ñ2Ô2Ñ3Ô3‰
ˆˆUÝ& u­dÑ3Ô3Ð>��a”�¸ˆÝ  ¨Ñ8Ô8ˆØˆ>Ø˜�<ÐØ—’�œÑ'Ô'×/Ò/°°2Ñ6Ô6ˆØŒ;�qŒ>˜VÔ0Ò0Ð0ð —L’L  FÔ$7Ñ8Ô8×CÒCÑEÔEˆEØ�Uˆ|Ðr   r+   c                 ó   — t          ¦   «         S r"   )ÚRevertFP8LinearScalerv   s    r   rw   z ConvertFP8LinearScale.reverse_op\  s   € å#Ñ%Ô%Ð%r   ©NN©r@   rA   rB   rx   rt   r|   r   rw   r}   r   r   rÎ   rÎ   D  sY   € € € € € ðð ðð ð ð ð ð&˜Mð &ð &ð &ñ „Xð&ð &ð &r   rÎ   c                   ó6   — e Zd ZdZdd„Zedefd„¦   «         ZdS )rÕ   a\  Save-time inverse of :class:`ConvertFP8LinearScale`: restore the checkpoint layout,
    ``(out_features, 1)`` for the channel strategy and ``(1, 1)`` for the tensor strategy.
    The strategy is read from the config group targeting the module, so the saved checkpoint
    stays loadable by other compressed-tensors consumers (llm-compressor, vLLM).Nc                 ón  — ddl m} t          t          |                     ¦   «         ¦  «        ¦  «        \  }}t          |t          ¦  «        r|d         n|}t          ||¦  «        }|€||iS |                     dd¦  «        d         }	|j	        j
        j
        }
d }|
j                             ¦   «         D ]1}|j        �( ||	||j        |
j        pd¦  «        r|j        j        } nŒ2|dk    r"||d d …d d…f                              ¦   «         iS ||                     ¦   «                              ¦   «         iS )Nr   )Úis_matchrÉ   rG   r}   r`   )rº   rÚ   rÐ   rÑ   rN   rP   r   rÌ   rË   Úconfigr   r   r   rK   r   r¹   ÚstrategyÚcloner«   rÓ   )r%   r'   rÁ   r*   rc   rÚ   rg   r=   rs   rÅ   Ú	ct_configrÜ   r   s                r   rt   zRevertFP8LinearScale.convertg  sG  € Ø;Ð;Ð;Ð;Ð;Ð;å�$˜z×/Ò/Ñ1Ô1Ñ2Ô2Ñ3Ô3‰
ˆˆUÝ& u­dÑ3Ô3Ð>��a”�¸ˆÝ  ¨Ñ8Ô8ˆØˆ>Ø˜�<Ðà%×,Ò,¨S°!Ñ4Ô4°QÔ7ˆØ”LÔ4ÔHˆ	ØˆØÔ,×3Ò3Ñ5Ô5ð 	ð 	ˆEØŒ}Ð(¨X¨X°kÀ6È5Ì=ÐZcÔZjÐZpÐnpÑ-qÔ-qÐ(Ø œ=Ô1�Ø�øØ�xÒÐà˜˜q˜q˜q " 1 "˜uœ×+Ò+Ñ-Ô-Ð.Ð.Ø�U—W’W‘Y”Y×)Ò)Ñ+Ô+Ð,Ð,r   r+   c                 ó   — t          ¦   «         S r"   )rÎ   rv   s    r   rw   zRevertFP8LinearScale.reverse_op|  s   € å$Ñ&Ô&Ð&r   rÖ   r×   r}   r   r   rÕ   rÕ   a  s[   € € € € € ðTð Tð
-ð -ð -ð -ð* ð'˜Mð 'ð 'ð 'ñ „Xð'ð 'ð 'r   rÕ   r"   )NNN) rx   rT   r   Úcore_model_loadingr   r   Úutilsr   Úutils.import_utilsr   Ú
get_loggerr@   r¿   r   r    Úfloat8_e4m3fnrŒ   Úfinfor‚   r‹   rƒ   rˆ   r{   r‘   r2   r    r[   r¢   rÇ   rÌ   rÎ   rÕ   r}   r   r   ú<module>ræ      s;  ðð %Ð $à €€€Ø Ð Ð Ð Ð Ð à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :ð 
ˆÔ	˜HÑ	%Ô	%€ðð ð ð$|ð |ð |ð |ð |˜ñ |ô |ð |ð~ Ô €
Øˆ5Œ;�zÑ"Ô"Ô&€Øˆ5Œ;�zÑ"Ô"Ô&€ð˜EœLð ð ð ð ð2 !%ð mð  mØŒ<ð màŒLð mð Œ\ð mð Œ\ð	 mð
 Œ{ð mð Œ,˜Ñ
ð mð „\ð mð  mð  mð  mðF&,ð &,ð &,ð &,ð &, ¤ñ &,ô &,ð &,ðR*ð *ð *ð *ðZNð Nð Nð&ð &ð &ð &ð &˜Mñ &ô &ð &ð:'ð 'ð 'ð 'ð '˜=ñ 'ô 'ð 'ð 'ð 'r   