
import pickle
import shutil
import tempfile
import unittest

from transformers import SPIECE_UNDERLINE, XGLMTokenizer, XGLMTokenizerFast
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, slow
from transformers.utils import cached_property

from ...test_tokenization_common import TokenizerTesterMixin


lowercase						:      Dict									= get_tests_dir('fixtures/test_sentencepiece.model')




@require_sentencepiece
@require_tokenizers
class 				lowerCamelCase__							(       lowercase__  ,		unittest.TestCase):




	'''simple docstring'''




	_A			=  XGLMTokenizer
	_A			=  XGLMTokenizerFast
	_A			=  True
	_A			=  True







	def      _lowerCamelCase       (      self	:List[Any]		)	->				str:
								super().setUp()

								# We have a SentencePiece fixture for testing
								__UpperCamelCase			:     Optional[Any]         =      XGLMTokenizer(__lowercase  ,     keep_accents=__lowercase		)
								tokenizer.save_pretrained(self.tmpdirname		)







	def      _lowerCamelCase       (      self	:Union[str, Any]		)	->				List[Any]:
								__UpperCamelCase			:     Tuple         =      "<pad>"
								__UpperCamelCase			:     List[str]         =      1

								self.assertEqual(self.get_tokenizer()._convert_token_to_id(__lowercase		)  ,     __lowercase		)
								self.assertEqual(self.get_tokenizer()._convert_id_to_token(__lowercase		)  ,     __lowercase		)







	def      _lowerCamelCase       (      self	:Tuple		)	->				int:
								__UpperCamelCase			:     List[Any]         =      list(self.get_tokenizer().get_vocab().keys()		)

								self.assertEqual(vocab_keys[0]  ,     "<s>"		)
								self.assertEqual(vocab_keys[1]  ,     "<pad>"		)
								self.assertEqual(len(__lowercase		)  ,     1_0_0_8		)







	def      _lowerCamelCase       (      self	:Tuple		)	->				Optional[Any]:
								self.assertEqual(self.get_tokenizer().vocab_size  ,     1_0_0_8		)







	def      _lowerCamelCase       (      self	:List[str]		)	->				Optional[int]:
								__UpperCamelCase			:     str         =      XGLMTokenizer(__lowercase  ,     keep_accents=__lowercase		)

								__UpperCamelCase			:     Union[str, Any]         =      tokenizer.tokenize("This is a test"		)
								self.assertListEqual(__lowercase  ,     ["▁This", "▁is", "▁a", "▁t", "est"]		)

								self.assertListEqual(
								    tokenizer.convert_tokens_to_ids(__lowercase		)  ,     [value + tokenizer.fairseq_offset for value in [2_8_5, 4_6, 1_0, 1_7_0, 3_8_2]]  ,     )

								__UpperCamelCase			:     str         =      tokenizer.tokenize("I was born in 92000, and this is falsé."		)
								self.assertListEqual(
								    __lowercase  ,     [
								        SPIECE_UNDERLINE + "I",
								        SPIECE_UNDERLINE + "was",
								        SPIECE_UNDERLINE + "b",
								        "or",
								        "n",
								        SPIECE_UNDERLINE + "in",
								        SPIECE_UNDERLINE + "",
								        "9",
								        "2",
								        "0",
								        "0",
								        "0",
								        ",",
								        SPIECE_UNDERLINE + "and",
								        SPIECE_UNDERLINE + "this",
								        SPIECE_UNDERLINE + "is",
								        SPIECE_UNDERLINE + "f",
								        "al",
								        "s",
								        "é",
								        ".",
								    ]  ,     )
								__UpperCamelCase			:     Any         =      tokenizer.convert_tokens_to_ids(__lowercase		)
								self.assertListEqual(
								    __lowercase  ,     [
								        value + tokenizer.fairseq_offset
								        for value in [8, 2_1, 8_4, 5_5, 2_4, 1_9, 7, 2, 6_0_2, 3_4_7, 3_4_7, 3_4_7, 3, 1_2, 6_6, 4_6, 7_2, 8_0, 6, 2, 4]
								    ]  ,     )

								__UpperCamelCase			:     str         =      tokenizer.convert_ids_to_tokens(__lowercase		)
								self.assertListEqual(
								    __lowercase  ,     [
								        SPIECE_UNDERLINE + "I",
								        SPIECE_UNDERLINE + "was",
								        SPIECE_UNDERLINE + "b",
								        "or",
								        "n",
								        SPIECE_UNDERLINE + "in",
								        SPIECE_UNDERLINE + "",
								        "<unk>",
								        "2",
								        "0",
								        "0",
								        "0",
								        ",",
								        SPIECE_UNDERLINE + "and",
								        SPIECE_UNDERLINE + "this",
								        SPIECE_UNDERLINE + "is",
								        SPIECE_UNDERLINE + "f",
								        "al",
								        "s",
								        "<unk>",
								        ".",
								    ]  ,     )







	@cached_property
	def      _lowerCamelCase       (      self	:List[str]		)	->				Optional[int]:
								return XGLMTokenizer.from_pretrained("facebook/xglm-564M"		)







	def      _lowerCamelCase       (      self	:int		)	->				Optional[int]:
								with tempfile.NamedTemporaryFile() as f:
															shutil.copyfile(__lowercase  ,     f.name		)
															__UpperCamelCase			:     List[Any]         =      XGLMTokenizer(f.name  ,     keep_accents=__lowercase		)
															__UpperCamelCase			:     Union[str, Any]         =      pickle.dumps(__lowercase		)
								pickle.loads(__lowercase		)







	def      _lowerCamelCase       (      self	:Dict		)	->				str:
								if not self.test_rust_tokenizer:
															return

								__UpperCamelCase			:     int         =      self.get_tokenizer()
								__UpperCamelCase			:     List[str]         =      self.get_rust_tokenizer()

								__UpperCamelCase			:     Any         =      "I was born in 92000, and this is falsé."

								__UpperCamelCase			:     List[str]         =      tokenizer.tokenize(__lowercase		)
								__UpperCamelCase			:     Optional[int]         =      rust_tokenizer.tokenize(__lowercase		)
								self.assertListEqual(__lowercase  ,     __lowercase		)

								__UpperCamelCase			:     Optional[Any]         =      tokenizer.encode(__lowercase  ,     add_special_tokens=__lowercase		)
								__UpperCamelCase			:     Any         =      rust_tokenizer.encode(__lowercase  ,     add_special_tokens=__lowercase		)
								self.assertListEqual(__lowercase  ,     __lowercase		)

								__UpperCamelCase			:     List[str]         =      self.get_rust_tokenizer()
								__UpperCamelCase			:     Tuple         =      tokenizer.encode(__lowercase		)
								__UpperCamelCase			:     Tuple         =      rust_tokenizer.encode(__lowercase		)
								self.assertListEqual(__lowercase  ,     __lowercase		)







	@slow
	def      _lowerCamelCase       (      self	:List[Any]		)	->				Union[str, Any]:
								__UpperCamelCase			:     List[Any]         =      "Hello World!"
								__UpperCamelCase			:     Dict         =      [2, 3_1_2_2_7, 4_4_4_7, 3_5]

								self.assertListEqual(__lowercase  ,     self.big_tokenizer.encode(__lowercase		)		)







	@slow
	def      _lowerCamelCase       (      self	:Union[str, Any]		)	->				Optional[Any]:
								__UpperCamelCase			:     Any         =      (
								    "This is a very long text with a lot of weird characters, such as: . , ~ ? ( ) \" [ ] ! : - . Also we will"
								    " add words that should not exsist and be tokenized to unk, such as saoneuhaoesuth"
								)
								# fmt: off
								__UpperCamelCase			:     List[str]         =      [2, 1_0_1_8, 6_7, 1_1, 1_9_8_8, 2_6_1_7, 5_6_3_1, 2_7_8, 1_1, 3_4_0_7, 4_8, 7_1_6_3_0, 2_8_0_8_5, 4, 3_2_3_4, 1_5_7, 1_3, 6, 5, 6, 4, 3_5_2_6, 7_6_8, 1_5, 6_5_9, 5_7, 2_9_8, 3_9_8_3, 8_6_4, 1_2_9, 2_1, 6, 5, 1_3_6_7_5, 3_7_7, 6_5_2, 7_5_8_0, 1_0_3_4_1, 1_5_5, 2_8_1_7, 4_2_2, 1_6_6_6, 7, 1_6_7_4, 5_3, 1_1_3, 2_0_2_2_7_7, 1_7_8_9_2, 3_3, 6_0, 8_7, 4, 3_2_3_4, 1_5_7, 6_1, 2_6_6_7, 5_2_3_7_6, 1_9, 8_8, 2_3, 7_3_5]
								# fmt: on

								self.assertListEqual(__lowercase  ,     self.big_tokenizer.encode(__lowercase		)		)







	@slow
	def      _lowerCamelCase       (      self	:Tuple		)	->				int:
								# fmt: off
								__UpperCamelCase			:     Any         =      {
								    "input_ids": [[2, 1_0_8_8_2_5, 1_1_6_3, 1_5, 8_8_0_1_0, 4_7_3, 1_5_8_9_8, 1_5_7, 1_3_6_7_2, 1_8_5_7, 3_1_2, 8, 2_3_8_0_2_1, 1_1_6_3, 5_3, 1_3_6_7_2, 1_8_5_7, 3_1_2, 8, 5_3_2_8_3, 1_8_2_3_9_6, 8, 1_8_5_6_6, 1_6, 3_6_7_3_3, 4_1_0_1, 8, 2_3_0, 2_4_4_0_1_7, 1_2_2_5_5_3, 7, 1_5, 1_3_2_5_9_7, 4, 2_9_3, 1_2_5_1_1, 7_6_1_0, 4, 3_4_1_4, 1_3_2_5_9_7, 9, 4, 3_2_3_6_1, 3_6_2, 4, 7_3_4, 2_8_5_1_2, 3_2_5_6_9, 1_8, 4, 3_2_3_6_1, 2_6_0_9_6, 1_4_9_8_2, 7_3, 1_8_7_1_5, 2_1_4_3_3, 2_3_5_2_6_1, 1_5, 4_9_2, 1_2_4_2_7, 1_6, 5_3, 1_8_7_1_5, 2_1_4_3_3, 6_5_4_5_4, 1_5, 2_3_6_5_9, 5_6_3, 1_6, 2_7_8, 5_9_7, 2_8_4_3, 5_9_5, 7_9_3_1, 1_8_2_3_9_6, 6_4_1_8_6, 2_2, 8_8_6, 5_9_5, 1_3_2_9_8_1, 5_3, 2_5_5_4_0, 3_4_4_9, 4_3_9_8_2, 3_9_9_0_1, 5_9_5_1, 8_7_8, 3_3_0, 4, 2_7_6_9_4, 8_0_2_6_9, 3_1_2, 5_3, 6_5_1_7, 1_1_7_8_0, 6_1_1, 2_0_4_0_8, 5], [2, 6, 1_3_2_5_9_7, 6_7, 4_2_8_9_7, 3_3, 5_9_2, 8, 1_6_3_7_2_9, 2_5_5_4_0, 3_6_1, 1_3_6_9_9_7, 1_0_9_5_1_4, 1_7_3_2_3_0, 7, 5_0_1, 6_0, 1_0_2_9_1_3, 1_9_6, 5_6_3_1, 2_3_5, 6_3_2_4_3, 4_7_3, 6, 2_3_1_7_5_7, 7_4, 5_2_7_7, 7_9_0_5, 5_3, 3_0_9_5, 3_7_3_1_7, 2_2, 4_5_4, 1_8_3_8_7_4, 5], [2, 2_6_8, 3_1_2_9_8, 4_6_5_3_0, 6, 1_3_2_9_3_5, 4_3_8_3_1, 7, 5_9_7, 3_2, 2_4, 3_6_8_8, 9_8_6_5, 5]],
								    "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
								}  # noqa: E501
								# fmt: on

								self.tokenizer_integration_test_util(
								    expected_encoding=__lowercase  ,     model_name="facebook/xglm-564M"  ,     padding=__lowercase  ,     )

