§
    +�’jmX  ã                  ó
  — U d dl m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Zd dlmZ e	rd dlmZ  ej        e¦  «        ZdZd	ed
<   d:d„Zd;d„Zd<d=d„Zd>d„Zd?d„Z G d„ d¦  «        Zd@d$„ZdAd*„ZdBd3„Z edd4fdCd9„Z!dS )Dé    )ÚannotationsN)ÚCallableÚMapping)Úpartial)ÚTYPE_CHECKINGÚAnyÚLiteral)Úlogging)ÚDataset)ÚlabelÚlabelsÚscoreÚscoresútuple[str, ...]ÚDEFAULT_LABEL_COLUMNSÚdatasetr   Ú	input_colÚstrÚreturnc           
     ó´   — d„ | j         D ¦   «         }t          |¦  «        dk    r-t          d|›d|pd› dt          | j         ¦  «        › d�¦  «        ‚|d         S )	Nc                óH   — g | ]}|d k    s|                      d¦  «        ¯|‘Œ S )ÚidÚ_id)Úendswith)Ú.0Úcols     úPC:\Projects\DSCons\.venv\Lib\site-packages\sentence_transformers\util\dataset.pyú
<listcomp>z!_infer_id_col.<locals>.<listcomp>   s.   € Ð\Ð\Ð\˜#¸Àº¸ÈÏÊÐUZÑH[ÔH[¸�#¸¸¸ó    é   z&Cannot infer the ID column of lookups[zD]: expected exactly one column named 'id' or ending in '_id', found Únonez among z+. Pass an explicit (dataset, id_col) tuple.r   )Úcolumn_namesÚlenÚ
ValueErrorÚsorted)r   r   Ú
candidatess      r   Ú_infer_id_colr'      s�   € Ø\Ð\ Ô!5Ð\Ñ\Ô\€JÝ
ˆ:�„˜!ÒÐÝð_°Yð _ð _ØPZÐPdÐ^dð_ð _å˜GÔ0Ñ1Ô1ð_ð _ð _ñ
ô 
ð 	
ð
 �aŒ=Ðr   Úid_colc           	     ó–   ‡— ˆfd„| j         D ¦   «         }t          |¦  «        dk    rt          d|›d‰›d|pd› d�¦  «        ‚|d         S )	Nc                ó    •— g | ]
}|‰k    ¯|‘ŒS © r+   )r   r   r(   s     €r   r   z$_infer_value_col.<locals>.<listcomp>!   s   ø€ ÐFÐFÐF˜¸¸vº¸�¸¸¸r   r    z)Cannot infer the value column of lookups[z']: expected exactly one column besides z, found r!   z6. Pass an explicit (dataset, id_col, value_col) tuple.r   )r"   r#   r$   )r   r(   r   Ú	remainings    `  r   Ú_infer_value_colr-       sŒ   ø€ ØFÐFÐFÐF Ô 4ÐFÑFÔF€IÝ
ˆ9�~„~˜ÒÐÝðD¸	ð Dð DØ39ðDð DØENÐEXÐRXðDð Dð Dñ
ô 
ð 	
ð
 �QŒ<Ðr   FÚpluralÚboolc                ó¶   — |rdddddœnddddœ}|                      ¦   «         D ]4\  }}|                      |¦  «        r|                      |¦  «        |z   c S Œ5| S )NÚiesÚsÚ )Úy_idsÚ_idsr   Ú_idx)r5   r   r6   )Úitemsr   Úremovesuffix)r   r.   ÚsuffixesÚsuffixÚreplacements        r   Ú_output_colr<   +   sŒ   € àGMÐv˜¨°BÀÐCÐCÐCÐ\^ÐgiÐsuÐSvÐSv€HØ'Ÿ~š~Ñ/Ô/ð @ð @Ñˆ�Ø×Ò˜fÑ%Ô%ð 	@Ø×)Ò)¨&Ñ1Ô1°KÑ?Ð?Ð?Ð?ð	@àÐr   Úvaluer   c                óz   — t          | t          ¦  «        o&|                      ¦   «                              d¦  «        S )Nú[)Ú
