



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 		snake_case_		(				*a__ ,						**a__):
            pass







   def 		lowerCAmelCase__    (					UpperCamelCase_				:       Dict	)->  List[str]:
       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.
_lowercase						  =		(
    "https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"
)



@is_pipeline_test
@require_torch
@require_vision
class     _UpperCAmelCase			(       unittest.TestCase     ):
     UpperCamelCase__		    =				MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING




     @require_pytesseract
     @require_vision
     def 		snake_case_		(				self ,						a__ ,						a__ ,						a__):
         A__		 =					pipeline(
             '''document-question-answering''' ,						model=a__ ,						tokenizer=a__ ,						image_processor=a__)

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




     def 		snake_case_		(				self ,						a__ ,						a__):
         A__		 =					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 		snake_case_		(				self):
         A__		 =					pipeline('''document-question-answering''' ,						model='''hf-internal-testing/tiny-random-layoutlmv2''')
         A__		 =					INVOICE_URL
         A__		 =					'''How many cats are there?'''

         A__		 =					[
             {'''score''': 0.0_0_0_1, '''answer''': '''oy 2312/2019''', '''start''': 3_8, '''end''': 3_9},
             {'''score''': 0.0_0_0_1, '''answer''': '''oy 2312/2019 DUE''', '''start''': 3_8, '''end''': 4_0},
         ]
         A__		 =					dqa_pipeline(image=a__ ,						question=a__ ,						top_k=2)
         self.assertEqual(nested_simplify(a__ ,						decimals=4) ,						a__)

         A__		 =					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
         A__		 =					'''./tests/fixtures/tests_samples/COCO/000000039769.png'''
         A__		 =					dqa_pipeline(image=a__ ,						question=a__ ,						top_k=2)
         self.assertEqual(a__ ,						[])

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




     @slow
     @require_torch
     @require_detectrona
     @require_pytesseract
     def 		snake_case_		(				self):
         A__		 =					pipeline(
             '''document-question-answering''' ,						model='''tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa''' ,						revision='''9977165''' ,						)
         A__		 =					INVOICE_URL
         A__		 =					'''What is the invoice number?'''

         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.0_0_0_9, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)

         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.0_0_0_9, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)

         A__		 =					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''': 1_6, '''end''': 1_6},
                     {'''score''': 0.0_0_0_9, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
                 ],
             ]
             * 2 ,						)




     @slow
     @require_torch
     @require_detectrona
     @require_pytesseract
     def 		snake_case_		(				self):
         A__		 =					pipeline(
             '''document-question-answering''' ,						model='''tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa''' ,						revision='''9977165''' ,						max_seq_len=5_0 ,						)
         A__		 =					INVOICE_URL
         A__		 =					'''What is the invoice number?'''

         A__		 =					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''': 2_3, '''end''': 2_3},
                 {'''score''': 0.9_9_4_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)

         A__		 =					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''': 2_3, '''end''': 2_3},
                 {'''score''': 0.9_9_4_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)

         A__		 =					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''': 2_3, '''end''': 2_3},
                     {'''score''': 0.9_9_4_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
                 ]
             ]
             * 2 ,						)




     @slow
     @require_torch
     @require_pytesseract
     @require_vision
     def 		snake_case_		(				self):
         A__		 =					AutoTokenizer.from_pretrained(
             '''impira/layoutlm-document-qa''' ,						revision='''3dc6de3''' ,						add_prefix_space=a__)
         A__		 =					pipeline(
             '''document-question-answering''' ,						model='''impira/layoutlm-document-qa''' ,						tokenizer=a__ ,						revision='''3dc6de3''' ,						)
         A__		 =					INVOICE_URL
         A__		 =					'''What is the invoice number?'''

         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.0_8_1_9, '''answer''': '''1110212019''', '''start''': 2_3, '''end''': 2_3},
             ] ,						)

         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.0_8_1_9, '''answer''': '''1110212019''', '''start''': 2_3, '''end''': 2_3},
             ] ,						)

         A__		 =					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''': 1_6, '''end''': 1_6},
                     {'''score''': 0.0_8_1_9, '''answer''': '''1110212019''', '''start''': 2_3, '''end''': 2_3},
                 ]
             ]
             * 2 ,						)

         A__		 =					list(zip(*apply_tesseract(load_image(a__) ,						a__ ,						'''''')))

         # This model should also work if `image` is set to None
         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.0_8_1_9, '''answer''': '''1110212019''', '''start''': 2_3, '''end''': 2_3},
             ] ,						)




     @slow
     @require_torch
     @require_pytesseract
     @require_vision
     def 		snake_case_		(				self):
         A__		 =					AutoTokenizer.from_pretrained(
             '''impira/layoutlm-document-qa''' ,						revision='''3dc6de3''' ,						add_prefix_space=a__)
         A__		 =					pipeline(
             '''document-question-answering''' ,						model='''impira/layoutlm-document-qa''' ,						tokenizer=a__ ,						revision='''3dc6de3''' ,						max_seq_len=5_0 ,						)
         A__		 =					INVOICE_URL
         A__		 =					'''What is the invoice number?'''

         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.9_9_9_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)

         A__		 =					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''': 1_6, '''end''': 1_6},
                     {'''score''': 0.9_9_9_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
                 ]
             ]
             * 2 ,						)

         A__		 =					list(zip(*apply_tesseract(load_image(a__) ,						a__ ,						'''''')))

         # This model should also work if `image` is set to None
         A__		 =					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''': 1_6, '''end''': 1_6},
                 {'''score''': 0.9_9_9_8, '''answer''': '''us-001''', '''start''': 1_6, '''end''': 1_6},
             ] ,						)




     @slow
     @require_torch
     def 		snake_case_		(				self):
         A__		 =					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''' ,						)

         A__		 =					INVOICE_URL
         A__		 =					'''What is the invoice number?'''
         A__		 =					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 		snake_case_		(				self):
         pass





from ...configuration_utils import PretrainedConfig
from ...utils import logging


_lowercase						  =		logging.get_logger(__name__)



class     _UpperCAmelCase			(       A__     ):
     UpperCamelCase__		    =				'''timm_backbone'''




     def __init__(				self ,						a__=None ,						a__=3 ,						a__=True ,						a__=True ,						a__=None ,						**a__ ,						):
         super().__init__(**a__)
         A__		 =					backbone
         A__		 =					num_channels
         A__		 =					features_only
         A__		 =					use_pretrained_backbone
         A__		 =					True
         A__		 =					out_indices if out_indices is not None else (-1,)
