



import copy
import unittest

from transformers.models.auto import get_values
from transformers.testing_utils import require_torch, 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, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
	import torch

	from transformers import (
	    MODEL_FOR_MULTIPLE_CHOICE_MAPPING,
	    MODEL_FOR_QUESTION_ANSWERING_MAPPING,
	    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
	    MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING,
	    LayoutLMvaConfig,
	    LayoutLMvaForQuestionAnswering,
	    LayoutLMvaForSequenceClassification,
	    LayoutLMvaForTokenClassification,
	    LayoutLMvaModel,
	)
	from transformers.models.layoutlmva.modeling_layoutlmva import LAYOUTLMV3_PRETRAINED_MODEL_ARCHIVE_LIST

if is_vision_available():
	from PIL import Image

	from transformers import LayoutLMvaImageProcessor


class 	__snake_case   :
		def __init__(							self    ,a_    ,a_=2    ,a_=3    ,a_=4    ,a_=2    ,a_=7    ,a_=True    ,a_=True    ,a_=True    ,a_=True    ,a_=99    ,a_=36    ,a_=3    ,a_=4    ,a_=37    ,a_="gelu"    ,a_=0.1    ,a_=0.1    ,a_=512    ,a_=16    ,a_=2    ,a_=0.02    ,a_=6    ,a_=6    ,a_=3    ,a_=4    ,a_=None    ,a_=1000    ,):







						"""simple docstring"""
						lowerCAmelCase__		  =  parent
						lowerCAmelCase__		  =  batch_size
						lowerCAmelCase__		  =  num_channels
						lowerCAmelCase__		  =  image_size
						lowerCAmelCase__		  =  patch_size
						lowerCAmelCase__		  =  text_seq_length
						lowerCAmelCase__		  =  is_training
						lowerCAmelCase__		  =  use_input_mask
						lowerCAmelCase__		  =  use_token_type_ids
						lowerCAmelCase__		  =  use_labels
						lowerCAmelCase__		  =  vocab_size
						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__		  =  max_position_embeddings
						lowerCAmelCase__		  =  type_vocab_size
						lowerCAmelCase__		  =  type_sequence_label_size
						lowerCAmelCase__		  =  initializer_range
						lowerCAmelCase__		  =  coordinate_size
						lowerCAmelCase__		  =  shape_size
						lowerCAmelCase__		  =  num_labels
						lowerCAmelCase__		  =  num_choices
						lowerCAmelCase__		  =  scope
						lowerCAmelCase__		  =  range_bbox

						# LayoutLMv3's sequence length equals the number of text tokens + number of patches + 1 (we add 1 for the CLS token)
						lowerCAmelCase__		  =  text_seq_length
						lowerCAmelCase__		  =  (image_size // patch_size) ** 2 + 1
						lowerCAmelCase__		  =  self.text_seq_length + self.image_seq_length
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  ids_tensor([self.batch_size, self.text_seq_length]    ,self.vocab_size						)

						lowerCAmelCase__		  =  ids_tensor([self.batch_size, self.text_seq_length, 4]    ,self.range_bbox						)
						# Ensure that bbox is legal
						for i in range(bbox.shape[0]						):
										for j in range(bbox.shape[1]						):
														if bbox[i, j, 3] < bbox[i, j, 1]:
																		lowerCAmelCase__		  =  bbox[i, j, 3]
																		lowerCAmelCase__		  =  bbox[i, j, 1]
																		lowerCAmelCase__		  =  t
														if bbox[i, j, 2] < bbox[i, j, 0]:
																		lowerCAmelCase__		  =  bbox[i, j, 2]
																		lowerCAmelCase__		  =  bbox[i, j, 0]
																		lowerCAmelCase__		  =  t

						lowerCAmelCase__		  =  floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]						)

						lowerCAmelCase__		  =  None
						if self.use_input_mask:
										lowerCAmelCase__		  =  random_attention_mask([self.batch_size, self.text_seq_length]						)

						lowerCAmelCase__		  =  None
						if self.use_token_type_ids:
										lowerCAmelCase__		  =  ids_tensor([self.batch_size, self.text_seq_length]    ,self.type_vocab_size						)

						lowerCAmelCase__		  =  None
						lowerCAmelCase__		  =  None
						if self.use_labels:
										lowerCAmelCase__		  =  ids_tensor([self.batch_size]    ,self.type_sequence_label_size						)
										lowerCAmelCase__		  =  ids_tensor([self.batch_size, self.text_seq_length]    ,self.num_labels						)

						lowerCAmelCase__		  =  LayoutLMvaConfig(
						    vocab_size=self.vocab_size    ,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    ,max_position_embeddings=self.max_position_embeddings    ,type_vocab_size=self.type_vocab_size    ,initializer_range=self.initializer_range    ,coordinate_size=self.coordinate_size    ,shape_size=self.shape_size    ,input_size=self.image_size    ,patch_size=self.patch_size    ,)

						return config, input_ids, bbox, pixel_values, token_type_ids, input_mask, sequence_labels, token_labels
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  LayoutLMvaModel(config=a_						)
						model.to(a_						)
						model.eval()

						# text + image
						lowerCAmelCase__		  =  model(a_    ,pixel_values=a_						)
						lowerCAmelCase__		  =  model(
						    a_    ,bbox=a_    ,pixel_values=a_    ,attention_mask=a_    ,token_type_ids=a_						)
						lowerCAmelCase__		  =  model(a_    ,bbox=a_    ,pixel_values=a_    ,token_type_ids=a_						)
						lowerCAmelCase__		  =  model(a_    ,bbox=a_    ,pixel_values=a_						)

						self.parent.assertEqual(result.last_hidden_state.shape    ,(self.batch_size, self.seq_length, self.hidden_size)						)

						# text only
						lowerCAmelCase__		  =  model(a_						)
						self.parent.assertEqual(
						    result.last_hidden_state.shape    ,(self.batch_size, self.text_seq_length, self.hidden_size)						)

						# image only
						lowerCAmelCase__		  =  model(pixel_values=a_						)
						self.parent.assertEqual(
						    result.last_hidden_state.shape    ,(self.batch_size, self.image_seq_length, self.hidden_size)						)
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.num_labels
						lowerCAmelCase__		  =  LayoutLMvaForSequenceClassification(a_						)
						model.to(a_						)
						model.eval()
						lowerCAmelCase__		  =  model(
						    a_    ,bbox=a_    ,pixel_values=a_    ,attention_mask=a_    ,token_type_ids=a_    ,labels=a_    ,)
						self.parent.assertEqual(result.logits.shape    ,(self.batch_size, self.num_labels)						)
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.num_labels
						lowerCAmelCase__		  =  LayoutLMvaForTokenClassification(config=a_						)
						model.to(a_						)
						model.eval()
						lowerCAmelCase__		  =  model(
						    a_    ,bbox=a_    ,pixel_values=a_    ,attention_mask=a_    ,token_type_ids=a_    ,labels=a_    ,)
						self.parent.assertEqual(result.logits.shape    ,(self.batch_size, self.text_seq_length, self.num_labels)						)
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  LayoutLMvaForQuestionAnswering(config=a_						)
						model.to(a_						)
						model.eval()
						lowerCAmelCase__		  =  model(
						    a_    ,bbox=a_    ,pixel_values=a_    ,attention_mask=a_    ,token_type_ids=a_    ,start_positions=a_    ,end_positions=a_    ,)
						self.parent.assertEqual(result.start_logits.shape    ,(self.batch_size, self.seq_length)						)
						self.parent.assertEqual(result.end_logits.shape    ,(self.batch_size, self.seq_length)						)



		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.prepare_config_and_inputs()
						(
						    (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   (
						    lowerCAmelCase__
						)  ,   
						)		  =  config_and_inputs
						lowerCAmelCase__		  =  {
						    'input_ids': input_ids,
						    'bbox': bbox,
						    'pixel_values': pixel_values,
						    'token_type_ids': token_type_ids,
						    'attention_mask': input_mask,
						}
						return config, inputs_dict



@require_torch
class 	__snake_case   ( SCREAMING_SNAKE_CASE							, SCREAMING_SNAKE_CASE							, unittest.TestCase ):
		SCREAMING_SNAKE_CASE__								=	False
		SCREAMING_SNAKE_CASE__								=	False
		SCREAMING_SNAKE_CASE__								=	False

		SCREAMING_SNAKE_CASE__								=	(
		    (
		        LayoutLMvaModel,
		        LayoutLMvaForSequenceClassification,
		        LayoutLMvaForTokenClassification,
		        LayoutLMvaForQuestionAnswering,
		    )
		    if is_torch_available()
		    else ()
		)
		SCREAMING_SNAKE_CASE__								=	(
		    {'document-question-answering': LayoutLMvaForQuestionAnswering, 'feature-extraction': LayoutLMvaModel}
		    if is_torch_available()
		    else {}
		)
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_    ,a_    ,a_						):







						"""simple docstring"""
						# `DocumentQuestionAnsweringPipeline` is expected to work with this model, but it combines the text and visual
						# embedding along the sequence dimension (dim 1), which causes an error during post-processing as `p_mask` has
						# the sequence dimension of the text embedding only.
						# (see the line `embedding_output = torch.cat([embedding_output, visual_embeddings], dim=1)`)
						return True
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  LayoutLMvaModelTester(self						)
						lowerCAmelCase__		  =  ConfigTester(self    ,config_class=a_    ,hidden_size=37						)
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_    ,a_    ,a_=False						):







						"""simple docstring"""
						lowerCAmelCase__		  =  copy.deepcopy(a_						)
						if model_class in get_values(a_						):
										lowerCAmelCase__		  =  {
										    k: v.unsqueeze(1						).expand(-1    ,self.model_tester.num_choices    ,-1						).contiguous()
										    if isinstance(a_    ,torch.Tensor						) and v.ndim > 1
										    else v
										    for k, v in inputs_dict.items()
										}
						if return_labels:
										if model_class in get_values(a_						):
														lowerCAmelCase__		  =  torch.ones(self.model_tester.batch_size    ,dtype=torch.long    ,device=a_						)
										elif model_class in get_values(a_						):
														lowerCAmelCase__		  =  torch.zeros(
														    self.model_tester.batch_size    ,dtype=torch.long    ,device=a_						)
														lowerCAmelCase__		  =  torch.zeros(
														    self.model_tester.batch_size    ,dtype=torch.long    ,device=a_						)
										elif model_class in [
										    *get_values(a_						),
										]:
														lowerCAmelCase__		  =  torch.zeros(
														    self.model_tester.batch_size    ,dtype=torch.long    ,device=a_						)
										elif model_class in [
										    *get_values(a_						),
										]:
														lowerCAmelCase__		  =  torch.zeros(
														    (self.model_tester.batch_size, self.model_tester.text_seq_length)    ,dtype=torch.long    ,device=a_    ,)

						return inputs_dict
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						self.config_tester.run_common_tests()
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_model(*a_						)
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.model_tester.prepare_config_and_inputs()
						for type in ["absolute", "relative_key", "relative_key_query"]:
										lowerCAmelCase__		  =  type
										self.model_tester.create_and_check_model(*a_						)
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_for_sequence_classification(*a_						)
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_for_token_classification(*a_						)
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.model_tester.prepare_config_and_inputs()
						self.model_tester.create_and_check_for_question_answering(*a_						)



		@slow
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						for model_name in LAYOUTLMV3_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
										lowerCAmelCase__		  =  LayoutLMvaModel.from_pretrained(a_						)
										self.assertIsNotNone(a_						)







