



"""simple docstring"""


import tempfile
import unittest

import numpy as np

from diffusers import (
    DDIMScheduler,
    DPMSolverMultistepScheduler,
    EulerAncestralDiscreteScheduler,
    EulerDiscreteScheduler,
    LMSDiscreteScheduler,
    OnnxStableDiffusionPipeline,
    PNDMScheduler,
)
from diffusers.utils.testing_utils import is_onnx_available, nightly, require_onnxruntime, require_torch_gpu

from ..test_pipelines_onnx_common import OnnxPipelineTesterMixin


if is_onnx_available():
					import onnxruntime as ort
class 			_a (					lowerCAmelCase			,							unittest.TestCase):
			"""simple docstring"""
			UpperCamelCase__			      =	"""hf-internal-testing/tiny-random-OnnxStableDiffusionPipeline"""



			def  lowercase__						(		self     :    Dict				,   __UpperCamelCase     :    List[str]=0   )->Optional[Any]:
							_UpperCAmelCase					=    np.random.RandomState(__UpperCamelCase   )
							_UpperCAmelCase					=    {
							    '''prompt''': '''A painting of a squirrel eating a burger''',
							    '''generator''': generator,
							    '''num_inference_steps''': 2,
							    '''guidance_scale''': 7.5,
							    '''output_type''': '''numpy''',
							}
							return inputs



			def  lowercase__						(		self     :    Optional[Any]   )->Any:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.6_5_0_7_2, 0.5_8_4_9_2, 0.4_8_2_1_9, 0.5_5_5_2_1, 0.5_3_1_8_0, 0.5_5_9_3_9, 0.5_0_6_9_7, 0.3_9_8_0_0, 0.4_6_4_5_5]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    str   )->Any:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							_UpperCAmelCase					=    PNDMScheduler.from_config(pipe.scheduler.config				,   skip_prk_steps=__UpperCamelCase   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.6_5_8_6_3, 0.5_9_4_2_5, 0.4_9_3_2_6, 0.5_6_3_1_3, 0.5_3_8_7_5, 0.5_6_6_2_7, 0.5_1_0_6_5, 0.3_9_7_7_7, 0.4_6_3_3_0]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    str   )->int:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							_UpperCAmelCase					=    LMSDiscreteScheduler.from_config(pipe.scheduler.config   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.5_3_7_5_5, 0.6_0_7_8_6, 0.4_7_4_0_2, 0.4_9_4_8_8, 0.5_1_8_6_9, 0.4_9_8_1_9, 0.4_7_9_8_5, 0.3_8_9_5_7, 0.4_4_2_7_9]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    Optional[Any]   )->Union[str, Any]:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							_UpperCAmelCase					=    EulerDiscreteScheduler.from_config(pipe.scheduler.config   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.5_3_7_5_5, 0.6_0_7_8_6, 0.4_7_4_0_2, 0.4_9_4_8_8, 0.5_1_8_6_9, 0.4_9_8_1_9, 0.4_7_9_8_5, 0.3_8_9_5_7, 0.4_4_2_7_9]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    Optional[int]   )->Dict:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							_UpperCAmelCase					=    EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.5_3_8_1_7, 0.6_0_8_1_2, 0.4_7_3_8_4, 0.4_9_5_3_0, 0.5_1_8_9_4, 0.4_9_8_1_4, 0.4_7_9_8_4, 0.3_8_9_5_8, 0.4_4_2_7_1]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    Tuple   )->int:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							_UpperCAmelCase					=    DPMSolverMultistepScheduler.from_config(pipe.scheduler.config   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   ).images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 1_2_8, 1_2_8, 3)
							_UpperCAmelCase					=    np.array([0.5_3_8_9_5, 0.6_0_8_0_8, 0.4_7_9_3_3, 0.4_9_6_0_8, 0.5_1_8_8_6, 0.4_9_9_5_0, 0.4_8_0_5_3, 0.3_8_9_5_7, 0.4_4_2_0_0]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-2



			def  lowercase__						(		self     :    int   )->str:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    3 * [inputs['''prompt''']]

							# forward
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   )
							_UpperCAmelCase					=    output.images[0, -3:, -3:, -1]

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    3 * [inputs.pop('''prompt'''   )]

							_UpperCAmelCase					=    pipe.tokenizer(
							    __UpperCamelCase				,   padding='''max_length'''				,   max_length=pipe.tokenizer.model_max_length				,   truncation=__UpperCamelCase				,   return_tensors='''np'''				,   )
							_UpperCAmelCase					=    text_inputs['''input_ids''']

							_UpperCAmelCase					=    pipe.text_encoder(input_ids=text_inputs.astype(np.intaa   )   )[0]

							_UpperCAmelCase					=    prompt_embeds

							# forward
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   )
							_UpperCAmelCase					=    output.images[0, -3:, -3:, -1]

							assert np.abs(image_slice_a.flatten() - image_slice_a.flatten()   ).max() < 1e-4



			def  lowercase__						(		self     :    List[Any]   )->str:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(self.hub_checkpoint				,   provider='''CPUExecutionProvider'''   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    3 * ['''this is a negative prompt''']
							_UpperCAmelCase					=    negative_prompt
							_UpperCAmelCase					=    3 * [inputs['''prompt''']]

							# forward
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   )
							_UpperCAmelCase					=    output.images[0, -3:, -3:, -1]

							_UpperCAmelCase					=    self.get_dummy_inputs()
							_UpperCAmelCase					=    3 * [inputs.pop('''prompt'''   )]

							_UpperCAmelCase					=    []
							for p in [prompt, negative_prompt]:
											_UpperCAmelCase					=    pipe.tokenizer(
											    __UpperCamelCase				,   padding='''max_length'''				,   max_length=pipe.tokenizer.model_max_length				,   truncation=__UpperCamelCase				,   return_tensors='''np'''				,   )
											_UpperCAmelCase					=    text_inputs['''input_ids''']

											embeds.append(pipe.text_encoder(input_ids=text_inputs.astype(np.intaa   )   )[0]   )

							_UpperCAmelCase		,						_UpperCAmelCase					=    embeds

							# forward
							_UpperCAmelCase					=    pipe(**__UpperCamelCase   )
							_UpperCAmelCase					=    output.images[0, -3:, -3:, -1]

							assert np.abs(image_slice_a.flatten() - image_slice_a.flatten()   ).max() < 1e-4



