






# 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.
import re

from ..models.auto import AutoProcessor
from ..models.vision_encoder_decoder import VisionEncoderDecoderModel
from ..utils import is_vision_available
from .base import PipelineTool


if is_vision_available():
					from PIL import Image
class      UpperCamelCase (				snake_case__ ):







		"""simple docstring"""



		snake_case    =   "naver-clova-ix/donut-base-finetuned-docvqa"
		snake_case    =   (
		    "This is a tool that answers a question about an document (pdf). It takes an input named `document` which "
		    "should be the document containing the information, as well as a `question` that is the question about the "
		    "document. It returns a text that contains the answer to the question."
		)
		snake_case    =   "document_qa"
		snake_case    =   AutoProcessor
		snake_case    =   VisionEncoderDecoderModel

		snake_case    =   ["image", "text"]
		snake_case    =   ["text"]
		def __init__(  self		:       Tuple						,*_SCREAMING_SNAKE_CASE		:       Tuple						,**_SCREAMING_SNAKE_CASE		:       Any		)    ->   int:


						'''simple docstring'''
						if not is_vision_available():
										raise ValueError('Pillow must be installed to use the DocumentQuestionAnsweringTool.'		)

						super().__init__(*_SCREAMING_SNAKE_CASE						,**_SCREAMING_SNAKE_CASE		)
		def       A(  self		:       List[str]						,_SCREAMING_SNAKE_CASE		:       "Image"						,_SCREAMING_SNAKE_CASE		:       str		)    ->   Optional[Any]:


						'''simple docstring'''
						A	 =      '<s_docvqa><s_question>{user_input}</s_question><s_answer>'
						A	 =      task_prompt.replace('{user_input}'						,_SCREAMING_SNAKE_CASE		)
						A	 =      self.pre_processor.tokenizer(
						    _SCREAMING_SNAKE_CASE						,add_special_tokens=_SCREAMING_SNAKE_CASE						,return_tensors='pt'		).input_ids
						A	 =      self.pre_processor(_SCREAMING_SNAKE_CASE						,return_tensors='pt'		).pixel_values

						return {"decoder_input_ids": decoder_input_ids, "pixel_values": pixel_values}
		def       A(  self		:       int						,_SCREAMING_SNAKE_CASE		:       List[Any]		)    ->   Dict:


						'''simple docstring'''
						return self.model.generate(
						    inputs['pixel_values'].to(self.device		)						,decoder_input_ids=inputs['decoder_input_ids'].to(self.device		)						,max_length=self.model.decoder.config.max_position_embeddings						,early_stopping=_SCREAMING_SNAKE_CASE						,pad_token_id=self.pre_processor.tokenizer.pad_token_id						,eos_token_id=self.pre_processor.tokenizer.eos_token_id						,use_cache=_SCREAMING_SNAKE_CASE						,num_beams=1						,bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]						,return_dict_in_generate=_SCREAMING_SNAKE_CASE						,).sequences







		def       A(  self		:       Optional[Any]						,_SCREAMING_SNAKE_CASE		:       Tuple		)    ->   Tuple:


						'''simple docstring'''
						A	 =      self.pre_processor.batch_decode(_SCREAMING_SNAKE_CASE		)[0]
						A	 =      sequence.replace(self.pre_processor.tokenizer.eos_token						,''		)
						A	 =      sequence.replace(self.pre_processor.tokenizer.pad_token						,''		)
						A	 =      re.sub(R'<.*?>'						,''						,_SCREAMING_SNAKE_CASE						,count=1		).strip()  # remove first task start token
						A	 =      self.pre_processor.tokenajson(_SCREAMING_SNAKE_CASE		)

						return sequence["answer"]













import warnings
from typing import List, Optional, Union

