






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      lowercase__     :

		@staticmethod
		def 		UpperCAmelCase  (							*__UpperCAmelCase		,    **__UpperCAmelCase       )->					List[Any]:







								'''simple docstring'''





								pass





	def        _a  (     UpperCamelCase_					:				Optional[int]   ) ->   Union[str, Any]:
							"""simple docstring"""







							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.
a_							=    (
    '''https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png'''
)


@is_pipeline_test
@require_torch
@require_vision
class      lowercase__     (			unittest.TestCase	):
	a_         =MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING

	@require_pytesseract
	@require_vision
	def 		UpperCAmelCase  (							self		,    __UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )->					str:







							'''simple docstring'''





							lowerCAmelCase__       =						pipeline(
							    "document-question-answering"		,    model=__UpperCAmelCase		,    tokenizer=__UpperCAmelCase		,    image_processor=__UpperCAmelCase       )

							lowerCAmelCase__       =						INVOICE_URL
							lowerCAmelCase__       =						list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )		,    __UpperCAmelCase		,    ""       )       )       )
							lowerCAmelCase__       =						"What is the placebo?"
							lowerCAmelCase__       =						[
							    {
							        "image": load_image(__UpperCAmelCase       ),
							        "question": question,
							    },
							    {
							        "image": image,
							        "question": question,
							    },
							    {
							        "image": image,
							        "question": question,
							        "word_boxes": word_boxes,
							    },
							]
							return dqa_pipeline, examples

	def 		UpperCAmelCase  (							self		,    __UpperCAmelCase		,    __UpperCAmelCase       )->					int:







							'''simple docstring'''





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

	@require_torch
	@require_detectrona
	@require_pytesseract
	def 		UpperCAmelCase  (							self       )->					Dict:







							'''simple docstring'''





							lowerCAmelCase__       =						pipeline("document-question-answering"		,    model="hf-internal-testing/tiny-random-layoutlmv2"       )
							lowerCAmelCase__       =						INVOICE_URL
							lowerCAmelCase__       =						"How many cats are there?"

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

							lowerCAmelCase__       =						dqa_pipeline({"image": image, "question": question}		,    top_k=2       )
							self.assertEqual(nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    __UpperCAmelCase       )

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

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

	@slow
	@require_torch
	@require_detectrona
	@require_pytesseract
	def 		UpperCAmelCase  (							self       )->					Optional[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						pipeline(
							    "document-question-answering"		,    model="tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"		,    revision="9977165"		,    )
							lowerCAmelCase__       =						INVOICE_URL
							lowerCAmelCase__       =						"What is the invoice number?"

							lowerCAmelCase__       =						dqa_pipeline(image=__UpperCAmelCase		,    question=__UpperCAmelCase		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.9_944, "answer": "us-001", "start": 16, "end": 16},
							        {"score": 0.0_009, "answer": "us-001", "start": 16, "end": 16},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline({"image": image, "question": question}		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.9_944, "answer": "us-001", "start": 16, "end": 16},
							        {"score": 0.0_009, "answer": "us-001", "start": 16, "end": 16},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline(
							    [{"image": image, "question": question}, {"image": image, "question": question}]		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        [
							            {"score": 0.9_944, "answer": "us-001", "start": 16, "end": 16},
							            {"score": 0.0_009, "answer": "us-001", "start": 16, "end": 16},
							        ],
							    ]
							    * 2		,    )

	@slow
	@require_torch
	@require_detectrona
	@require_pytesseract
	def 		UpperCAmelCase  (							self       )->					Any:







							'''simple docstring'''





							lowerCAmelCase__       =						pipeline(
							    "document-question-answering"		,    model="tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa"		,    revision="9977165"		,    max_seq_len=50		,    )
							lowerCAmelCase__       =						INVOICE_URL
							lowerCAmelCase__       =						"What is the invoice number?"

							lowerCAmelCase__       =						dqa_pipeline(image=__UpperCAmelCase		,    question=__UpperCAmelCase		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.9_974, "answer": "1110212019", "start": 23, "end": 23},
							        {"score": 0.9_948, "answer": "us-001", "start": 16, "end": 16},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline({"image": image, "question": question}		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.9_974, "answer": "1110212019", "start": 23, "end": 23},
							        {"score": 0.9_948, "answer": "us-001", "start": 16, "end": 16},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline(
							    [{"image": image, "question": question}, {"image": image, "question": question}]		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        [
							            {"score": 0.9_974, "answer": "1110212019", "start": 23, "end": 23},
							            {"score": 0.9_948, "answer": "us-001", "start": 16, "end": 16},
							        ]
							    ]
							    * 2		,    )

	@slow
	@require_torch
	@require_pytesseract
	@require_vision
	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





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

							lowerCAmelCase__       =						dqa_pipeline(image=__UpperCAmelCase		,    question=__UpperCAmelCase		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.4_251, "answer": "us-001", "start": 16, "end": 16},
							        {"score": 0.0_819, "answer": "1110212019", "start": 23, "end": 23},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline({"image": image, "question": question}		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.4_251, "answer": "us-001", "start": 16, "end": 16},
							        {"score": 0.0_819, "answer": "1110212019", "start": 23, "end": 23},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline(
							    [{"image": image, "question": question}, {"image": image, "question": question}]		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        [
							            {"score": 0.4_251, "answer": "us-001", "start": 16, "end": 16},
							            {"score": 0.0_819, "answer": "1110212019", "start": 23, "end": 23},
							        ]
							    ]
							    * 2		,    )

							lowerCAmelCase__       =						list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )		,    __UpperCAmelCase		,    ""       )       )       )

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

	@slow
	@require_torch
	@require_pytesseract
	@require_vision
	def 		UpperCAmelCase  (							self       )->					Optional[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						AutoTokenizer.from_pretrained(
							    "impira/layoutlm-document-qa"		,    revision="3dc6de3"		,    add_prefix_space=__UpperCAmelCase       )
							lowerCAmelCase__       =						pipeline(
							    "document-question-answering"		,    model="impira/layoutlm-document-qa"		,    tokenizer=__UpperCAmelCase		,    revision="3dc6de3"		,    max_seq_len=50		,    )
							lowerCAmelCase__       =						INVOICE_URL
							lowerCAmelCase__       =						"What is the invoice number?"

							lowerCAmelCase__       =						dqa_pipeline(image=__UpperCAmelCase		,    question=__UpperCAmelCase		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        {"score": 0.9_999, "answer": "us-001", "start": 16, "end": 16},
							        {"score": 0.9_998, "answer": "us-001", "start": 16, "end": 16},
							    ]		,    )

							lowerCAmelCase__       =						dqa_pipeline(
							    [{"image": image, "question": question}, {"image": image, "question": question}]		,    top_k=2       )
							self.assertEqual(
							    nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [
							        [
							            {"score": 0.9_999, "answer": "us-001", "start": 16, "end": 16},
							            {"score": 0.9_998, "answer": "us-001", "start": 16, "end": 16},
							        ]
							    ]
							    * 2		,    )

							lowerCAmelCase__       =						list(zip(*apply_tesseract(load_image(__UpperCAmelCase       )		,    __UpperCAmelCase		,    ""       )       )       )

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

	@slow
	@require_torch
	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						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__       =						INVOICE_URL
							lowerCAmelCase__       =						"What is the invoice number?"
							lowerCAmelCase__       =						dqa_pipeline(image=__UpperCAmelCase		,    question=__UpperCAmelCase		,    top_k=2       )
							self.assertEqual(nested_simplify(__UpperCAmelCase		,    decimals=4       )		,    [{"answer": "us-001"}]       )


	@require_tf
	@unittest.skip("Document question answering not implemented in TF"       )
	def 		UpperCAmelCase  (							self       )->					int:







							'''simple docstring'''





							pass














from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


a_							=    {'''configuration_sew''': ['''SEW_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''SEWConfig''']}

try:
	if not is_torch_available():
		raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
	pass
else:
	a_							=    [
	    '''SEW_PRETRAINED_MODEL_ARCHIVE_LIST''',
	    '''SEWForCTC''',
	    '''SEWForSequenceClassification''',
	    '''SEWModel''',
	    '''SEWPreTrainedModel''',
	]

if TYPE_CHECKING:
	from .configuration_sew import SEW_PRETRAINED_CONFIG_ARCHIVE_MAP, SEWConfig

	try:
		if not is_torch_available():
			raise OptionalDependencyNotAvailable()
	except OptionalDependencyNotAvailable:
		pass
	else:
		from .modeling_sew import (
		    SEW_PRETRAINED_MODEL_ARCHIVE_LIST,
		    SEWForCTC,
		    SEWForSequenceClassification,
		    SEWModel,
		    SEWPreTrainedModel,
		)


else:
	import sys

	a_							=    _LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)






