






'''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_					(    __A				):




      """simple docstring"""




      UpperCamelCase_								=			'''naver-clova-ix/donut-base-finetuned-docvqa'''
      UpperCamelCase_								=			(
          '''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.'''
      )
      UpperCamelCase_								=			'''document_qa'''
      UpperCamelCase_								=			AutoProcessor
      UpperCamelCase_								=			VisionEncoderDecoderModel

      UpperCamelCase_								=			['''image''', '''text''']
      UpperCamelCase_								=			['''text''']






      def __init__( self			:		Union[str, Any]     ,      *UpperCAmelCase			:		Union[str, Any]     ,      **UpperCAmelCase			:		Tuple		)  ->  Tuple:


       '''simple docstring'''

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

       super().__init__(*UpperCAmelCase     ,      **UpperCAmelCase		)






      def 				A__      ( self			:		Any     ,      UpperCAmelCase			:		"Image"     ,      UpperCAmelCase			:		str		)  ->  int:


       '''simple docstring'''

       lowercase					:   int				  ='''<s_docvqa><s_question>{user_input}</s_question><s_answer>'''
       lowercase					:   Union[str, Any]				  =task_prompt.replace('''{user_input}'''     ,      UpperCAmelCase		)
       lowercase					:   str				  =self.pre_processor.tokenizer(
           UpperCAmelCase     ,      add_special_tokens=UpperCAmelCase     ,      return_tensors='''pt'''		).input_ids
       lowercase					:   Optional[int]				  =self.pre_processor(UpperCAmelCase     ,      return_tensors='''pt'''		).pixel_values

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






      def 				A__      ( self			:		Tuple     ,      UpperCAmelCase			:		List[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=UpperCAmelCase     ,      pad_token_id=self.pre_processor.tokenizer.pad_token_id     ,      eos_token_id=self.pre_processor.tokenizer.eos_token_id     ,      use_cache=UpperCAmelCase     ,      num_beams=1     ,      bad_words_ids=[[self.pre_processor.tokenizer.unk_token_id]]     ,      return_dict_in_generate=UpperCAmelCase     ,      ).sequences






      def 				A__      ( self			:		str     ,      UpperCAmelCase			:		Dict		)  ->  int:


       '''simple docstring'''

       lowercase					:   Dict				  =self.pre_processor.batch_decode(UpperCAmelCase		)[0]
       lowercase					:   Tuple				  =sequence.replace(self.pre_processor.tokenizer.eos_token     ,      ''''''		)
       lowercase					:   Optional[Any]				  =sequence.replace(self.pre_processor.tokenizer.pad_token     ,      ''''''		)
       lowercase					:   List[str]				  =re.sub(R'''<.*?>'''     ,      ''''''     ,      UpperCAmelCase     ,      count=1		).strip()  # remove first task start token
       lowercase					:   Union[str, Any]				  =self.pre_processor.tokenajson(UpperCAmelCase		)

       return sequence["answer"]











'''simple docstring'''



def 							lowercase_				(    __A :       int					,      __A :       int			)       ->      str:



 """simple docstring"""




 if number < 0 or shift_amount < 0:
  raise ValueError('''both inputs must be positive integers'''			)

 lowercase					:   List[Any]				  =str(bin(__A			)			)
 binary_number += "0" * shift_amount
 return binary_number


def 							lowercase_				(    __A :       int					,      __A :       int			)       ->      str:



 """simple docstring"""




 if number < 0 or shift_amount < 0:
  raise ValueError('''both inputs must be positive integers'''			)

 lowercase					:   Union[str, Any]				  =str(bin(__A			)			)[2:]
 if shift_amount >= len(__A			):
  return "0b0"
 lowercase					:   Any				  =binary_number[: len(__A			) - shift_amount]
 return "0b" + shifted_binary_number


def 							lowercase_				(    __A :       int					,      __A :       int			)       ->      str:



 """simple docstring"""




 if number >= 0:  # Get binary representation of positive number
  lowercase					:   str				  ='''0''' + str(bin(__A			)			).strip('''-'''			)[2:]
 else:  # Get binary (2's complement) representation of negative number
  lowercase					:   Dict				  =len(bin(__A			)[3:]			)  # Find 2's complement of number
  lowercase					:   Optional[Any]				  =bin(abs(__A			) - (1 << binary_number_length)			)[3:]
  lowercase					:   int				  =(
      '''1''' + '''0''' * (binary_number_length - len(__A			)) + binary_number
  )

 if shift_amount >= len(__A			):
  return "0b" + binary_number[0] * len(__A			)
 return (
     "0b"
     + binary_number[0] * shift_amount
     + binary_number[: len(__A			) - shift_amount]
 )


if __name__ == "__main__":
      import doctest

      doctest.testmod()