isinstancer   ÚlstripÚ
startswith)r=   s    r   Ú_is_string_encoded_listrC   4   s-   € Ý�e�SÑ!Ô!ÐD e§l¢l¡n¤n×&?Ò&?ÀÑ&DÔ&DÐDr   ÚcolumnÚlistÚcol_namec                ó”  — g }| D ]Â}	 t          j        |¦  «        }n:# t          t          f$ r&}t          d|›d|› d|d d…         ›�¦  «        d ‚d }~ww xY wt	          |t
          t          f¦  «        s2t          d|›dt          |¦  «        j        › d|d d…         ›�¦  «        ‚| 	                    t          |¦  «        ¦  «         ŒÃ|S )NzColumn zF looks like it holds string-encoded lists, but a row failed to parse (z): éd   z? looks like it holds string-encoded lists, but a row parsed to z instead of a list: )
ÚastÚliteral_evalr$   ÚSyntaxErrorr@   rE   ÚtupleÚtypeÚ__name__Úappend)rD   rF   ÚparsedÚrowr=   Úes         r   Ú_parse_string_encoded_listsrS   8   s*  € à€FØð #ð #ˆð	ÝÔ$ SÑ)Ô)ˆEˆEøÝ�KÐ(ð 	ð 	ð 	Ýð.˜(ð .ð .Øð.ð .Ø # D S D¤	ð.ð .ñô ð ðøøøøð	øøøõ
 ˜%¥$­ Ñ/Ô/ð 	ÝðK˜(ð Kð KÝ˜‘;”;Ô'ðKð KØ=@ÀÀ#À¼YðKð Kñô ð ð 	�Š•d˜5‘k”kÑ"Ô"Ð"Ð"Ø€Ms   ˆ�A®!AÁAc                  ó.   — e Zd ZdZdZdd„Zdd	„Zdd„ZdS )Ú_SortedIdIndexa«  ``id -> row position`` lookup backed by sorted numpy arrays.

    A python dict retains a hash table plus every key object, and rebuilds that table in each
    DataLoader worker on spawn-start platforms. Sorted arrays hold the same lookup in a fraction of
    the memory and pickle as flat buffers, so they also unpickle far faster. Lookups are a
    searchsorted rather than a hash, so they take 6x to 16x as long per batch as the dict, which is
    immaterial next to the forward pass. Only used for homogeneous numeric ids and for strings
    narrow enough that the fixed-width array stays under the dict's footprint, since numpy sizes
    such an array by its longest entry.
    )ÚkeysÚ	positionsrV   ú