@nightly
@require_onnxruntime
@require_torch_gpu
class 			_a (					unittest.TestCase):
			"""simple docstring"""



			@property
			def  lowercase__						(		self     :    Tuple   )->Optional[Any]:
							return (
							    "CUDAExecutionProvider",
							    {
							        "gpu_mem_limit": "15000000000",  # 15GB
							        "arena_extend_strategy": "kSameAsRequested",
							    },
							)



			@property
			def  lowercase__						(		self     :    Dict   )->Union[str, Any]:
							_UpperCAmelCase					=    ort.SessionOptions()
							_UpperCAmelCase					=    False
							return options



			def  lowercase__						(		self     :    Dict   )->Union[str, Any]:
							# using the PNDM scheduler by default
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(
							    '''CompVis/stable-diffusion-v1-4'''				,   revision='''onnx'''				,   safety_checker=__UpperCamelCase				,   feature_extractor=__UpperCamelCase				,   provider=self.gpu_provider				,   sess_options=self.gpu_options				,   )
							sd_pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    '''A painting of a squirrel eating a burger'''
							np.random.seed(0   )
							_UpperCAmelCase					=    sd_pipe([prompt]				,   guidance_scale=6.0				,   num_inference_steps=1_0				,   output_type='''np'''   )
							_UpperCAmelCase					=    output.images

							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 5_1_2, 5_1_2, 3)
							_UpperCAmelCase					=    np.array([0.0_4_5_2, 0.0_3_9_0, 0.0_0_8_7, 0.0_3_5_0, 0.0_6_1_7, 0.0_3_6_4, 0.0_5_4_4, 0.0_5_2_3, 0.0_7_2_0]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-3



			def  lowercase__						(		self     :    Union[str, Any]   )->List[str]:
							_UpperCAmelCase					=    DDIMScheduler.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   subfolder='''scheduler'''				,   revision='''onnx'''   )
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   revision='''onnx'''				,   scheduler=__UpperCamelCase				,   safety_checker=__UpperCamelCase				,   feature_extractor=__UpperCamelCase				,   provider=self.gpu_provider				,   sess_options=self.gpu_options				,   )
							sd_pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    '''open neural network exchange'''
							_UpperCAmelCase					=    np.random.RandomState(0   )
							_UpperCAmelCase					=    sd_pipe([prompt]				,   guidance_scale=7.5				,   num_inference_steps=1_0				,   generator=__UpperCamelCase				,   output_type='''np'''   )
							_UpperCAmelCase					=    output.images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 5_1_2, 5_1_2, 3)
							_UpperCAmelCase					=    np.array([0.2_8_6_7, 0.1_9_7_4, 0.1_4_8_1, 0.7_2_9_4, 0.7_2_5_1, 0.6_6_6_7, 0.4_1_9_4, 0.5_6_4_2, 0.6_4_8_6]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-3



			def  lowercase__						(		self     :    List[str]   )->Tuple:
							_UpperCAmelCase					=    LMSDiscreteScheduler.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   subfolder='''scheduler'''				,   revision='''onnx'''   )
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   revision='''onnx'''				,   scheduler=__UpperCamelCase				,   safety_checker=__UpperCamelCase				,   feature_extractor=__UpperCamelCase				,   provider=self.gpu_provider				,   sess_options=self.gpu_options				,   )
							sd_pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    '''open neural network exchange'''
							_UpperCAmelCase					=    np.random.RandomState(0   )
							_UpperCAmelCase					=    sd_pipe([prompt]				,   guidance_scale=7.5				,   num_inference_steps=1_0				,   generator=__UpperCamelCase				,   output_type='''np'''   )
							_UpperCAmelCase					=    output.images
							_UpperCAmelCase					=    image[0, -3:, -3:, -1]

							assert image.shape == (1, 5_1_2, 5_1_2, 3)
							_UpperCAmelCase					=    np.array([0.2_3_0_6, 0.1_9_5_9, 0.1_5_9_3, 0.6_5_4_9, 0.6_3_9_4, 0.5_4_0_8, 0.5_0_6_5, 0.6_0_1_0, 0.6_1_6_1]   )

							assert np.abs(image_slice.flatten() - expected_slice   ).max() < 1e-3



			def  lowercase__						(		self     :    Dict   )->List[Any]:
							_UpperCAmelCase					=    0

							def test_callback_fn(__UpperCamelCase     :    int				,   __UpperCamelCase     :    int				,   __UpperCamelCase     :    np.ndarray   ) -> None:
											_UpperCAmelCase					=    True
											nonlocal number_of_steps
											number_of_steps += 1
											if step == 0:
															assert latents.shape == (1, 4, 6_4, 6_4)
															_UpperCAmelCase					=    latents[0, -3:, -3:, -1]
															_UpperCAmelCase					=    np.array(
															    [-0.6_7_7_2, -0.3_8_3_5, -1.2_4_5_6, 0.1_9_0_5, -1.0_9_7_4, 0.6_9_6_7, -1.9_3_5_3, 0.0_1_7_8, 1.0_1_6_7]   )

															assert np.abs(latents_slice.flatten() - expected_slice   ).max() < 1e-3
											elif step == 5:
															assert latents.shape == (1, 4, 6_4, 6_4)
															_UpperCAmelCase					=    latents[0, -3:, -3:, -1]
															_UpperCAmelCase					=    np.array(
															    [-0.3_3_5_1, 0.2_2_4_1, -0.1_8_3_7, -0.2_3_2_5, -0.6_5_7_7, 0.3_3_9_3, -0.0_2_4_1, 0.5_8_9_9, 1.3_8_7_5]   )

															assert np.abs(latents_slice.flatten() - expected_slice   ).max() < 1e-3

							_UpperCAmelCase					=    False

							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   revision='''onnx'''				,   safety_checker=__UpperCamelCase				,   feature_extractor=__UpperCamelCase				,   provider=self.gpu_provider				,   sess_options=self.gpu_options				,   )
							pipe.set_progress_bar_config(disable=__UpperCamelCase   )

							_UpperCAmelCase					=    '''Andromeda galaxy in a bottle'''

							_UpperCAmelCase					=    np.random.RandomState(0   )
							pipe(
							    prompt=__UpperCamelCase				,   num_inference_steps=5				,   guidance_scale=7.5				,   generator=__UpperCamelCase				,   callback=__UpperCamelCase				,   callback_steps=1				,   )
							assert test_callback_fn.has_been_called
							assert number_of_steps == 6



			def  lowercase__						(		self     :    int   )->Optional[Any]:
							_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(
							    '''runwayml/stable-diffusion-v1-5'''				,   revision='''onnx'''				,   safety_checker=__UpperCamelCase				,   feature_extractor=__UpperCamelCase				,   provider=self.gpu_provider				,   sess_options=self.gpu_options				,   )
							assert isinstance(__UpperCamelCase				,   __UpperCamelCase   )
							assert pipe.safety_checker is None

							_UpperCAmelCase					=    pipe('''example prompt'''				,   num_inference_steps=2   ).images[0]
							assert image is not None

							# check that there's no error when saving a pipeline with one of the models being None
							with tempfile.TemporaryDirectory() as tmpdirname:
											pipe.save_pretrained(__UpperCamelCase   )
											_UpperCAmelCase					=    OnnxStableDiffusionPipeline.from_pretrained(__UpperCamelCase   )

							# sanity check that the pipeline still works
							assert pipe.safety_checker is None
							_UpperCAmelCase					=    pipe('''example prompt'''				,   num_inference_steps=2   ).images[0]
							assert image is not None








