
import unittest

from transformers import MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING, AutoTokenizer, is_vision_available
from transformers.pipelines import pipeline
from transformers.pipelines.document_question_answering import apply_tesseract
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_detectrona,
    require_pytesseract,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
					from PIL import Image

					from transformers.image_utils import load_image
else:







					class      A__							:






									@staticmethod
									def 							_lowerCamelCase		(						*a					:      Optional[int]    ,     **a					:      Tuple   ):






												'''simple docstring'''







												pass






					def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_     )				->		Tuple:
								return None


# This is a pinned image from a specific revision of a document question answering space, hosted by HuggingFace,
# so we can expect it to be available.
lowerCamelCase__          =		(
    '''https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png'''
)







@is_pipeline_test
@require_torch
@require_vision
class      A__							(     unittest.TestCase	):
				lowercase			    =  MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING






				@require_pytesseract
				@require_vision
				def 							_lowerCamelCase		(						self					:      List[Any]    ,     a					:      Dict    ,     a					:      List[str]    ,     a					:      Optional[int]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      List[str]         =		pipeline(
							    'document-question-answering'    ,     model=a    ,     tokenizer=a    ,     image_processor=a   )

							lowerCAmelCase__      :      Dict         =		INVOICE_URL
							lowerCAmelCase__      :      Union[str, Any]         =		list(zip(*apply_tesseract(load_image(a   )    ,     a    ,     ''   )   )   )
							lowerCAmelCase__      :      Optional[Any]         =		"What is the placebo?"
							lowerCAmelCase__      :      List[Any]         =		[
							    {
							        "image": load_image(a   ),
							        "question": question,
							    },
							    {
							        "image": image,
							        "question": question,
							    },
							    {
							        "image": image,
							        "question": question,
							        "word_boxes": word_boxes,
							    },
							]
							return dqa_pipeline, examples






				def 							_lowerCamelCase		(						self					:      Tuple    ,     a					:      str    ,     a					:      Optional[int]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      str         =		dqa_pipeline(a    ,     top_k=2   )
							self.assertEqual(
							    a    ,     [
							        [
							            {'score': ANY(a   ), 'answer': ANY(a   ), 'start': ANY(a   ), 'end': ANY(a   )},
							            {'score': ANY(a   ), 'answer': ANY(a   ), 'start': ANY(a   ), 'end': ANY(a   )},
							        ]
							    ]
							    * 3    ,     )






				@require_torch
				@require_detectrona
				@require_pytesseract
				def 							_lowerCamelCase		(						self					:      Optional[int]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Union[str, Any]         =		pipeline('document-question-answering'    ,     model='hf-internal-testing/tiny-random-layoutlmv2'   )
							lowerCAmelCase__      :      str         =		INVOICE_URL
							lowerCAmelCase__      :      Optional[int]         =		"How many cats are there?"

							lowerCAmelCase__      :      Optional[Any]         =		[
							    {"score": 0.0_0_0_1, "answer": "oy 2312/2019", "start": 38, "end": 39},
							    {"score": 0.0_0_0_1, "answer": "oy 2312/2019 DUE", "start": 38, "end": 40},
							]
							lowerCAmelCase__      :      Any         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(nested_simplify(a    ,     decimals=4   )    ,     a   )

							lowerCAmelCase__      :      Union[str, Any]         =		dqa_pipeline({'image': image, 'question': question}    ,     top_k=2   )
							self.assertEqual(nested_simplify(a    ,     decimals=4   )    ,     a   )

							# This image does not detect ANY text in it, meaning layoutlmv2 should fail.
							# Empty answer probably
							lowerCAmelCase__      :      Union[str, Any]         =		"./tests/fixtures/tests_samples/COCO/000000039769.png"
							lowerCAmelCase__      :      List[str]         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(a    ,     []   )

							# We can optionnally pass directly the words and bounding boxes
							lowerCAmelCase__      :      List[Any]         =		"./tests/fixtures/tests_samples/COCO/000000039769.png"
							lowerCAmelCase__      :      Any         =		[]
							lowerCAmelCase__      :      Dict         =		[]
							lowerCAmelCase__      :      Optional[Any]         =		dqa_pipeline(image=a    ,     question=a    ,     words=a    ,     boxes=a    ,     top_k=2   )
							self.assertEqual(a    ,     []   )






				@slow
				@require_torch
				@require_detectrona
				@require_pytesseract
				def 							_lowerCamelCase		(						self					:      Optional[Any]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Optional[Any]         =		pipeline(
							    'document-question-answering'    ,     model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'    ,     revision='9977165'    ,     )
							lowerCAmelCase__      :      Tuple         =		INVOICE_URL
							lowerCAmelCase__      :      Optional[int]         =		"What is the invoice number?"

							lowerCAmelCase__      :      Dict         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )

							lowerCAmelCase__      :      Any         =		dqa_pipeline({'image': image, 'question': question}    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )

							lowerCAmelCase__      :      str         =		dqa_pipeline(
							    [{'image': image, 'question': question}, {'image': image, 'question': question}]    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        [
							            {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 16, 'end': 16},
							            {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							        ],
							    ]
							    * 2    ,     )






				@slow
				@require_torch
				@require_detectrona
				@require_pytesseract
				def 							_lowerCamelCase		(						self					:      Optional[Any]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      int         =		pipeline(
							    'document-question-answering'    ,     model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'    ,     revision='9977165'    ,     max_seq_len=50    ,     )
							lowerCAmelCase__      :      List[Any]         =		INVOICE_URL
							lowerCAmelCase__      :      List[str]         =		"What is the invoice number?"

							lowerCAmelCase__      :      str         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 23, 'end': 23},
							        {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )

							lowerCAmelCase__      :      Any         =		dqa_pipeline({'image': image, 'question': question}    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 23, 'end': 23},
							        {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )

							lowerCAmelCase__      :      List[str]         =		dqa_pipeline(
							    [{'image': image, 'question': question}, {'image': image, 'question': question}]    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        [
							            {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 23, 'end': 23},
							            {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							        ]
							    ]
							    * 2    ,     )






				@slow
				@require_torch
				@require_pytesseract
				@require_vision
				def 							_lowerCamelCase		(						self					:      Union[str, Any]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Dict         =		AutoTokenizer.from_pretrained(
							    'impira/layoutlm-document-qa'    ,     revision='3dc6de3'    ,     add_prefix_space=a   )
							lowerCAmelCase__      :      Any         =		pipeline(
							    'document-question-answering'    ,     model='impira/layoutlm-document-qa'    ,     tokenizer=a    ,     revision='3dc6de3'    ,     )
							lowerCAmelCase__      :      str         =		INVOICE_URL
							lowerCAmelCase__      :      str         =		"What is the invoice number?"

							lowerCAmelCase__      :      Tuple         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 23, 'end': 23},
							    ]    ,     )

							lowerCAmelCase__      :      str         =		dqa_pipeline({'image': image, 'question': question}    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 23, 'end': 23},
							    ]    ,     )

							lowerCAmelCase__      :      List[Any]         =		dqa_pipeline(
							    [{'image': image, 'question': question}, {'image': image, 'question': question}]    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        [
							            {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 16, 'end': 16},
							            {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 23, 'end': 23},
							        ]
							    ]
							    * 2    ,     )

							lowerCAmelCase__      :      Dict         =		list(zip(*apply_tesseract(load_image(a   )    ,     a    ,     ''   )   )   )

							# This model should also work if `image` is set to None
							lowerCAmelCase__      :      Any         =		dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 23, 'end': 23},
							    ]    ,     )






				@slow
				@require_torch
				@require_pytesseract
				@require_vision
				def 							_lowerCamelCase		(						self					:      Tuple   ):






							'''simple docstring'''







							lowerCAmelCase__      :      List[str]         =		AutoTokenizer.from_pretrained(
							    'impira/layoutlm-document-qa'    ,     revision='3dc6de3'    ,     add_prefix_space=a   )
							lowerCAmelCase__      :      Any         =		pipeline(
							    'document-question-answering'    ,     model='impira/layoutlm-document-qa'    ,     tokenizer=a    ,     revision='3dc6de3'    ,     max_seq_len=50    ,     )
							lowerCAmelCase__      :      List[str]         =		INVOICE_URL
							lowerCAmelCase__      :      Any         =		"What is the invoice number?"

							lowerCAmelCase__      :      Optional[Any]         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )

							lowerCAmelCase__      :      List[str]         =		dqa_pipeline(
							    [{'image': image, 'question': question}, {'image': image, 'question': question}]    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        [
							            {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							            {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							        ]
							    ]
							    * 2    ,     )

							lowerCAmelCase__      :      List[str]         =		list(zip(*apply_tesseract(load_image(a   )    ,     a    ,     ''   )   )   )

							# This model should also work if `image` is set to None
							lowerCAmelCase__      :      Tuple         =		dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}    ,     top_k=2   )
							self.assertEqual(
							    nested_simplify(a    ,     decimals=4   )    ,     [
							        {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 16, 'end': 16},
							        {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 16, 'end': 16},
							    ]    ,     )






				@slow
				@require_torch
				def 							_lowerCamelCase		(						self					:      Dict   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Optional[int]         =		pipeline(
							    'document-question-answering'    ,     model='naver-clova-ix/donut-base-finetuned-docvqa'    ,     tokenizer=AutoTokenizer.from_pretrained('naver-clova-ix/donut-base-finetuned-docvqa'   )    ,     feature_extractor='naver-clova-ix/donut-base-finetuned-docvqa'    ,     )

							lowerCAmelCase__      :      List[str]         =		INVOICE_URL
							lowerCAmelCase__      :      List[Any]         =		"What is the invoice number?"
							lowerCAmelCase__      :      Optional[Any]         =		dqa_pipeline(image=a    ,     question=a    ,     top_k=2   )
							self.assertEqual(nested_simplify(a    ,     decimals=4   )    ,     [{'answer': 'us-001'}]   )






				@require_tf
				@unittest.skip('Document question answering not implemented in TF'   )
				def 							_lowerCamelCase		(						self					:      Optional[int]   ):






							'''simple docstring'''







							pass







from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


lowerCamelCase	:							Tuple				={
    '''configuration_luke''': ['''LUKE_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''LukeConfig'''],
    '''tokenization_luke''': ['''LukeTokenizer'''],
}

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase	:							Union[str, Any]				=[
     '''LUKE_PRETRAINED_MODEL_ARCHIVE_LIST''',
     '''LukeForEntityClassification''',
     '''LukeForEntityPairClassification''',
     '''LukeForEntitySpanClassification''',
     '''LukeForMultipleChoice''',
     '''LukeForQuestionAnswering''',
     '''LukeForSequenceClassification''',
     '''LukeForTokenClassification''',
     '''LukeForMaskedLM''',
     '''LukeModel''',
     '''LukePreTrainedModel''',
 ]


if TYPE_CHECKING:
 from .configuration_luke import LUKE_PRETRAINED_CONFIG_ARCHIVE_MAP, LukeConfig
 from .tokenization_luke import LukeTokenizer

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_luke import (
      LUKE_PRETRAINED_MODEL_ARCHIVE_LIST,
      LukeForEntityClassification,
      LukeForEntityPairClassification,
      LukeForEntitySpanClassification,
      LukeForMaskedLM,
      LukeForMultipleChoice,
      LukeForQuestionAnswering,
      LukeForSequenceClassification,
      LukeForTokenClassification,
      LukeModel,
      LukePreTrainedModel,
  )

else:
 import sys

 lowerCamelCase	:							Dict				=_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)