a
    h                     @  sn  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m	Z	 d dl
mZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlZd dlZd dlmZmZ d dlmZ  d dlm!Z" d dl#m$Z$m%Z% d dl&m'Z' d dlm(Z( d dl)m*Z* d dlm+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@ e@ rd dlAmBZBmCZCmDZDmEZEmFZF eGeHZIerd dlJmKZK d dlLmMZM d dlNmOZO G dd  d e+ZPe4d!G d"d# d#ePZQg d$ZRg d%ZSd&d'd(d)ZTd*d+d,d-d.ZUd/d0d1d2d3ZVeG d4d5 d5eZWd6d7d8d9d:ZXdS );    )annotationsN)Counterdefaultdict)copy)	dataclassfieldfields)Path)python_version)pformatindent)TYPE_CHECKINGAnyLiteral)CardData	ModelCard)dataset_info)
model_info)
EvalResulteval_results_to_model_index)	yaml_dump)nn)tqdm)TrainerCallback)CodeCarbonCallback)make_markdown_table)TrainerControlTrainerState)
deprecated__version__)RouterStaticEmbedding)$SentenceTransformerTrainingArguments)fullnameis_accelerate_availableis_datasets_available)DatasetDatasetDictIterableDatasetIterableDatasetDictValue)SentenceEvaluator)SentenceTransformer)SentenceTransformerTrainerc                      s   e Zd Zddd fddZdddd	d
ddddZdddd	ddddZdddd	dddddZdddd	dddddZ  ZS )$SentenceTransformerModelCardCallbackdict[str, Any]None)default_args_dictreturnc                   s   t    || _d S N)super__init__r3   )selfr3   	__class__ \/var/www/html/assistant/venv/lib/python3.9/site-packages/sentence_transformers/model_card.pyr7   0   s    
z-SentenceTransformerModelCardCallback.__init__r$   r   r   r.   r/   )argsstatecontrolmodeltrainerr4   c           
      K  s   |j d dd |jjD }|r.|d |j _|jrR|j |j|j j|jd|j _|j	rv|j |j	|j j
|jd|j _
t|j}|j | |j js|j	p|j }	r|j |	 d S )NZgenerated_from_trainerc                 S  s   g | ]}t |tr|qS r;   )
isinstancer   ).0callbackr;   r;   r<   
<listcomp>@   s   zDSentenceTransformerModelCardCallback.on_init_end.<locals>.<listcomp>r   traineval)model_card_dataadd_tagsZcallback_handler	callbackscode_carbon_callbackZtrain_datasetextract_dataset_metadatatrain_datasetslossZeval_dataseteval_datasets
get_losses
set_losseswidgetset_widget_examples)
r8   r=   r>   r?   r@   rA   kwargsrJ   lossesdatasetr;   r;   r<   on_init_end4   s$    	
z0SentenceTransformerModelCardCallback.on_init_end)r=   r>   r?   r@   r4   c                   sJ   h d |  } fdd| D |j_ fdd| D |j_d S )N>   Zdo_trainZgreater_is_betterZsave_strategyZpush_to_hub_tokenZlogging_steps
output_dirZdo_evalZ
eval_delayZsamples_per_labelZ	report_toZ
save_stepsZrun_nameZlogging_first_stepZmetric_for_best_modelZlogging_strategyZsave_total_limitshow_progress_barZevaluation_strategyZ	hub_tokenZ
eval_stepsZdo_testZlogging_dirc                   s   i | ]\}}| vr||qS r;   r;   rC   keyvalue)ignore_keysr;   r<   
<dictcomp>z   s   zGSentenceTransformerModelCardCallback.on_train_begin.<locals>.<dictcomp>c                   s6   i | ].\}}| vr|j v r|j | kr||qS r;   )r3   rZ   r]   r8   r;   r<   r^   }   s    )to_dictitemsrH   all_hyperparametersnon_default_hyperparameters)r8   r=   r>   r?   r@   rT   Z	args_dictr;   r_   r<   on_train_beginY   s    

z3SentenceTransformerModelCardCallback.on_train_beginzdict[str, float])r=   r>   r?   r@   metricsr4   c                   s    fdd D }t |dkr2d|v r2d|d i}|jjrd|jjd d |jkrd|jjd | n|jj|j|jd| d S )	Nc                   s>   i | ]6}| d r|drd|ddd  | qS )Zeval_Z_loss _   N)
startswithendswithjoinsplitrC   r[   re   r;   r<   r^      s   zDSentenceTransformerModelCardCallback.on_evaluate.<locals>.<dictcomp>rh   rN   Validation LossStepEpochrq   )lenrH   training_logsglobal_stepupdateappendepoch)r8   r=   r>   r?   r@   re   rT   Z	loss_dictr;   rn   r<   on_evaluate   s"    	
z0SentenceTransformerModelCardCallback.on_evaluate)r=   r>   r?   r@   logsr4   c           	      K  s   dht |@ }|rl|jjrJ|jjd d |jkrJ||  |jjd d< n"|jj|j|j||  d |jjd u r|D ]}d|v r|d|j_q|d S )NrN   rp   rq   Training Loss)rs   rq   r|   ZndcgT)setrH   ru   rv   poprx   ry   ir_model)	r8   r=   r>   r?   r@   r{   rT   keysr[   r;   r;   r<   on_log   s"    	
	z+SentenceTransformerModelCardCallback.on_log)	__name__