np.ndarrayr   ÚNonec                ó"  — t          j        |d¬¦  «        }||         }t          j        t          |¦  «        t          ¬¦  «        }t          |¦  «        dk    r|dd …         |d d…         k    |d d…<   ||         | _        ||         | _        d S )NÚstable)Úkind)Údtyper    éÿÿÿÿ)ÚnpÚargsortÚonesr#   r/   rV   rW   )ÚselfrV   ÚorderÚsorted_keysÚkeeps        r   Ú__init__z_SortedIdIndex.__init__Z   sŽ   € Ý”
˜4 hÐ/Ñ/Ô/ˆØ˜5”kˆõ Œw•s˜;Ñ'Ô'­tÐ4Ñ4Ô4ˆÝˆ{ÑÔ˜aÒÐØ# A B Bœ¨;°s¸°sÔ+;Ò;ˆD��"�‰IØ Ô%ˆŒ	Ø˜tœˆŒˆˆr   Úintc                ó*   — t          | j        ¦  «        S ©N)r#   rV   )rb   s    r   Ú__len__z_SortedIdIndex.__len__e   s   € Ý�4”9‰~Œ~Ðr   Úidsc                óú  — t          | j        ¦  «        dk    r	|d         }n�t          j        | j        |¦  «        }t          j        |t          | j        ¦  «        dz
  ¦  «        }| j        |         |k    }|                     ¦   «         r| j        |         S |t          t          j        |¦  «        ¦  «                 }t          |j
        j        dv r|                     ¦   «         nt          |¦  «        ¦  «        ‚)zQReturn the row positions for ``ids``, raising ``KeyError(missing_id)`` on a miss.r   r    Úiuf)r#   rV   r_   ÚsearchsortedÚminimumÚallrW   rg   ÚargminÚKeyErrorr]   r\   Úitemr   )rb   rk   ÚmissingÚinsertion_pointsÚclippedÚfounds         r   Úlookupz_SortedIdIndex.lookuph   sË   € åˆtŒy‰>Œ>˜QÒÐØ˜!”fˆGˆGå!œ¨t¬y¸#Ñ>Ô>ÐÝ”jÐ!1µ3°t´y±>´>ÀAÑ3EÑFÔFˆGØ”I˜gÔ&¨#Ò-ˆEØ�yŠy‰{Œ{ð /Ø”~ gÔ.Ð.Ø�#�bœi¨Ñ.Ô.Ñ/Ô/Ô0ˆGÝ¨¬¬¸5Ð)@Ð)@�w—|’|‘~”~�~ÅcÈ'ÁlÄlÑSÔSÐSr   N)rV   rX   r   rY   )r   rg   )rk   rX   r   rX   )rN   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rf   rj   rx   r+   r   r   rU   rU   L   sg   € € € € € ð	ð 	ð &€Ið	%ð 	%ð 	%ð 	%ðð ð ð ðTð Tð Tð Tð Tð Tr   rU   rk   Úindexú_SortedIdIndex | dictÚ	value_colc           	     óœ  ‡— | sg S 	 t          ‰t          ¦  «        r€t          j        | ¦  «        }|j        j        dk    s|j        j        ‰j        j        j        k    rt          | d         ¦  «        ‚‰                     |¦  «         	                    ¦   «         }nˆfd„| D ¦   «         }n•# t          $ r t          d|›d�¦  «        d ‚t          $ rk}|j        d         }d}	t          |t          ¦  «        r)|                     ¦   «                              d¦  «        rd}	t          d	|›d
