


# Copyright 2023 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

import torch

from ..models.auto import AutoModelForVisualQuestionAnswering, AutoProcessor
from ..utils import requires_backends
from .base import PipelineTool


if TYPE_CHECKING:
						from PIL import Image
class 			_lowercase (     __a			):






				'''simple docstring'''



				SCREAMING_SNAKE_CASE__							:     Optional[Any]         =						'''dandelin/vilt-b32-finetuned-vqa'''
				SCREAMING_SNAKE_CASE__							:     Optional[Any]         =						(
				    '''This is a tool that answers a question about an image. It takes an input named `image` which should be the '''
				    '''image containing the information, as well as a `question` which should be the question in English. It '''
				    '''returns a text that is the answer to the question.'''
				)
				SCREAMING_SNAKE_CASE__							:     List[str]         =						'''image_qa'''
				SCREAMING_SNAKE_CASE__							:     Dict         =						AutoProcessor
				SCREAMING_SNAKE_CASE__							:     Optional[Any]         =						AutoModelForVisualQuestionAnswering

				SCREAMING_SNAKE_CASE__							:     int         =						['''image''', '''text''']
				SCREAMING_SNAKE_CASE__							:     Union[str, Any]         =						['''text''']


				def __init__(			self     :Any     ,     *lowerCAmelCase__     :Dict     ,     **lowerCAmelCase__     :Union[str, Any]      )						->     int:
										requires_backends(self     ,     ['''vision''']      )
										super().__init__(*_lowercase     ,     **_lowercase      )


				def 						__magic_name__(			self     :List[Any]     ,     lowerCAmelCase__     :"Image"     ,     lowerCAmelCase__     :str      )						->     List[Any]:
										return self.pre_processor(_lowercase     ,     _lowercase     ,     return_tensors='''pt'''      )


				def 						__magic_name__(			self     :Optional[Any]     ,     lowerCAmelCase__     :int      )						->     str:



										with torch.no_grad():
																return self.model(**_lowercase      ).logits



				def 						__magic_name__(			self     :List[str]     ,     lowerCAmelCase__     :Dict      )						->     List[Any]:
										__SCREAMING_SNAKE_CASE		:	Any						     =						outputs.argmax(-1      ).item()
										return self.model.config.idalabel[idx]

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




def    lowerCAmelCase_  (		lowercase:				Tuple	,       lowercase:				Union[str, Any]	,       lowercase:				Any	,       lowercase:				List[Any]		)     ->					List[Any]:







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

  _UpperCamelCase:  str    						=			corpus.__dict__
  corpus_dict_no_vocab.pop('''vocab'''	,       lowercase		)
  _UpperCamelCase:  str    						=			pytorch_dump_folder_path + '''/''' + CORPUS_NAME
  print(F"""Save dataset to {pytorch_dataset_dump_path}"""		)
  torch.save(lowercase	,       lowercase		)

 if tf_checkpoint_path:
  # Convert a pre-trained TensorFlow model
  _UpperCamelCase:  Optional[Any]    						=			os.path.abspath(lowercase		)
  _UpperCamelCase:  List[str]    						=			os.path.abspath(lowercase		)

  print(F"""Converting Transformer XL checkpoint from {tf_path} with config at {config_path}."""		)
  # Initialise PyTorch model
  if transfo_xl_config_file == "":
   _UpperCamelCase:  Tuple    						=			TransfoXLConfig()
  else:
   _UpperCamelCase:  Union[str, Any]    						=			TransfoXLConfig.from_json_file(lowercase		)
  print(F"""Building PyTorch model from configuration: {config}"""		)
  _UpperCamelCase:  Optional[int]    						=			TransfoXLLMHeadModel(lowercase		)

  _UpperCamelCase:  int    						=			load_tf_weights_in_transfo_xl(lowercase	,       lowercase	,       lowercase		)
  # Save pytorch-model
  _UpperCamelCase:  List[str]    						=			os.path.join(lowercase	,       lowercase		)
  _UpperCamelCase:  Union[str, Any]    						=			os.path.join(lowercase	,       lowercase		)
  print(F"""Save PyTorch model to {os.path.abspath(lowercase		)}"""		)
  torch.save(model.state_dict()	,       lowercase		)
  print(F"""Save configuration file to {os.path.abspath(lowercase		)}"""		)
  with open(lowercase	,       '''w'''	,       encoding='''utf-8'''		) as f:
   f.write(config.to_json_string()		)


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