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





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

        snake_case__    =					corpus.__dict__
        corpus_dict_no_vocab.pop("vocab"     ,		__lowerCAmelCase				)
        snake_case__    =					pytorch_dump_folder_path + "/" + CORPUS_NAME
        print(F"""Save dataset to {pytorch_dataset_dump_path}"""				)
        torch.save(__lowerCAmelCase     ,		__lowerCAmelCase				)

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

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

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


if __name__ == "__main__":
     __magic_name__  							=	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.''',
     )
     __magic_name__  							=	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,
     )





def 						SCREAMING_SNAKE_CASE__     (   __lowerCAmelCase     ,		__lowerCAmelCase     ,		__lowerCAmelCase				):
    return round(float(moles / volume				) * nfactor				)





def 						SCREAMING_SNAKE_CASE__     (   __lowerCAmelCase     ,		__lowerCAmelCase     ,		__lowerCAmelCase				):
    return round(float((moles * 0.0_821 * temperature) / (volume)				)				)





def 						SCREAMING_SNAKE_CASE__     (   __lowerCAmelCase     ,		__lowerCAmelCase     ,		__lowerCAmelCase				):
    return round(float((moles * 0.0_821 * temperature) / (pressure)				)				)





def 						SCREAMING_SNAKE_CASE__     (   __lowerCAmelCase     ,		__lowerCAmelCase     ,		__lowerCAmelCase				):
    return round(float((pressure * volume) / (0.0_821 * moles)				)				)


if __name__ == "__main__":
     import doctest

     doctest.testmod()



