

'''simple docstring'''






import os
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import PreTrainedTokenizer
from ...utils import logging


lowerCAmelCase__											=	logging.get_logger(__name__)

lowerCAmelCase__											=	'''▁'''

lowerCAmelCase__											=	{'''vocab_file''': '''sentencepiece.bpe.model'''}

lowerCAmelCase__											=	{
    '''vocab_file''': {
        '''facebook/xglm-564M''': '''https://huggingface.co/facebook/xglm-564M/resolve/main/sentencepiece.bpe.model''',
    }
}

lowerCAmelCase__											=	{
    '''facebook/xglm-564M''': 2048,
}






class 			lowercase_	(lowerCamelCase__      ):




  """simple docstring"""




  SCREAMING_SNAKE_CASE    :  Tuple							=			VOCAB_FILES_NAMES
  SCREAMING_SNAKE_CASE    :  Dict							=			PRETRAINED_VOCAB_FILES_MAP
  SCREAMING_SNAKE_CASE    :  int							=			PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
  SCREAMING_SNAKE_CASE    :  str							=			['input_ids', 'attention_mask']






  def __init__(      self   :     Dict					,lowercase__   :     List[str]					,lowercase__   :     Optional[Any]="<s>"					,lowercase__   :     str="</s>"					,lowercase__   :     Tuple="</s>"					,lowercase__   :     Union[str, Any]="<s>"					,lowercase__   :     str="<unk>"					,lowercase__   :     str="<pad>"					,lowercase__   :     Optional[Dict[str, Any]] = None					,**lowercase__   :     Optional[int]					,):
   __lowercase							  = {} if sp_model_kwargs is None else sp_model_kwargs

   # Compatibility with the original tokenizer
   __lowercase							  = 7
   __lowercase							  = [F"<madeupword{i}>" for i in range(self.num_madeup_words			)]

   __lowercase							  = kwargs.get('''additional_special_tokens'''					,[]			)
   kwargs["additional_special_tokens"] += [
       word for word in madeup_words if word not in kwargs["additional_special_tokens"]
   ]

   super().__init__(
       bos_token=lowercase__					,eos_token=lowercase__					,unk_token=lowercase__					,sep_token=lowercase__					,cls_token=lowercase__					,pad_token=lowercase__					,sp_model_kwargs=self.sp_model_kwargs					,**lowercase__					,)

   __lowercase							  = spm.SentencePieceProcessor(**self.sp_model_kwargs			)
   self.sp_model.Load(str(lowercase__			)			)
   __lowercase							  = vocab_file

   # Original fairseq vocab and spm vocab must be "aligned":
   # Vocab    |    0    |    1    |   2    |    3    |  4  |  5  |  6  |   7   |   8   |  9
   # -------- | ------- | ------- | ------ | ------- | --- | --- | --- | ----- | ----- | ----
   # fairseq  | '<s>'   | '<pad>' | '</s>' | '<unk>' | ',' | '.' | '▁' | 's'   | '▁de' | '-'
   # spm      | '<unk>' | '<s>'   | '</s>' | ','     | '.' | '▁' | 's' | '▁de' | '-'   | '▁a'

   # The first "real" token "," has position 4 in the original fairseq vocab and position 3 in the spm vocab
   __lowercase							  = 1

   # Mimic fairseq token-to-id alignment for the first 4 token
   __lowercase							  = {'''<s>''': 0, '''<pad>''': 1, '''</s>''': 2, '''<unk>''': 3}

   __lowercase							  = len(self.sp_model			)
   __lowercase							  = {F"<madeupword{i}>": sp_size + i + self.fairseq_offset for i in range(self.num_madeup_words			)}
   self.fairseq_tokens_to_ids.update(lowercase__			)

   __lowercase							  = {v: k for k, v in self.fairseq_tokens_to_ids.items()}






  def __getstate__(      self   :     Tuple			):
   __lowercase							  = self.__dict__.copy()
   __lowercase							  = None
   __lowercase							  = self.sp_model.serialized_model_proto()
   return state






  def __setstate__(      self   :     Tuple					,lowercase__   :     List[Any]			):
   __lowercase							  = d

   # for backward compatibility
   if not hasattr(self					,'''sp_model_kwargs'''			):
    __lowercase							  = {}

   __lowercase							  = spm.SentencePieceProcessor(**self.sp_model_kwargs			)
   self.sp_model.LoadFromSerializedProto(self.sp_model_proto			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     List[Any]					,lowercase__   :     List[int]					,lowercase__   :     Optional[List[int]] = None			):

   if token_ids_a is None:
    return [self.sep_token_id] + token_ids_a
   __lowercase							  = [self.sep_token_id]
   return sep + token_ids_a + sep + sep + token_ids_a






  def 					SCREAMING_SNAKE_CASE      (      self   :     Tuple					,lowercase__   :     List[int]					,lowercase__   :     Optional[List[int]] = None					,lowercase__   :     bool = False			):

   if already_has_special_tokens:
    return super().get_special_tokens_mask(
        token_ids_a=lowercase__					,token_ids_a=lowercase__					,already_has_special_tokens=lowercase__			)

   if token_ids_a is None:
    return [1] + ([0] * len(lowercase__			))
   return [1] + ([0] * len(lowercase__			)) + [1, 1] + ([0] * len(lowercase__			))






  def 					SCREAMING_SNAKE_CASE      (      self   :     List[str]					,lowercase__   :     List[int]					,lowercase__   :     Optional[List[int]] = None			):
   __lowercase							  = [self.sep_token_id]

   if token_ids_a is None:
    return len(sep + token_ids_a			) * [0]
   return len(sep + token_ids_a + sep + sep + token_ids_a			) * [0]






  @property
  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]			):
   return len(self.sp_model			) + self.fairseq_offset + self.num_madeup_words






  def 					SCREAMING_SNAKE_CASE      (      self   :     Optional[int]			):
   __lowercase							  = {self.convert_ids_to_tokens(lowercase__			): i for i in range(self.vocab_size			)}
   vocab.update(self.added_tokens_encoder			)
   return vocab






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]					,lowercase__   :     str			):
   return self.sp_model.encode(lowercase__					,out_type=lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Tuple					,lowercase__   :     Tuple			):
   if token in self.fairseq_tokens_to_ids:
    return self.fairseq_tokens_to_ids[token]
   __lowercase							  = self.sp_model.PieceToId(lowercase__			)

   # Need to return unknown token if the SP model returned 0
   return spm_id + self.fairseq_offset if spm_id else self.unk_token_id






  def 					SCREAMING_SNAKE_CASE      (      self   :     Optional[Any]					,lowercase__   :     int			):
   if index in self.fairseq_ids_to_tokens:
    return self.fairseq_ids_to_tokens[index]
   return self.sp_model.IdToPiece(index - self.fairseq_offset			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]					,lowercase__   :     Optional[int]			):
   __lowercase							  = ''''''.join(lowercase__			).replace(lowercase__					,''' '''			).strip()
   return out_string






  def 					SCREAMING_SNAKE_CASE      (      self   :     Dict					,lowercase__   :     str					,lowercase__   :     Optional[str] = None			):
   if not os.path.isdir(lowercase__			):
    logger.error(F"Vocabulary path ({save_directory}) should be a directory"			)
    return
   __lowercase							  = os.path.join(
       lowercase__					,(filename_prefix + '''-''' if filename_prefix else '''''') + VOCAB_FILES_NAMES['''vocab_file''']			)

   if os.path.abspath(self.vocab_file			) != os.path.abspath(lowercase__			) and os.path.isfile(self.vocab_file			):
    copyfile(self.vocab_file					,lowercase__			)
   elif not os.path.isfile(self.vocab_file			):
    with open(lowercase__					,'''wb'''			) as fi:
     __lowercase							  = self.sp_model.serialized_model_proto()
     fi.write(lowercase__			)

   return (out_vocab_file,)




