






"""simple docstring"""


import argparse
import os
import pickle
import sys

import torch

from transformers import TransfoXLConfig, TransfoXLLMHeadModel, load_tf_weights_in_transfo_xl
from transformers.models.transfo_xl import tokenization_transfo_xl as data_utils
from transformers.models.transfo_xl.tokenization_transfo_xl import CORPUS_NAME, VOCAB_FILES_NAMES
from transformers.utils import CONFIG_NAME, WEIGHTS_NAME, logging


logging.set_verbosity_info()

# We do this to be able to load python 2 datasets pickles
# See e.g. https://stackoverflow.com/questions/2121874/python-pickling-after-changing-a-modules-directory/2121918#2121918
lowercase_				     =     data_utils.TransfoXLTokenizer
lowercase_				     =     data_utils.TransfoXLCorpus
lowercase_				     =     data_utils
lowercase_				     =     data_utils



def 					lowerCAmelCase				(    __UpperCamelCase		,       __UpperCamelCase		,       __UpperCamelCase		,       __UpperCamelCase ):




  """simple docstring"""







  if transfo_xl_dataset_file:
    # Convert a pre-processed corpus (see original TensorFlow repo)
    with open(__UpperCamelCase		,       '''rb''' ) as fp:
      __A									= pickle.load(__UpperCamelCase		,       encoding='''latin1''' )
    # Save vocabulary and dataset cache as Dictionaries (should be better than pickles for the long-term)
    __A									= pytorch_dump_folder_path + '''/''' + VOCAB_FILES_NAMES['''pretrained_vocab_file''']
    print(f'Save vocabulary to {pytorch_vocab_dump_path}' )
    __A									= corpus.vocab.__dict__
    torch.save(__UpperCamelCase		,       __UpperCamelCase )

    __A									= corpus.__dict__
    corpus_dict_no_vocab.pop('''vocab'''		,       __UpperCamelCase )
    __A									= pytorch_dump_folder_path + '''/''' + CORPUS_NAME
    print(f'Save dataset to {pytorch_dataset_dump_path}' )
    torch.save(__UpperCamelCase		,       __UpperCamelCase )

  if tf_checkpoint_path:
    # Convert a pre-trained TensorFlow model
    __A									= os.path.abspath(__UpperCamelCase )
    __A									= os.path.abspath(__UpperCamelCase )

    print(f'Converting Transformer XL checkpoint from {tf_path} with config at {config_path}.' )
    # Initialise PyTorch model
    if transfo_xl_config_file == "":
      __A									= TransfoXLConfig()
    else:
      __A									= TransfoXLConfig.from_json_file(__UpperCamelCase )
    print(f'Building PyTorch model from configuration: {config}' )
    __A									= TransfoXLLMHeadModel(__UpperCamelCase )

    __A									= load_tf_weights_in_transfo_xl(__UpperCamelCase		,       __UpperCamelCase		,       __UpperCamelCase )
    # Save pytorch-model
    __A									= os.path.join(__UpperCamelCase		,       __UpperCamelCase )
    __A									= os.path.join(__UpperCamelCase		,       __UpperCamelCase )
    print(f'Save PyTorch model to {os.path.abspath(__UpperCamelCase )}' )
    torch.save(model.state_dict()		,       __UpperCamelCase )
    print(f'Save configuration file to {os.path.abspath(__UpperCamelCase )}' )
    with open(__UpperCamelCase		,       '''w'''		,       encoding='''utf-8''' ) as f:
      f.write(config.to_json_string() )


if __name__ == "__main__":
       lowercase_				     =     argparse.ArgumentParser()
       parser.add_argument(
           '--pytorch_dump_folder_path',
           default=None,
           type=str,
           required=True,
           help='Path to the folder to store the PyTorch model or dataset/vocab.',
       )
       parser.add_argument(
           '--tf_checkpoint_path',
           default='',
           type=str,
           help='An optional path to a TensorFlow checkpoint path to be converted.',
       )
       parser.add_argument(
           '--transfo_xl_config_file',
           default='',
           type=str,
           help=(
               'An optional config json file corresponding to the pre-trained BERT model. \n'
               'This specifies the model architecture.'
           ),
       )
       parser.add_argument(
           '--transfo_xl_dataset_file',
           default='',
           type=str,
           help='An optional dataset file to be converted in a vocabulary.',
       )
       lowercase_				     =     parser.parse_args()
       convert_transfo_xl_checkpoint_to_pytorch(
           args.tf_checkpoint_path,
           args.transfo_xl_config_file,
           args.pytorch_dump_folder_path,
           args.transfo_xl_dataset_file,
       )












