§
    *�’j~$  ã                  ó¨   — U 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	Z	d dl
mZ  ej        e¦  «        ZdZded	<   e G d
„ d¦  «        ¦   «         ZdS )é    )Úannotations)ÚCallable)Ú	dataclassÚfield)ÚAnyN)Úlogging)ÚlabelÚlabelsÚscoreÚscoresztuple[str, ...]ÚDEFAULT_LABEL_COLUMNSc                  ó  — e Zd ZU dZded<    ed„ ¬¦  «        Zded<    eed¬	¦  «        Zd
ed<    eed¬	¦  «        Z	ded<    edd¬¦  «        Z
ded<    eedd¬¦  «        Zded<   d-d„Zd.d„Zd/d „Zd0d#„Zd1d&„Zd2d)„Zd3d,„ZdS )4ÚBaseDataCollatora„  Base data collator for Sentence Transformers models.

    Preprocesses text columns via ``preprocess_fn`` (typically ``model.preprocess``),
    producing ``{column}_input_ids``, ``{column}_attention_mask``, etc.  Handles prompt
    resolution (per-column or per-dataset) and Router task mapping.

    It is important that the columns are in the expected order. For example, if your dataset has columns
    "answer", "question" in that order, then the MultipleNegativesRankingLoss will consider
    "answer" as the anchor and "question" as the positive, and it will (unexpectedly) optimize for
    "given the answer, what is the question?".
    r   Úpreprocess_fnc                 ó*   — t          t          ¦  «        S )N)Úlistr   © ó    úVC:\Projects\DSCons\.venv\Lib\site-packages\sentence_transformers\base\data_collator.pyú<lambda>zBaseDataCollator.<lambda>    s   € Å4ÕH]ÑC^ÔC^€ r   )Údefault_factoryú	list[str]Úvalid_label_columnsF)r   Úreprz1dict[str, str] | dict[str, dict[str, str]] | NoneÚrouter_mappingz7str | dict[str, str] | dict[str, dict[str, str]] | NoneÚpromptsN)Údefaultr   zint | dict[str, int] | NoneÚ
max_length)r   Úinitr   zset[tuple[str, ...]]Ú_warned_columnsÚbatchúdict[str, Any]Úreturnúdict[str, str]c                ó  — | j         }|rtt          |t          ¦  «        r_t          t          t	          |                     ¦   «         ¦  «        ¦  «        t          ¦  «        rd|v r|d         |v r||d                  S i S |pi S )zRResolve the router mapping for this batch, handling nested (per-dataset) mappings.Údataset_name)r   Ú
isinstanceÚdictÚnextÚiterÚvalues)Úselfr!   r   s      r   Ú_resolve_router_mappingz(BaseDataCollator._resolve_router_mapping'   s�   € àÔ,ˆàð	å˜>­4Ñ0Ô0ð	õ �4¥ ^×%:Ò%:Ñ%<Ô%<Ñ =Ô =Ñ>Ô>ÅÑEÔEð	ð
  Ð&Ð&¨5°Ô+@ÀNÐ+RÐ+RØ% e¨NÔ&;Ô<Ð<ØˆIØÐ# Ð#r   ústr | dict[str, str] | Nonec                ón  — | j         }t          |t          ¦  «        r|s|S d|v }|r|d         |v r||d                  S t          t          t	          |                     ¦   «         ¦  «        ¦  «        t          ¦  «        r5|s1t          dt          |                     ¦   «         ¦  «        ›�¦  «        ‚i S |S )zKResolve the prompts for this batch, handling nested (per-dataset) mappings.r&   a=  The prompts provided to the trainer are a nested dictionary. In this setting, the first level of the dictionary should map to dataset names and the second level to column names. However, as the provided dataset is a not a DatasetDict, no dataset names can be inferred. The keys to the provided prompts dictionary are )	r   r'   r(   r)   r*   r+   Ú
ValueErrorr   Úkeys)r,   r!   r   Úis_multi_datasets       r   Ú_resolve_promptsz!BaseDataCollator._resolve_prompts4   sÔ   € à”,ˆÝ˜'¥4Ñ(Ô(ð 	°ð 	ØˆNà)¨UÐ2ÐØð 	2  nÔ 5¸Ð @Ð @Ø˜5 Ô0Ô1Ð1å•d�4 §¢Ñ 0Ô 0Ñ1Ô1Ñ2Ô2µDÑ9Ô9ð 	Ø#ð Ý ð`õ HLÈGÏLÊLÉNÌNÑG[ÔG[ð`ð `ñô ð ð ˆIàˆr   ústr | dict[str, str]Úcolumn_nameÚstrú
str | Nonec                óv   — t          |t          ¦  «        r|S t          |t          ¦  «        r||v r||         S dS )z,Get the prompt string for a specific column.N)r'   r6   r(   )r,   r   r5   s      r   Ú_get_prompt_for_columnz'BaseDataCollator._get_prompt_for_columnJ   sE   € å�g�sÑ#Ô#ð 	(ØˆNÝ˜¥Ñ&Ô&ð 	(¨;¸'Ð+AÐ+AØ˜;Ô'Ð'Øˆtr   Úcolumn_positionÚintc                ó,   — |                      |¦  «        S )zWResolve the task a column is preprocessed with. Subclasses may add positional defaults.)Úget)r,   r5   r:   r   s       r   Ú_get_task_for_columnz%BaseDataCollator._get_task_for_columnR   s   € ð ×!Ò! +Ñ.Ô.Ð.r   Útaskú
int | Nonec                ó´   — t          | j        t          ¦  «        r| j        S t          | j        t          ¦  «        r|�| j                             |¦  «        S dS )zwResolve the training max-length override for a column: an int applies to every column,
        a dict is keyed by task.N)r'   r   r;   r(   r=   )r,   r?   s     r   Ú_get_max_length_for_taskz)BaseDataCollator._get_max_length_for_taskX   sT   € õ �d”o¥sÑ+Ô+ð 	#Ø”?Ð"Ý�d”o¥tÑ,Ô,ð 	-°Ð1AØ”?×&Ò& tÑ,Ô,Ð,Øˆtr   Úfeaturesúlist[dict[str, Any]]c                óØ  ‡‡— |si S t          |d                              ¦   «         ¦  «        }i }d|v r&|                     d¦  «         |d         d         |d<   t          |¦  «        | j        vr|                      |¦  «         | j        D ]@Š‰|v r:t          j        ˆfd„|D ¦   «         ¦  «        |d<   |                     ‰¦  «          nŒA|  	                    |¦  «        }|  
                    |¦  «        }d„ |D ¦   «         }|rt                               d|› d�¦  «         t          |¦  «        D ]·\  }Š|                      ‰||¦  «        }|                      |‰¦  «        }	ˆfd„|D ¦   «         }
