


'''simple docstring'''

import argparse

import gdown
import numpy as np
import torch
from huggingface_hub import hf_hub_download

from transformers import (
    CLIPTokenizer,
    CLIPTokenizerFast,
    VideoMAEImageProcessor,
    XCLIPConfig,
    XCLIPModel,
    XCLIPProcessor,
    XCLIPTextConfig,
    XCLIPVisionConfig,
)





def __snake_case					(      UpperCAmelCase_						:						List[str]					,				UpperCAmelCase_						:						List[str]		):
 lowerCamelCase_      =  XCLIPTextConfig()

 # derive patch size from model name
 lowerCamelCase_      =  model_name.find("patch"		)
 lowerCamelCase_      =  int(model_name[start_idx + len("patch"		) : start_idx + len("patch"		) + 2]		)
 lowerCamelCase_      =  XCLIPVisionConfig(patch_size=UpperCAmelCase_					,				num_frames=UpperCAmelCase_		)

 if "large" in model_name:
  lowerCamelCase_      =  768
  lowerCamelCase_      =  3072
  lowerCamelCase_      =  12

  lowerCamelCase_      =  1024
  lowerCamelCase_      =  4096
  lowerCamelCase_      =  16
  lowerCamelCase_      =  24
  lowerCamelCase_      =  768
  lowerCamelCase_      =  3072

 if model_name == "xclip-large-patch14-16-frames":
  lowerCamelCase_      =  336

 lowerCamelCase_      =  XCLIPConfig.from_text_vision_configs(UpperCAmelCase_					,				UpperCAmelCase_		)

 if "large" in model_name:
  lowerCamelCase_      =  768

 return config





def __snake_case					(      UpperCAmelCase_						:						str		):
 # text encoder
 if name == "token_embedding.weight":
  lowerCamelCase_      =  name.replace("token_embedding.weight"					,				"text_model.embeddings.token_embedding.weight"		)
 if name == "positional_embedding":
  lowerCamelCase_      =  name.replace("positional_embedding"					,				"text_model.embeddings.position_embedding.weight"		)
 if "ln_1" in name:
  lowerCamelCase_      =  name.replace("ln_1"					,				"layer_norm1"		)
 if "ln_2" in name:
  lowerCamelCase_      =  name.replace("ln_2"					,				"layer_norm2"		)
 if "c_fc" in name:
  lowerCamelCase_      =  name.replace("c_fc"					,				"fc1"		)
 if "c_proj" in name:
  lowerCamelCase_      =  name.replace("c_proj"					,				"fc2"		)
 if name.startswith("transformer.resblocks"		):
  lowerCamelCase_      =  name.replace("transformer.resblocks"					,				"text_model.encoder.layers"		)
 if "attn.out_proj" in name and "message" not in name:
  lowerCamelCase_      =  name.replace("attn.out_proj"					,				"self_attn.out_proj"		)
 if "ln_final" in name:
  lowerCamelCase_      =  name.replace("ln_final"					,				"text_model.final_layer_norm"		)
 # visual encoder
 if name == "visual.class_embedding":
  lowerCamelCase_      =  name.replace("visual.class_embedding"					,				"vision_model.embeddings.class_embedding"		)
 if name == "visual.positional_embedding":
  lowerCamelCase_      =  name.replace("visual.positional_embedding"					,				"vision_model.embeddings.position_embedding.weight"		)
 if name.startswith("visual.transformer.resblocks"		):
  lowerCamelCase_      =  name.replace("visual.transformer.resblocks"					,				"vision_model.encoder.layers"		)
 if "visual.conv1" in name:
  lowerCamelCase_      =  name.replace("visual.conv1"					,				"vision_model.embeddings.patch_embedding"		)
 if "visual.ln_pre" in name:
  lowerCamelCase_      =  name.replace("visual.ln_pre"					,				"vision_model.pre_layernorm"		)
 if "visual.ln_post" in name:
  lowerCamelCase_      =  name.replace("visual.ln_post"					,				"vision_model.post_layernorm"		)
 if "visual.proj" in name:
  lowerCamelCase_      =  name.replace("visual.proj"					,				"visual_projection.weight"		)
 if "text_projection" in name:
  lowerCamelCase_      =  name.replace("text_projection"					,				"text_projection.weight"		)
 # things on top
 if "prompts_visual_proj" in name:
  lowerCamelCase_      =  name.replace("prompts_visual_proj"					,				"prompts_visual_projection"		)
 if "prompts_visual_ln" in name:
  lowerCamelCase_      =  name.replace("prompts_visual_ln"					,				"prompts_visual_layernorm"		)
 # mit
 if name == "mit.positional_embedding":
  lowerCamelCase_      =  name.replace("positional"					,				"position"		)
 if name.startswith("mit.resblocks"		):
  lowerCamelCase_      =  name.replace("mit.resblocks"					,				"mit.encoder.layers"		)
 # prompts generator
 if name.startswith("prompts_generator.norm"		):
  lowerCamelCase_      =  name.replace("prompts_generator.norm"					,				"prompts_generator.layernorm"		)

 return name