'''simple docstring'''






import unittest

from transformers import DebertaConfig, is_torch_available
from transformers.testing_utils import require_sentencepiece, require_tokenizers, require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
 import torch

 from transformers import (
     DebertaForMaskedLM,
     DebertaForQuestionAnswering,
     DebertaForSequenceClassification,
     DebertaForTokenClassification,
     DebertaModel,
 )
 from transformers.models.deberta.modeling_deberta import DEBERTA_PRETRAINED_MODEL_ARCHIVE_LIST






class 			lowercase_	(lowerCamelCase__      ):




  """simple docstring"""




  def __init__(      self   :     Optional[Any]					,lowercase__   :     Optional[Any]					,lowercase__   :     Optional[int]=1_3					,lowercase__   :     Any=7					,lowercase__   :     Union[str, Any]=True					,lowercase__   :     Optional[int]=True					,lowercase__   :     List[str]=True					,lowercase__   :     str=True					,lowercase__   :     Dict=9_9					,lowercase__   :     Union[str, Any]=3_2					,lowercase__   :     List[str]=5					,lowercase__   :     int=4					,lowercase__   :     Dict=3_7					,lowercase__   :     Union[str, Any]="gelu"					,lowercase__   :     str=0.1					,lowercase__   :     List[str]=0.1					,lowercase__   :     Any=5_1_2					,lowercase__   :     Optional[int]=1_6					,lowercase__   :     Optional[int]=2					,lowercase__   :     Optional[int]=0.0_2					,lowercase__   :     Dict=False					,lowercase__   :     Optional[int]=True					,lowercase__   :     str="None"					,lowercase__   :     Optional[int]=3					,lowercase__   :     List[Any]=4					,lowercase__   :     Union[str, Any]=None					,):
   __lowercase							  = parent
   __lowercase							  = batch_size
   __lowercase							  = seq_length
   __lowercase							  = is_training
   __lowercase							  = use_input_mask
   __lowercase							  = use_token_type_ids
   __lowercase							  = use_labels
   __lowercase							  = vocab_size
   __lowercase							  = hidden_size
   __lowercase							  = num_hidden_layers
   __lowercase							  = num_attention_heads
   __lowercase							  = intermediate_size
   __lowercase							  = hidden_act
   __lowercase							  = hidden_dropout_prob
   __lowercase							  = attention_probs_dropout_prob
   __lowercase							  = max_position_embeddings
   __lowercase							  = type_vocab_size
   __lowercase							  = type_sequence_label_size
   __lowercase							  = initializer_range
   __lowercase							  = num_labels
   __lowercase							  = num_choices
   __lowercase							  = relative_attention
   __lowercase							  = position_biased_input
   __lowercase							  = pos_att_type
   __lowercase							  = scope






  def 					SCREAMING_SNAKE_CASE      (      self   :     Tuple			):
   __lowercase							  = ids_tensor([self.batch_size, self.seq_length]					,self.vocab_size			)

   __lowercase							  = None
   if self.use_input_mask:
    __lowercase							  = ids_tensor([self.batch_size, self.seq_length]					,vocab_size=2			)

   __lowercase							  = None
   if self.use_token_type_ids:
    __lowercase							  = ids_tensor([self.batch_size, self.seq_length]					,self.type_vocab_size			)

   __lowercase							  = None
   __lowercase							  = None
   __lowercase							  = None
   if self.use_labels:
    __lowercase							  = ids_tensor([self.batch_size]					,self.type_sequence_label_size			)
    __lowercase							  = ids_tensor([self.batch_size, self.seq_length]					,self.num_labels			)
    __lowercase							  = ids_tensor([self.batch_size]					,self.num_choices			)

   __lowercase							  = self.get_config()

   return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels






  def 					SCREAMING_SNAKE_CASE      (      self   :     Optional[Any]			):
   return DebertaConfig(
       vocab_size=self.vocab_size					,hidden_size=self.hidden_size					,num_hidden_layers=self.num_hidden_layers					,num_attention_heads=self.num_attention_heads					,intermediate_size=self.intermediate_size					,hidden_act=self.hidden_act					,hidden_dropout_prob=self.hidden_dropout_prob					,attention_probs_dropout_prob=self.attention_probs_dropout_prob					,max_position_embeddings=self.max_position_embeddings					,type_vocab_size=self.type_vocab_size					,initializer_range=self.initializer_range					,relative_attention=self.relative_attention					,position_biased_input=self.position_biased_input					,pos_att_type=self.pos_att_type					,)






  def 					SCREAMING_SNAKE_CASE      (      self   :     List[str]			):
   __lowercase							  = self.get_config()
   __lowercase							  = 3_0_0
   return config






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]					,lowercase__   :     Optional[Any]			):
   self.parent.assertListEqual(list(result.loss.size()			)					,[]			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]					,lowercase__   :     List[Any]					,lowercase__   :     Dict					,lowercase__   :     List[Any]					,lowercase__   :     Tuple					,lowercase__   :     Dict					,lowercase__   :     str					,lowercase__   :     Union[str, Any]			):
   __lowercase							  = DebertaModel(config=lowercase__			)
   model.to(lowercase__			)
   model.eval()
   __lowercase							  = model(lowercase__					,attention_mask=lowercase__					,token_type_ids=lowercase__			)[0]
   __lowercase							  = model(lowercase__					,token_type_ids=lowercase__			)[0]
   __lowercase							  = model(lowercase__			)[0]

   self.parent.assertListEqual(list(sequence_output.size()			)					,[self.batch_size, self.seq_length, self.hidden_size]			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Tuple					,lowercase__   :     str					,lowercase__   :     Tuple					,lowercase__   :     Optional[Any]					,lowercase__   :     Dict					,lowercase__   :     int					,lowercase__   :     Tuple					,lowercase__   :     int			):
   __lowercase							  = DebertaForMaskedLM(config=lowercase__			)
   model.to(lowercase__			)
   model.eval()
   __lowercase							  = model(lowercase__					,attention_mask=lowercase__					,token_type_ids=lowercase__					,labels=lowercase__			)

   self.parent.assertEqual(result.logits.shape					,(self.batch_size, self.seq_length, self.vocab_size)			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     int					,lowercase__   :     Optional[int]					,lowercase__   :     Optional[int]					,lowercase__   :     int					,lowercase__   :     Union[str, Any]					,lowercase__   :     Dict					,lowercase__   :     List[Any]					,lowercase__   :     Optional[Any]			):
   __lowercase							  = self.num_labels
   __lowercase							  = DebertaForSequenceClassification(lowercase__			)
   model.to(lowercase__			)
   model.eval()
   __lowercase							  = model(lowercase__					,attention_mask=lowercase__					,token_type_ids=lowercase__					,labels=lowercase__			)
   self.parent.assertListEqual(list(result.logits.size()			)					,[self.batch_size, self.num_labels]			)
   self.check_loss_output(lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]					,lowercase__   :     Optional[int]					,lowercase__   :     Optional[int]					,lowercase__   :     Optional[int]					,lowercase__   :     Tuple					,lowercase__   :     List[str]					,lowercase__   :     List[str]					,lowercase__   :     Optional[int]			):
   __lowercase							  = self.num_labels
   __lowercase							  = DebertaForTokenClassification(config=lowercase__			)
   model.to(lowercase__			)
   model.eval()
   __lowercase							  = model(lowercase__					,attention_mask=lowercase__					,token_type_ids=lowercase__					,labels=lowercase__			)
   self.parent.assertEqual(result.logits.shape					,(self.batch_size, self.seq_length, self.num_labels)			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Any					,lowercase__   :     Any					,lowercase__   :     Any					,lowercase__   :     Dict					,lowercase__   :     Any					,lowercase__   :     Optional[Any]					,lowercase__   :     int					,lowercase__   :     List[str]			):
   __lowercase							  = DebertaForQuestionAnswering(config=lowercase__			)
   model.to(lowercase__			)
   model.eval()
   __lowercase							  = model(
       lowercase__					,attention_mask=lowercase__					,token_type_ids=lowercase__					,start_positions=lowercase__					,end_positions=lowercase__					,)
   self.parent.assertEqual(result.start_logits.shape					,(self.batch_size, self.seq_length)			)
   self.parent.assertEqual(result.end_logits.shape					,(self.batch_size, self.seq_length)			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Dict			):
   __lowercase							  = self.prepare_config_and_inputs()
   (
       (
       __lowercase
   )  ,	(
       __lowercase
   )  ,	(
       __lowercase
   )  ,	(
       __lowercase
   )  ,	(
       __lowercase
   )  ,	(
       __lowercase
   )  ,	(
       __lowercase
   )  ,	
   )							  = config_and_inputs
   __lowercase							  = {'''input_ids''': input_ids, '''token_type_ids''': token_type_ids, '''attention_mask''': input_mask}
   return config, inputs_dict