|                      |¦  «        }|�|                      |
|	||¬	¦  «        }n|                      |
|	|¬
¦  «        }|                     ¦   «         D ]\  }}||‰› d|› �<   Œ|�||‰› d�<   Œ¸|S )Nr   r&   c                ó    •— g | ]
}|‰         ‘ŒS r   r   )Ú.0ÚrowÚlabel_columns     €r   ú
<listcomp>z-BaseDataCollator.__call__.<locals>.<listcomp>t   s   ø€ Ð.UÐ.UÐ.UÀS¨s°<Ô/@Ð.UÐ.UÐ.Ur   r	   c                óH   — g | ]}|d k    s|                      d¦  «        ¯|‘Œ S )Úid)Ú_idÚ_idsÚ_idx)Úendswith)rG   Úcols     r   rJ   z-BaseDataCollator.__call__.<locals>.<listcomp>{   s.   € ÐgÐgÐg˜3°#¸²+°+ÀÇÂÐNeÑAfÔAf°+�3°+°+°+r   z
Column(s) zÔ look like ID columns, but they will be tokenized and trained on as text. If they hold IDs, resolve them to their values first, e.g. with `sentence_transformers.util.resolve_ids`, or remove them from the dataset.c                ó    •— g | ]
}|‰         ‘ŒS r   r   )rG   rH   r5   s     €r   rJ   z-BaseDataCollator.__call__.<locals>.<listcomp>†   s   ø€ Ð;Ð;Ð;¨3�c˜+Ô&Ð;Ð;Ð;r   )Úpromptr?   r   )rS   r?   Ú_Ú_task)r   r1   ÚremoveÚtupler    Úmaybe_warn_about_column_orderr   ÚtorchÚtensorr-   r3   ÚloggerÚwarning_onceÚ	enumerater>   r9   rB   r   Úitems)r,   rC   Úcolumn_namesr!   r   r   Úid_liker:   r?   rS   Úinputsr   ÚpreprocessedÚkeyÚvaluer5   rI   s                  @@r   Ú__call__zBaseDataCollator.__call__a   s{  øø€ Øð 	ØˆIå˜H QœK×,Ò,Ñ.Ô.Ñ/Ô/ˆð ˆà˜\Ð)Ð)Ø×Ò Ñ/Ô/Ð/Ø$,¨Q¤K°Ô$?ˆE�.Ñ!å�ÑÔ dÔ&:Ð:Ð:Ø×.Ò.¨|Ñ<Ô<Ð<ð !Ô4ð 	ð 	ˆLØ˜|Ð+Ð+Ý!&¤Ð.UÐ.UÐ.UÐ.UÈHÐ.UÑ.UÔ.UÑ!VÔ!V��g‘Ø×#Ò# LÑ1Ô1Ð1Ø�ð ,ð
 ×5Ò5°eÑ<Ô<ˆØ×'Ò'¨Ñ.Ô.ˆàgÐg ,ÐgÑgÔgˆØð 	Ý×Òð]˜Wð ]ð ]ð ]ñô ð õ -6°lÑ,CÔ,Cð 	4ð 	4Ñ(ˆO˜[Ø×,Ò,¨[¸/È>ÑZÔZˆDØ×0Ò0°¸+ÑFÔFˆFØ;Ð;Ð;Ð;°(Ð;Ñ;Ô;ˆFØ×6Ò6°tÑ<Ô<ˆJàÐ%Ø#×1Ò1°&ÀÈdÐ_iÐ1ÑjÔj��à#×1Ò1°&ÀÈdÐ1ÑSÔS�Ø*×0Ò0Ñ2Ô2ð 6ð 6‘
��UØ05�˜Ð,Ð, sÐ,Ð,Ñ-Ð-ð ÐØ/3�˜Ð+Ð+Ð+Ñ,øàˆr   r_   ÚNonec                óš  — dddddddddddœ
}|                      ¦   «         D ]�\  }}||v rx|                     |¦  «        |k    r_|dv rg d¢}n|dv rddg}n|d	v rd
dg}n|dv rg d¢}t                               d|›d|                     |¦  «        › d|› d|› d�	¦  «          nŒ‚| j                             t          |¦  «        ¦  «         dS )zBWarn the user if the columns are likely not in the expected order.r   é   é   )
ÚanchorÚpositiveÚnegativeÚquestionÚanswerÚqueryÚresponseÚ
hypothesisÚ
entailmentÚcontradiction)rj   rk   rl   )rm   rn   rm   rn   )ro   rp   ro   rp   )rq   rr   rs   zColumn z is at index z?, whereas a column with this name is usually expected at index a?  . Note that the column order can be important for some losses, e.g. MultipleNegativesRankingLoss will always consider the first column as the anchor and the second as the positive, regardless of the dataset column names. Consider renaming the columns to match the expected order, e.g.:
dataset = dataset.select_columns(ú)N)r^   Úindexr[   Úwarningr    ÚaddrW   )r,   r_   Úcolumn_name_to_expected_idxr5   Úexpected_idxÚproposed_fix_columnss         r   rX   z.BaseDataCollator.maybe_warn_about_column_order–   sw  € ð ØØØØØØØØØð'
ð '
Ð#ð *E×)JÒ)JÑ)LÔ)Lð 	ð 	Ñ%ˆK˜Ø˜lÐ*Ð*¨|×/AÒ/AÀ+Ñ/NÔ/NÐR^Ò/^Ð/^ØÐ"DÐDÐDØ+MÐ+MÐ+MÐ(Ð(Ø Ð$:Ð:Ð:Ø,6¸Ð+AÐ(Ð(Ø Ð$9Ð9Ð9Ø,3°ZÐ+@Ð(Ð(Ø Ð$QÐQÐQØ+XÐ+XÐ+XÐ(å—’ðP˜kð Pð P¸,×:LÒ:LÈ[Ñ:YÔ:Yð Pð PØLXðPð Pð
 9MðPð Pð Pñô ð ð �øàÔ× Ò ¥ |Ñ!4Ô!4Ñ5Ô5Ð5Ð5Ð5r   )r!   r"   r#   r$   )r!   r"   r#   r.   )r   r4   r5   r6   r#   r7   )r5   r6   r:   r;   r   r$   r#   r7   )r?   r7   r#   r@   )rC   rD   r#   r"   )r_   r   r#   rf   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r(   r   r   r   Úsetr    r-   r3   r9   r>   rB   re   rX   r   r   r   r   r      se  € € € € € € ð
