
"""simple docstring"""





import os
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import AddedToken, BatchEncoding, PreTrainedTokenizer
from ...utils import logging


__magic_name__       =			logging.get_logger(__name__)

__magic_name__       =			"▁"

__magic_name__       =			{"vocab_file": "sentencepiece.bpe.model"}

__magic_name__       =			{
    "vocab_file": {
        "facebook/mbart-large-en-ro": (
            "https://huggingface.co/facebook/mbart-large-en-ro/resolve/main/sentencepiece.bpe.model"
        ),
        "facebook/mbart-large-cc25": (
            "https://huggingface.co/facebook/mbart-large-cc25/resolve/main/sentencepiece.bpe.model"
        ),
    }
}

__magic_name__       =			{
    "facebook/mbart-large-en-ro": 1024,
    "facebook/mbart-large-cc25": 1024,
}

# fmt: off
__magic_name__       =			["ar_AR", "cs_CZ", "de_DE", "en_XX", "es_XX", "et_EE", "fi_FI", "fr_XX", "gu_IN", "hi_IN", "it_IT", "ja_XX", "kk_KZ", "ko_KR", "lt_LT", "lv_LV", "my_MM", "ne_NP", "nl_XX", "ro_RO", "ru_RU", "si_LK", "tr_TR", "vi_VN", "zh_CN"]
class 						SCREAMING_SNAKE_CASE_ (						__a ):




		"""simple docstring"""





		__lowercase							:  Dict						   =		VOCAB_FILES_NAMES
		__lowercase							:  Dict						   =		PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
		__lowercase							:  Optional[int]						   =		PRETRAINED_VOCAB_FILES_MAP
		__lowercase							:  Optional[int]						   =		['''input_ids''', '''attention_mask''']

		__lowercase							:  List[int]						   =		[]
		__lowercase							:  List[int]						   =		[]




		def __init__(     self							,  lowerCAmelCase__							,  lowerCAmelCase__="<s>"							,  lowerCAmelCase__="</s>"							,  lowerCAmelCase__="</s>"							,  lowerCAmelCase__="<s>"							,  lowerCAmelCase__="<unk>"							,  lowerCAmelCase__="<pad>"							,  lowerCAmelCase__="<mask>"							,  lowerCAmelCase__=None							,  lowerCAmelCase__=None							,  lowerCAmelCase__=None							,  lowerCAmelCase__ = None							,  lowerCAmelCase__=None							,  **lowerCAmelCase__							,  ):
				# Mask token behave like a normal word, i.e. include the space before it
				__SCREAMING_SNAKE_CASE            = AddedToken(lowerCAmelCase__							,  lstrip=lowerCAmelCase__							,  rstrip=lowerCAmelCase__) if isinstance(lowerCAmelCase__							,  lowerCAmelCase__) else mask_token

				__SCREAMING_SNAKE_CASE            = {} if sp_model_kwargs is None else sp_model_kwargs

				super().__init__(
				    bos_token=lowerCAmelCase__							,  eos_token=lowerCAmelCase__							,  unk_token=lowerCAmelCase__							,  sep_token=lowerCAmelCase__							,  cls_token=lowerCAmelCase__							,  pad_token=lowerCAmelCase__							,  mask_token=lowerCAmelCase__							,  tokenizer_file=lowerCAmelCase__							,  src_lang=lowerCAmelCase__							,  tgt_lang=lowerCAmelCase__							,  additional_special_tokens=lowerCAmelCase__							,  sp_model_kwargs=self.sp_model_kwargs							,  **lowerCAmelCase__							,  )

				__SCREAMING_SNAKE_CASE            = spm.SentencePieceProcessor(**self.sp_model_kwargs)
				self.sp_model.Load(str(lowerCAmelCase__))
				__SCREAMING_SNAKE_CASE            = vocab_file

				# Original fairseq vocab and spm vocab must be "aligned":
				# Vocab    |    0    |    1    |   2    |    3    |  4  |  5  |  6  |   7   |   8   |  9
				# -------- | ------- | ------- | ------ | ------- | --- | --- | --- | ----- | ----- | ----
				# fairseq  | '<s>'   | '<pad>' | '</s>' | '<unk>' | ',' | '.' | '▁' | 's'   | '▁de' | '-'
				# spm      | '<unk>' | '<s>'   | '</s>' | ','     | '.' | '▁' | 's' | '▁de' | '-'   | '▁a'

				# Mimic fairseq token-to-id alignment for the first 4 token
				__SCREAMING_SNAKE_CASE            = {"""<s>""": 0, """<pad>""": 1, """</s>""": 2, """<unk>""": 3}

				# The first "real" token "," has position 4 in the original fairseq vocab and position 3 in the spm vocab
				__SCREAMING_SNAKE_CASE            = 1

				__SCREAMING_SNAKE_CASE            = len(self.sp_model)
				__SCREAMING_SNAKE_CASE            = {
				    code: self.sp_model_size + i + self.fairseq_offset for i, code in enumerate(lowerCAmelCase__)
				}
				__SCREAMING_SNAKE_CASE            = {v: k for k, v in self.lang_code_to_id.items()}
				__SCREAMING_SNAKE_CASE            = len(self.sp_model) + len(self.lang_code_to_id) + self.fairseq_offset

				self.fairseq_tokens_to_ids.update(self.lang_code_to_id)
				__SCREAMING_SNAKE_CASE            = {v: k for k, v in self.fairseq_tokens_to_ids.items()}
				__SCREAMING_SNAKE_CASE            = list(self.lang_code_to_id.keys())

				if additional_special_tokens is not None:
						# Only add those special tokens if they are not already there.
						self._additional_special_tokens.extend(
						    [t for t in additional_special_tokens if t not in self._additional_special_tokens])

				__SCREAMING_SNAKE_CASE            = src_lang if src_lang is not None else """en_XX"""
				__SCREAMING_SNAKE_CASE            = self.lang_code_to_id[self._src_lang]
				__SCREAMING_SNAKE_CASE            = tgt_lang
				self.set_src_lang_special_tokens(self._src_lang)




		def __getstate__(     self):
				__SCREAMING_SNAKE_CASE            = self.__dict__.copy()
				__SCREAMING_SNAKE_CASE            = None
				__SCREAMING_SNAKE_CASE            = self.sp_model.serialized_model_proto()
				return state




		def __setstate__(     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = d

				# for backward compatibility
				if not hasattr(self							,  """sp_model_kwargs"""):
						__SCREAMING_SNAKE_CASE            = {}

				__SCREAMING_SNAKE_CASE            = spm.SentencePieceProcessor(**self.sp_model_kwargs)
				self.sp_model.LoadFromSerializedProto(self.sp_model_proto)




		@property
		def 	snake_case_     (     self):
				return len(self.sp_model) + len(self.lang_code_to_id) + self.fairseq_offset + 1  # Plus 1 for the mask token




		@property
		def 	snake_case_     (     self):
				return self._src_lang




		@src_lang.setter
		def 	snake_case_     (     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = new_src_lang
				self.set_src_lang_special_tokens(self._src_lang)




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__ = None							,  lowerCAmelCase__ = False):

				if already_has_special_tokens:
						return super().get_special_tokens_mask(
						    token_ids_a=lowerCAmelCase__							,  token_ids_a=lowerCAmelCase__							,  already_has_special_tokens=lowerCAmelCase__)

				__SCREAMING_SNAKE_CASE            = [1] * len(self.prefix_tokens)
				__SCREAMING_SNAKE_CASE            = [1] * len(self.suffix_tokens)
				if token_ids_a is None:
						return prefix_ones + ([0] * len(lowerCAmelCase__)) + suffix_ones
				return prefix_ones + ([0] * len(lowerCAmelCase__)) + ([0] * len(lowerCAmelCase__)) + suffix_ones




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__ = None):
				if token_ids_a is None:
						return self.prefix_tokens + token_ids_a + self.suffix_tokens
				# We don't expect to process pairs, but leave the pair logic for API consistency
				return self.prefix_tokens + token_ids_a + token_ids_a + self.suffix_tokens




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__ = None):
				__SCREAMING_SNAKE_CASE            = [self.sep_token_id]
				__SCREAMING_SNAKE_CASE            = [self.cls_token_id]

				if token_ids_a is None:
						return len(cls + token_ids_a + sep) * [0]
				return len(cls + token_ids_a + sep + sep + token_ids_a + sep) * [0]




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__							,  lowerCAmelCase__							,  lowerCAmelCase__							,  **lowerCAmelCase__):
				if src_lang is None or tgt_lang is None:
						raise ValueError("""Translation requires a `src_lang` and a `tgt_lang` for this model""")
				__SCREAMING_SNAKE_CASE            = src_lang
				__SCREAMING_SNAKE_CASE            = self(lowerCAmelCase__							,  add_special_tokens=lowerCAmelCase__							,  return_tensors=lowerCAmelCase__							,  **lowerCAmelCase__)
				__SCREAMING_SNAKE_CASE            = self.convert_tokens_to_ids(lowerCAmelCase__)
				__SCREAMING_SNAKE_CASE            = tgt_lang_id
				return inputs




		def 	snake_case_     (     self):
				__SCREAMING_SNAKE_CASE            = {self.convert_ids_to_tokens(lowerCAmelCase__): i for i in range(self.vocab_size)}
				vocab.update(self.added_tokens_encoder)
				return vocab




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				return self.sp_model.encode(lowerCAmelCase__							,  out_type=lowerCAmelCase__)




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				if token in self.fairseq_tokens_to_ids:
						return self.fairseq_tokens_to_ids[token]
				__SCREAMING_SNAKE_CASE            = self.sp_model.PieceToId(lowerCAmelCase__)

				# Need to return unknown token if the SP model returned 0
				return spm_id + self.fairseq_offset if spm_id else self.unk_token_id




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				if index in self.fairseq_ids_to_tokens:
						return self.fairseq_ids_to_tokens[index]
				return self.sp_model.IdToPiece(index - self.fairseq_offset)




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = """""".join(lowerCAmelCase__).replace(lowerCAmelCase__							,  """ """).strip()
				return out_string




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__ = None):
				if not os.path.isdir(lowerCAmelCase__):
						logger.error(f"Vocabulary path ({save_directory}) should be a directory")
						return
				__SCREAMING_SNAKE_CASE            = os.path.join(
				    lowerCAmelCase__							,  (filename_prefix + """-""" if filename_prefix else """""") + VOCAB_FILES_NAMES["""vocab_file"""])

				if os.path.abspath(self.vocab_file) != os.path.abspath(lowerCAmelCase__) and os.path.isfile(self.vocab_file):
						copyfile(self.vocab_file							,  lowerCAmelCase__)
				elif not os.path.isfile(self.vocab_file):
						with open(lowerCAmelCase__							,  """wb""") as fi:
								__SCREAMING_SNAKE_CASE            = self.sp_model.serialized_model_proto()
								fi.write(lowerCAmelCase__)

				return (out_vocab_file,)




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__ = "en_XX"							,  lowerCAmelCase__ = None							,  lowerCAmelCase__ = "ro_RO"							,  **lowerCAmelCase__							,  ):
				__SCREAMING_SNAKE_CASE            = src_lang
				__SCREAMING_SNAKE_CASE            = tgt_lang
				return super().prepare_seqaseq_batch(lowerCAmelCase__							,  lowerCAmelCase__							,  **lowerCAmelCase__)




		def 	snake_case_     (     self):
				return self.set_src_lang_special_tokens(self.src_lang)




		def 	snake_case_     (     self):
				return self.set_tgt_lang_special_tokens(self.tgt_lang)




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = self.lang_code_to_id[src_lang]
				__SCREAMING_SNAKE_CASE            = []
				__SCREAMING_SNAKE_CASE            = [self.eos_token_id, self.cur_lang_code]




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = self.lang_code_to_id[lang]
				__SCREAMING_SNAKE_CASE            = []
				__SCREAMING_SNAKE_CASE            = [self.eos_token_id, self.cur_lang_code]