__module____qualname__r7   rW   rd   rz   r   __classcell__r;   r;   r9   r<   r0   /   s
   %*r0   zThe `ModelCardCallback` has been renamed to `SentenceTransformerModelCardCallback` and the former is now deprecated. Please use `SentenceTransformerModelCardCallback` instead.c                      s   e Zd Z fddZ  ZS )ModelCardCallbackc                   s   t  j|i | d S r5   )r6   r7   )r8   r=   rT   r9   r;   r<   r7      s    zModelCardCallback.__init__)r   r   r   r7   r   r;   r;   r9   r<   r      s   r   )languagelicenselibrary_nametagsdatasetsre   pipeline_tagrR   model-indexco2_eq_emissions
base_model)r@   rA   eval_results_dictr1   r4   c                  C  s`   t  ttjtjd} t r.ddlm} || d< t rHddlm} || d< ddl	m} || d< | S )N)pythonsentence_transformerstransformerstorchr   r    
accelerater   
tokenizers)
r
   sentence_transformers_versionr   r!   r   r&   r   r'   r   r   )versionsZaccelerate_versionZdatasets_versionZtokenizers_versionr;   r;   r<   get_versions   s    r   zfloat | int | strr   r\   r4   c                 C  s   t | trt| dS | S )N   )rB   floatroundr\   r;   r;   r<   
format_log   s    

r   znn.Module | dict[nn.Module]list[nn.Module])rN   r4   c                 C  s   t | trt|  }n| g}d}|t|k r|| } t| drV| j|vrV|| j t| drv| j|vrv|| j t| dr| j	|vr|| j	 |d7 }q"|S )Nr   rN   document_regularizerquery_regularizerrh   )
rB   dictlistvaluesrt   hasattrrN   rx   r   r   )rN   rU   Zloss_idxr;   r;   r<   rP      s    

rP   c                   @  s  e Zd ZU dZeedZded< dZded< dZ	ded< dZ
ded	< eedZd
ed< eedZd
ed< dZded< edd dZded< dZded< eddZded< edddZded< edddZded< eeddZded< eeddZded < eeddZd!ed"< eeddZd#ed$< eeddZd
ed%< edddZded&< eeddZd
ed'< edddZd(ed)< eeddZd*ed+< edddZd,ed-< eeddd.Zd/ed0< edddd1Zd2ed3< edddd1Z ded4< edddZ!ded5< ed6ddZ"d7ed8< ed9ddZ#ded:< ed;ddZ$ded<< ee%ddZ&d*ed=< ee'e(j)d> ddd1Z*d?ed@< edddd1Z+dAedB< dCdDdEdFZ,ddGddGdHdIdJZ-dKdCdLdMdNZ.d7dCdOdPdQZ/dRdCdSdTdUZ0ddWdd7d7dCdXdYdZZ1d[dCdSd\d]Z2ddRdd
d^d_d`Z3daddbdcddZ4deddfd*dgdhdiZ5dRdGdjdkdGdldmdnZ6dodCdpdqdrZ7ddCdsdtduZ8ddddCdvdwdxZ9dadCdydzd{Z:ddCd|d}d~Z;dadCdddZ<dCdDddZ=ddDddZ>dd Z?ddDddZ@ddDddZAddDddZBdCdDddZCddDddZDdddDddZEdS ) SentenceTransformerModelCardDataa	  A dataclass storing data used in the model card.

    Args:
        language (`Optional[Union[str, List[str]]]`): The model language, either a string or a list,
            e.g. "en" or ["en", "de", "nl"]
        license (`Optional[str]`): The license of the model, e.g. "apache-2.0", "mit",
            or "cc-by-nc-sa-4.0"
        model_name (`Optional[str]`): The pretty name of the model, e.g. "SentenceTransformer based on microsoft/mpnet-base".
        model_id (`Optional[str]`): The model ID when pushing the model to the Hub,
            e.g. "tomaarsen/sbert-mpnet-base-allnli".
        train_datasets (`List[Dict[str, str]]`): A list of the names and/or Hugging Face dataset IDs of the training datasets.
            e.g. [{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}, {"name": "STSB"}]
        eval_datasets (`List[Dict[str, str]]`): A list of the names and/or Hugging Face dataset IDs of the evaluation datasets.
            e.g. [{"name": "SNLI", "id": "stanfordnlp/snli"}, {"id": "mteb/stsbenchmark-sts"}]
        task_name (`str`): The human-readable task the model is trained on,
            e.g. "semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more".
        tags (`Optional[List[str]]`): A list of tags for the model,
            e.g. ["sentence-transformers", "sentence-similarity", "feature-extraction"].
        local_files_only (`bool`): If True, don't attempt to find dataset or base model information on the Hub.
            Defaults to False.
        generate_widget_examples (`bool`): If True, generate widget examples from the evaluation or training dataset,
            and compute their similarities. Defaults to True.

    .. tip::

        Install `codecarbon <https://github.com/mlco2/codecarbon>`_ to automatically track carbon emission usage and
        include it in your model cards.

    Example::

        >>> model = SentenceTransformer(
        ...     "microsoft/mpnet-base",
        ...     model_card_data=SentenceTransformerModelCardData(
        ...         model_id="tomaarsen/sbert-mpnet-base-allnli",
        ...         train_datasets=[{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}],
        ...         eval_datasets=[{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}],
        ...         license="apache-2.0",
        ...         language="en",
        ...     ),
        ... )
    )default_factoryzstr | list[str] | Noner   Nz