|›d|	› �¦  «        d ‚d }~ww xY w||         |         S )NÚOr   c                ó    •— g | ]
}‰|         ‘ŒS r+   r+   )r   Úkeyr}   s     €r   r   z_take.<locals>.<listcomp>‚   s   ø€ Ð.Ð.Ð. 3�E˜#”JÐ.Ð.Ð.r   zIDs from input column z¦ are not hashable, which typically means the train dataset carries a format (e.g. with_format('numpy')). Call dataset.with_format(None) before applying the transform.r3   r?   zS The ID looks like a string-encoded list. Convert the column to native lists first.zID z from input column z% was not found in its lookup dataset.)r@   rU   r_   Úasarrayr]   r\   rV   rr   rx   ÚtolistÚ	TypeErrorÚargsr   rA   rB   )
rk   Ú
value_viewr}   r   r   ÚqueriesÚrowsrR   rt   Úhints
     `       r   Ú_takerŒ   v   s“  ø€ Øð Øˆ	ðÝ�e�^Ñ,Ô,ð 	/Ý”j ‘o”oˆGØŒ}Ô! SÒ(Ð(¨G¬MÔ,>À%Ä*ÔBRÔBWÒ,WÐ,Wõ ˜s 1œvÑ&Ô&Ð&Ø—<’< Ñ(Ô(×/Ò/Ñ1Ô1ˆDˆDà.Ð.Ð.Ð.¨#Ð.Ñ.Ô.ˆDøøÝð ð ð Ýð- Yð -ð -ð -ñ
ô 
ð ð		õ
 ð ð ð Ø”&˜”)ˆØˆÝ�g�sÑ#Ô#ð 	i¨¯ªÑ(8Ô(8×(CÒ(CÀCÑ(HÔ(Hð 	iØhˆDÝØh�'ÐhÐh°	ÐhÐhÐbfÐhÐhñ
ô 
àð	øøøøðøøøð �dÔ˜IÔ&Ð&s   ‡B#B+ Â+'D=ÃA&D8Ä8D=Úresolvedúdict[str, Any]ÚnameÚvaluesrY   c                ó>   — || v rt          d|›d�¦  «        ‚|| |<   d S )NzOutput column zµ is produced more than once (e.g. two lookups entries resolving to the same name, or an expanded list column colliding with another entry). Rename the input columns to disambiguate.)r$   )r�   r�   r�   s      r   Ú_add_output_columnr’   ”   sD   € àˆxÐÐÝð-˜Tð -ð -ð -ñ
ô 
ð 	
ð
 €HˆT�N€N€Nr   ÚbatchÚresolutionsú;dict[str, tuple[Any, _SortedIdIndex | dict, str, str, str]]Úkeep_columnsÚmax_list_lengthú
int | NoneÚoutput_formatúLiteral['columns', 'lists']c                óÀ  ‡— t          | t          ¦  «        s%t          dt          | ¦  «        j        › d�¦  «        ‚i }|                     ¦   «         D �]Q\  }\  }}}	}
}| |         }t          |t          ¦  «        s(t          d|›dt          |¦  «        j        › d�¦  «        ‚t          |¦  «        dk    r%t          |d         ¦  «        rt          ||¦  «        }t          |¦  «        dk    o!t          |d         t          t          f¦  «        }|rØ|dk    rÒ‰�ˆfd„|D ¦   «         }d	„ |D ¦   «         }t          |¦  «        d
k    r#t          d|›dt          |¦  «        › d�¦  «        ‚|                     ¦   «         }|dk    rt          d|›d�¦  «        ‚t          d„ |D ¦   «         |||	|¦  «        }t          |¦  «        D ]$}t!          ||
› d|d
z   › �||d |…         ¦  «         Œ%�Œ˜|rˆ‰�ˆfd„|D ¦   «         }t          d„ |D ¦   «         |||	|¦  «        }g d}}|D ]A}|                     |||t          |¦  «        z   …         ¦  «         |t          |¦  «        z  }ŒBt!          |||¦  «         �Œ"t!          ||
t          t          |¦  «        |||	|¦  «        ¦  «         �ŒS|D ]¶}|| vrŒ| |         }t          |¦  «        dk    r%t          |d         ¦  «        rt          ||¦  «        }t          |¦  «        dk    o8t          |d         t$          t&          f¦  «         ot)          |d         d¦  «        }‰�|rˆfd„|D ¦   «         }t!          |||¦  «         Œ·|S )Nz7resolve_ids expects batches as plain column dicts, got z€: the train dataset carries a format (e.g. with_format('pandas')). Call dataset.with_format(None) before applying the transform.zInput column z	 holds a zž rather than a list, which means the train dataset carries a format (e.g. with_format('numpy')). Call dataset.with_format(None) before applying the transform.r   Úcolumnsc                ó$   •— g | ]}|d ‰…         ‘ŒS ri   r+   ©r   rQ   r—   s     €r   r   z&_resolve_ids_batch.<locals>.<listcomp>¿   ó$   ø€ ÐBÐBÐB°C˜#Ð.˜Ð.Ô/ÐBÐBÐBr   c                ó,   — h | ]}t          |¦  «        ’ŒS r+   )r#   )r   rQ   s     r   ú	<setcomp>z%_resolve_ids_batch.<locals>.<setcomp>À   s   € Ð2Ð2Ð2 C•s˜3‘x”xÐ2Ð2Ð2r   r    zRows of input column z! hold lists of differing lengths a
  . List columns expand into one output column per position, which requires the same length on every row. Set max_list_length to cap all rows to a common length, or output_format="lists" to keep nested lists (the CrossEncoder listwise shape, which allows ragged rows).zl hold empty ID lists, so there are no positions to expand into columns. Filter such rows out of the dataset.c                ó   — g | ]	}|D ]}|‘ŒŒ
S r+   r+   ©r   rQ   Úks      r   r   z&_resolve_ids_batch.<locals>.<listcomp>Ï   ó%   € Ð BÐ BÐ B s¸cÐ BÐ B¸ Ð BÐ BÐ BÐ Br   Ú_c                ó$   •— g | ]}|d ‰…         ‘ŒS ri   r+   rž   s     €r   r   z&_resolve_ids_batch.<locals>.<listcomp>Õ   rŸ   r   c                ó   — g | ]	}|D ]}|‘ŒŒ
S r+   r+   r£   s      r   r   z&_resolve_ids_batch.<locals>.<listcomp>Ö   r¥   r   rj   c                ó$   •— g | ]}|d ‰…         ‘ŒS ri   r+   rž   s     €r   r   z&_resolve_ids_batch.<locals>.<listcomp>ê   s$   ø€ Ð>Ð>Ð>°�cÐ*˜?Ð*Ô+Ð>Ð>Ð>r   )r@   r   r†   rM   rN   r7   rE   r#   rC   rS   rL   r$   r%   ÚpoprŒ   Úranger’   rO   r   ÚbytesÚhasattr)r“   r”   r–   r—   r™   r�   r   rˆ   r}   r   Ústripped_nameÚplural_namerD   Úis_listÚlengthsÚnum_positionsÚflat_valuesÚpositionÚnestedÚoffsetrQ   Úkeep_colr�   Úis_row_sequences      `                    r   Ú_resolve_ids_batchr¹   Ÿ   sI  ø€ õ �e�WÑ%Ô%ð 
Ýð-ÅdÈ5ÁkÄkÔFZð -ð -ð -ñ
ô 
ð 	
ð
  "€HàQ\×QbÒQbÑQdÔQdð ,vñ ,vÑMˆ	ÑM�J  y°-ÀØ�yÔ!ˆÝ˜&¥$Ñ'Ô'ð 	ÝðK 	ð Kð Kµd¸6±l´lÔ6Kð Kð Kð Kñô ð õ
 ˆv‰;Œ;˜Š?ˆ?Õ6°v¸a´yÑAÔAˆ?Ý0°¸ÑCÔCˆFå�f‘+”+ ’/ÐJ¥j°¸´½TÅ5¸MÑ&JÔ&JˆØð  	v�}¨	Ò1Ð1ØÐ*ØBÐBÐBÐB¸6ÐBÑBÔB�Ø2Ð2¨6Ð2Ñ2Ô2ˆGÝ�7‰|Œ|˜qÒ Ð Ý ðS¨Ið Sð SÝ˜g‘”ðSð Sð Sñô ð ð $ŸKšK™MœMˆMØ Ò!Ð!Ý ð]¨Ið ]ð ]ð ]ñô ð õ  Ð BÐ B¨fÐ BÑ BÔ BÀJÐPUÐW`ÐbkÑlÔlˆKÝ! -Ñ0Ô0ð vð v�å" 8°Ð-NÐ-NÀÈ1ÁÐ-NÐ-NÐP[Ð\dÐ\sÐfsÐ\sÔPtÑuÔuÐuÐuñvð ð 
	vØÐ*ØBÐBÐBÐB¸6ÐBÑBÔB�ÝÐ BÐ B¨fÐ BÑ BÔ BÀJÐPUÐW`ÐbkÑlÔlˆKØ �FˆFØð #ð #�Ø—’˜k¨&°6½CÀ¹H¼HÑ3DÐ*DÔEÑFÔFÐFØ�#˜c™(œ(Ñ"��Ý˜x¨°fÑ=Ô=Ð=Ñ=å˜x¨½½dÀ6¹l¼lÈJÐX]Ð_hÐjsÑ8tÔ8tÑuÔuÐuÑuð !ð 