"""simple docstring"""





# 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 						SCREAMING_SNAKE_CASE_ (						__a ):




		"""simple docstring"""





		__lowercase							:  Tuple						   =		'''dandelin/vilt-b32-finetuned-vqa'''
		__lowercase							:  str						   =		(
		    '''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.'''
		)
		__lowercase							:  Optional[int]						   =		'''image_qa'''
		__lowercase							:  Union[str, Any]						   =		AutoProcessor
		__lowercase							:  Optional[Any]						   =		AutoModelForVisualQuestionAnswering

		__lowercase							:  List[str]						   =		['''image''', '''text''']
		__lowercase							:  Optional[Any]						   =		['''text''']




		def __init__(     self							,  *lowerCAmelCase__							,  **lowerCAmelCase__):
				requires_backends(self							,  ["""vision"""])
				super().__init__(*lowerCAmelCase__							,  **lowerCAmelCase__)




		def 	snake_case_     (     self							,  lowerCAmelCase__							,  lowerCAmelCase__):
				return self.pre_processor(lowerCAmelCase__							,  lowerCAmelCase__							,  return_tensors="""pt""")




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				with torch.no_grad():
						return self.model(**lowerCAmelCase__).logits




		def 	snake_case_     (     self							,  lowerCAmelCase__):
				__SCREAMING_SNAKE_CASE            = outputs.argmax(-1).item()
				return self.model.config.idalabel[idx]