from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import BatchEncoding, PaddingStrategy, PreTokenizedInput, TextInput, TruncationStrategy
from ...utils import TensorType
class      UpperCamelCase (				snake_case__ ):







		"""simple docstring"""



		snake_case    =   ["image_processor", "tokenizer"]
		snake_case    =   "LayoutLMv2ImageProcessor"
		snake_case    =   ("LayoutXLMTokenizer", "LayoutXLMTokenizerFast")
		def __init__(  self		:       List[str]						,_SCREAMING_SNAKE_CASE		:       List[str]=None						,_SCREAMING_SNAKE_CASE		:       Optional[int]=None						,**_SCREAMING_SNAKE_CASE		:       Tuple		)    ->   List[str]:


						'''simple docstring'''
						if "feature_extractor" in kwargs:
										warnings.warn(
										    'The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`'
										    ' instead.'						,_SCREAMING_SNAKE_CASE						,)
										A	 =      kwargs.pop('feature_extractor'		)

						A	 =      image_processor if image_processor is not None else feature_extractor
						if image_processor is None:
										raise ValueError('You need to specify an `image_processor`.'		)
						if tokenizer is None:
										raise ValueError('You need to specify a `tokenizer`.'		)

						super().__init__(_SCREAMING_SNAKE_CASE						,_SCREAMING_SNAKE_CASE		)
		def __call__(  self		:       Union[str, Any]						,_SCREAMING_SNAKE_CASE		:       Optional[int]						,_SCREAMING_SNAKE_CASE		:       Union[TextInput, PreTokenizedInput, List[TextInput], List[PreTokenizedInput]] = None						,_SCREAMING_SNAKE_CASE		:       Optional[Union[PreTokenizedInput, List[PreTokenizedInput]]] = None						,_SCREAMING_SNAKE_CASE		:       Union[List[List[int]], List[List[List[int]]]] = None						,_SCREAMING_SNAKE_CASE		:       Optional[Union[List[int], List[List[int]]]] = None						,_SCREAMING_SNAKE_CASE		:       bool = True						,_SCREAMING_SNAKE_CASE		:       Union[bool, str, PaddingStrategy] = False						,_SCREAMING_SNAKE_CASE		:       Union[bool, str, TruncationStrategy] = None						,_SCREAMING_SNAKE_CASE		:       Optional[int] = None						,_SCREAMING_SNAKE_CASE		:       int = 0						,_SCREAMING_SNAKE_CASE		:       Optional[int] = None						,_SCREAMING_SNAKE_CASE		:       Optional[bool] = None						,_SCREAMING_SNAKE_CASE		:       Optional[bool] = None						,_SCREAMING_SNAKE_CASE		:       bool = False						,_SCREAMING_SNAKE_CASE		:       bool = False						,_SCREAMING_SNAKE_CASE		:       bool = False						,_SCREAMING_SNAKE_CASE		:       bool = False						,_SCREAMING_SNAKE_CASE		:       bool = True						,_SCREAMING_SNAKE_CASE		:       Optional[Union[str, TensorType]] = None						,**_SCREAMING_SNAKE_CASE		:       Tuple						,)    ->   BatchEncoding:


						'''simple docstring'''
						# verify input
						if self.image_processor.apply_ocr and (boxes is not None):
										raise ValueError(
										    'You cannot provide bounding boxes '
										    'if you initialized the image processor with apply_ocr set to True.'		)

						if self.image_processor.apply_ocr and (word_labels is not None):
										raise ValueError(
										    'You cannot provide word labels if you initialized the image processor with apply_ocr set to True.'		)

						if return_overflowing_tokens is True and return_offsets_mapping is False:
										raise ValueError('You cannot return overflowing tokens without returning the offsets mapping.'		)

						# first, apply the image processor
						A	 =      self.image_processor(images=_SCREAMING_SNAKE_CASE						,return_tensors=_SCREAMING_SNAKE_CASE		)

						# second, apply the tokenizer
						if text is not None and self.image_processor.apply_ocr and text_pair is None:
										if isinstance(_SCREAMING_SNAKE_CASE						,_SCREAMING_SNAKE_CASE		):
														A	 =      [text]  # add batch dimension (as the image processor always adds a batch dimension)
										A	 =      features['words']

						A	 =      self.tokenizer(
						    text=text if text is not None else features['words']						,text_pair=text_pair if text_pair is not None else None						,boxes=boxes if boxes is not None else features['boxes']						,word_labels=_SCREAMING_SNAKE_CASE						,add_special_tokens=_SCREAMING_SNAKE_CASE						,padding=_SCREAMING_SNAKE_CASE						,truncation=_SCREAMING_SNAKE_CASE						,max_length=_SCREAMING_SNAKE_CASE						,stride=_SCREAMING_SNAKE_CASE						,pad_to_multiple_of=_SCREAMING_SNAKE_CASE						,return_token_type_ids=_SCREAMING_SNAKE_CASE						,return_attention_mask=_SCREAMING_SNAKE_CASE						,return_overflowing_tokens=_SCREAMING_SNAKE_CASE						,return_special_tokens_mask=_SCREAMING_SNAKE_CASE						,return_offsets_mapping=_SCREAMING_SNAKE_CASE						,return_length=_SCREAMING_SNAKE_CASE						,verbose=_SCREAMING_SNAKE_CASE						,return_tensors=_SCREAMING_SNAKE_CASE						,**_SCREAMING_SNAKE_CASE						,)

						# add pixel values
						A	 =      features.pop('pixel_values'		)
						if return_overflowing_tokens is True:
										A	 =      self.get_overflowing_images(_SCREAMING_SNAKE_CASE						,encoded_inputs['overflow_to_sample_mapping']		)
						A	 =      images

						return encoded_inputs
		def       A(  self		:       Dict						,_SCREAMING_SNAKE_CASE		:       Optional[Any]						,_SCREAMING_SNAKE_CASE		:       Optional[Any]		)    ->   Dict:


						'''simple docstring'''
						# in case there's an overflow, ensure each `input_ids` sample is mapped to its corresponding image
						A	 =      []
						for sample_idx in overflow_to_sample_mapping:
										images_with_overflow.append(images[sample_idx]		)

						if len(_SCREAMING_SNAKE_CASE		) != len(_SCREAMING_SNAKE_CASE		):
										raise ValueError(
										    'Expected length of images to be the same as the length of `overflow_to_sample_mapping`, but got'
										    f' {len(_SCREAMING_SNAKE_CASE		)} and {len(_SCREAMING_SNAKE_CASE		)}'		)

						return images_with_overflow
		def       A(  self		:       List[str]						,*_SCREAMING_SNAKE_CASE		:       str						,**_SCREAMING_SNAKE_CASE		:       Union[str, Any]		)    ->   Tuple:


						'''simple docstring'''
						return self.tokenizer.batch_decode(*_SCREAMING_SNAKE_CASE						,**_SCREAMING_SNAKE_CASE		)
		def       A(  self		:       Dict						,*_SCREAMING_SNAKE_CASE		:       Tuple						,**_SCREAMING_SNAKE_CASE		:       int		)    ->   int:


						'''simple docstring'''
						return self.tokenizer.decode(*_SCREAMING_SNAKE_CASE						,**_SCREAMING_SNAKE_CASE		)
		@property
		def       A(  self		:       Any		)    ->   Union[str, Any]:


						'''simple docstring'''
						return ["input_ids", "bbox", "attention_mask", "image"]
		@property
		def       A(  self		:       Dict		)    ->   int:


						'''simple docstring'''
						warnings.warn(
						    '`feature_extractor_class` is deprecated and will be removed in v5. Use `image_processor_class` instead.'						,_SCREAMING_SNAKE_CASE						,)
						return self.image_processor_class







		@property
		def       A(  self		:       Optional[int]		)    ->   Union[str, Any]:


						'''simple docstring'''
						warnings.warn(
						    '`feature_extractor` is deprecated and will be removed in v5. Use `image_processor` instead.'						,_SCREAMING_SNAKE_CASE						,)
						return self.image_processor





