




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






		def __init__(    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE=2						,		_SCREAMING_SNAKE_CASE=3						,		_SCREAMING_SNAKE_CASE=4						,		_SCREAMING_SNAKE_CASE=2						,		_SCREAMING_SNAKE_CASE=7						,		_SCREAMING_SNAKE_CASE=True						,		_SCREAMING_SNAKE_CASE=True						,		_SCREAMING_SNAKE_CASE=True						,		_SCREAMING_SNAKE_CASE=True						,		_SCREAMING_SNAKE_CASE=99						,		_SCREAMING_SNAKE_CASE=36						,		_SCREAMING_SNAKE_CASE=3						,		_SCREAMING_SNAKE_CASE=4						,		_SCREAMING_SNAKE_CASE=37						,		_SCREAMING_SNAKE_CASE="gelu"						,		_SCREAMING_SNAKE_CASE=0.1						,		_SCREAMING_SNAKE_CASE=0.1						,		_SCREAMING_SNAKE_CASE=512						,		_SCREAMING_SNAKE_CASE=16						,		_SCREAMING_SNAKE_CASE=2						,		_SCREAMING_SNAKE_CASE=0.02						,		_SCREAMING_SNAKE_CASE=6						,		_SCREAMING_SNAKE_CASE=6						,		_SCREAMING_SNAKE_CASE=3						,		_SCREAMING_SNAKE_CASE=4						,		_SCREAMING_SNAKE_CASE=None						,		_SCREAMING_SNAKE_CASE=1000						,		):
								_UpperCAmelCase      =			parent
								_UpperCAmelCase      =			batch_size
								_UpperCAmelCase      =			num_channels
								_UpperCAmelCase      =			image_size
								_UpperCAmelCase      =			patch_size
								_UpperCAmelCase      =			text_seq_length
								_UpperCAmelCase      =			is_training
								_UpperCAmelCase      =			use_input_mask
								_UpperCAmelCase      =			use_token_type_ids
								_UpperCAmelCase      =			use_labels
								_UpperCAmelCase      =			vocab_size
								_UpperCAmelCase      =			hidden_size
								_UpperCAmelCase      =			num_hidden_layers
								_UpperCAmelCase      =			num_attention_heads
								_UpperCAmelCase      =			intermediate_size
								_UpperCAmelCase      =			hidden_act
								_UpperCAmelCase      =			hidden_dropout_prob
								_UpperCAmelCase      =			attention_probs_dropout_prob
								_UpperCAmelCase      =			max_position_embeddings
								_UpperCAmelCase      =			type_vocab_size
								_UpperCAmelCase      =			type_sequence_label_size
								_UpperCAmelCase      =			initializer_range
								_UpperCAmelCase      =			coordinate_size
								_UpperCAmelCase      =			shape_size
								_UpperCAmelCase      =			num_labels
								_UpperCAmelCase      =			num_choices
								_UpperCAmelCase      =			scope
								_UpperCAmelCase      =			range_bbox

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






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			ids_tensor([self.batch_size, self.text_seq_length]						,		self.vocab_size			)

								_UpperCAmelCase      =			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]:
																										_UpperCAmelCase      =			bbox[i, j, 3]
																										_UpperCAmelCase      =			bbox[i, j, 1]
																										_UpperCAmelCase      =			t
																				if bbox[i, j, 2] < bbox[i, j, 0]:
																										_UpperCAmelCase      =			bbox[i, j, 2]
																										_UpperCAmelCase      =			bbox[i, j, 0]
																										_UpperCAmelCase      =			t

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

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

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

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

								_UpperCAmelCase      =			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 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			LayoutLMvaModel(config=_SCREAMING_SNAKE_CASE			)
								model.to(_SCREAMING_SNAKE_CASE			)
								model.eval()

								# text + image
								_UpperCAmelCase      =			model(_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE			)
								_UpperCAmelCase      =			model(
								    _SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE						,		attention_mask=_SCREAMING_SNAKE_CASE						,		token_type_ids=_SCREAMING_SNAKE_CASE			)
								_UpperCAmelCase      =			model(_SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE						,		token_type_ids=_SCREAMING_SNAKE_CASE			)
								_UpperCAmelCase      =			model(_SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE			)

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

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

								# image only
								_UpperCAmelCase      =			model(pixel_values=_SCREAMING_SNAKE_CASE			)
								self.parent.assertEqual(
								    result.last_hidden_state.shape						,		(self.batch_size, self.image_seq_length, self.hidden_size)			)






		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			self.num_labels
								_UpperCAmelCase      =			LayoutLMvaForSequenceClassification(_SCREAMING_SNAKE_CASE			)
								model.to(_SCREAMING_SNAKE_CASE			)
								model.eval()
								_UpperCAmelCase      =			model(
								    _SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE						,		attention_mask=_SCREAMING_SNAKE_CASE						,		token_type_ids=_SCREAMING_SNAKE_CASE						,		labels=_SCREAMING_SNAKE_CASE						,		)
								self.parent.assertEqual(result.logits.shape						,		(self.batch_size, self.num_labels)			)






		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			self.num_labels
								_UpperCAmelCase      =			LayoutLMvaForTokenClassification(config=_SCREAMING_SNAKE_CASE			)
								model.to(_SCREAMING_SNAKE_CASE			)
								model.eval()
								_UpperCAmelCase      =			model(
								    _SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE						,		attention_mask=_SCREAMING_SNAKE_CASE						,		token_type_ids=_SCREAMING_SNAKE_CASE						,		labels=_SCREAMING_SNAKE_CASE						,		)
								self.parent.assertEqual(result.logits.shape						,		(self.batch_size, self.text_seq_length, self.num_labels)			)






		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			LayoutLMvaForQuestionAnswering(config=_SCREAMING_SNAKE_CASE			)
								model.to(_SCREAMING_SNAKE_CASE			)
								model.eval()
								_UpperCAmelCase      =			model(
								    _SCREAMING_SNAKE_CASE						,		bbox=_SCREAMING_SNAKE_CASE						,		pixel_values=_SCREAMING_SNAKE_CASE						,		attention_mask=_SCREAMING_SNAKE_CASE						,		token_type_ids=_SCREAMING_SNAKE_CASE						,		start_positions=_SCREAMING_SNAKE_CASE						,		end_positions=_SCREAMING_SNAKE_CASE						,		)
								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 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.prepare_config_and_inputs()
								(
								    (
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					(
								    _UpperCAmelCase
								)    ,					
								)      =			config_and_inputs
								_UpperCAmelCase      =			{
								    """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       _A				(		__lowercase       ,     __lowercase       ,     unittest.TestCase     ):
		__a					    =       False
		__a					    =       False
		__a					    =       False

		__a					    =       (
		    (
		        LayoutLMvaModel,
		        LayoutLMvaForSequenceClassification,
		        LayoutLMvaForTokenClassification,
		        LayoutLMvaForQuestionAnswering,
		    )
		    if is_torch_available()
		    else ()
		)
		__a					    =       (
		    {"""document-question-answering""": LayoutLMvaForQuestionAnswering, """feature-extraction""": LayoutLMvaModel}
		    if is_torch_available()
		    else {}
		)






		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								# `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 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			LayoutLMvaModelTester(self			)
								_UpperCAmelCase      =			ConfigTester(self						,		config_class=_SCREAMING_SNAKE_CASE						,		hidden_size=37			)






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

								return inputs_dict






		def 				UpperCAmelCase (    self			):
								self.config_tester.run_common_tests()






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_model(*_SCREAMING_SNAKE_CASE			)






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.model_tester.prepare_config_and_inputs()
								for type in ["absolute", "relative_key", "relative_key_query"]:
														_UpperCAmelCase      =			type
														self.model_tester.create_and_check_model(*_SCREAMING_SNAKE_CASE			)






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_sequence_classification(*_SCREAMING_SNAKE_CASE			)






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_token_classification(*_SCREAMING_SNAKE_CASE			)






		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_question_answering(*_SCREAMING_SNAKE_CASE			)






		@slow
		def 				UpperCAmelCase (    self			):
								for model_name in LAYOUTLMV3_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
														_UpperCAmelCase      =			LayoutLMvaModel.from_pretrained(_SCREAMING_SNAKE_CASE			)
														self.assertIsNotNone(_SCREAMING_SNAKE_CASE			)




def        _SCREAMING_SNAKE_CASE      (		)						->				Dict:
						_UpperCAmelCase      =			Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png"""       )
						return image




@require_torch
class       _A				(		unittest.TestCase     ):






		@cached_property
		def 				UpperCAmelCase (    self			):
								return LayoutLMvaImageProcessor(apply_ocr=_SCREAMING_SNAKE_CASE			) if is_vision_available() else None






		@slow
		def 				UpperCAmelCase (    self			):
								_UpperCAmelCase      =			LayoutLMvaModel.from_pretrained("""microsoft/layoutlmv3-base"""			).to(_SCREAMING_SNAKE_CASE			)

								_UpperCAmelCase      =			self.default_image_processor
								_UpperCAmelCase      =			prepare_img()
								_UpperCAmelCase      =			image_processor(images=_SCREAMING_SNAKE_CASE						,		return_tensors="""pt"""			).pixel_values.to(_SCREAMING_SNAKE_CASE			)

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

								# forward pass
								_UpperCAmelCase      =			model(
								    input_ids=input_ids.to(_SCREAMING_SNAKE_CASE			)						,		bbox=bbox.to(_SCREAMING_SNAKE_CASE			)						,		pixel_values=pixel_values.to(_SCREAMING_SNAKE_CASE			)						,		)

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

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

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





import logging

from transformers.configuration_utils import PretrainedConfig


a													=			logging.getLogger(__name__)




class       _A				(		__lowercase     ):
		__a					    =       """masked_bert"""






		def __init__(    self						,		_SCREAMING_SNAKE_CASE=3_0522						,		_SCREAMING_SNAKE_CASE=768						,		_SCREAMING_SNAKE_CASE=12						,		_SCREAMING_SNAKE_CASE=12						,		_SCREAMING_SNAKE_CASE=3072						,		_SCREAMING_SNAKE_CASE="gelu"						,		_SCREAMING_SNAKE_CASE=0.1						,		_SCREAMING_SNAKE_CASE=0.1						,		_SCREAMING_SNAKE_CASE=512						,		_SCREAMING_SNAKE_CASE=2						,		_SCREAMING_SNAKE_CASE=0.02						,		_SCREAMING_SNAKE_CASE=1e-12						,		_SCREAMING_SNAKE_CASE=0						,		_SCREAMING_SNAKE_CASE="topK"						,		_SCREAMING_SNAKE_CASE="constant"						,		_SCREAMING_SNAKE_CASE=0.0						,		**_SCREAMING_SNAKE_CASE						,		):
								super().__init__(pad_token_id=_SCREAMING_SNAKE_CASE						,		**_SCREAMING_SNAKE_CASE			)

								_UpperCAmelCase      =			vocab_size
								_UpperCAmelCase      =			hidden_size
								_UpperCAmelCase      =			num_hidden_layers
								_UpperCAmelCase      =			num_attention_heads
								_UpperCAmelCase      =			hidden_act
								_UpperCAmelCase      =			intermediate_size
								_UpperCAmelCase      =			hidden_dropout_prob
								_UpperCAmelCase      =			attention_probs_dropout_prob
								_UpperCAmelCase      =			max_position_embeddings
								_UpperCAmelCase      =			type_vocab_size
								_UpperCAmelCase      =			initializer_range
								_UpperCAmelCase      =			layer_norm_eps
								_UpperCAmelCase      =			pruning_method
								_UpperCAmelCase      =			mask_init
								_UpperCAmelCase      =			mask_scale