7ð 
7ˆØ˜5Ð Ð ØØ�x”ˆÝˆv‰;Œ;˜Š?ˆ?Õ6°v¸a´yÑAÔAˆ?Ý0°¸ÑBÔBˆFå˜f™+œ+¨š/Ðwµ*¸VÀA¼YÍÍeÈÑ2UÔ2UÐ.UÐwÕZaÐbhÐijÔbkÐmvÑZwÔZwˆØÐ&¨?Ð&Ø>Ð>Ð>Ð>°vÐ>Ñ>Ô>ˆFÝ˜8 X¨vÑ6Ô6Ð6Ð6à€Or   rœ   ÚlookupsúCdict[str, Dataset | tuple[Dataset, str] | tuple[Dataset, str, str]]úlist[str] | tuple[str, ...]ú*Callable[[dict[str, Any]], dict[str, Any]]c                ób  — 	 ddl m}m} n"# t          $ r}t          d¦  «        |‚d}~ww xY wt	          |t
          ¦  «        rt          d|›d�¦  «        ‚|�|dk     rt          d|› d�¦  «        ‚|d	vrt          d
|›d�¦  «        ‚i }i }|                      ¦   «         D �]ê\  }	}
t	          |
t          ¦  «        rqt          |
¦  «        }t          |¦  «        dvr#t          d|	›dt          |¦  «        › d�¦  «        ‚|d         }|d         }t          |¦  «        dk    r|d         nd}n|
dd}}}t	          ||¦  «        rt          d|	›d�¦  «        ‚t	          ||¦  «        s(t          d|	›dt          |¦  «        j        › d�¦  «        ‚t          |¦  «        }|                     d¦  «        }|€t!          ||	¦  «        }n4||j        vr+t          d|	›d|›dt%          |j        ¦  «        › d�¦  «        ‚|€t'          |||	¦  «        }n4||j        vr+t          d|	›d|›dt%          |j        ¦  «        › d�¦  «        ‚||f}||v�rg }|                     |g¦  «                             d¬¦  «        D ]}|                     ||         ¦  «         Œt/          j        |¦  «        }|j        dk    r)|j        j        dv r|j        dk    rt;          |¦  «        }nd„ t=          |¦  «        D ¦   «         }t          |¦  «        |j        k    r9t@           !                    d|	›d|›d|j        t          |¦  «        z
  › d�¦  «         |||<   |                     |g¦  «        ||         |tE          |	¦  «        tE          |	d¬¦  «        f||	<   �ŒìtG          tH          |t          |¦  «        ||¬ ¦  «        S )!a  Build a batched transform that resolves ID columns to their values via a join against lookup
    datasets. Useful for IR datasets that store query / document IDs alongside separate text (or
    image) datasets, e.g. `lightonai/ms-marco-en-bge <https://huggingface.co/datasets/lightonai/ms-marco-en-bge>`_.

    An input column may hold one ID per row (e.g. ``positive_id: str``) or a list of IDs per row
    (e.g. ``document_ids: list[str]``), detected from the row values. An ID that is missing from its
    lookup dataset raises a :class:`KeyError` when the batch is read.

    Pass the returned callable to :meth:`~datasets.Dataset.set_transform` (lazy, no caching) or
    :meth:`~datasets.Dataset.map` with ``batched=True`` (eager, cached). With ``map``, also pass
    ``remove_columns=list(lookups)`` so the raw ID columns are dropped from the result: unlike
    ``set_transform``, ``map`` merges the transform output with the untouched input columns. ``map``
    also hands the transform batches in the dataset's current format, so remove any format first
    with ``with_format(None)``.

    Args:
        lookups: ``{input_col: lookup}`` for every input column to resolve, where ``lookup`` is:

            - a :class:`datasets.Dataset`: the ID column (the single column named ``id`` or ending
              in ``_id``) and the value column (the single remaining column) are inferred. Ambiguity
              raises at build time.
            - ``(dataset, id_col)``: explicit ID column, value column inferred.
            - ``(dataset, id_col, value_col)``: fully explicit.

            All other input columns are dropped (except ``keep_columns``), as the losses read batch
            columns positionally. Insertion order sets the output column order, so list the anchor
            (query) column first.
        keep_columns: Input columns to pass through unresolved. Defaults to the label columns the
            data collators recognize by default (``label``, ``labels``, ``score``, ``scores``).
            Mirror your collator's ``valid_label_columns`` if you customized it. Absent columns
            are ignored.
        max_list_length: Truncate every list-per-row column (ID lists and list-valued kept columns) to the
            first ``max_list_length`` entries. Must be a positive integer or ``None`` (default, keep all).
            Note that this takes the first N as stored, not top-N by teacher score.
        output_format: ``"columns"`` (default) expands each list column into numbered columns
            (``document_1``, ..., ``document_N``), requiring a uniform list length per row.
            ``"lists"`` keeps list columns nested under a plural name (``documents: list``),
            allowing ragged rows. Use ``"lists"`` for CrossEncoder listwise training.

    Returns:
        A picklable batched transform mapping a batch dict of ID columns to a batch dict of
        resolved columns, for :meth:`~datasets.Dataset.set_transform` or
        :meth:`~datasets.Dataset.map` with ``batched=True``.

    Example (KD, LightOn ms-marco-en-bge)::

        from datasets import load_dataset
        from sentence_transformers.util import resolve_ids

        train = load_dataset("lightonai/ms-marco-en-bge", "train", split="train")
        queries = load_dataset("lightonai/ms-marco-en-bge", "queries", split="train")
        documents = load_dataset("lightonai/ms-marco-en-bge", "documents", split="train")

        train.set_transform(resolve_ids({
            "query_id": queries,
            "document_ids": documents,
        }, max_list_length=32))
        # -> rows of {"query": str, "document_1": str, ..., "document_32": str, "scores": list[float]}

    Example (triplet with IDs)::

        train.set_transform(resolve_ids({
            "query_id": queries,
            "positive_id": documents,
            "negative_id": documents,
        }))
        # -> rows of {"query": str, "positive": str, "negative": str}

    Example (CrossEncoder listwise, nested lists)::

        train.set_transform(resolve_ids({
            "query_id": queries,
            "document_ids": documents,
        }, output_format="lists"))
        # -> rows of {"query": str, "documents": list[str], "scores": list[float]}

    Example (streaming)::

        from datasets import Features, Sequence, Value

        # Only the train split streams. The lookup datasets are random-access joins, so they
        # must stay regular (materialized) Datasets.
        train = load_dataset("lightonai/ms-marco-en-bge", "train", split="train", streaming=True)
        train = train.map(
            resolve_ids({"query_id": queries, "document_ids": documents}, max_list_length=32),
            batched=True,
            remove_columns=["query_id", "document_ids"],
            features=Features({
                "query": Value("string"),
                **{f"document_{i}": Value("string") for i in range(1, 33)},
                "scores": Sequence(Value("float32")),
            }),
        )
        # Streaming map cannot infer the output schema, and the trainers require it, so pass
        # ``features=`` explicitly.
    r   )r   ÚDatasetDictzTresolve_ids requires the `datasets` library. Install it with `pip install datasets`.NzEkeep_columns must be a list or tuple of column names, got the string ú.r    z8max_list_length must be a positive integer or None, got )rœ   Úlistsz0output_format must be "columns" or "lists", got )é   é   zlookups[z_] must be a Dataset, (dataset, id_col), or (dataset, id_col, value_col), got a tuple of length rÃ   rÂ   z“] holds a `DatasetDict`, expected a `Dataset`. Pass a specific split (e.g. `dataset_dict['train']`), or load with `load_dataset(..., split='...')`.z] must hold a `Dataset`, got z]: ID column z1 is not a column of the lookup dataset (columns: z).z]: value column iPÃ  )Ú