str | Noner   
model_namemodel_idzlist[dict[str, str]]rM   rO   zjsemantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and morestr	task_namec                   C  s   g dS )N)sentence-transformerssentence-similarityzfeature-extractionZdenser;   r;   r;   r;   r<   <lambda>@      z)SentenceTransformerModelCardData.<lambda>zlist[str] | Noner   Fboollocal_files_onlyT)defaultgenerate_widget_examples)r   initr   base_model_revision)r   r   r1   rc   rb   z.dict[SentenceEvaluator, dict[str, Any]] | Noner   zlist[dict[str, float]]ru   rR   predict_examplelabel_example_listzCodeCarbonCallback | NonerK   zdict[str, str]	citationsz
int | Nonebest_model_step)r   r   repr	list[str]r   )r   r   r   zbool | Noner   similarities
first_saverp   intwidget_stepr   r   r   r   versionzmodel_card_template.mdr	   template_pathzSentenceTransformer | Noner@   r2   r   c                 C  sv   | j  }t| j tr| j g| _ | j| j|d| _| j| j|d| _| jrr| jddkrrt	d| jd d | _d S )N)infer_languages/rh   zThe provided z} model ID should include the organization or user, such as "tomaarsen/mpnet-base-nli-matryoshka". Setting `model_id` to None.)
r   rB   r   validate_datasetsrM   rO   r   countloggerwarning)r8   r   r;   r;   r<   __post_init__h  s    
z.SentenceTransformerModelCardData.__post_init__zlist[dict[str, Any]])dataset_listr   r4   c              	   C  s   g }|D ]}d|vr(d|v r(|d |d< d|v r| j szt|d }W n. tyt   td|d d |d= Y nt0 |jr|rd|jv r|jd}|d urt|tr|g}|D ]}|| j	vr| j	
| q|j| jvr| j
|j |
| q|S )NnameidzThe dataset `id` z5 does not exist on the Hub. Setting the `id` to None.r   )r   get_dataset_info	Exceptionr   r   ZcardDatagetrB   r   r   rx   r   r   )r8   r   r   Zoutput_dataset_listrV   infoZdataset_languager   r;   r;   r<   r   x  s2    

z2SentenceTransformerModelCardData.validate_datasetsr   rU   r4   c              	     s   ddi}|D ]*}z|j ||jj< W q ty4   Y q0 qtt}| D ]\}}|| | qHddddd  fdd	| D | _| 	d
d dd	 |D D  d S )NzSentence Transformersa  
@inproceedings{reimers-2019-sentence-bert,
    title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
    author = "Reimers, Nils and Gurevych, Iryna",
    booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
    month = "11",
    year = "2019",
    publisher = "Association for Computational Linguistics",
    url = "https://arxiv.org/abs/1908.10084",
}
r   r   r   c                 S  s2   t | dkr*d| d d d | d  S | d S )Nrh   , rp   z and r   )rt   rk   )rU   r;   r;   r<   	join_list  s    z>SentenceTransformerModelCardData.set_losses.<locals>.join_listc                   s   i | ]\}} ||qS r;   r;   )rC   citationrU   r   r;   r<   r^     r   z?SentenceTransformerModelCardData.set_losses.<locals>.<dictcomp>c                 S  s   g | ]}d | qS )zloss:r;   rC   rN   r;   r;   r<   rE     r   z?SentenceTransformerModelCardData.set_losses.<locals>.<listcomp>c                 S  s   i | ]}|j j|qS r;   )r:   r   r   r;   r;   r<   r^     r   )
r   r:   r   r   r   r   ra   rx   r   rI   )r8   rU   r   rN   Zinverted_citationsr   r;   r   r<   rQ     s    z+SentenceTransformerModelCardData.set_losses)stepr4   c                 C  s
   || _ d S r5   )r   )r8   r   r;   r;   r<   set_best_model_step  s    z4SentenceTransformerModelCardData.set_best_model_stepzDataset | DatasetDict)rV   r4   c              	   C  sF  t |ttfrd S t |tr&t|d}g | _ttjt	|
 dd}d}t| ddddD ]\}}t || trxq^d	d
 || j D }|| |}t|}|dkrq^i }	t|tjt|t||dD ]"\}
}tdd | D |	|
< qtt|	 dd d \}}|d | t	||d  d d d  }}|D ]}
dd
 ||
  D }t|dk r|r| }dd
 ||  D }t|dkr|| n||d  q\t|dk r̐qBdd
 |D }| jdkr| j|d tj|dd  t|d dd n| jdt|i |d d | _qBq^d S )N)rV      )k  zComputing widget examplesZexampleF)descunitZleavec                 S  s2   g | ]*\}}t |ts*t |tr|jd v r|qS )>   stringZlarge_string)rB   r   r,   dtype)rC   columnfeaturer;   r;   r<   rE     s   