from ...configuration_utils import PretrainedConfig
from ...utils import logging
from ...utils.backbone_utils import BackboneConfigMixin, get_aligned_output_features_output_indices


lowercase						:      Optional[Any]									= logging.get_logger(__name__)

lowercase						:      List[str]									= {
    'shi-labs/nat-mini-in1k-224': 'https://huggingface.co/shi-labs/nat-mini-in1k-224/resolve/main/config.json',
    # See all Nat models at https://huggingface.co/models?filter=nat
}




class 				lowerCamelCase__							(       __lowercase  ,		__lowercase):




	'''simple docstring'''




	_A			=  'nat'

	_A			=  {
	    'num_attention_heads': 'num_heads',
	    'num_hidden_layers': 'num_layers',
	}







	def __init__(      self	:Optional[Any]  ,     a	:Any=4  ,     a	:Any=3  ,     a	:int=6_4  ,     a	:Dict=[3, 4, 6, 5]  ,     a	:Dict=[2, 4, 8, 1_6]  ,     a	:Optional[Any]=7  ,     a	:Any=3.0  ,     a	:Optional[int]=True  ,     a	:int=0.0  ,     a	:Union[str, Any]=0.0  ,     a	:List[Any]=0.1  ,     a	:str="gelu"  ,     a	:Union[str, Any]=0.02  ,     a	:Tuple=1E-5  ,     a	:str=0.0  ,     a	:Optional[int]=None  ,     a	:Dict=None  ,     **a	:Optional[Any]  ,     )	->				int:
								super().__init__(**a		)

								__UpperCamelCase			:     Any         =      patch_size
								__UpperCamelCase			:     str         =      num_channels
								__UpperCamelCase			:     List[Any]         =      embed_dim
								__UpperCamelCase			:     str         =      depths
								__UpperCamelCase			:     str         =      len(a		)
								__UpperCamelCase			:     Optional[Any]         =      num_heads
								__UpperCamelCase			:     Dict         =      kernel_size
								__UpperCamelCase			:     Union[str, Any]         =      mlp_ratio
								__UpperCamelCase			:     Union[str, Any]         =      qkv_bias
								__UpperCamelCase			:     List[str]         =      hidden_dropout_prob
								__UpperCamelCase			:     Any         =      attention_probs_dropout_prob
								__UpperCamelCase			:     Any         =      drop_path_rate
								__UpperCamelCase			:     Any         =      hidden_act
								__UpperCamelCase			:     Tuple         =      layer_norm_eps
								__UpperCamelCase			:     Dict         =      initializer_range
								# we set the hidden_size attribute in order to make Nat work with VisionEncoderDecoderModel
								# this indicates the channel dimension after the last stage of the model
								__UpperCamelCase			:     int         =      int(embed_dim * 2 ** (len(a		) - 1)		)
								__UpperCamelCase			:     List[Any]         =      layer_scale_init_value
								__UpperCamelCase			:     Optional[Any]         =      ["stem"] + [f'stage{idx}' for idx in range(1  ,     len(a		) + 1		)]
								__UpperCamelCase     ,		__UpperCamelCase			:     Any         =      get_aligned_output_features_output_indices(
								    out_features=a  ,     out_indices=a  ,     stage_names=self.stage_names		)