§
    *�’jp  ã                  ó¨   — d dl mZ d dlZd dlmZmZ d dlmZ  ej        e	¦  «        Z
erd dlmZmZmZmZ 	 d dlmZ n# e$ r Y nw xY w	 	 	 ddd„ZdS )é    )ÚannotationsN)ÚTYPE_CHECKINGÚLiteral)Úsave_or_push_to_hub_model)ÚCrossEncoderÚMultiVectorEncoderÚSentenceTransformerÚSparseEncoder)ÚOptimizationConfigFÚmodelúGSentenceTransformer | SparseEncoder | CrossEncoder | MultiVectorEncoderÚoptimization_configú4OptimizationConfig | Literal['O1', 'O2', 'O3', 'O4']Úmodel_name_or_pathÚstrÚpush_to_hubÚboolÚ	create_prÚfile_suffixú
str | NoneÚreturnÚNonec                ó°  ‡‡‡
— 	 ddl m}m} ddlm} n# t
          $ r t          d¦  «        ‚w xY w| j        }	t          |	|¦  «        st          d¦  «        ‚| 	                    |	¦  «        Š
t          ‰t          ¦  «        r4‰|j        vrt          d¦  «        ‚‰p‰Š t          |‰¦  «        ¦   «         Š‰€dŠt          ˆˆˆ
fd	„d
‰|||‰d| ¬¦	  «	         dS )a=  
    Export an optimized ONNX model from a SentenceTransformer, SparseEncoder, CrossEncoder,
    or MultiVectorEncoder model.

    The O1-O4 optimization levels are defined by Optimum and are documented here:
    https://huggingface.co/docs/optimum-onnx/main/en/onnxruntime/usage_guides/optimization

    The optimization levels are:

    - O1: basic general optimizations.
    - O2: basic and extended general optimizations, transformers-specific fusions.
    - O3: same as O2 with GELU approximation.
    - O4: same as O3 with mixed precision (fp16, GPU-only)

    See the following pages for more information & benchmarks:

    - `Sentence Transformer > Usage > Speeding up Inference <https://sbert.net/docs/sentence_transformer/usage/efficiency.html>`_
    - `Cross Encoder > Usage > Speeding up Inference <https://sbert.net/docs/cross_encoder/usage/efficiency.html>`_

    Args:
        model (SentenceTransformer | SparseEncoder | CrossEncoder | MultiVectorEncoder): The SentenceTransformer,
            SparseEncoder, CrossEncoder, or MultiVectorEncoder model to be optimized. Must be loaded with `backend="onnx"`.
        optimization_config (OptimizationConfig | Literal["O1", "O2", "O3", "O4"]): The optimization configuration or level.
        model_name_or_path (str): The path or Hugging Face Hub repository name where the optimized model will be saved.
        push_to_hub (bool, optional): Whether to push the optimized model to the Hugging Face Hub. Defaults to False.
        create_pr (bool, optional): Whether to create a pull request when pushing to the Hugging Face Hub. Defaults to False.
        file_suffix (str | None, optional): The suffix to add to the optimized model file name. Defaults to None.

    Raises:
        ImportError: If the required packages `optimum` and `onnxruntime` are not installed.
        ValueError: If the provided model is not a valid SentenceTransformer, SparseEncoder, CrossEncoder,
            or MultiVectorEncoder model loaded with `backend="onnx"`.
        ValueError: If the provided optimization_config is not valid.

    Returns:
        None
    r   )ÚORTModelÚORTOptimizer)ÚAutoOptimizationConfigz·Please install Optimum and ONNX Runtime to use this function. You can install them with pip: `pip install sentence-transformers[onnx]` or `pip install sentence-transformers[onnx-gpu]`z‘The model must be a Transformer-based SentenceTransformer, SparseEncoder, CrossEncoder, or MultiVectorEncoder model loaded with `backend="onnx"`.z\optimization_config must be an OptimizationConfig instance or one of 'O1', 'O2', 'O3', 'O4'.NÚ	optimizedc                ó4   •— ‰                      ‰| ‰¬¦  «        S )N)r   )Úoptimize)Úsave_dirr   r   Ú	optimizers    €€€úTC:\Projects\DSCons\.venv\Lib\site-packages\sentence_transformers\backend\optimize.pyú<lambda>z-export_optimized_onnx_model.<locals>.<lambda>a   s   ø€ ¨×);Ò);Ð<OÐQYÐgrÐ);Ñ)sÔ)s€ ó    Úexport_optimized_onnx_modelÚonnx)	Úexport_functionÚexport_function_nameÚconfigr   r   r   r   Úbackendr   )Úoptimum.onnxruntimer   r   Ú!optimum.onnxruntime.configurationr   ÚImportErrorÚtransformers_modelÚ
isinstanceÚ
ValueErrorÚfrom_pretrainedr   Ú_LEVELSÚgetattrr   )r   r   r   r   r   r   r   r   r   Ú	ort_modelr!   s    `   `    @r"   r%   r%      sh  øøø€ ð\
Ø>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØLÐLÐLÐLÐLÐLÐLøÝð 
ð 
ð 
Ýð?ñ
ô 
ð 	
ð
øøøð Ô(€IÝ�i Ñ*Ô*ð 
ÝðHñ
ô 
ð 	
ð
 ×,Ò,¨YÑ7Ô7€IåÐ%¥sÑ+Ô+ð UØÐ&<Ô&DÐDÐDÝØnñô ð ð "Ð8Ð%8ˆØR�gÐ&<Ð>QÑRÔRÑTÔTÐàÐØ!ˆåØsÐsÐsÐsÐsÐsØ:Ø"Ø-ØØØØØð
ñ 
ô 
ð 
ð 
ð 
s   … ”.)FFN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Ú
__future__r   ÚloggingÚtypingr   r   Ú#sentence_transformers.backend.utilsr   Ú	getLoggerÚ__name__ÚloggerÚsentence_transformersr   r   r	   r
   r,   r   r-   r%   © r$   r"   ú<module>r>      s÷   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à IÐ IÐ IÐ IÐ IÐ Ià	ˆÔ	˜8Ñ	$Ô	$€àð ØjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjðØHÐHÐHÐHÐHÐHÐHøØð ð ð Øˆðøøøð ØØ"ðWð Wð Wð Wð Wð Wð Ws   ¸? ¿AÁA