zHSentenceTransformerModelCardData.set_widget_examples.<locals>.<listcomp>r   c                 s  s"   | ]\}}|d krt |V  qdS )dataset_nameNrt   rZ   r;   r;   r<   	<genexpr>  r   zGSentenceTransformerModelCardData.set_widget_examples.<locals>.<genexpr>c                 S  s   | d S )Nrh   r;   )xr;   r;   r<   r     r   zFSentenceTransformerModelCardData.set_widget_examples.<locals>.<lambda>r[   rp   c                 S  s   g | ]\}}|d kr|qS r   r;   rC   r[   sentencer;   r;   r<   rE     r   r   c                 S  s   g | ]\}}|d kr|qS r   r;   r   r;   r;   r<   rE     s   rh   c                 S  s*   g | ]"}t |tr"t| d  n|qS )r   )rB   r   r   r   rC   r   r;   r;   r<   rE     s   r   )Zsource_sentence	sentencestext)rB   r*   r+   r(   r)   rR   r   randomchoicesr   r   r   ra   featuresZselect_columnsrt   	enumerateselectsamplerangeminsumzipsortedr~   extendrx   r   choicer   )r8   rV   Zdataset_namesZnum_samples_to_checkr   num_samplescolumnsZstr_datasetZdataset_sizelengthsidxr   indicesrg   Ztarget_indicesZbackup_indicesr   Z
backup_idxZbackup_sampler;   r;   r<   rS     sb    

(
z4SentenceTransformerModelCardData.set_widget_examplesr   r-   )	evaluatorre   ry   r   r4   c                   s   ddl m} t|| j|< t|dr|j  rt||rJdd |jD  nt trZ g  fdd|	 D }| j
r| j
d d	 |kr| j
d | n| j
||d
| d S )Nr   )SequentialEvaluatorprimary_metricc                 S  s   g | ]
}|j qS r;   r  )rC   Zsub_evaluatorr;   r;   r<   rE     r   zKSentenceTransformerModelCardData.set_evaluation_metrics.<locals>.<listcomp>c                   s   i | ]\}}| v r||qS r;   r;   rZ   Zprimary_metricsr;   r<   r^     r   zKSentenceTransformerModelCardData.set_evaluation_metrics.<locals>.<dictcomp>rp   rq   rr   )Z sentence_transformers.evaluationr  r   r   r   r  rB   Z
evaluatorsr   ra   ru   rw   rx   )r8   r   re   ry   r   r  Ztraining_log_metricsr;   r  r<   set_evaluation_metrics  s"    

z7SentenceTransformerModelCardData.set_evaluation_metricsr(   c                   s   d}t t}t }|D ]b}|d }|d }||vrf|| dt| d t|| |krf|| t| jkr qzq fdd| D  _	d S )N   r   labelz<li>z</li>c                   sF   g | ]>\}} j jr*t|tr* j j| n|d d| d dqS )z<ul> z</ul>)LabelZExamples)r@   labelsrB   r   rk   )rC   r  Zexample_setr8   r;   r<   rE   3  s    zGSentenceTransformerModelCardData.set_label_examples.<locals>.<listcomp>)
r   r   r}   rx   r   rt   addZnum_classesra   r   )r8   rV   Znum_examples_per_labelexamplesZfinished_labelsr   r   r  r;   r  r<   set_label_examples&  s    

z3SentenceTransformerModelCardData.set_label_examples)rV   r   r4   c                   s   t |tr  fdd| D S |r4td|r4d }|p>|jjt|jd}|jj	rv|j|jj	v rv|jj	|j j
|d< |j }rt| d }|drd|v r|tdd  d}|d |d	< |d
 dd  }rt|dkr||d< |gS )Nc                   s(   g | ] \}} j ||d D ]}|qqS )r   )infer_datasets)rC   r   sub_datasetrV   r  r;   r<   rE   =  s   zCSentenceTransformerModelCardData.infer_datasets.<locals>.<listcomp>z_dataset_\d+)r   rl   sizer   zhf://datasets/@r   rh   r   (   revision)rB   r)   ra   rematchr   r   r   rl   splitsZnum_examplesZdownload_checksumsr   r   ri   rt   )r8   rV   r   Zdataset_outputZ	checksumssourceZsource_partsr  r;   r  r<   r  ;  s&    



