§
    æ˜ºhJ  ã                   óz   — d Z ddlmZ ddlZddlmZ ddlmZ ddl	Z	 e	j
        e¦  «        Z G d„ de¦  «        ZdS )	z

é    )ÚIterableDatasetN)ÚListé   )ÚInputExamplec                   óJ   ‡ — e Zd ZdZd
dee         dedefˆ fd„Zd„ Z	d	„ Z
ˆ xZS )ÚSentenceLabelDatasetaU  
    This dataset can be used for some specific Triplet Losses like BATCH_HARD_TRIPLET_LOSS which requires
    multiple examples with the same label in a batch.

    It draws n consecutive, random and unique samples from one label at a time. This is repeated for each label.

    Labels with fewer than n unique samples are ignored.
    This also applied to drawing without replacement, once less than n samples remain for a label, it is skipped.

    This *DOES NOT* check if there are more labels than the batch is large or if the batch size is divisible
    by the samples drawn per label.
    r   FÚexamplesÚsamples_per_labelÚwith_replacementc                 ó  •— t          ¦   «                              ¦   «          || _        i }|D ]5}|j        |vr
g ||j        <   ||j                                      |¦  «         Œ6g | _        g | _        d}|                     ¦   «         D ]h\  }}t          |¦  «        | j        k    rK| j         	                    |¦  «         | j                             t          | j        ¦  «        ¦  «         |dz  }Œit          j        |¦  «        | _        || _        t          j                             | j        ¦  «         t                                d                     t          |¦  «        t          | j        ¦  «        | j        |¦  «        ¦  «         dS )aT  
        Creates a LabelSampler for a SentenceLabelDataset.

        :param examples:
            a list with InputExamples
        :param samples_per_label:
            the number of consecutive, random and unique samples drawn per label. Batch size should be a multiple of samples_per_label
        :param with_replacement:
            if this is True, then each sample is drawn at most once (depending on the total number of samples per label).
            if this is False, then one sample can be drawn in multiple draws, but still not multiple times in the same
            drawing.
        r   é   z�SentenceLabelDataset: {} examples, from which {} examples could be used (those labels appeared at least {} times). {} different labels found.N)ÚsuperÚ__init__r
   ÚlabelÚappendÚgrouped_inputsÚgroups_right_borderÚitemsÚlenÚextendÚnpÚarangeÚlabel_ranger   ÚrandomÚshuffleÚloggerÚinfoÚformat)
Úselfr	   r
   r   Úlabel2exÚexampleÚ
num_labelsr   Úlabel_examplesÚ	__class__s
            €ú{/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/sentence_transformers/datasets/SentenceLabelDataset.pyr   zSentenceLabelDataset.__init__   s”  ø€ õ 	‰Œ×ÒÑÔÐà!2ˆÔð ˆØð 	4ð 	4ˆGØŒ} HÐ,Ð,Ø*,�˜œÑ'Ø�W”]Ô#×*Ò*¨7Ñ3Ô3Ð3Ð3ð !ˆÔØ#%ˆÔ Øˆ
à%-§^¢^Ñ%5Ô%5ð 	 ð 	 Ñ!ˆE�>Ý�>Ñ"Ô" dÔ&<Ò<Ð<ØÔ#×*Ò*¨>Ñ:Ô:Ð:ØÔ(×/Ò/Ý˜Ô+Ñ,Ô,ñô ð ð ˜a‘�
øåœ9 ZÑ0Ô0ˆÔØ 0ˆÔÝ
Œ	×Ò˜$Ô*Ñ+Ô+Ð+å�Šð \÷  cò  cÝ�H‘”�s 4Ô#6Ñ7Ô7¸Ô9OÐQ[ñô ñ	
ô 	
ð 	
ð 	
ð 	
ó    c              #   óú  ‡‡K  — d}d}i Š|t          | j        ¦  «        k     �rW| j        |         Š‰‰vrt          ¦   «         ‰‰<   ‰dk    rdn| j        ‰dz
           }| j        ‰         }| j        rt          j        ||¦  «        }n"ˆˆfd„t          j        ||¦  «        D ¦   «         }t          |¦  «        | j        k    rYt          j	         
                    || j        d¬¦  «        D ]1}|dz  }‰‰                              |¦  «         | j        |         V — Œ2|dz  }|t          | j        ¦  «        k    r(d}i Št          j	                             | j        ¦  «         |t          | j        ¦  «        k     �°Ud S d S )Nr   r   c                 ó(   •— g | ]}|‰‰         v¯|‘ŒS © r)   )Ú.0ÚiÚalready_seenr   s     €€r%   ú
<listcomp>z1SentenceLabelDataset.__iter__.<locals>.<listcomp>Y   s+   ø€ ÐmÐmÐm 1ÐPQÐYeÐfkÔYlÐPlÐPl˜QÐPlÐPlÐPlr&   F)Úreplace)r   r   r   Úsetr   r   r   r   r
   r   ÚchoiceÚaddr   )	r   Ú	label_idxÚcountÚleft_borderÚright_borderÚ	selectionÚelement_idxr,   r   s	          @@r%   Ú__iter__zSentenceLabelDataset.__iter__J   s¢  øøè è € Øˆ	ØˆØˆØ•c˜$Ô-Ñ.Ô.Ò.Ñ.ØÔ$ YÔ/ˆEØ˜LÐ(Ð(Ý&)¡e¤e�˜UÑ#à$¨šz˜z˜!˜!¨tÔ/GÈÐPQÉ	Ô/RˆKØÔ3°EÔ:ˆLàÔ$ð nÝœI k°<Ñ@Ô@�	�	àmÐmÐmÐmÐm­¬	°+¸|Ñ(LÔ(LÐmÑmÔm�	å�9‰~Œ~ Ô!7Ò7Ð7Ý#%¤9×#3Ò#3°I¸tÔ?UÐ_dÐ#3Ñ#eÔ#eð ;ð ;�KØ˜Q‘J�EØ  Ô'×+Ò+¨KÑ8Ô8Ð8ØÔ-¨kÔ:Ð:Ð:Ð:Ð:à˜‰NˆIØ�C Ô 0Ñ1Ô1Ò1Ð1Ø�	Ø!�Ý”	×!Ò! $Ô"2Ñ3Ô3Ð3ð/ •c˜$Ô-Ñ.Ô.Ò.Ñ.Ð.Ð.Ð.Ð.r&   c                 ó*   — t          | j        ¦  «        S )N)r   r   )r   s    r%   Ú__len__zSentenceLabelDataset.__len__g   s   € Ý�4Ô&Ñ'Ô'Ð'r&   )r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚintÚboolr   r8   r:   Ú__classcell__)r$   s   @r%   r   r      s†   ø€ € € € € ðð ð-
ð -
  lÔ!3ð -
Èð -
Ðcgð -
ð -
ð -
ð -
ð -
ð -
ð^4ð 4ð 4ð:(ð (ð (ð (ð (ð (ð (r&   r   )r>   Útorch.utils.datar   Únumpyr   Útypingr   Úreadersr   ÚloggingÚ	getLoggerr;   r   r   r)   r&   r%   ú<module>rH      s¬   ððð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ø €€€à	ˆÔ	˜8Ñ	$Ô	$€ð[(ð [(ð [(ð [(ð [(˜?ñ [(ô [(ð [(ð [(ð [(r&   