





# 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 		snake_case_   (							UpperCAmelCase_						):







	'''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							:     int					,      *__lowerCamelCase							:     List[Any]					,      **__lowerCamelCase							:     Tuple   )       -> Tuple:

			'''simple docstring'''




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

			super().__init__(*__lowerCamelCase					,      **__lowerCamelCase   )




	def    UpperCAmelCase			(						self							:     Optional[Any]					,      __lowerCamelCase							:     "Image"					,      __lowerCamelCase							:     str   )       -> Tuple:

			'''simple docstring'''




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

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




	def    UpperCAmelCase			(						self							:     str					,      __lowerCamelCase							:     Union[str, Any]   )       -> int:

			'''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    UpperCAmelCase			(						self							:     int					,      __lowerCamelCase							:     Optional[Any]   )       -> Optional[Any]:

			'''simple docstring'''




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

			return sequence["answer"]











from math import factorial



def  SCREAMING_SNAKE_CASE				(      snake_case						,   snake_case							)		->    int:

		# If either of the conditions are true, the function is being asked
		# to calculate a factorial of a negative number, which is not possible
		if n < k or k < 0:
				raise ValueError('Please enter positive integers for n and k where n >= k'							)
		return factorial(snake_case							) // (factorial(snake_case							) * factorial(n - k							))


if __name__ == "__main__":
		print(
		    '''The number of five-card hands possible from a standard''',
		    F"""fifty-two card deck is: {combinations(52, 5)}\n""",
		)

		print(
		    '''If a class of 40 students must be arranged into groups of''',
		    F"""4 for group projects, there are {combinations(40, 4)} ways""",
		    '''to arrange them.\n''',
		)

		print(
		    '''If 10 teams are competing in a Formula One race, there''',
		    F"""are {combinations(10, 3)} ways that first, second and""",
		    '''third place can be awarded.''',
		)




