





"""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 		UpperCamelCase__			(				__lowerCAmelCase       ):



     '''simple docstring'''

     __snake_case   :     Tuple		     =      '''naver-clova-ix/donut-base-finetuned-docvqa'''
     __snake_case   :     Union[str, Any]		     =      (
         '''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   :     List[str]		     =      '''document_qa'''
     __snake_case   :     Union[str, Any]		     =      AutoProcessor
     __snake_case   :     str		     =      VisionEncoderDecoderModel

     __snake_case   :     str		     =      ['''image''', '''text''']
     __snake_case   :     List[str]		     =      ['''text''']






     def __init__(							self						:   Any						,*lowerCamelCase__						:   Optional[Any]						,**lowerCamelCase__						:   List[Any]	)					->		Optional[Any]:




           '''simple docstring'''


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

           super().__init__(*lowerCAmelCase_						,**lowerCAmelCase_	)






     def     SCREAMING_SNAKE_CASE__  (							self						:   Any						,lowerCamelCase__						:   Dict						,lowerCamelCase__						:   Union[str, Any]	)					->		Any:




           '''simple docstring'''


           SCREAMING_SNAKE_CASE		=						"""<s_docvqa><s_question>{user_input}</s_question><s_answer>"""
           SCREAMING_SNAKE_CASE		=						task_prompt.replace("""{user_input}"""						,lowerCAmelCase_	)
           SCREAMING_SNAKE_CASE		=						self.pre_processor.tokenizer(
               lowerCAmelCase_						,add_special_tokens=lowerCAmelCase_						,return_tensors="""pt"""	).input_ids
           SCREAMING_SNAKE_CASE		=						self.pre_processor(lowerCAmelCase_						,return_tensors="""pt"""	).pixel_values

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






     def     SCREAMING_SNAKE_CASE__  (							self						:   List[Any]						,lowerCamelCase__						:   Optional[Any]	)					->		Union[str, Any]:




           '''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=lowerCAmelCase_						,pad_token_id=self.pre_processor.tokenizer.pad_token_id						,eos_token_id=self.pre_processor.tokenizer.eos_token_id						,use_cache=lowerCAmelCase_						,num_beams=1						,bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]						,return_dict_in_generate=lowerCAmelCase_						,).sequences






     def     SCREAMING_SNAKE_CASE__  (							self						:   List[Any]						,lowerCamelCase__						:   Any	)					->		Dict:




           '''simple docstring'''


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

           return sequence["answer"]









def        __lowercase       (				_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE     )			->       int:


      '''simple docstring'''


      if index == number_of_items:
            return 0
      SCREAMING_SNAKE_CASE		=						0
      SCREAMING_SNAKE_CASE		=						0
      SCREAMING_SNAKE_CASE		=						knapsack(_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						index + 1     )
      if weights[index] <= max_weight:
            SCREAMING_SNAKE_CASE		=						values[index] + knapsack(
                _SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE			,						max_weight - weights[index]			,						index + 1     )
      return max(_SCREAMING_SNAKE_CASE			,						_SCREAMING_SNAKE_CASE     )


if __name__ == "__main__":
      import doctest

      doctest.testmod()