"z/SentenceTransformerModelCardData.infer_datasetszstr | list[str])r   r4   c                 K  s:   z| j j|fi |W S  ty4   | j | Y S 0 d S r5   )r@   tokenize	TypeError)r8   r   rT   r;   r;   r<   r  Z  s    z)SentenceTransformerModelCardData.tokenizez Dataset | IterableDataset | Nonez'dict[str, nn.Module] | nn.Module | None)rV   r   rN   r4   c                   sl  |si S t |trt||d< dd |jD |d< i |d< t |tr|jD ]
}|dd | d }t |tr"| jd	d
}t |trd|v r|d jdd }d}ndd D }d}dt	t
|d d| t	t|t| d d| t	t|d d| dd|d |< qLt |ttfrbt d fddt D d|d |< qLt |trdt	t
dt	tt dt	tddd|d |< qLt |trBtdd D  t dkrddt| did|d |< nBdt
  dt t  ddt  ddd|d |< qLt|i d|d |< qLddd d!d"d#id$d |d  D d"d%ifd&d|d  D g}	tt|	d'd(d)|d*< |dd+ |d,< t|d, t|d, d  }
g }t|
D ]}i }|jD ]}|d, | | }t |trRt|d-krRt|dd- dd. d/ }t |tr|t|dkr||dd d0 }t|d1d2d3d4}d5| d6||< q|| qtt|d'd(d)|d7< d8t|i|d9< t|d:rh| }d;d<d=d>d?fd@d| D }ztj|dAdB}W n  tyL   t|dAdB}Y n0 tdC| dDd)|d9 dE< |S )Fa  
        Given a dataset, compute the following:
        * Dataset Size
        * Dataset Columns
        * Dataset Stats
            - Strings: min, mean, max word count/token length
            - Integers: Counter() instance
            - Floats: min, mean, max range
            - List: number of elements or min, mean, max number of elements
        * 3 Example samples
        * Loss function name
            - Loss function config
        r  c                 S  s   g | ]}d | dqS )<code></code>r;   )rC   r   r;   r;   r<   rE   z  r   zLSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.<listcomp>r   statsNr   r   document)taskZattention_maskrh   )dimtokensc                 S  s   g | ]}t |qS r;   r   r   r;   r;   r<   rE     r   
charactersr      rf   )r   meanmax)r   datar   c                   s8   i | ]0}|t  d krdnd  | t  dqS )rh   ~r  z.2%r   rm   )counter
subsectionr;   r<   r^     s   zLSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.<dictcomp>r   c                 S  s   g | ]}t |qS r;   r   )rC   lstr;   r;   r<   rE     r   r   z	 elementsz.2fr   r&  c                 S  s    dd dd |  D  d S )Nz<ul><li>z	</li><li>c                 s  s    | ]\}}| d | V  qdS )z: Nr;   rZ   r;   r;   r<   r     r   zaSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.to_html_list.<locals>.<genexpr>z
</li></ul>)rk   ra   r+  r;   r;   r<   to_html_list  s    zNSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.to_html_listr  typec                 S  s   i | ]\}}||d  qS )r   r;   rZ   r;   r;   r<   r^     r   detailsc                   s   i | ]\}}| |d  qS r+  r;   rZ   )r,  r;   r<   r^     r   -:|--|  Zstats_tabler  r  r   rp   z, ...]z...
z<br>|z\|r  r  Zexamples_tabler%   rN   get_config_dictr   r   r   c                 S  s   t | tjs| S | jj}g }t| drDt| jdrD|t| jj	 t| dr^| j
r^|d t| dr|   D ] \}}|| dt|  qt|r| dd| d	S |S )
NrH   r   trust_remote_codeztrust_remote_code=Truer4  =(r   ))rB   r   Moduler:   r   r   rH   rx   r   r   r5  r4  ra   rk   )r\   module_nameZmodule_args_strr[   valr;   r;   r<   format_config_value  s    

zUSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.format_config_valuec                   s   i | ]\}}| |qS r;   r;   rZ   )r<  r;   r<   r^     r   r   r   ```json

```config_code)rB   r(   rt   column_namesr   r  r   r   tolistr   r   r%  r   r   r   r   r   r   r%   ra   r   r   replacer   rx   r   r4  jsondumpsr  r   )r8   rV   r   rN   r   firstZ	tokenizedr   suffixZstats_linesr   Zexamples_linesZ
sample_idxr   r\   config
str_configr;   )r(  r<  r)  r,  r<   compute_dataset_metricsa  s    
	 
