Ë
    S^(h<  ã                   óÈ   — d Z ddlZddlmZmZ ddlZddlmZ ddl	m
Z
 ddlmZmZ dZ ej                  e«      Zd	ed
edej(                  fd„Z G d„ d«      Z G d„ d«      Zy)z%REALM Retriever model implementation.é    N)ÚOptionalÚUnion)Úhf_hub_downloadé   )ÚAutoTokenizer)ÚloggingÚ	strtoboolzblock_records.npyÚblock_records_pathÚnum_block_recordsÚreturnc                 óÈ   — dd l mc m} |j                  j	                  | d¬«      }|j                  |d¬«      }t        |j                  d«      j                  «       «      }|S )Nr   i    )Úbuffer_sizeT)Údrop_remainderé   )	Útensorflow.compat.v1ÚcompatÚv1ÚdataÚTFRecordDatasetÚbatchÚnextÚtakeÚas_numpy_iterator)r
   r   ÚtfÚblocks_datasetÚ	np_records        úr/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/models/deprecated/realm/retrieval_realm.pyÚconvert_tfrecord_to_npr   !   s]   € ß%Ð%à—W‘W×,Ñ,Ð-?ÐM^Ð,Ó_€NØ#×)Ñ)Ð*;ÈDÐ)ÓQ€NÜ�^×(Ñ(¨Ó+×=Ñ=Ó?Ó@€IàÐó    c                   ó&   — e Zd ZdZ	 	 	 	 dd„Zd„ Zy)ÚScaNNSearcherztNote that ScaNNSearcher cannot currently be used within the model. In future versions, it might however be included.c                 óœ   — ddl m}  |||d¬«      }|j                  |||¬«      }|j                  |¬«      }|j	                  «       | _        y)zBuild scann searcher.r   )ÚbuilderÚdot_product)ÚdbÚnum_neighborsÚdistance_measure)Ú
num_leavesÚnum_leaves_to_searchÚtraining_sample_size)Údimensions_per_blockN)Ú#scann.scann_ops.py.scann_ops_pybindr#   ÚtreeÚscore_ahÚbuildÚsearcher)	Úselfr%   r&   r+   r(   r)   r*   ÚBuilderr#   s	            r   Ú__init__zScaNNSearcher.__init__.   sU   € õ 	Ká˜R¨}È}Ô]ˆØ—,‘,Ø!Ð8LÐcwð ó 
ˆð ×"Ñ"Ð8LÐ"ÓMˆàŸ™›ˆ�r   c                 ó˜   — | j                   j                  |j                  «       j                  «       «      \  }}|j	                  d«      S )NÚint64)r0   Úsearch_batchedÚdetachÚcpuÚastype)r1   Úquestion_projectionÚretrieved_block_idsÚ_s       r   r6   zScaNNSearcher.search_batchedC   s@   € Ø!%§¡×!=Ñ!=Ð>Q×>XÑ>XÓ>Z×>^Ñ>^Ó>`Ó!aÑÐ˜QØ"×)Ñ)¨'Ó2Ð2r   N)é   iè  éd   i † )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   r6   © r   r   r!   r!   +   s   „ Ù~ð ØØ Ø#ó(ó*3r   r!   c                   óp   ‡ — e Zd ZdZˆ fd„Zdd„Zedeee	e
j                  f      fd„«       Zd„ Zd„ Zˆ xZS )	ÚRealmRetrieverah  The retriever of REALM outputting the retrieved evidence block and whether the block has answers as well as answer
    positions."

        Parameters:
            block_records (`np.ndarray`):
                A numpy array which cantains evidence texts.
            tokenizer ([`RealmTokenizer`]):
                The tokenizer to encode retrieved texts.
    c                 ó>   •— t         ‰| �  «        || _        || _        y ©N)Úsuperr3   Úblock_recordsÚ	tokenizer)r1   rI   rJ   Ú	__class__s      €r   r3   zRealmRetriever.__init__S   s   ø€ Ü‰ÑÔØ*ˆÔØ"ˆ�r   c                 óˆ  — t        j                  | j                  |d¬«      }| j                  j	                  |d   d¬«      }g }g }	|D ]2  }
