

from typing import List

from .keymap import KEYMAP, get_character
def 						_snake_case(    SCREAMING_SNAKE_CASE__			:	str      )							->      Optional[int]:





    '''simple docstring'''






    def decorator(SCREAMING_SNAKE_CASE__			:	Any      ):
        A__          =   getattr(SCREAMING_SNAKE_CASE__    ,			'handle_key'    ,			[]      )
        handle += [key]
        setattr(SCREAMING_SNAKE_CASE__    ,			'handle_key'    ,			SCREAMING_SNAKE_CASE__      )
        return func

    return decorator
def 						_snake_case(    *SCREAMING_SNAKE_CASE__			:	List[str]      )							->      Union[str, Any]:





    '''simple docstring'''






    def decorator(SCREAMING_SNAKE_CASE__			:	List[str]      ):
        A__          =   getattr(SCREAMING_SNAKE_CASE__    ,			'handle_key'    ,			[]      )
        handle += keys
        setattr(SCREAMING_SNAKE_CASE__    ,			'handle_key'    ,			SCREAMING_SNAKE_CASE__      )
        return func

    return decorator


class  A						(							_UpperCAmelCase ):







    """simple docstring"""





    def __new__(      cls :       List[Any],lowercase_ :       List[str],lowercase_ :       Dict,lowercase_ :       Optional[Any]		)->    Tuple:





        '''simple docstring'''







        A__          =   super().__new__(cls,lowercase_,lowercase_,lowercase_		)
        if not hasattr(lowercase_,'key_handler'		):
            setattr(lowercase_,'key_handler',{}		)
        setattr(lowercase_,'handle_input',KeyHandler.handle_input		)

        for value in attrs.values():
            A__          =   getattr(lowercase_,'handle_key',[]		)
            for key in handled_keys:
                A__          =   value
        return new_cls


    @staticmethod
    def 						snake_case__     (      cls :       str		)->    Optional[Any]:





        '''simple docstring'''







        A__          =   get_character()
        if char != KEYMAP["undefined"]:
            A__          =   ord(lowercase_		)
        A__          =   cls.key_handler.get(lowercase_		)
        if handler:
            A__          =   char
            return handler(cls		)
        else:
            return None




def 						_snake_case(    cls			:	Optional[Any]      )							->      Dict:





    '''simple docstring'''






    return KeyHandler(cls.__name__    ,			cls.__bases__    ,			cls.__dict__.copy()      )







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
__A        =    data_utils.TransfoXLTokenizer
__A        =    data_utils.TransfoXLCorpus
__A        =    data_utils
__A        =    data_utils







def 			lowerCamelCase_		(       UpperCamelCase__				:      List[str] ,     UpperCamelCase__				:      Optional[int] ,     UpperCamelCase__				:      Union[str, Any] ,     UpperCamelCase__				:      Optional[Any]      )     ->       Union[str, Any]:





				"""simple docstring"""


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

								__lowerCamelCase		       =    corpus.__dict__
								corpus_dict_no_vocab.pop('vocab' ,     UpperCamelCase__      )
								__lowerCamelCase		       =    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
								__lowerCamelCase		       =    os.path.abspath(UpperCamelCase__      )
								__lowerCamelCase		       =    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 == "":
												__lowerCamelCase		       =    TransfoXLConfig()
								else:
												__lowerCamelCase		       =    TransfoXLConfig.from_json_file(UpperCamelCase__      )
								print(F"""Building PyTorch model from configuration: {config}"""      )
								__lowerCamelCase		       =    TransfoXLLMHeadModel(UpperCamelCase__      )

								__lowerCamelCase		       =    load_tf_weights_in_transfo_xl(UpperCamelCase__ ,     UpperCamelCase__ ,     UpperCamelCase__      )
								# Save pytorch-model
								__lowerCamelCase		       =    os.path.join(UpperCamelCase__ ,     UpperCamelCase__      )
								__lowerCamelCase		       =    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__":
					__A        =    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.",
					)
					__A        =    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,
					)