z8SentenceTransformerModelCardData.compute_dataset_metricsz nn.Module | dict[str, nn.Module]zLiteral['train', 'eval'])rV   dataset_metadatarN   dataset_typer4   c              	     s4  |r|rZt |tr"t|t|ks8t |trZt|dkrZtd| d| d| d g }|sh|}t |tr fddt| |	 |D }n
||d  g}|d	kr*td
d |D }|r܈d|  jd u r*t |trtdd |	 D }n
t|j}ddh|@ r*d_|S )Nrh   zThe number of `z?_datasets` in the model card data does not match the number of z1 datasets in the Trainer. Removing the provided `z$_datasets` from the model card data.c              	     s2   g | ]*\}}} ||t tr( | n qS r;   )rI  rB   r   )rC   r   Zdataset_valuer   rN   r8   r;   r<   rE     s   zMSentenceTransformerModelCardData.extract_dataset_metadata.<locals>.<listcomp>r   rF   c                 S  s   g | ]}| d dqS )r  r   )r   )rC   metadatar;   r;   r<   rE     r   zdataset_size:c                 s  s   | ]}|j D ]
}|V  qqd S r5   )r@  )rC   r  r   r;   r;   r<   r   !  s   zLSentenceTransformerModelCardData.extract_dataset_metadata.<locals>.<genexpr>queryquestionT)rB   r)   rt   r(   r   r   r  r   r   r   rI  r   rI   r   r   r}   r@  r   )r8   rV   rJ  rN   rK  Znum_training_samplesr@  r;   rL  r<   rL     sL    





z9SentenceTransformerModelCardData.extract_dataset_metadatar.   r@   r4   c                 C  sj   || _ | jd urd S tdd | D v r4d| _d S dD ],}||jv r8t|j| dkr8d| _ d S q8d S )Nc                 S  s   g | ]
}|j qS r;   r9   )rC   moduler;   r;   r<   rE   1  r   zCSentenceTransformerModelCardData.register_model.<locals>.<listcomp>T)rN  r  ZpassageZcorpusr   )r@   r   r"   childrenZpromptsrt   )r8   r@   Zir_prompt_namer;   r;   r<   register_model+  s    
z/SentenceTransformerModelCardData.register_model)r   r4   c                 C  s
   || _ d S r5   )r   )r8   r   r;   r;   r<   set_model_id:  s    z-SentenceTransformerModelCardData.set_model_id)r   r  r4   c                 C  sT   | j r
dS zt|}W n ty*   Y dS 0 |j| _|d u sD|dkrJ|j}|| _dS )NFmainT)r   get_model_infor   r   r   shar   )r8   r   r  r   r;   r;   r<   set_base_model=  s    z/SentenceTransformerModelCardData.set_base_model)r   r4   c                 C  s   t |tr|g}|| _d S r5   )rB   r   r   )r8   r   r;   r;   r<   set_languageM  s    
z-SentenceTransformerModelCardData.set_language)r   r4   c                 C  s
   || _ d S r5   )r   )r8   r   r;   r;   r<   set_licenseR  s    z,SentenceTransformerModelCardData.set_license)r   r4   c                 C  s4   t |tr|g}|D ]}|| jvr| j| qd S r5   )rB   r   r   rx   )r8   r   tagr;   r;   r<   rI   U  s
    

z)SentenceTransformerModelCardData.add_tagsc                   s   | j j }d ur||jj}t|}d|jdd  g}|jd | fddt	dt
 D 7 }|D ]}| |rf qqfn.t| j d tr| j d jr| | j d j d S )Nr   rg   c                   s4   g | ],}d   d| d d   |d  qS )rg   Nr   )rk   )rC   r   r  r;   r<   rE   h  s   zJSentenceTransformerModelCardData.try_to_set_base_model.<locals>.<listcomp>rh   r   )r@   transformers_modelrG  Z_name_or_pathr	   rk   partsr   rl   r   rt   rX  rB   r#   r   )r8   r^  r   Zbase_model_pathZcandidate_model_idsr   r;   r]  r<   try_to_set_base_model\  s    
z6SentenceTransformerModelCardData.try_to_set_base_modelc              	     s  g }i }g }| j  D ]z\}}t|ddt|ddrtfdd| D rfdd| D }rd rtd	 d d
d
dddfdd| D }fdd| D }|jt|dd d}t|dr@|	  }r@zt
j|dd}	W n ty,   t|}	Y n0 td|	 dd}|t| ||d fdd| fdd| D  || qg }
|D ]}dd |d D }t|}|
D ]}tdd |d D }|d |d kr||kr|d  |d  kr|d! |d! kr|d D ]6}d"|v rB|d"||d  < ||d#  ||d  < q"t|d  tsx|d  g|d < |d  |d    qq|
| q|
D ] }t|dd$d%|d&< q|
t| t| j|d'S )(au  Format the evaluation metrics for the model card.

        The following keys will be returned:
        - eval_metrics: A list of dictionaries containing the class name, description, dataset name, and a markdown table
          This is used to display the evaluation metrics in the model card.
        - metrics: A list of all metric keys. This is used in the model card metadata.
        - model-index: A list of dictionaries containing the task name, task type, dataset type, dataset name, metric name,
          metric type, and metric value. This is used to display the evaluation metrics in the model card metadata.
        r   Nr  c                 3  s   | ]}|  d  V  qdS )rg   N)ri   rm   r   r;   r<   r     r   zGSentenceTransformerModelCardData.format_eval_metrics.<locals>.<genexpr>c                   s&   i | ]\}}|t  d  d |qS )rh   Nr   rZ   ra  r;   r<   r^     r   zHSentenceTransformerModelCardData.format_eval_metrics.<locals>.<dictcomp>rg   rh   r   r   c                 S  s0   zt | dr|  W S W n ty*   Y n0 | S )z^Try to convert a value from a Numpy or Torch scalar to pure Python, if not already pure Pythonr   )r   itemr   r   r;   r;   r<   try_to_pure_python  s    