ð 
ð ÐÐÑØ%* UÐ;^Ð;^Ð%_Ñ%_Ô%_ÐÐ_Ð_Ð_Ñ_ØHMÈÐ^bÐinÐHoÑHoÔHo€NÐoÐoÐoÑoØGLÀuÐ]aÐhmÐGnÑGnÔGn€GÐnÐnÐnÑnØ.3¨e¸DÀuÐ.MÑ.MÔ.M€JÐMÐMÐMÑMà,1¨EÀ#ÈEÐX]Ð,^Ñ,^Ô,^€OÐ^Ð^Ð^Ñ^ð$ð $ð $ð $ðð ð ð ð,ð ð ð ð/ð /ð /ð /ðð ð ð ð3ð 3ð 3ð 3ðj%6ð %6ð %6ð %6ð %6ð %6r   r   )Ú
__future__r   Úcollections.abcr   Údataclassesr   r   Útypingr   rY   Útransformers.utilsr   Útransformers_loggingÚ
get_loggerr{   r[   r   r   r   r   r   r   ú<module>rˆ      sã   ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à €€€Ø >Ð >Ð >Ð >Ð >Ð >ð 
)Ð	Ô	(¨Ñ	2Ô	2€ð *PÐ Ð OÐ OÐ OÑ Oð ði6ð i6ð i6ð i6ð i6ñ i6ô i6ñ „ði6ð i6ð i6r   