


'''simple docstring'''

import inspect
import math
import tempfile
import unittest

import numpy as np

from transformers import ViTMAEConfig
from transformers.testing_utils import require_torch, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
     import torch
     from torch import nn

     from transformers import ViTMAEForPreTraining, ViTMAEModel
     from transformers.models.vit.modeling_vit import VIT_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
     from PIL import Image

     from transformers import ViTImageProcessor





class      snake_case    :





  """simple docstring"""




  def __init__(    self			,  UpperCamelCase			,  UpperCamelCase=13			,  UpperCamelCase=30			,  UpperCamelCase=2			,  UpperCamelCase=3			,  UpperCamelCase=True			,  UpperCamelCase=True			,  UpperCamelCase=32			,  UpperCamelCase=5			,  UpperCamelCase=4			,  UpperCamelCase=37			,  UpperCamelCase="gelu"			,  UpperCamelCase=0.1			,  UpperCamelCase=0.1			,  UpperCamelCase=10			,  UpperCamelCase=0.02			,  UpperCamelCase=3			,  UpperCamelCase=0.6			,  UpperCamelCase=None			,  ):







   """simple docstring"""
   lowerCamelCase_      =  parent
   lowerCamelCase_      =  batch_size
   lowerCamelCase_      =  image_size
   lowerCamelCase_      =  patch_size
   lowerCamelCase_      =  num_channels
   lowerCamelCase_      =  is_training
   lowerCamelCase_      =  use_labels
   lowerCamelCase_      =  hidden_size
   lowerCamelCase_      =  num_hidden_layers
   lowerCamelCase_      =  num_attention_heads
   lowerCamelCase_      =  intermediate_size
   lowerCamelCase_      =  hidden_act
   lowerCamelCase_      =  hidden_dropout_prob
   lowerCamelCase_      =  attention_probs_dropout_prob
   lowerCamelCase_      =  type_sequence_label_size
   lowerCamelCase_      =  initializer_range
   lowerCamelCase_      =  mask_ratio
   lowerCamelCase_      =  scope

   # in ViTMAE, the expected sequence length = (num_patches + 1) * (1 - config.mask_ratio), rounded above
   # (we add 1 for the [CLS] token)
   lowerCamelCase_      =  (image_size // patch_size) ** 2
   lowerCamelCase_      =  int(math.ceil((1 - mask_ratio) * (num_patches + 1)     )     )






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]     )

   lowerCamelCase_      =  None
   if self.use_labels:
    lowerCamelCase_      =  ids_tensor([self.batch_size]			,  self.type_sequence_label_size     )

   lowerCamelCase_      =  self.get_config()

   return config, pixel_values, labels






  def   snake_case		(    self     ):







   """simple docstring"""
   return ViTMAEConfig(
       image_size=self.image_size			,  patch_size=self.patch_size			,  num_channels=self.num_channels			,  hidden_size=self.hidden_size			,  num_hidden_layers=self.num_hidden_layers			,  num_attention_heads=self.num_attention_heads			,  intermediate_size=self.intermediate_size			,  hidden_act=self.hidden_act			,  hidden_dropout_prob=self.hidden_dropout_prob			,  attention_probs_dropout_prob=self.attention_probs_dropout_prob			,  is_decoder=UpperCamelCase			,  initializer_range=self.initializer_range			,  mask_ratio=self.mask_ratio			,  )






  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase			,  UpperCamelCase     ):







   """simple docstring"""
   lowerCamelCase_      =  ViTMAEModel(config=UpperCamelCase     )
   model.to(UpperCamelCase     )
   model.eval()
   lowerCamelCase_      =  model(UpperCamelCase     )
   self.parent.assertEqual(result.last_hidden_state.shape			,  (self.batch_size, self.seq_length, self.hidden_size)     )






  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase			,  UpperCamelCase     ):







   """simple docstring"""
   lowerCamelCase_      =  ViTMAEForPreTraining(UpperCamelCase     )
   model.to(UpperCamelCase     )
   model.eval()
   lowerCamelCase_      =  model(UpperCamelCase     )
   lowerCamelCase_      =  (self.image_size // self.patch_size) ** 2
   lowerCamelCase_      =  self.patch_size**2 * self.num_channels
   self.parent.assertEqual(result.logits.shape			,  (self.batch_size, num_patches, expected_num_channels)     )

   # test greyscale images
   lowerCamelCase_      =  1
   lowerCamelCase_      =  ViTMAEForPreTraining(UpperCamelCase     )
   model.to(UpperCamelCase     )
   model.eval()
   lowerCamelCase_      =  floats_tensor([self.batch_size, 1, self.image_size, self.image_size]     )
   lowerCamelCase_      =  model(UpperCamelCase     )
   lowerCamelCase_      =  self.patch_size**2
   self.parent.assertEqual(result.logits.shape			,  (self.batch_size, num_patches, expected_num_channels)     )







  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  self.prepare_config_and_inputs()
   lowerCamelCase_ ,lowerCamelCase_ ,lowerCamelCase_      =  config_and_inputs
   lowerCamelCase_      =  {"pixel_values": pixel_values}
   return config, inputs_dict





@require_torch
class      snake_case    (    lowercase			,						lowercase			,						unittest.TestCase			):





  """simple docstring"""




  _lowerCamelCase		    =  (ViTMAEModel, ViTMAEForPreTraining) if is_torch_available() else ()
  _lowerCamelCase		    =  {"feature-extraction": ViTMAEModel} if is_torch_available() else {}

  _lowerCamelCase		    =  False
  _lowerCamelCase		    =  False
  _lowerCamelCase		    =  False
  _lowerCamelCase		    =  False






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  ViTMAEModelTester(self     )
   lowerCamelCase_      =  ConfigTester(self			,  config_class=UpperCamelCase			,  has_text_modality=UpperCamelCase			,  hidden_size=37     )






  def   snake_case		(    self     ):







   """simple docstring"""
   self.config_tester.run_common_tests()






  @unittest.skip(reason="ViTMAE does not use inputs_embeds"     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_ ,lowerCamelCase_      =  self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    lowerCamelCase_      =  model_class(UpperCamelCase     )
    self.assertIsInstance(model.get_input_embeddings()			,  (nn.Module)     )
    lowerCamelCase_      =  model.get_output_embeddings()
    self.assertTrue(x is None or isinstance(UpperCamelCase			,  nn.Linear     )     )






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_ ,lowerCamelCase_      =  self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    lowerCamelCase_      =  model_class(UpperCamelCase     )
    lowerCamelCase_      =  inspect.signature(model.forward     )
    # signature.parameters is an OrderedDict => so arg_names order is deterministic
    lowerCamelCase_      =  [*signature.parameters.keys()]

    lowerCamelCase_      =  ["pixel_values"]
    self.assertListEqual(arg_names[:1]			,  UpperCamelCase     )






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_model(*UpperCamelCase     )






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_for_pretraining(*UpperCamelCase     )






  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase			,  UpperCamelCase     ):







   """simple docstring"""
   # make masks reproducible
   np.random.seed(2     )

   lowerCamelCase_      =  int((pt_model.config.image_size // pt_model.config.patch_size) ** 2     )
   lowerCamelCase_      =  np.random.uniform(size=(self.model_tester.batch_size, num_patches)     )
   lowerCamelCase_      =  torch.from_numpy(UpperCamelCase     )

   # Add `noise` argument.
   # PT inputs will be prepared in `super().check_pt_tf_models()` with this added `noise` argument
   lowerCamelCase_      =  pt_noise

   super().check_pt_tf_models(UpperCamelCase			,  UpperCamelCase			,  UpperCamelCase     )






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_ ,lowerCamelCase_      =  self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    lowerCamelCase_      =  model_class(UpperCamelCase     )
    model.to(UpperCamelCase     )
    model.eval()
    # make random mask reproducible
    torch.manual_seed(2     )
    with torch.no_grad():
     lowerCamelCase_      =  model(**self._prepare_for_class(UpperCamelCase			,  UpperCamelCase     )     )

    lowerCamelCase_      =  outputs[0].cpu().numpy()
    lowerCamelCase_      =  0

    with tempfile.TemporaryDirectory() as tmpdirname:
     model.save_pretrained(UpperCamelCase     )
     lowerCamelCase_      =  model_class.from_pretrained(UpperCamelCase     )
     model.to(UpperCamelCase     )
     # make random mask reproducible
     torch.manual_seed(2     )
     with torch.no_grad():
      lowerCamelCase_      =  model(**self._prepare_for_class(UpperCamelCase			,  UpperCamelCase     )     )

     # Make sure we don't have nans
     lowerCamelCase_      =  after_outputs[0].cpu().numpy()
     lowerCamelCase_      =  0
     lowerCamelCase_      =  np.amax(np.abs(out_a - out_a     )     )
     self.assertLessEqual(UpperCamelCase			,  1e-5     )






  @unittest.skip(
      reason="ViTMAE returns a random mask + ids_restore in each forward pass. See test_save_load\n    to get deterministic results."     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass






  @unittest.skip(
      reason="ViTMAE returns a random mask + ids_restore in each forward pass. See test_save_load\n    to get deterministic results."     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass






  @unittest.skip(
      reason="ViTMAE returns a random mask + ids_restore in each forward pass. See test_save_load\n    to get deterministic results."     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass






  @unittest.skip(reason="ViTMAE returns a random mask + ids_restore in each forward pass. See test_save_load"     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass






  @unittest.skip("Will be fixed soon by reducing the size of the model used for common tests."     )
  def   snake_case		(    self     ):







   """simple docstring"""
   pass







  @slow
  def   snake_case		(    self     ):







   """simple docstring"""
   for model_name in VIT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
    lowerCamelCase_      =  ViTMAEModel.from_pretrained(UpperCamelCase     )
    self.assertIsNotNone(UpperCamelCase     )





def __snake_case					(      ):
 lowerCamelCase_      =  Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"		)
 return image







@require_torch
@require_vision
class      snake_case    (    unittest.TestCase			):





  """simple docstring"""




  @cached_property
  def   snake_case		(    self     ):







   """simple docstring"""
   return ViTImageProcessor.from_pretrained("facebook/vit-mae-base"     ) if is_vision_available() else None







  @slow
  def   snake_case		(    self     ):







   """simple docstring"""
   # make random mask reproducible across the PT and TF model
   np.random.seed(2     )

   lowerCamelCase_      =  ViTMAEForPreTraining.from_pretrained("facebook/vit-mae-base"     ).to(UpperCamelCase     )

   lowerCamelCase_      =  self.default_image_processor
   lowerCamelCase_      =  prepare_img()
   lowerCamelCase_      =  image_processor(images=UpperCamelCase			,  return_tensors="pt"     ).to(UpperCamelCase     )

   # prepare a noise vector that will be also used for testing the TF model
   # (this way we can ensure that the PT and TF models operate on the same inputs)
   lowerCamelCase_      =  ViTMAEConfig()
   lowerCamelCase_      =  int((vit_mae_config.image_size // vit_mae_config.patch_size) ** 2     )
   lowerCamelCase_      =  np.random.uniform(size=(1, num_patches)     )

   # forward pass
   with torch.no_grad():
    lowerCamelCase_      =  model(**UpperCamelCase			,  noise=torch.from_numpy(UpperCamelCase     ).to(device=UpperCamelCase     )     )

   # verify the logits
   lowerCamelCase_      =  torch.Size((1, 196, 768)     )
   self.assertEqual(outputs.logits.shape			,  UpperCamelCase     )

   lowerCamelCase_      =  torch.tensor(
       [[-0.0_548, -1.7_023, -0.9_325], [0.3_721, -0.5_670, -0.2_233], [0.8_235, -1.3_878, -0.3_524]]     )

   self.assertTrue(torch.allclose(outputs.logits[0, :3, :3]			,  expected_slice.to(UpperCamelCase     )			,  atol=1e-4     )     )







'''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      snake_case    :





       """simple docstring"""




       @staticmethod
       def   snake_case		(    *UpperCamelCase			,  **UpperCamelCase     ):







        """simple docstring"""
        pass





     def __snake_case					(      UpperCAmelCase_						:						List[Any]		):
      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      snake_case    (    unittest.TestCase			):





  """simple docstring"""




  _lowerCamelCase		    =  MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING






  @require_pytesseract
  @require_vision
  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase			,  UpperCamelCase     ):







   """simple docstring"""
   lowerCamelCase_      =  pipeline(
       "document-question-answering"			,  model=UpperCamelCase			,  tokenizer=UpperCamelCase			,  image_processor=UpperCamelCase     )

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






  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase     ):







   """simple docstring"""
   lowerCamelCase_      =  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   snake_case		(    self     ):







   """simple docstring"""
   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=UpperCamelCase			,  question=UpperCamelCase			,  top_k=2     )
   self.assertEqual(nested_simplify(UpperCamelCase			,  decimals=4     )			,  UpperCamelCase     )

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

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






  @slow
  @require_torch
  @require_detectrona
  @require_pytesseract
  def   snake_case		(    self     ):







   """simple docstring"""
   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=UpperCamelCase			,  question=UpperCamelCase			,  top_k=2     )
   self.assertEqual(
       nested_simplify(UpperCamelCase			,  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(UpperCamelCase			,  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(UpperCamelCase			,  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   snake_case		(    self     ):







   """simple docstring"""
   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=UpperCamelCase			,  question=UpperCamelCase			,  top_k=2     )
   self.assertEqual(
       nested_simplify(UpperCamelCase			,  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(UpperCamelCase			,  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(UpperCamelCase			,  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   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  AutoTokenizer.from_pretrained(
       "impira/layoutlm-document-qa"			,  revision="3dc6de3"			,  add_prefix_space=UpperCamelCase     )
   lowerCamelCase_      =  pipeline(
       "document-question-answering"			,  model="impira/layoutlm-document-qa"			,  tokenizer=UpperCamelCase			,  revision="3dc6de3"			,  )
   lowerCamelCase_      =  INVOICE_URL
   lowerCamelCase_      =  "What is the invoice number?"

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

   # 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(UpperCamelCase			,  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   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  AutoTokenizer.from_pretrained(
       "impira/layoutlm-document-qa"			,  revision="3dc6de3"			,  add_prefix_space=UpperCamelCase     )
   lowerCamelCase_      =  pipeline(
       "document-question-answering"			,  model="impira/layoutlm-document-qa"			,  tokenizer=UpperCamelCase			,  revision="3dc6de3"			,  max_seq_len=50			,  )
   lowerCamelCase_      =  INVOICE_URL
   lowerCamelCase_      =  "What is the invoice number?"

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

   # 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(UpperCamelCase			,  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   snake_case		(    self     ):







   """simple docstring"""
   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=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   snake_case		(    self     ):







   """simple docstring"""
   pass



