



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





       @staticmethod
       def 	__lowerCAmelCase							(	*_lowerCAmelCase       ,     **_lowerCAmelCase			):
             pass






    def 							UpperCAmelCase__		(				_SCREAMING_SNAKE_CASE   :	List[str]				)->Optional[int]:
          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.
UpperCAmelCase_									=							(
    "https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"
)





@is_pipeline_test
@require_torch
@require_vision
class 		UpperCAmelCase						(						unittest.TestCase				):
   SCREAMING_SNAKE_CASE__							=     MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING





   @require_pytesseract
   @require_vision
   def 	__lowerCAmelCase							(	self       ,     _lowerCAmelCase       ,     _lowerCAmelCase       ,     _lowerCAmelCase			):
         _lowerCAmelCase 			=  pipeline(
             '''document-question-answering'''       ,     model=_lowerCAmelCase       ,     tokenizer=_lowerCAmelCase       ,     image_processor=_lowerCAmelCase			)

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





   def 	__lowerCAmelCase							(	self       ,     _lowerCAmelCase       ,     _lowerCAmelCase			):
         _lowerCAmelCase 			=  dqa_pipeline(_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(
             _lowerCAmelCase       ,     [
                 [
                     {'''score''': ANY(_lowerCAmelCase			), '''answer''': ANY(_lowerCAmelCase			), '''start''': ANY(_lowerCAmelCase			), '''end''': ANY(_lowerCAmelCase			)},
                     {'''score''': ANY(_lowerCAmelCase			), '''answer''': ANY(_lowerCAmelCase			), '''start''': ANY(_lowerCAmelCase			), '''end''': ANY(_lowerCAmelCase			)},
                 ]
             ]
             * 3       ,     )





   @require_torch
   @require_detectrona
   @require_pytesseract
   def 	__lowerCAmelCase							(	self			):
         _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=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(nested_simplify(_lowerCAmelCase       ,     decimals=4			)       ,     _lowerCAmelCase			)

         _lowerCAmelCase 			=  dqa_pipeline({'''image''': image, '''question''': question}       ,     top_k=2			)
         self.assertEqual(nested_simplify(_lowerCAmelCase       ,     decimals=4			)       ,     _lowerCAmelCase			)

         # 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=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(_lowerCAmelCase       ,     []			)

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





   @slow
   @require_torch
   @require_detectrona
   @require_pytesseract
   def 	__lowerCAmelCase							(	self			):
         _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=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(
             nested_simplify(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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 	__lowerCAmelCase							(	self			):
         _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=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(
             nested_simplify(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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 	__lowerCAmelCase							(	self			):
         _lowerCAmelCase 			=  AutoTokenizer.from_pretrained(
             '''impira/layoutlm-document-qa'''       ,     revision='''3dc6de3'''       ,     add_prefix_space=_lowerCAmelCase			)
         _lowerCAmelCase 			=  pipeline(
             '''document-question-answering'''       ,     model='''impira/layoutlm-document-qa'''       ,     tokenizer=_lowerCAmelCase       ,     revision='''3dc6de3'''       ,     )
         _lowerCAmelCase 			=  INVOICE_URL
         _lowerCAmelCase 			=  '''What is the invoice number?'''

         _lowerCAmelCase 			=  dqa_pipeline(image=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(
             nested_simplify(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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(_lowerCAmelCase			)       ,     _lowerCAmelCase       ,     ''''''			)			)			)

         # 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(_lowerCAmelCase       ,     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 	__lowerCAmelCase							(	self			):
         _lowerCAmelCase 			=  AutoTokenizer.from_pretrained(
             '''impira/layoutlm-document-qa'''       ,     revision='''3dc6de3'''       ,     add_prefix_space=_lowerCAmelCase			)
         _lowerCAmelCase 			=  pipeline(
             '''document-question-answering'''       ,     model='''impira/layoutlm-document-qa'''       ,     tokenizer=_lowerCAmelCase       ,     revision='''3dc6de3'''       ,     max_seq_len=50       ,     )
         _lowerCAmelCase 			=  INVOICE_URL
         _lowerCAmelCase 			=  '''What is the invoice number?'''

         _lowerCAmelCase 			=  dqa_pipeline(image=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(
             nested_simplify(_lowerCAmelCase       ,     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(_lowerCAmelCase       ,     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(_lowerCAmelCase			)       ,     _lowerCAmelCase       ,     ''''''			)			)			)

         # 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(_lowerCAmelCase       ,     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 	__lowerCAmelCase							(	self			):
         _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=_lowerCAmelCase       ,     question=_lowerCAmelCase       ,     top_k=2			)
         self.assertEqual(nested_simplify(_lowerCAmelCase       ,     decimals=4			)       ,     [{'''answer''': '''us-001'''}]			)





   @require_tf
   @unittest.skip('''Document question answering not implemented in TF'''			)
   def 	__lowerCAmelCase							(	self			):
         pass




from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_tf_available,
    is_torch_available,
    is_vision_available,
)


UpperCAmelCase_									=							{"configuration_deit": ["DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP", "DeiTConfig", "DeiTOnnxConfig"]}

try:
    if not is_vision_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    UpperCAmelCase_									=							["DeiTFeatureExtractor"]
    UpperCAmelCase_									=							["DeiTImageProcessor"]

try:
    if not is_torch_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    UpperCAmelCase_									=							[
        "DEIT_PRETRAINED_MODEL_ARCHIVE_LIST",
        "DeiTForImageClassification",
        "DeiTForImageClassificationWithTeacher",
        "DeiTForMaskedImageModeling",
        "DeiTModel",
        "DeiTPreTrainedModel",
    ]

try:
    if not is_tf_available():
        raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
    pass
else:
    UpperCAmelCase_									=							[
        "TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST",
        "TFDeiTForImageClassification",
        "TFDeiTForImageClassificationWithTeacher",
        "TFDeiTForMaskedImageModeling",
        "TFDeiTModel",
        "TFDeiTPreTrainedModel",
    ]


if TYPE_CHECKING:
    from .configuration_deit import DEIT_PRETRAINED_CONFIG_ARCHIVE_MAP, DeiTConfig, DeiTOnnxConfig

    try:
        if not is_vision_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .feature_extraction_deit import DeiTFeatureExtractor
        from .image_processing_deit import DeiTImageProcessor

    try:
        if not is_torch_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .modeling_deit import (
            DEIT_PRETRAINED_MODEL_ARCHIVE_LIST,
            DeiTForImageClassification,
            DeiTForImageClassificationWithTeacher,
            DeiTForMaskedImageModeling,
            DeiTModel,
            DeiTPreTrainedModel,
        )

    try:
        if not is_tf_available():
            raise OptionalDependencyNotAvailable()
    except OptionalDependencyNotAvailable:
        pass
    else:
        from .modeling_tf_deit import (
            TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST,
            TFDeiTForImageClassification,
            TFDeiTForImageClassificationWithTeacher,
            TFDeiTForMaskedImageModeling,
            TFDeiTModel,
            TFDeiTPreTrainedModel,
        )


else:
    import sys

    UpperCAmelCase_									=							_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)