@require_torch
class 			lowercase_	(lowerCamelCase__				,       lowerCamelCase__				,       unittest.TestCase      ):




  """simple docstring"""




  SCREAMING_SNAKE_CASE    :  Tuple							=			(
      (
          DebertaModel,
          DebertaForMaskedLM,
          DebertaForSequenceClassification,
          DebertaForTokenClassification,
          DebertaForQuestionAnswering,
      )
      if is_torch_available()
      else ()
  )
  SCREAMING_SNAKE_CASE    :  Union[str, Any]							=			(
      {
          'feature-extraction': DebertaModel,
          'fill-mask': DebertaForMaskedLM,
          'question-answering': DebertaForQuestionAnswering,
          'text-classification': DebertaForSequenceClassification,
          'token-classification': DebertaForTokenClassification,
          'zero-shot': DebertaForSequenceClassification,
      }
      if is_torch_available()
      else {}
  )

  SCREAMING_SNAKE_CASE    :  Tuple							=			True
  SCREAMING_SNAKE_CASE    :  List[str]							=			False
  SCREAMING_SNAKE_CASE    :  List[str]							=			False
  SCREAMING_SNAKE_CASE    :  Any							=			False
  SCREAMING_SNAKE_CASE    :  List[Any]							=			False






  def 					SCREAMING_SNAKE_CASE      (      self   :     int			):
   __lowercase							  = DebertaModelTester(self			)
   __lowercase							  = ConfigTester(self					,config_class=lowercase__					,hidden_size=3_7			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     int			):
   self.config_tester.run_common_tests()






  def 					SCREAMING_SNAKE_CASE      (      self   :     List[str]			):
   __lowercase							  = self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_deberta_model(*lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Union[str, Any]			):
   __lowercase							  = self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_deberta_for_sequence_classification(*lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Dict			):
   __lowercase							  = self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_deberta_for_masked_lm(*lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Optional[int]			):
   __lowercase							  = self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_deberta_for_question_answering(*lowercase__			)






  def 					SCREAMING_SNAKE_CASE      (      self   :     Dict			):
   __lowercase							  = self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_deberta_for_token_classification(*lowercase__			)






  @slow
  def 					SCREAMING_SNAKE_CASE      (      self   :     Tuple			):
   for model_name in DEBERTA_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
    __lowercase							  = DebertaModel.from_pretrained(lowercase__			)
    self.assertIsNotNone(lowercase__			)