zPSentenceTransformerModelCardData.format_eval_metrics.<locals>.try_to_pure_pythonc                   s   i | ]\}}| |qS r;   r;   rZ   )rc  r;   r<   r^     r   c                   sJ   g | ]B\}}| kr d | d n|| kr:d t | d nt |dqS )**Metricr,   )r   rC   Z
metric_keymetric_valuer  r;   r<   rE     s   zHSentenceTransformerModelCardData.format_eval_metrics.<locals>.<listcomp>r  r4  r   r   r=  r>  r1  )
class_namedescriptionr   table_linesr?  c                   sD   z
t | W S  ty   Y n0 t| tr@d| v r@ |  d S d S )Nrf   r   )r   r   rB   r   rl   )rh  )try_to_floatr;   r<   rl    s    
zJSentenceTransformerModelCardData.format_eval_metrics.<locals>.try_to_floatc                   sj   g | ]b\}}| d urt  dd p4d rL ddddnd|dd |dqS )Nrf   -unknownrg   Unknown)r   Z	task_typerK  r   Zmetric_nameZmetric_typerh  )r   lowerrB  titlerg  )r   rj  metric_value_floatrl  r;   r<   rE     s   
c                 S  s   i | ]}|d  |d qS re  r;   rC   liner;   r;   r<   r^     r   rk  c                 s  s   | ]}|d  V  qdS )rf  Nr;   rs  r;   r;   r<   r     r   ri  r   r?  r,   rf  r/  r0  table)eval_metricsre   r   )r   ra   getattrallr   ri   rt   rj  r   r4  rC  rD  r  r   r   rx   r%   r   rw   r}   r~   rB   r   r   rB  r   r   )r8   rv  Zall_metricsZeval_resultsr   re   rk  r?  rG  rH  Zgrouped_eval_metricsZeval_metricZeval_metric_mappingZeval_metric_metricsZgrouped_eval_metricZgrouped_eval_metric_metricsrt  r;   )r   rj  rr  r   r  rl  rc  r<   format_eval_metricsr  s    
	







z4SentenceTransformerModelCardData.format_eval_metricsc                   s|   g  j D ]$}| D ]}| vr | qq
ddd fdd}t |dfddj D }t|}|d|v d	S )
Nr   )r[   r4   c                   sL   | dkrdS | dkrdS | dkr$dS | dkr0dS |  d	r>d
S  | d S )Nrs   r   rq   rh   r|   r#  ro   r  rN   r   r   )rj   indexr   )eval_lines_keysr;   r<   sort_metrics  s    
zKSentenceTransformerModelCardData.format_training_logs.<locals>.sort_metricsr   c                   s    g | ]  fd dD qS )c                   sH   i | ]@}| d  j kr8d| v r.t | nd dn
 |dqS )rq   rd  rm  )r   r   r   rm   )rt  r8   r;   r<   r^     s
   "zTSentenceTransformerModelCardData.format_training_logs.<locals>.<listcomp>.<dictcomp>r;   )rC   )r8   sorted_eval_lines_keys)rt  r<   rE   
  s   zISentenceTransformerModelCardData.format_training_logs.<locals>.<listcomp>rd  )
eval_linesZexplain_bold_in_eval)ru   r   rx   r   r   )r8   linesr[   r|  ru   r~  r;   )r{  r8   r}  r<   format_training_logs  s    
	z5SentenceTransformerModelCardData.format_training_logsc                 C  s  | j d u r&| jrg d| _ n
g d| _ | js0d S | jrz| jj| j d ddd}| jj| j dd  ddd}| j||}n2| j d d | _ | jj| j ddd}| j||}tj	j
d	dd
2 ddd t|  D | _W d    n1 s0    Y  d S )N)z(Which planet is known as the Red Planet?zMVenus is often called Earth's twin because of its similar size and proximity.zOMars, known for its reddish appearance, is often referred to as the Red Planet.zGSaturn, famous for its rings, is sometimes mistaken for the Red Planet.)zThe weather is lovely today.zIt's so sunny outside!zHe drove to the stadium.r   TF)Zconvert_to_tensorrY   rh   r  r   )	precisionZsci_moder2  c                 s  s   | ]}d | V  qdS )z# Nr;   rs  r;   r;   r<   r   :  r   zESentenceTransformerModelCardData.run_usage_snippet.<locals>.<genexpr>)r   r   r   r@   Zencode_queryZencode_document
similarityencoder   Z_tensor_strZprintoptionsrk   r   cpu
splitlinesr   )r8   Zquery_embeddingsZdocument_embeddingsr  Z
embeddingsr;   r;   r<   run_usage_snippet  s&    

