



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




							'''simple docstring'''



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

											"""simple docstring"""






											pass






					def      lowerCAmelCase__		(   lowerCamelCase_		:		Dict):





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



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




		'''simple docstring'''



		snake_case_     =MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING



		@require_pytesseract
		@require_vision
		def 		lowerCAmelCase__				(self		,__lowerCamelCase		,__lowerCamelCase		,__lowerCamelCase			)					->      str:

						"""simple docstring"""






						lowerCAmelCase__					:    Tuple												=					pipeline(
						    '''document-question-answering'''		,model=lowercase_		,tokenizer=lowercase_		,image_processor=lowercase_			)

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



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

						"""simple docstring"""






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



		@require_torch
		@require_detectrona
		@require_pytesseract
		def 		lowerCAmelCase__				(self			)					->      List[Any]:

						"""simple docstring"""






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

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

						lowerCAmelCase__					:    Optional[int]												=					dqa_pipeline({'''image''': image, '''question''': question}		,top_k=2			)
						self.assertEqual(nested_simplify(lowercase_		,decimals=4			)		,lowercase_			)

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

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



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

						"""simple docstring"""






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

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

						lowerCAmelCase__					:    Union[str, Any]												=					dqa_pipeline({'''image''': image, '''question''': question}		,top_k=2			)
						self.assertEqual(
						    nested_simplify(lowercase_		,decimals=4			)		,[
						        {'''score''': 0.9944, '''answer''': '''us-001''', '''start''': 16, '''end''': 16},
						        {'''score''': 0.0009, '''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(lowercase_		,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 		lowerCAmelCase__				(self			)					->      Any:

						"""simple docstring"""






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

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

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

						lowerCAmelCase__					:    Optional[Any]												=					dqa_pipeline(
						    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}]		,top_k=2			)
						self.assertEqual(
						    nested_simplify(lowercase_		,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 		lowerCAmelCase__				(self			)					->      List[str]:

						"""simple docstring"""






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

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

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

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

						lowerCAmelCase__					:    List[Any]												=					list(zip(*apply_tesseract(load_image(lowercase_			)		,lowercase_		,''''''			)			)			)

						# This model should also work if `image` is set to None
						lowerCAmelCase__					:    List[Any]												=					dqa_pipeline({'''image''': None, '''word_boxes''': word_boxes, '''question''': question}		,top_k=2			)
						self.assertEqual(
						    nested_simplify(lowercase_		,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 		lowerCAmelCase__				(self			)					->      int:

						"""simple docstring"""






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

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

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

						lowerCAmelCase__					:    str												=					list(zip(*apply_tesseract(load_image(lowercase_			)		,lowercase_		,''''''			)			)			)

						# 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(lowercase_		,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 		lowerCAmelCase__				(self			)					->      List[str]:

						"""simple docstring"""






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



		@require_tf
		@unittest.skip('''Document question answering not implemented in TF'''			)
		def 		lowerCAmelCase__				(self			)					->      Any:

						"""simple docstring"""






						pass






def      lowerCAmelCase__		(   lowerCamelCase_		:		str	,lowerCamelCase_		:		str):





				'''simple docstring'''

				lowerCAmelCase__					:    Optional[Any]												=					len(lowerCamelCase_)
				lowerCAmelCase__					:    str												=					len(lowerCamelCase_)
				lowerCAmelCase__					:    Union[str, Any]												=					[[False for _ in range(m + 1)] for _ in range(n + 1)]
				lowerCAmelCase__					:    List[Any]												=					True
				for i in range(lowerCamelCase_):
								for j in range(m + 1):
												if dp[i][j]:
																if j < m and a[i].upper() == b[j]:
																				lowerCAmelCase__					:    int												=					True
																if a[i].islower():
																				lowerCAmelCase__					:    int												=					True
				return dp[n][m]


if __name__ == "__main__":
							import doctest

							doctest.testmod()

