



# 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  __lowerCAmelCase     (	UpperCAmelCase_   ):
	lowerCAmelCase__       					=  "naver-clova-ix/donut-base-finetuned-docvqa"
	lowerCAmelCase__       					=  (
	    "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."
	)
	lowerCAmelCase__       					=  "document_qa"
	lowerCAmelCase__       					=  AutoProcessor
	lowerCAmelCase__       					=  VisionEncoderDecoderModel

	lowerCAmelCase__       					=  ["image", "text"]
	lowerCAmelCase__       					=  ["text"]




	def __init__(						self	,				*__UpperCAmelCase	,				**__UpperCAmelCase				):



				'''simple docstring'''


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

				super().__init__(*_snake_case	,				**_snake_case				)




	def        lowerCamelCase      (						self	,				__UpperCAmelCase	,				__UpperCAmelCase				):



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

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




	def        lowerCamelCase      (						self	,				__UpperCAmelCase				):



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




	def        lowerCamelCase      (						self	,				__UpperCAmelCase				):



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

				return sequence["answer"]











import unittest

from transformers import RoFormerTokenizer, RoFormerTokenizerFast
from transformers.testing_utils import require_rjieba, require_tokenizers

from ...test_tokenization_common import TokenizerTesterMixin



@require_rjieba
@require_tokenizers
class  __lowerCAmelCase     (	lowerCAmelCase__  ,	unittest.TestCase   ):
 lowerCAmelCase__       					=  RoFormerTokenizer
 lowerCAmelCase__       					=  RoFormerTokenizerFast
 lowerCAmelCase__       					=  True
 lowerCAmelCase__       					=  True




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    super().setUp()




 def        lowerCamelCase      (						self	,				**__UpperCAmelCase				):



    '''simple docstring'''
    return self.tokenizer_class.from_pretrained('''junnyu/roformer_chinese_base'''	,				**__UpperCAmelCase				)




 def        lowerCamelCase      (						self	,				**__UpperCAmelCase				):



    '''simple docstring'''
    return self.rust_tokenizer_class.from_pretrained('''junnyu/roformer_chinese_base'''	,				**__UpperCAmelCase				)




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    __lowerCamelCase													=    '''永和服装饰品有限公司,今天天气非常好'''
    __lowerCamelCase													=    '''永和 服装 饰品 有限公司 , 今 天 天 气 非常 好'''
    return input_text, output_text




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    __lowerCamelCase													=    self.get_tokenizer()
    __lowerCamelCase							,__lowerCamelCase													=    self.get_chinese_input_output_texts()
    __lowerCamelCase													=    tokenizer.tokenize(__UpperCAmelCase				)

    self.assertListEqual(__UpperCAmelCase	,				output_text.split()				)

    __lowerCamelCase													=    tokens + [tokenizer.unk_token]
    __lowerCamelCase													=    [22943, 21332, 34431, 45904, 117, 306, 1231, 1231, 2653, 33994, 1266, 100]
    self.assertListEqual(tokenizer.convert_tokens_to_ids(__UpperCAmelCase				)	,				__UpperCAmelCase				)




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    __lowerCamelCase													=    self.get_rust_tokenizer()
    __lowerCamelCase							,__lowerCamelCase													=    self.get_chinese_input_output_texts()
    __lowerCamelCase													=    tokenizer.tokenize(__UpperCAmelCase				)
    self.assertListEqual(__UpperCAmelCase	,				output_text.split()				)
    __lowerCamelCase													=    tokens + [tokenizer.unk_token]
    __lowerCamelCase													=    [22943, 21332, 34431, 45904, 117, 306, 1231, 1231, 2653, 33994, 1266, 100]
    self.assertListEqual(tokenizer.convert_tokens_to_ids(__UpperCAmelCase				)	,				__UpperCAmelCase				)




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    pass




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    pass




 def        lowerCamelCase      (						self				):



    '''simple docstring'''
    pass