batch_sizeÚiufUSé€   c                ó   — i | ]\  }}||“Œ	S r+   r+   )r   r´   r=   s      r   ú
<dictcomp>zresolve_ids.<locals>.<dictcomp>¡  s   € ÐUÐUÐU©_¨X°u˜ ÐUÐUÐUr   z] contains duplicate z	 values (zD rows shadowed). Each duplicated ID resolves to its last occurrence.T)r.   )r”   r–   r—   r™   )%Údatasetsr   r¿   ÚImportErrorr@   r   r†   r$   r7   rL   rE   r#   rM   rN   r   Úwith_formatr'   r"   r%   r-   Úselect_columnsÚiterÚextendr_   r„   Úndimr]   r\   ÚitemsizerU   Ú	enumerateÚnum_rowsÚloggerÚwarning_oncer<   r   r¹   )rº   r–   r—   r™   r   r¿   rR   r”   Úindicesr   Úlookup_specÚspecr   r(   r   Úoriginal_dataset_idÚ	index_keyÚ	id_valuesÚid_batchrV   r}   s                        r   Úresolve_idsrÜ   ð   s  € ðLØ1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1øÝð ð ð ÝØbñ
ô 
àð	øøøøðøøøõ
 �,¥Ñ$Ô$ð sÝÐqÐ`lÐqÐqÐqÑrÔrÐrØÐ" ¸Ò':Ð':ÝÐfÐTcÐfÐfÐfÑgÔgÐgØÐ0Ð0Ð0ÝÐ^ÈMÐ^Ð^Ð^Ñ_Ô_Ð_ð PR€KØ<>€GØ")§-¢-¡/¤/ð F
ñ F
Ñˆ	�;Ý�k¥5Ñ)Ô)ð 	AÝ˜Ñ$Ô$ˆDÝ�4‰yŒy Ð&Ð&Ý ðX˜yð Xð XÝKNÈtÉ9Ì9ðXð Xð Xñô ð ð ˜1”gˆGØ˜!”WˆFÝ#& t¡9¤9°¢> >˜˜Qœ˜°tˆIˆIà)4°d¸D˜Y�VˆGå�g˜{Ñ+Ô+ð 	Ýðg˜9ð gð gð gñô ð õ ˜' 7Ñ+Ô+ð 	lÝÐj yÐjÐjÕQUÐV]ÑQ^ÔQ^ÔQgÐjÐjÐjÑkÔkÐkõ ! ™kœkÐØ×%Ò% dÑ+Ô+ˆàˆ>Ý" 7¨IÑ6Ô6ˆFˆFØ˜7Ô/Ð/Ð/Ýð>˜9ð >ð >°Vð >ð >Ý# GÔ$8Ñ9Ô9ð>ð >ð >ñô ð ð ÐÝ(¨°&¸)ÑDÔDˆIˆIØ˜gÔ2Ð2Ð2ÝðF˜9ð Fð F¸	ð Fð FÝ%+¨GÔ,@Ñ%AÔ%AðFð Fð Fñô ð ð
 )¨&Ð1ˆ	Ø˜GÐ#Ñ#ð !ˆIØ#×2Ò2°F°8Ñ<Ô<×AÒAÈVÐAÑTÔTð 3ð 3�Ø× Ò  ¨&Ô!1Ñ2Ô2Ð2Ð2Ý”:˜iÑ(Ô(ˆDàŒy˜AŠ~ˆ~ $¤*¤/°WÐ"<Ð"<ÀÄÐRUÒAUÐAUÝ& tÑ,Ô,��ð VÐUÅ	È)Ñ@TÔ@TÐUÑUÔU�Ý�5‰zŒz˜WÔ-Ò-Ð-Ý×#Ò#ð'˜yð 'ð 'Àð 'ð 'ØÔ(­3¨u©:¬:Ñ5ð'ð 'ð 'ñô ð ð
 "'ˆG�IÑð ×"Ò" I ;Ñ/Ô/Ø�IÔØÝ˜	Ñ"Ô"Ý˜	¨$Ð/Ñ/Ô/ð"
ˆ�IÑÑõ ÝØÝ˜<Ñ(Ô(Ø'Ø#ðñ ô ð s   ‚ ‹
*•%¥*)r   r   r   r   r   r   )r   r   r(   r   r   r   r   r   )F)r   r   r.   r/   r   r   )r=   r   r   r/   )rD   rE   rF   r   r   rE   )
rk   rE   r}   r~   r   r   r   r   r   rE   )r�   rŽ   r�   r   r�   rE   r   rY   )r“   rŽ   r”   r•   r–   r   r—   r˜   r™   rš   r   rŽ   )
rº   r»   r–   r¼   r—   r˜   r™   rš   r   r½   )"Ú
__future__r   rI   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r	   Únumpyr_   Útransformers.utilsr
   Útransformers_loggingrÉ   r   Ú
get_loggerrN   rÓ   r   Ú__annotations__r'   r-   r<   rC   rS   rU   rŒ   r’   r¹   rÜ   r+   r   r   ú<module>ræ      sâ  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à 
€
€
€
Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à Ð Ð Ð Ø >Ð >Ð >Ð >Ð >Ð >àð !Ø Ð Ð Ð Ð Ð ð 
)Ð	Ô	(¨Ñ	2Ô	2€ð *PÐ Ð OÐ OÐ OÑ Oðð ð ð ðð ð ð ðð ð ð ð ðEð Eð Eð Eðð ð ð ð('Tð 'Tð 'Tð 'Tð 'Tñ 'Tô 'Tð 'TðT'ð 'ð 'ð 'ð<ð ð ð ðNð Nð Nð Nðf 1FØ"&Ø1:ð	Hð Hð Hð Hð Hð Hð Hr   