"""simple docstring"""


import unittest

from transformers import PegasusTokenizer, PegasusTokenizerFast
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, require_torch, slow
from transformers.utils import cached_property

from ...test_tokenization_common import TokenizerTesterMixin


lowercase_				     =     get_tests_dir('fixtures/test_sentencepiece_no_bos.model')


@require_sentencepiece
@require_tokenizers
class 					snake_case		(							_lowerCAmelCase   ,	unittest.TestCase						):


   '''simple docstring'''

   A_						:	Optional[Any]						 = PegasusTokenizer
   A_						:	int						 = PegasusTokenizerFast
   A_						:	Optional[Any]						 = True
   A_						:	Union[str, Any]						 = True


   def 				_SCREAMING_SNAKE_CASE				(	self :     Union[str, Any]  ):

     '''simple docstring'''
     super().setUp()

     # We have a SentencePiece fixture for testing
     __A									= PegasusTokenizer(_lowerCamelCase  )
     tokenizer.save_pretrained(self.tmpdirname  )


   @cached_property
   def 				_SCREAMING_SNAKE_CASE				(	self :     Tuple  ):

     '''simple docstring'''
     return PegasusTokenizer.from_pretrained('''google/pegasus-large'''  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     int,       **_lowerCamelCase :     List[Any]  ):

     '''simple docstring'''
     return PegasusTokenizer.from_pretrained(self.tmpdirname,       **_lowerCamelCase  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     Optional[Any],       _lowerCamelCase :     Dict  ):

     '''simple docstring'''
     return ("This is a test", "This is a test")


   def 				_SCREAMING_SNAKE_CASE				(	self :     Tuple  ):

     '''simple docstring'''
     __A									= '''</s>'''
     __A									= 1

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


   def 				_SCREAMING_SNAKE_CASE				(	self :     int  ):

     '''simple docstring'''
     __A									= list(self.get_tokenizer().get_vocab().keys()  )

     self.assertEqual(vocab_keys[0],       '''<pad>'''  )
     self.assertEqual(vocab_keys[1],       '''</s>'''  )
     self.assertEqual(vocab_keys[-1],       '''v'''  )
     self.assertEqual(len(_lowerCamelCase  ),       11_03  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     int  ):

     '''simple docstring'''
     self.assertEqual(self.get_tokenizer().vocab_size,       11_03  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     Dict  ):

     '''simple docstring'''
     __A									= self.rust_tokenizer_class.from_pretrained(self.tmpdirname  )
     __A									= self.tokenizer_class.from_pretrained(self.tmpdirname  )
     __A									= (
         '''Let\'s see which <unk> is the better <unk_token_11> one <mask_1> It seems like this <mask_2> was important'''
         ''' </s> <pad> <pad> <pad>'''
     )
     __A									= rust_tokenizer([raw_input_str],       return_tensors=_lowerCamelCase,       add_special_tokens=_lowerCamelCase  ).input_ids[0]
     __A									= py_tokenizer([raw_input_str],       return_tensors=_lowerCamelCase,       add_special_tokens=_lowerCamelCase  ).input_ids[0]
     self.assertListEqual(_lowerCamelCase,       _lowerCamelCase  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     List[Any]  ):

     '''simple docstring'''
     __A									= self._large_tokenizer
     # <mask_1> masks whole sentence while <mask_2> masks single word
     __A									= '''<mask_1> To ensure a <mask_2> flow of bank resolutions.'''
     __A									= [2, 4_13, 6_15, 1_14, 3, 19_71, 1_13, 16_79, 1_07_10, 1_07, 1]
     __A									= tokenizer([raw_input_str],       return_tensors=_lowerCamelCase  ).input_ids[0]
     self.assertListEqual(_lowerCamelCase,       _lowerCamelCase  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     Optional[int]  ):

     '''simple docstring'''
     __A									= self._large_tokenizer
     # The tracebacks for the following asserts are **better** without messages or self.assertEqual
     assert tokenizer.vocab_size == 9_61_03
     assert tokenizer.pad_token_id == 0
     assert tokenizer.eos_token_id == 1
     assert tokenizer.offset == 1_03
     assert tokenizer.unk_token_id == tokenizer.offset + 2 == 1_05
     assert tokenizer.unk_token == "<unk>"
     assert tokenizer.model_max_length == 10_24
     __A									= '''To ensure a smooth flow of bank resolutions.'''
     __A									= [4_13, 6_15, 1_14, 22_91, 19_71, 1_13, 16_79, 1_07_10, 1_07, 1]
     __A									= tokenizer([raw_input_str],       return_tensors=_lowerCamelCase  ).input_ids[0]
     self.assertListEqual(_lowerCamelCase,       _lowerCamelCase  )
     assert tokenizer.convert_ids_to_tokens([0, 1, 2, 3]  ) == ["<pad>", "</s>", "<mask_1>", "<mask_2>"]


   @require_torch
   def 				_SCREAMING_SNAKE_CASE				(	self :     Dict  ):

     '''simple docstring'''
     __A									= ['''This is going to be way too long.''' * 1_50, '''short example''']
     __A									= ['''not super long but more than 5 tokens''', '''tiny''']
     __A									= self._large_tokenizer(_lowerCamelCase,       padding=_lowerCamelCase,       truncation=_lowerCamelCase,       return_tensors='''pt'''  )
     __A									= self._large_tokenizer(
         text_target=_lowerCamelCase,       max_length=5,       padding=_lowerCamelCase,       truncation=_lowerCamelCase,       return_tensors='''pt'''  )

     assert batch.input_ids.shape == (2, 10_24)
     assert batch.attention_mask.shape == (2, 10_24)
     assert targets["input_ids"].shape == (2, 5)
     assert len(_lowerCamelCase  ) == 2  # input_ids, attention_mask.






   @slow
   def 				_SCREAMING_SNAKE_CASE				(	self :     Tuple  ):

     '''simple docstring'''
     # fmt: off
     __A									= {'''input_ids''': [[3_89_79, 1_43, 1_84_85, 6_06, 1_30, 2_66_69, 8_76_86, 1_21, 5_41_89, 11_29, 1_11, 2_66_69, 8_76_86, 1_21, 91_14, 1_47_87, 1_21, 1_32_49, 1_58, 5_92, 9_56, 1_21, 1_46_21, 3_15_76, 1_43, 6_26_13, 1_08, 96_88, 9_30, 4_34_30, 1_15_62, 6_26_13, 3_04, 1_08, 1_14_43, 8_97, 1_08, 93_14, 1_74_15, 6_33_99, 1_08, 1_14_43, 76_14, 1_83_16, 1_18, 42_84, 71_48, 1_24_30, 1_43, 14_00, 2_57_03, 1_58, 1_11, 42_84, 71_48, 1_17_72, 1_43, 2_12_97, 10_64, 1_58, 1_22, 2_04, 35_06, 17_54, 11_33, 1_47_87, 15_81, 1_15, 3_32_24, 44_82, 1_11, 13_55, 1_10, 2_91_73, 3_17, 5_08_33, 1_08, 2_01_47, 9_46_65, 1_11, 7_71_98, 1_07, 1], [1_10, 6_26_13, 1_17, 6_38, 1_12, 11_33, 1_21, 2_00_98, 13_55, 7_90_50, 1_38_72, 1_35, 15_96, 5_35_41, 13_52, 1_41, 1_30_39, 55_42, 1_24, 3_02, 5_18, 1_11, 2_68, 29_56, 1_15, 1_49, 44_27, 1_07, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1_39, 12_35, 27_99, 1_82_89, 1_77_80, 2_04, 1_09, 94_74, 12_96, 1_07, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], '''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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}  # noqa: E501
     # fmt: on

     self.tokenizer_integration_test_util(
         expected_encoding=_lowerCamelCase,       model_name='''google/bigbird-pegasus-large-arxiv''',       revision='''ba85d0851d708441f91440d509690f1ab6353415''',       )





@require_sentencepiece
@require_tokenizers
class 					snake_case		(							_lowerCAmelCase   ,	unittest.TestCase						):


   '''simple docstring'''

   A_						:	str						 = PegasusTokenizer
   A_						:	Union[str, Any]						 = PegasusTokenizerFast
   A_						:	Any						 = True
   A_						:	str						 = True


   def 				_SCREAMING_SNAKE_CASE				(	self :     List[Any]  ):

     '''simple docstring'''
     super().setUp()

     # We have a SentencePiece fixture for testing
     __A									= PegasusTokenizer(_lowerCamelCase,       offset=0,       mask_token_sent=_lowerCamelCase,       mask_token='''[MASK]'''  )
     tokenizer.save_pretrained(self.tmpdirname  )


   @cached_property
   def 				_SCREAMING_SNAKE_CASE				(	self :     str  ):

     '''simple docstring'''
     return PegasusTokenizer.from_pretrained('''google/bigbird-pegasus-large-arxiv'''  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     Optional[int],       **_lowerCamelCase :     Dict  ):

     '''simple docstring'''
     return PegasusTokenizer.from_pretrained(self.tmpdirname,       **_lowerCamelCase  )


   def 				_SCREAMING_SNAKE_CASE				(	self :     List[str],       _lowerCamelCase :     List[str]  ):

     '''simple docstring'''
     return ("This is a test", "This is a test")


   def 				_SCREAMING_SNAKE_CASE				(	self :     List[Any]  ):

     '''simple docstring'''
     __A									= self.rust_tokenizer_class.from_pretrained(self.tmpdirname  )
     __A									= self.tokenizer_class.from_pretrained(self.tmpdirname  )
     __A									= (
         '''Let\'s see which <unk> is the better <unk_token> one [MASK] It seems like this [MASK] was important </s>'''
         ''' <pad> <pad> <pad>'''
     )
     __A									= rust_tokenizer([raw_input_str],       return_tensors=_lowerCamelCase,       add_special_tokens=_lowerCamelCase  ).input_ids[0]
     __A									= py_tokenizer([raw_input_str],       return_tensors=_lowerCamelCase,       add_special_tokens=_lowerCamelCase  ).input_ids[0]
     self.assertListEqual(_lowerCamelCase,       _lowerCamelCase  )


   @require_torch
   def 				_SCREAMING_SNAKE_CASE				(	self :     Tuple  ):

     '''simple docstring'''
     __A									= ['''This is going to be way too long.''' * 10_00, '''short example''']
     __A									= ['''not super long but more than 5 tokens''', '''tiny''']
     __A									= self._large_tokenizer(_lowerCamelCase,       padding=_lowerCamelCase,       truncation=_lowerCamelCase,       return_tensors='''pt'''  )
     __A									= self._large_tokenizer(
         text_target=_lowerCamelCase,       max_length=5,       padding=_lowerCamelCase,       truncation=_lowerCamelCase,       return_tensors='''pt'''  )

     assert batch.input_ids.shape == (2, 40_96)
     assert batch.attention_mask.shape == (2, 40_96)
     assert targets["input_ids"].shape == (2, 5)
     assert len(_lowerCamelCase  ) == 2  # input_ids, attention_mask.






   def 				_SCREAMING_SNAKE_CASE				(	self :     Tuple  ):

     '''simple docstring'''
     __A									= (
         '''This is an example string that is used to test the original TF implementation against the HF'''
         ''' implementation'''
     )

     __A									= self._large_tokenizer(_lowerCamelCase  ).input_ids

     self.assertListEqual(
         _lowerCamelCase,       [1_82, 1_17, 1_42, 5_87, 42_11, 1_20, 1_17, 2_63, 1_12, 8_04, 1_09, 8_56, 2_50_16, 31_37, 4_64, 1_09, 2_69_55, 31_37, 1],       )




