





"""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.
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 		lowercase					(					_UpperCAmelCase					):
      _SCREAMING_SNAKE_CASE					=      'naver-clova-ix/donut-base-finetuned-docvqa'
      _SCREAMING_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.'
      )
      _SCREAMING_SNAKE_CASE					=      'document_qa'
      _SCREAMING_SNAKE_CASE					=      AutoProcessor
      _SCREAMING_SNAKE_CASE					=      VisionEncoderDecoderModel

      _SCREAMING_SNAKE_CASE					=      ['image', 'text']
      _SCREAMING_SNAKE_CASE					=      ['text']





      def __init__(       self      ,						*lowercase      ,						**lowercase )		->     Union[str, Any]:
            if not is_vision_available():
                  raise ValueError("""Pillow must be installed to use the DocumentQuestionAnsweringTool.""" )

            super().__init__(*lowercase      ,						**lowercase )





      def     _snake_case			(       self      ,						lowercase      ,						lowercase )		->     Dict:
            lowerCAmelCase  						=       """<s_docvqa><s_question>{user_input}</s_question><s_answer>"""
            lowerCAmelCase  						=       task_prompt.replace("""{user_input}"""      ,						lowercase )
            lowerCAmelCase  						=       self.pre_processor.tokenizer(
                lowercase      ,						add_special_tokens=lowercase      ,						return_tensors="""pt""" ).input_ids
            lowerCAmelCase  						=       self.pre_processor(lowercase      ,						return_tensors="""pt""" ).pixel_values

            return {"decoder_input_ids": decoder_input_ids, "pixel_values": pixel_values}





      def     _snake_case			(       self      ,						lowercase )		->     Optional[Any]:
            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=lowercase      ,						pad_token_id=self.pre_processor.tokenizer.pad_token_id      ,						eos_token_id=self.pre_processor.tokenizer.eos_token_id      ,						use_cache=lowercase      ,						num_beams=1      ,						bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]      ,						return_dict_in_generate=lowercase      ,						).sequences





      def     _snake_case			(       self      ,						lowercase )		->     Union[str, Any]:
            lowerCAmelCase  						=       self.pre_processor.batch_decode(lowercase )[0]
            lowerCAmelCase  						=       sequence.replace(self.pre_processor.tokenizer.eos_token      ,						"""""" )
            lowerCAmelCase  						=       sequence.replace(self.pre_processor.tokenizer.pad_token      ,						"""""" )
            lowerCAmelCase  						=       re.sub(r"""<.*?>"""      ,						""""""      ,						lowercase      ,						count=1 ).strip()  # remove first task start token
            lowerCAmelCase  						=       self.pre_processor.tokenajson(lowercase )

            return sequence["answer"]













"""simple docstring"""





# This is the module that test_patching.py uses to test patch_submodule()

import os  # noqa: this is just for tests
import os as renamed_os  # noqa: this is just for tests
from os import path  # noqa: this is just for tests
from os import path as renamed_path  # noqa: this is just for tests
from os.path import join  # noqa: this is just for tests
from os.path import join as renamed_join  # noqa: this is just for tests


SCREAMING_SNAKE_CASE__					=   open  # noqa: we just need to have a builtin inside this module to test it properly