z2SentenceTransformerModelCardData.run_usage_snippetz1dict[Literal['co2_eq_emissions'], dict[str, Any]]c                 C  sd   | j j }dt|jd t|jdd|jdk|j|jt	|j
d ddi}|jr`|j|d d	< |S )
Nr   r   Z
codecarbonzfine-tuningYi  r  )	emissionsenergy_consumedr  Ztraining_typeon_cloud	cpu_modelram_total_sizeZ
hours_usedZhardware_used)rK   trackerZ_prepare_emissions_datar   r  r  r  r  r  r   durationZ	gpu_model)r8   Zemissions_dataresultsr;   r;   r<   get_codecarbon_data<  s    z4SentenceTransformerModelCardData.get_codecarbon_datac                 C  sV   d}| j jr6ddddd| j j| j jdd }| j  | j  t| j |dS )	NzCosine SimilarityzDot ProductzEuclidean DistancezManhattan Distance)ZcosinedotZ	euclideanZ	manhattanrg   rf   )Zmodel_max_lengthZoutput_dimensionalityZmodel_stringsimilarity_fn_name)r@   r  r   rB  rq  Zget_max_seq_lengthZ get_sentence_embedding_dimensionr   )r8   r  r;   r;   r<   get_model_specific_metadataO  s    z<SentenceTransformerModelCardData.get_model_specific_metadatac                 C  s*   | j r| jjj d| j  S | jjjS d S )Nz
 based on )r   r@   r:   r   r  r;   r;   r<   get_default_model_name_  s    z7SentenceTransformerModelCardData.get_default_model_namec              
     s   j r, js,z   W n ty*   Y n0  js<   _z   W n4 ty| } ztd|  W Y d }~n
d }~0 0  fddt	 D } j
rz|   W n8 ty } z td|  |W Y d }~n
d }~0 0  jr8z|   W n6 ty6 } ztd|  W Y d }~n
d }~0 0 t jdk|d<  jrz jjrz jjjd urz|   |   d _ tD ]}||d  q|S )	Nz,Error while computing usage snippet output: c                   s   i | ]}|j t |j qS r;   )r   rw  )rC   r   r  r;   r<   r^   w  r   z<SentenceTransformerModelCardData.to_dict.<locals>.<dictcomp>z+Error while formatting evaluation metrics: z&Error while formatting training logs: d   Zhide_eval_linesF)r   r   r`  r   r   r  r  r   r   r   r   rw   ry  ru   r  rt   rK   r  Z_start_timer  r  IGNORED_FIELDSr~   )r8   excZ
super_dictr[   r;   r  r<   r`   e  sH    
&&z(SentenceTransformerModelCardData.to_dictc                 C  s$   t dd |   D d|d S )Nc                 S  s*   i | ]"\}}|t v r|d g fvr||qS r5   )YAML_FIELDSrZ   r;   r;   r<   r^     r   z<SentenceTransformerModelCardData.to_yaml.<locals>.<dictcomp>F)	sort_keys
line_break)r   r`   ra   strip)r8   r  r;   r;   r<   to_yaml  s
    z(SentenceTransformerModelCardData.to_yaml)T)r   r   )N)N)N)Fr   r   r   __doc__r   r   r   __annotations__r   r   r   rM   rO   r   r   r   r   r   r   r   rc   rb   r   ru   rR   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r	   __file__parentr   r@   r   r   rQ   r   rS   r  r  r  r  rI  rL   rS  rT  rX  rY  rZ  rI   r`  ry  r  r  r  r  r  r`   r  r;   r;   r;   r<   r   	  s   
+
  #O  5 &#5r   r.   r   rP  c                 C  s   t j| j| jjdd}|jS )Nu   🤗)Z	card_datar   Zhf_emoji)r   Zfrom_templaterH   r   content)r@   Z
model_cardr;   r;   r<   generate_model_card  s    r  )Y
__future__r   rC  loggingr   r  collectionsr   r   r   dataclassesr   r   r   pathlibr	   platformr
   pprintr   textwrapr   typingr   r   r   r   r   Zhuggingface_hubr   r   r   r   r   rV  Zhuggingface_hub.repocard_datar   r   Zhuggingface_hub.utilsr   r   Ztqdm.autonotebookr   r   Ztransformers.integrationsr   Ztransformers.modelcardr   Ztransformers.trainer_callbackr   r   Ztyping_extensionsr   r   r!   r   Zsentence_transformers.modelsr"   r#   Z#sentence_transformers.training_argsr$   Zsentence_transformers.utilr%   r&   r'   r   r(   r)   r*   r+   r,   	getLoggerr   r   Z2sentence_transformers.evaluation.SentenceEvaluatorr-   Z)sentence_transformers.SentenceTransformerr.   Zsentence_transformers.trainerr/   r0   r   r  r  r   r   rP   r   r  r;   r;   r;   r<   <module>   st   
        