def     UpperCAmelCase_		(					)	->     Optional[Any]:



				"""simple docstring"""





				lowerCAmelCase__		  =  Image.open('./tests/fixtures/tests_samples/COCO/000000039769.png'					)
				return image


@require_torch
class 	__snake_case   ( unittest.TestCase ):
		@cached_property
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						return LayoutLMvaImageProcessor(apply_ocr=a_						) if is_vision_available() else None



		@slow
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  LayoutLMvaModel.from_pretrained('microsoft/layoutlmv3-base'						).to(a_						)

						lowerCAmelCase__		  =  self.default_image_processor
						lowerCAmelCase__		  =  prepare_img()
						lowerCAmelCase__		  =  image_processor(images=a_    ,return_tensors='pt'						).pixel_values.to(a_						)

						lowerCAmelCase__		  =  torch.tensor([[1, 2]]						)
						lowerCAmelCase__		  =  torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]]						).unsqueeze(0						)

						# forward pass
						lowerCAmelCase__		  =  model(
						    input_ids=input_ids.to(a_						)    ,bbox=bbox.to(a_						)    ,pixel_values=pixel_values.to(a_						)    ,)

						# verify the logits
						lowerCAmelCase__		  =  torch.Size((1, 199, 768)						)
						self.assertEqual(outputs.last_hidden_state.shape    ,a_						)

						lowerCAmelCase__		  =  torch.tensor(
						    [[-0.0529, 0.3618, 0.1632], [-0.1587, -0.1667, -0.0400], [-0.1557, -0.1671, -0.0505]]						).to(a_						)

						self.assertTrue(torch.allclose(outputs.last_hidden_state[0, :3, :3]    ,a_    ,atol=1e-4						)						)