"""simple docstring"""


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 			_a :
								"""simple docstring"""



								@staticmethod
								def  lowercase__						(		*__UpperCamelCase     :    Dict				,   **__UpperCamelCase     :    Optional[Any]   )->List[str]:
												pass







					def  lowercase	(      _SCREAMING_SNAKE_CASE   :						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   :							Dict										=   (
    "https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png"
)
@is_pipeline_test
@require_torch
@require_vision
class 			_a (					unittest.TestCase):
			"""simple docstring"""
			UpperCamelCase__			      =	MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING



			@require_pytesseract
			@require_vision
			def  lowercase__						(		self     :    List[str]				,   __UpperCamelCase     :    Tuple				,   __UpperCamelCase     :    Any				,   __UpperCamelCase     :    str   )->Tuple:
							_UpperCAmelCase					=    pipeline(
							    '''document-question-answering'''				,   model=__UpperCamelCase				,   tokenizer=__UpperCamelCase				,   image_processor=__UpperCamelCase   )

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



			def  lowercase__						(		self     :    str				,   __UpperCamelCase     :    List[Any]				,   __UpperCamelCase     :    Optional[int]   )->Any:
							_UpperCAmelCase					=    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  lowercase__						(		self     :    str   )->Union[str, Any]:
							_UpperCAmelCase					=    pipeline('''document-question-answering'''				,   model='''hf-internal-testing/tiny-random-layoutlmv2'''   )
							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''How many cats are there?'''

							_UpperCAmelCase					=    [
							    {'''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},
							]
							_UpperCAmelCase					=    dqa_pipeline(image=__UpperCamelCase				,   question=__UpperCamelCase				,   top_k=2   )
							self.assertEqual(nested_simplify(__UpperCamelCase				,   decimals=4   )				,   __UpperCamelCase   )

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

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



			@slow
			@require_torch
			@require_detectrona
			@require_pytesseract
			def  lowercase__						(		self     :    Union[str, Any]   )->Optional[Any]:
							_UpperCAmelCase					=    pipeline(
							    '''document-question-answering'''				,   model='''tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'''				,   revision='''9977165'''				,   )
							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''What is the invoice number?'''

							_UpperCAmelCase					=    dqa_pipeline(image=__UpperCamelCase				,   question=__UpperCamelCase				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline({'''image''': image, '''question''': question}				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}]				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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  lowercase__						(		self     :    int   )->Optional[int]:
							_UpperCAmelCase					=    pipeline(
							    '''document-question-answering'''				,   model='''tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'''				,   revision='''9977165'''				,   max_seq_len=5_0				,   )
							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''What is the invoice number?'''

							_UpperCAmelCase					=    dqa_pipeline(image=__UpperCamelCase				,   question=__UpperCamelCase				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline({'''image''': image, '''question''': question}				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}]				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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  lowercase__						(		self     :    Dict   )->Tuple:
							_UpperCAmelCase					=    AutoTokenizer.from_pretrained(
							    '''impira/layoutlm-document-qa'''				,   revision='''3dc6de3'''				,   add_prefix_space=__UpperCamelCase   )
							_UpperCAmelCase					=    pipeline(
							    '''document-question-answering'''				,   model='''impira/layoutlm-document-qa'''				,   tokenizer=__UpperCamelCase				,   revision='''3dc6de3'''				,   )
							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''What is the invoice number?'''

							_UpperCAmelCase					=    dqa_pipeline(image=__UpperCamelCase				,   question=__UpperCamelCase				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline({'''image''': image, '''question''': question}				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}]				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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				,   )

							_UpperCAmelCase					=    list(zip(*apply_tesseract(load_image(__UpperCamelCase   )				,   __UpperCamelCase				,   ''''''   )   )   )

							# This model should also work if `image` is set to None
							_UpperCAmelCase					=    dqa_pipeline({'''image''': None, '''word_boxes''': word_boxes, '''question''': question}				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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  lowercase__						(		self     :    List[str]   )->Any:
							_UpperCAmelCase					=    AutoTokenizer.from_pretrained(
							    '''impira/layoutlm-document-qa'''				,   revision='''3dc6de3'''				,   add_prefix_space=__UpperCamelCase   )
							_UpperCAmelCase					=    pipeline(
							    '''document-question-answering'''				,   model='''impira/layoutlm-document-qa'''				,   tokenizer=__UpperCamelCase				,   revision='''3dc6de3'''				,   max_seq_len=5_0				,   )
							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''What is the invoice number?'''

							_UpperCAmelCase					=    dqa_pipeline(image=__UpperCamelCase				,   question=__UpperCamelCase				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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},
							    ]				,   )

							_UpperCAmelCase					=    dqa_pipeline(
							    [{'''image''': image, '''question''': question}, {'''image''': image, '''question''': question}]				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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				,   )

							_UpperCAmelCase					=    list(zip(*apply_tesseract(load_image(__UpperCamelCase   )				,   __UpperCamelCase				,   ''''''   )   )   )

							# This model should also work if `image` is set to None
							_UpperCAmelCase					=    dqa_pipeline({'''image''': None, '''word_boxes''': word_boxes, '''question''': question}				,   top_k=2   )
							self.assertEqual(
							    nested_simplify(__UpperCamelCase				,   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  lowercase__						(		self     :    int   )->str:
							_UpperCAmelCase					=    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'''				,   )

							_UpperCAmelCase					=    INVOICE_URL
							_UpperCAmelCase					=    '''What is the invoice number?'''
							_UpperCAmelCase					=    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  lowercase__						(		self     :    Tuple   )->Union[str, Any]:
							pass