|j                  |«       |	j                  |
j	                  «       «       Œ4 | j                  ||	ddd|¬«      }|j                  |«      }|�| j                  ||«      |fz   S d d d |fS )Nr   )ÚindicesÚaxisT)Úskip_special_tokens)ÚpaddingÚ
truncationÚreturn_special_tokens_maskÚ
max_length)Únpr   rI   rJ   ÚdecodeÚappendÚconvert_to_tensorsÚblock_has_answer)r1   r;   Úquestion_input_idsÚ
answer_idsrS   Úreturn_tensorsÚretrieved_blocksÚquestionÚtextÚ	text_pairÚretrieved_blockÚconcat_inputsÚconcat_inputs_tensorss                r   Ú__call__zRealmRetriever.__call__X   sâ   € ÜŸ7™7 4×#5Ñ#5Ð?RÐYZÔ[Ðà—>‘>×(Ñ(Ð);¸AÑ)>ÐTXÐ(ÓYˆàˆØˆ	Ø/ò 	7ˆOØ�K‰K˜Ô!Ø×Ñ˜_×3Ñ3Ó5Õ6ð	7ð Ÿ™Ø�) T°dÐW[Ðhrð 'ó 
ˆð !.× @Ñ @ÀÓ PÐàÐ!Ø×(Ñ(¨¸
ÓCÐG\ÐF^Ñ^Ð^à˜$ Ð&;Ð<Ð<r   Úpretrained_model_name_or_pathc                 óˆ  — t         j                  j                  |«      r%t         j                  j                  |t        «      }nt        d|t        dœ|¤Ž}t        t         j                  j                  dd«      «      st        d«      ‚t        j                  |d¬«      }t        j                  |g|¢­i |¤Ž} | ||«      S )N)Úrepo_idÚfilenameÚTRUST_REMOTE_CODEÚFalseaz  This part uses `pickle.load` which is insecure and will execute arbitrary code that is potentially malicious. It's recommended to never unpickle data that could have come from an untrusted source, or that could have been tampered with. If you already verified the pickle data and decided to use it, you can set the environment variable `TRUST_REMOTE_CODE` to `True` to allow it.T)Úallow_picklerC   )ÚosÚpathÚisdirÚjoinÚ_REALM_BLOCK_RECORDS_FILENAMEr   r	   ÚenvironÚgetÚ
ValueErrorrT   Úloadr   Úfrom_pretrained)Úclsrd   Úinit_inputsÚkwargsr
   rI   rJ   s          r   rt   zRealmRetriever.from_pretrainedm   s±   € ä�7‰7�=‰=Ð6Ô7Ü!#§¡§¡Ð.KÔMjÓ!kÑä!0ð "Ø5Ô@]ñ"Øagñ"Ðô œŸ™Ÿ™Ð(;¸WÓEÔFÜð=óð ô Ÿ™Ð 2ÀÔFˆä!×1Ñ1Ð2OÐhÐR]ÒhÐagÑhˆ	á�= )Ó,Ð,r   c                 ó¾   — t        j                  t        j                  j	                  |t
        «      | j                  «       | j                  j                  |«       y rG   )	rT   Úsaverk   rl   rn   ro   rI   rJ   Úsave_pretrained)r1   Úsave_directorys     r   rz   zRealmRetriever.save_pretrainedƒ   s8   € ä
�‰”—‘—‘˜^Ô-JÓKÈT×M_ÑM_Ô`à�‰×&Ñ& ~Õ6r   c           	      ób  — g }g }g }d}|j                   D �]T  }|j                  «       }|j                  | j                  j                  «      }	|	dz   ||	dz   d j                  | j                  j                  «      z   }
|j                  g «       |j                  g «       |D ]n  }t        |	dz   |
«      D ]Z  }|d   ||   k(  sŒ|||t        |«      z    |k(  sŒ$|d   j                  |«       |d   j                  |t        |«      z   dz
  «       Œ\ Œp t        |d   «      dk(  r|j                  d«       �Œ#|j                  d«       t        |d   «      |kD  s�ŒGt        |d   «      }�ŒW t        ||«      D ]0  \  }}t        |«      |k  sŒdg|t        |«      z
  z  }||z  }||z  }Œ2 |||fS )z&check if retrieved_blocks has answers.r   r   NéÿÿÿÿFT)	Ú	input_idsÚtolistÚindexrJ   Úsep_token_idrV   ÚrangeÚlenÚzip)r1   ra   rZ   Úhas_answersÚ	start_posÚend_posÚmax_answersÚinput_idÚinput_id_listÚfirst_sep_idxÚsecond_sep_idxÚanswerÚidxÚ
start_pos_Úend_pos_Úpaddeds                   r   rX   zRealmRetriever.block_has_answer‰   s×  € àˆØˆ	ØˆØˆà%×/Ñ/ó 	5ˆHØ$ŸO™OÓ-ˆMà)×/Ñ/°·±×0KÑ0KÓLˆMØ*¨QÑ.°¸}ÈqÑ?PÐ?RÐ1S×1YÑ1YÐZ^×ZhÑZh×ZuÑZuÓ1vÑvˆNà×Ñ˜RÔ Ø�N‰N˜2ÔØ$ò F�Ü  °Ñ!2°NÓCò F�CØ˜a‘y M°#Ñ$6Ó6Ø(¨¨s´S¸³[Ñ/@ÐAÀVÓKØ% b™M×0Ñ0°Ô5Ø# B™K×.Ñ.¨s´S¸³[Ñ/@À1Ñ/DÕEñ	FðFô �9˜R‘=Ó! QÒ&Ø×"Ñ" 5Ö)à×"Ñ" 4Ô(Ü�y ‘}Ó%¨Ô3Ü"% i°¡mÓ"4’Kð)	5ô. %(¨	°7Ó$;ò 	#Ñ ˆJ˜Ü�:‹ Ó,Ø˜ ¬s°:«Ñ!>Ñ?�Ø˜fÑ$�
Ø˜FÑ"‘ð		#ð
 ˜I wÐ.Ð.r   )NÚpt)r?   r@   rA   rB   r3   rc   Úclassmethodr   r   Ústrrk   ÚPathLikert   rz   rX   Ú__classcell__)rK   s   @r   rE   rE   H   sM   ø„ ñô#ó
=ð* ð-¸HÀUÈ3ÐPR×P[ÑP[ÐK[ÑE\Ñ<]ò -ó ð-ò*7ö#/r   rE   )rB   rk   Útypingr   r   ÚnumpyrT   Úhuggingface_hubr   Ú r   Úutilsr   r	   ro   Ú
get_loggerr?   Úloggerr”   ÚintÚndarrayr   r!   rE   rC   r   r   ú<module>r       sl   ðñ ,ã 	ß "ã Ý +å ß (ð !4Ð ð 
ˆ×	Ñ	˜HÓ	%€ð¨sð Àsð ÈrÏzÉzó ÷3ñ 3÷:d/ò d/r   