@require_torch
@require_sentencepiece
@require_tokenizers
class 			lowercase_	(unittest.TestCase      ):




  """simple docstring"""




  @unittest.skip(reason='''Model not available yet'''			)
  def 					SCREAMING_SNAKE_CASE      (      self   :     str			):
   pass






  @slow
  def 					SCREAMING_SNAKE_CASE      (      self   :     Optional[int]			):
   __lowercase							  = DebertaModel.from_pretrained('''microsoft/deberta-base'''			)

   __lowercase							  = torch.tensor([[0, 3_1_4_1_4, 2_3_2, 3_2_8, 7_4_0, 1_1_4_0, 1_2_6_9_5, 6_9, 4_6_0_7_8, 1_5_8_8, 2]]			)
   __lowercase							  = torch.tensor([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]			)
   with torch.no_grad():
    __lowercase							  = model(lowercase__					,attention_mask=lowercase__			)[0]
   # compare the actual values for a slice.
   __lowercase							  = torch.tensor(
       [[[-0.5_9_8_6, -0.8_0_5_5, -0.8_4_6_2], [1.4_4_8_4, -0.9_3_4_8, -0.8_0_5_9], [0.3_1_2_3, 0.0_0_3_2, -1.4_1_3_1]]]			)
   self.assertTrue(torch.allclose(output[:, 1:4, 1:4]					,lowercase__					,atol=1e-4			)					,F"{output[:, 1:4, 1:4]}"			)