def __snake_case					(      UpperCAmelCase_						:						Optional[int]					,				UpperCAmelCase_						:						List[str]		):
 for key in orig_state_dict.copy().keys():
  lowerCamelCase_      =  orig_state_dict.pop(UpperCAmelCase_		)

  if "attn.in_proj" in key:
   lowerCamelCase_      =  key.split("."		)
   if key.startswith("visual"		):
    lowerCamelCase_      =  key_split[3]
    lowerCamelCase_      =  config.vision_config.hidden_size
    if "message_attn" in key:
     if "weight" in key:
      lowerCamelCase_      =  val[
          :dim, :
      ]
      lowerCamelCase_      =  val[
          dim : dim * 2, :
      ]
      lowerCamelCase_      =  val[
          -dim:, :
      ]
     else:
      lowerCamelCase_      =  val[
          :dim
      ]
      lowerCamelCase_      =  val[
          dim : dim * 2
      ]
      lowerCamelCase_      =  val[
          -dim:
      ]
    else:
     if "weight" in key:
      lowerCamelCase_      =  val[
          :dim, :
      ]
      lowerCamelCase_      =  val[
          dim : dim * 2, :
      ]
      lowerCamelCase_      =  val[
          -dim:, :
      ]
     else:
      lowerCamelCase_      =  val[:dim]
      lowerCamelCase_      =  val[
          dim : dim * 2
      ]
      lowerCamelCase_      =  val[-dim:]
   elif key.startswith("mit"		):
    lowerCamelCase_      =  key_split[2]
    lowerCamelCase_      =  config.vision_config.mit_hidden_size
    if "weight" in key:
     lowerCamelCase_      =  val[:dim, :]
     lowerCamelCase_      =  val[dim : dim * 2, :]
     lowerCamelCase_      =  val[-dim:, :]
    else:
     lowerCamelCase_      =  val[:dim]
     lowerCamelCase_      =  val[dim : dim * 2]
     lowerCamelCase_      =  val[-dim:]
   else:
    lowerCamelCase_      =  key_split[2]
    lowerCamelCase_      =  config.text_config.hidden_size
    if "weight" in key:
     lowerCamelCase_      =  val[:dim, :]
     lowerCamelCase_      =  val[
         dim : dim * 2, :
     ]
     lowerCamelCase_      =  val[-dim:, :]
    else:
     lowerCamelCase_      =  val[:dim]
     lowerCamelCase_      =  val[
         dim : dim * 2
     ]
     lowerCamelCase_      =  val[-dim:]
  else:
   lowerCamelCase_      =  rename_key(UpperCAmelCase_		)
   if new_key_name in ["visual_projection.weight", "text_projection.weight"]:
    lowerCamelCase_      =  val.T
   lowerCamelCase_      =  val

 return orig_state_dict





def __snake_case					(      UpperCAmelCase_						:						List[str]		):
 if num_frames == 8:
  lowerCamelCase_      =  "eating_spaghetti_8_frames.npy"
 elif num_frames == 16:
  lowerCamelCase_      =  "eating_spaghetti.npy"
 elif num_frames == 32:
  lowerCamelCase_      =  "eating_spaghetti_32_frames.npy"
 lowerCamelCase_      =  hf_hub_download(
     repo_id="hf-internal-testing/spaghetti-video"					,				filename=UpperCAmelCase_					,				repo_type="dataset"					,				)
 lowerCamelCase_      =  np.load(UpperCAmelCase_		)
 return list(UpperCAmelCase_		)





