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 :


					"""simple docstring"""






					@staticmethod
					def 			_SCREAMING_SNAKE_CASE     (  *lowerCAmelCase__ ,  **lowerCAmelCase__		)	->   int:

									'''simple docstring'''


									pass





		def 							UpperCAmelCase		(       lowercase				):







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




@is_pipeline_test
@require_torch
@require_vision
class   _UpperCamelCase (		unittest.TestCase					):


			"""simple docstring"""






			__a    :					str     					=		MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING





			@require_pytesseract
			@require_vision
			def 			_SCREAMING_SNAKE_CASE     (  self ,  lowerCAmelCase__ ,  lowerCAmelCase__ ,  lowerCAmelCase__		)	->   Optional[Any]:

							'''simple docstring'''


							__lowercase					     =				pipeline(
							    '''document-question-answering''' ,  model=lowerCAmelCase__ ,  tokenizer=lowerCAmelCase__ ,  image_processor=lowerCAmelCase__		)

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





			def 			_SCREAMING_SNAKE_CASE     (  self ,  lowerCAmelCase__ ,  lowerCAmelCase__		)	->   Optional[Any]:

							'''simple docstring'''


							__lowercase					     =				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 			_SCREAMING_SNAKE_CASE     (  self		)	->   Optional[Any]:

							'''simple docstring'''


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

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

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

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





			@slow
			@require_torch
			@require_detectrona
			@require_pytesseract
			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   Tuple:

							'''simple docstring'''


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

							__lowercase					     =				dqa_pipeline(image=lowerCAmelCase__ ,  question=lowerCAmelCase__ ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        {'''score''': 0.9944, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        {'''score''': 0.0009, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							    ] ,  )

							__lowercase					     =				dqa_pipeline({'''image''': image, '''question''': question} ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        {'''score''': 0.9944, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        {'''score''': 0.0009, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							    ] ,  )

							__lowercase					     =				dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}] ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        [
							            {'''score''': 0.9944, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							            {'''score''': 0.0009, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        ],
							    ]
							    * 2 ,  )





			@slow
			@require_torch
			@require_detectrona
			@require_pytesseract
			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   Tuple:

							'''simple docstring'''


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

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

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

							__lowercase					     =				dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}] ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        [
							            {'''score''': 0.9974, '''answer''': '''1110212019''', '''start''': 23, '''end''': 23},
							            {'''score''': 0.9948, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        ]
							    ]
							    * 2 ,  )





			@slow
			@require_torch
			@require_pytesseract
			@require_vision
			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   Dict:

							'''simple docstring'''


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

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

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

							__lowercase					     =				dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}] ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        [
							            {'''score''': 0.4251, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							            {'''score''': 0.0819, '''answer''': '''1110212019''', '''start''': 23, '''end''': 23},
							        ]
							    ]
							    * 2 ,  )

							__lowercase					     =				list(zip(*apply_tesseract(load_image(lowerCAmelCase__		) ,  lowerCAmelCase__ ,  ''''''		)		)		)

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





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

							'''simple docstring'''


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

							__lowercase					     =				dqa_pipeline(image=lowerCAmelCase__ ,  question=lowerCAmelCase__ ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        {'''score''': 0.9999, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        {'''score''': 0.9998, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							    ] ,  )

							__lowercase					     =				dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}] ,  top_k=2		)
							self.assertEqual(
							    nested_simplify(lowerCAmelCase__ ,  decimals=4		) ,  [
							        [
							            {'''score''': 0.9999, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							            {'''score''': 0.9998, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
							        ]
							    ]
							    * 2 ,  )

							__lowercase					     =				list(zip(*apply_tesseract(load_image(lowerCAmelCase__		) ,  lowerCAmelCase__ ,  ''''''		)		)		)

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





			@slow
			@require_torch
			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   Dict:

							'''simple docstring'''


							__lowercase					     =				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''' ,  )

							__lowercase					     =				INVOICE_URL
							__lowercase					     =				'''What is the invoice number?'''
							__lowercase					     =				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 			_SCREAMING_SNAKE_CASE     (  self		)	->   Any:

							'''simple docstring'''


							pass
import unittest

from accelerate import debug_launcher
from accelerate.test_utils import require_cpu, test_ops, test_script




@require_cpu
class   _UpperCamelCase (		unittest.TestCase					):


			"""simple docstring"""






			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   int:

							'''simple docstring'''


							debug_launcher(test_script.main		)





			def 			_SCREAMING_SNAKE_CASE     (  self		)	->   Union[str, Any]:

							'''simple docstring'''


							debug_launcher(test_ops.main		)