from __future__ import annotations

from collections.abc import Iterator
from typing import Generic, TypeVar

_lowerCAmelCase	:   List[str]    =   TypeVar("T")


class 	__snake_case   ( Generic[T] ):
		def __init__(							self    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  data
						lowerCAmelCase__		  =  None



		def __str__(							self						):







						"""simple docstring"""
						return f'{self.data}'



class 	__snake_case   ( Generic[T] ):
		def __init__(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  None
		def __iter__(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  self.top
						while node:
										yield node.data
										lowerCAmelCase__		  =  node.next
		def __str__(							self						):







						"""simple docstring"""
						return "->".join([str(a_						) for item in self]						)
		def __len__(							self						):







						"""simple docstring"""
						return len(tuple(iter(self						)						)						)
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						return self.top is None
		def 						SCREAMING_SNAKE_CASE_					(							self    ,a_						):







						"""simple docstring"""
						lowerCAmelCase__		  =  Node(a_						)
						if not self.is_empty():
										lowerCAmelCase__		  =  self.top
						lowerCAmelCase__		  =  node
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						if self.is_empty():
										raise IndexError('pop from empty stack'						)
						assert isinstance(self.top    ,a_						)
						lowerCAmelCase__		  =  self.top
						lowerCAmelCase__		  =  self.top.next
						return pop_node.data
		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						if self.is_empty():
										raise IndexError('peek from empty stack'						)

						assert self.top is not None
						return self.top.data



		def 						SCREAMING_SNAKE_CASE_					(							self						):







						"""simple docstring"""
						lowerCAmelCase__		  =  None


if __name__ == "__main__":
	from doctest import testmod

	testmod()