def __snake_case					(      UpperCAmelCase_						:						str					,				UpperCAmelCase_						:						Optional[Any]=None					,				UpperCAmelCase_						:						List[Any]=False		):
 lowerCamelCase_      =  {
     # fully supervised kinetics-400 checkpoints
     "xclip-base-patch32": "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_32_8.pth",
     "xclip-base-patch32-16-frames": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_32_16.pth"
     ),
     "xclip-base-patch16": "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_16_8.pth",
     "xclip-base-patch16-16-frames": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_16_16.pth"
     ),
     "xclip-large-patch14": "https://drive.google.com/u/0/uc?id=1NUOImq0o5DlQTST17iIP3vG7DgmHQuCx&amp;export=download&amp;confirm=t&amp;uuid=b26caedc-88e2-473e-830a-9d158b653cdb",
     "xclip-large-patch14-16-frames": "https://drive.google.com/u/0/uc?id=1FOYgnJc097OJ4lGwtRCCydQyVPJEOH7d&amp;export=download&amp;confirm=t&amp;uuid=538fa810-e671-4050-b385-9a623f89804f",
     # fully supervised kinetics-600 checkpoints
     "xclip-base-patch16-kinetics-600": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k600_16_8.pth"
     ),
     "xclip-base-patch16-kinetics-600-16-frames": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k600_16_16.pth"
     ),
     "xclip-large-patch14-kinetics-600": "https://drive.google.com/u/0/uc?id=1FV8C1INuM91sLAN4ImjzePLIlpMSihwV&amp;export=download&amp;confirm=t&amp;uuid=141d4977-4a65-44ae-864f-4b0c19f838be",
     # few shot
     "xclip-base-patch16-hmdb-2-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_2.pth"
     ),
     "xclip-base-patch16-hmdb-4-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_4.pth"
     ),
     "xclip-base-patch16-hmdb-8-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_8.pth"
     ),
     "xclip-base-patch16-hmdb-16-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_16.pth"
     ),
     "xclip-base-patch16-ucf-2-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_2.pth"
     ),
     "xclip-base-patch16-ucf-4-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_4.pth"
     ),
     "xclip-base-patch16-ucf-8-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_8.pth"
     ),
     "xclip-base-patch16-ucf-16-shot": (
         "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_16.pth"
     ),
     # zero shot
     "xclip-base-patch16-zero-shot": "https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/zero.pth",
 }

 lowerCamelCase_      =  model_to_url[model_name]
 lowerCamelCase_      =  8
 if "16-frames" in model_name:
  lowerCamelCase_      =  16
 elif "shot" in model_name:
  lowerCamelCase_      =  32

 lowerCamelCase_      =  get_xclip_config(UpperCAmelCase_					,				UpperCAmelCase_		)
 lowerCamelCase_      =  XCLIPModel(UpperCAmelCase_		)
 model.eval()

 if "drive" in checkpoint_url:
  lowerCamelCase_      =  "pytorch_model.bin"
  gdown.cached_download(UpperCAmelCase_					,				UpperCAmelCase_					,				quiet=UpperCAmelCase_		)
  lowerCamelCase_      =  torch.load(UpperCAmelCase_					,				map_location="cpu"		)["model"]
 else:
  lowerCamelCase_      =  torch.hub.load_state_dict_from_url(UpperCAmelCase_		)["model"]

 lowerCamelCase_      =  convert_state_dict(UpperCAmelCase_					,				UpperCAmelCase_		)

 lowerCamelCase_      =  XCLIPModel(UpperCAmelCase_		)
 lowerCamelCase_ ,lowerCamelCase_      =  model.load_state_dict(UpperCAmelCase_					,				strict=UpperCAmelCase_		)
 assert missing_keys == ["text_model.embeddings.position_ids", "vision_model.embeddings.position_ids"]
 model.eval()

 lowerCamelCase_      =  336 if model_name == "xclip-large-patch14-16-frames" else 224
 lowerCamelCase_      =  VideoMAEImageProcessor(size=UpperCAmelCase_		)
 lowerCamelCase_      =  CLIPTokenizer.from_pretrained("openai/clip-vit-base-patch32"		)
 lowerCamelCase_      =  CLIPTokenizerFast.from_pretrained("openai/clip-vit-base-patch32"		)
 lowerCamelCase_      =  XCLIPProcessor(image_processor=UpperCAmelCase_					,				tokenizer=UpperCAmelCase_		)

 lowerCamelCase_      =  prepare_video(UpperCAmelCase_		)
 lowerCamelCase_      =  processor(
     text=["playing sports", "eating spaghetti", "go shopping"]					,				videos=UpperCAmelCase_					,				return_tensors="pt"					,				padding=UpperCAmelCase_		)

 print("Shape of pixel values:"					,				inputs.pixel_values.shape		)

 with torch.no_grad():
  lowerCamelCase_      =  model(**UpperCAmelCase_		)

 # Verify outputs
 lowerCamelCase_      =  outputs.logits_per_video
 lowerCamelCase_      =  logits_per_video.softmax(dim=1		)
 print("Probs:"					,				UpperCAmelCase_		)
 # kinetics-400
 if model_name == "xclip-base-patch32":
  lowerCamelCase_      =  torch.tensor([[0.0019, 0.9951, 0.0030]]		)
 elif model_name == "xclip-base-patch32-16-frames":
  lowerCamelCase_      =  torch.tensor([[7.0_9_9_9E-0_4, 9.9_8_8_3E-0_1, 4.5_5_8_0E-0_4]]		)
 elif model_name == "xclip-base-patch16":
  lowerCamelCase_      =  torch.tensor([[0.0083, 0.9681, 0.0236]]		)
 elif model_name == "xclip-base-patch16-16-frames":
  lowerCamelCase_      =  torch.tensor([[7.6_9_3_7E-0_4, 9.9_7_2_8E-0_1, 1.9_4_7_3E-0_3]]		)
 elif model_name == "xclip-large-patch14":
  lowerCamelCase_      =  torch.tensor([[0.0062, 0.9864, 0.0075]]		)
 elif model_name == "xclip-large-patch14-16-frames":
  lowerCamelCase_      =  torch.tensor([[3.3_8_7_7E-0_4, 9.9_9_3_7E-0_1, 2.8_8_8_8E-0_4]]		)
 # kinetics-600
 elif model_name == "xclip-base-patch16-kinetics-600":
  lowerCamelCase_      =  torch.tensor([[0.0555, 0.8914, 0.0531]]		)
 elif model_name == "xclip-base-patch16-kinetics-600-16-frames":
  lowerCamelCase_      =  torch.tensor([[3.8_5_5_4E-0_4, 9.9_9_2_9E-0_1, 3.2_7_5_4E-0_4]]		)
 elif model_name == "xclip-large-patch14-kinetics-600":
  lowerCamelCase_      =  torch.tensor([[0.0036, 0.9920, 0.0045]]		)
 # few shot
 elif model_name == "xclip-base-patch16-hmdb-2-shot":
  lowerCamelCase_      =  torch.tensor([[7.1_8_9_0E-0_6, 9.9_9_9_4E-0_1, 5.6_5_5_9E-0_5]]		)
 elif model_name == "xclip-base-patch16-hmdb-4-shot":
  lowerCamelCase_      =  torch.tensor([[1.0_3_2_0E-0_5, 9.9_9_9_3E-0_1, 6.2_4_3_5E-0_5]]		)
 elif model_name == "xclip-base-patch16-hmdb-8-shot":
  lowerCamelCase_      =  torch.tensor([[4.1_3_7_7E-0_6, 9.9_9_9_0E-0_1, 9.8_3_8_6E-0_5]]		)
 elif model_name == "xclip-base-patch16-hmdb-16-shot":
  lowerCamelCase_      =  torch.tensor([[4.1_3_4_7E-0_5, 9.9_9_6_2E-0_1, 3.3_4_1_1E-0_4]]		)
 elif model_name == "xclip-base-patch16-ucf-2-shot":
  lowerCamelCase_      =  torch.tensor([[8.5_8_5_7E-0_5, 9.9_9_2_8E-0_1, 6.3_2_9_1E-0_4]]		)
 elif model_name == "xclip-base-patch16-ucf-4-shot":
  lowerCamelCase_      =  torch.tensor([[8.5_8_5_7E-0_5, 9.9_9_2_8E-0_1, 6.3_2_9_1E-0_4]]		)
 elif model_name == "xclip-base-patch16-ucf-8-shot":
  lowerCamelCase_      =  torch.tensor([[0.0027, 0.9904, 0.0070]]		)
 elif model_name == "xclip-base-patch16-ucf-16-shot":
  lowerCamelCase_      =  torch.tensor([[9.8_2_1_9E-0_4, 9.9_5_9_3E-0_1, 3.0_8_6_3E-0_3]]		)
 # zero shot
 elif model_name == "xclip-base-patch16-zero-shot":
  lowerCamelCase_      =  torch.tensor([[3.5_0_8_2E-0_4, 9.9_7_8_5E-0_1, 1.7_9_6_6E-0_3]]		)
 else:
  raise ValueError(F'''Model name {model_name} not supported'''		)
 assert torch.allclose(UpperCAmelCase_					,				UpperCAmelCase_					,				atol=1E-3		)
 print("Looks ok!"		)

 if pytorch_dump_folder_path is not None:
  print(F'''Saving model {model_name} to {pytorch_dump_folder_path}'''		)
  model.save_pretrained(UpperCAmelCase_		)

 if push_to_hub:
  print("Pushing model, processor and slow tokenizer files to the hub..."		)
  model.push_to_hub(UpperCAmelCase_					,				organization="nielsr"		)
  processor.push_to_hub(UpperCAmelCase_					,				organization="nielsr"		)
  slow_tokenizer.push_to_hub(UpperCAmelCase_					,				organization="nielsr"		)


if __name__ == "__main__":
     a_  :				Tuple						= argparse.ArgumentParser()
     # Required parameters
     parser.add_argument(
         """--model_name""",
         default="""xclip-base-patch32""",
         type=str,
         help="""Name of the model.""",
     )
     parser.add_argument(
         """--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model directory."""
     )
     parser.add_argument(
         """--push_to_hub""", action="""store_true""", help="""Whether or not to push the converted model to the 🤗 hub."""
     )

     a_  :				Optional[Any]						= parser.parse_args()
     convert_xclip_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)







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



