
import unittest

from transformers import LayoutLMConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

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


if is_torch_available():
						import torch

						from transformers import (
						    LayoutLMForMaskedLM,
						    LayoutLMForQuestionAnswering,
						    LayoutLMForSequenceClassification,
						    LayoutLMForTokenClassification,
						    LayoutLMModel,
						)


class 	UpperCamelCase__       :

						'''simple docstring'''



						def __init__(  self  , A  , A=13  , A=7  , A=True  , A=True  , A=True  , A=True  , A=99  , A=32  , A=5  , A=4  , A=37  , A="gelu"  , A=0.1  , A=0.1  , A=5_12  , A=16  , A=2  , A=0.02  , A=3  , A=4  , A=None  , A=10_00  , )  ->Dict:
									UpperCAmelCase__		:Optional[int] 		=    parent
									UpperCAmelCase__		:Any 		=    batch_size
									UpperCAmelCase__		:Union[str, Any] 		=    seq_length
									UpperCAmelCase__		:Tuple 		=    is_training
									UpperCAmelCase__		:Tuple 		=    use_input_mask
									UpperCAmelCase__		:Union[str, Any] 		=    use_token_type_ids
									UpperCAmelCase__		:List[Any] 		=    use_labels
									UpperCAmelCase__		:Any 		=    vocab_size
									UpperCAmelCase__		:str 		=    hidden_size
									UpperCAmelCase__		:Union[str, Any] 		=    num_hidden_layers
									UpperCAmelCase__		:int 		=    num_attention_heads
									UpperCAmelCase__		:Optional[Any] 		=    intermediate_size
									UpperCAmelCase__		:List[str] 		=    hidden_act
									UpperCAmelCase__		:Dict 		=    hidden_dropout_prob
									UpperCAmelCase__		:List[Any] 		=    attention_probs_dropout_prob
									UpperCAmelCase__		:Optional[int] 		=    max_position_embeddings
									UpperCAmelCase__		:List[str] 		=    type_vocab_size
									UpperCAmelCase__		:Tuple 		=    type_sequence_label_size
									UpperCAmelCase__		:int 		=    initializer_range
									UpperCAmelCase__		:Optional[Any] 		=    num_labels
									UpperCAmelCase__		:Dict 		=    num_choices
									UpperCAmelCase__		:Optional[Any] 		=    scope
									UpperCAmelCase__		:List[str] 		=    range_bbox


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:int 		=    ids_tensor([self.batch_size, self.seq_length]  , self.vocab_size	)

									UpperCAmelCase__		:int 		=    ids_tensor([self.batch_size, self.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__		:Dict 		=    bbox[i, j, 3]
																		UpperCAmelCase__		:int 		=    bbox[i, j, 1]
																		UpperCAmelCase__		:List[str] 		=    t
															if bbox[i, j, 2] < bbox[i, j, 0]:
																		UpperCAmelCase__		:Union[str, Any] 		=    bbox[i, j, 2]
																		UpperCAmelCase__		:Dict 		=    bbox[i, j, 0]
																		UpperCAmelCase__		:Optional[Any] 		=    t

									UpperCAmelCase__		:Union[str, Any] 		=    None
									if self.use_input_mask:
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size, self.seq_length]  , vocab_size=2	)

									UpperCAmelCase__		:List[Any] 		=    None
									if self.use_token_type_ids:
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size, self.seq_length]  , self.type_vocab_size	)

									UpperCAmelCase__		:Dict 		=    None
									UpperCAmelCase__		:int 		=    None
									UpperCAmelCase__		:Tuple 		=    None
									if self.use_labels:
												UpperCAmelCase__		:Union[str, Any] 		=    ids_tensor([self.batch_size]  , self.type_sequence_label_size	)
												UpperCAmelCase__		:Any 		=    ids_tensor([self.batch_size, self.seq_length]  , self.num_labels	)
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size]  , self.num_choices	)

									UpperCAmelCase__		:Dict 		=    self.get_config()

									return config, input_ids, bbox, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels


						def    A__       (  self	)  ->Any:
									return LayoutLMConfig(
									    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  , )


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Tuple:
									UpperCAmelCase__		:Optional[int] 		=    LayoutLMModel(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:List[str] 		=    model(A  , A  , attention_mask=A  , token_type_ids=A	)
									UpperCAmelCase__		:Any 		=    model(A  , A  , token_type_ids=A	)
									UpperCAmelCase__		:List[str] 		=    model(A  , A	)
									self.parent.assertEqual(result.last_hidden_state.shape  , (self.batch_size, self.seq_length, self.hidden_size)	)
									self.parent.assertEqual(result.pooler_output.shape  , (self.batch_size, self.hidden_size)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Tuple:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMForMaskedLM(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:List[str] 		=    model(A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.seq_length, self.vocab_size)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->List[Any]:
									UpperCAmelCase__		:Any 		=    self.num_labels
									UpperCAmelCase__		:List[Any] 		=    LayoutLMForSequenceClassification(A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Optional[int] 		=    model(
									    A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.num_labels)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Dict:
									UpperCAmelCase__		:Optional[Any] 		=    self.num_labels
									UpperCAmelCase__		:Dict 		=    LayoutLMForTokenClassification(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Dict 		=    model(A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.seq_length, self.num_labels)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->List[str]:
									UpperCAmelCase__		:Tuple 		=    LayoutLMForQuestionAnswering(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Optional[int] 		=    model(
									    A  , bbox=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    A__       (  self	)  ->List[Any]:
									UpperCAmelCase__		:Union[str, Any] 		=    self.prepare_config_and_inputs()
									(
									    (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       
									)		:Optional[int] 		=    config_and_inputs
									UpperCAmelCase__		:str 		=    {
									    'input_ids': input_ids,
									    'bbox': bbox,
									    'token_type_ids': token_type_ids,
									    'attention_mask': input_mask,
									}
									return config, inputs_dict


@require_torch
class 	UpperCamelCase__       (  UpperCAmelCase__						,			UpperCAmelCase__						,			unittest.TestCase):

						'''simple docstring'''



						__a     :    Dict												=			(
						    (
						        LayoutLMModel,
						        LayoutLMForMaskedLM,
						        LayoutLMForSequenceClassification,
						        LayoutLMForTokenClassification,
						        LayoutLMForQuestionAnswering,
						    )
						    if is_torch_available()
						    else None
						)
						__a     :    Tuple												=			(
						    {
						        """document-question-answering""": LayoutLMForQuestionAnswering,
						        """feature-extraction""": LayoutLMModel,
						        """fill-mask""": LayoutLMForMaskedLM,
						        """text-classification""": LayoutLMForSequenceClassification,
						        """token-classification""": LayoutLMForTokenClassification,
						        """zero-shot""": LayoutLMForSequenceClassification,
						    }
						    if is_torch_available()
						    else {}
						)
						__a     :    str												=			True


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMModelTester(self	)
									UpperCAmelCase__		:Optional[Any] 		=    ConfigTester(self  , config_class=A  , hidden_size=37	)


						def    A__       (  self	)  ->Any:
									self.config_tester.run_common_tests()


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:Union[str, Any] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_model(*A	)


						def    A__       (  self	)  ->List[Any]:
									UpperCAmelCase__		:int 		=    self.model_tester.prepare_config_and_inputs()
									for type in ["absolute", "relative_key", "relative_key_query"]:
												UpperCAmelCase__		:List[Any] 		=    type
												self.model_tester.create_and_check_model(*A	)


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:Any 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_masked_lm(*A	)


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:Optional[int] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_sequence_classification(*A	)


						def    A__       (  self	)  ->Union[str, Any]:
									UpperCAmelCase__		:List[Any] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_token_classification(*A	)


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:List[str] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_question_answering(*A	)


						@unittest.skip('Will be fixed soon by reducing the size of the model used for common tests.'	)
						def    A__       (  self	)  ->Any:
									pass




def 		A						(  ):




			"""simple docstring"""


			UpperCAmelCase__		:Tuple 		=    torch.tensor([[101,1019,1014,1016,1037,12849,4747,1004,14246,2278,5439,4524,5002,2930,2193,2930,4341,3208,1005,1055,2171,2848,11300,3531,102],[101,4070,4034,7020,1024,3058,1015,1013,2861,1013,6070,19274,2772,6205,27814,16147,16147,4343,2047,10283,10969,14389,1012,2338,102]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:List[str] 		=    torch.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:List[Any] 		=    torch.tensor([[[0,0,0,0],[423,237,440,251],[427,272,441,287],[419,115,437,129],[961,885,992,912],[256,38,330,58],[256,38,330,58],[336,42,353,57],[360,39,401,56],[360,39,401,56],[411,39,471,59],[479,41,528,59],[533,39,630,60],[67,113,134,131],[141,115,209,132],[68,149,133,166],[141,149,187,164],[195,148,287,165],[195,148,287,165],[195,148,287,165],[295,148,349,165],[441,149,492,166],[497,149,546,164],[64,201,125,218],[1000,1000,1000,1000]],[[0,0,0,0],[662,150,754,166],[665,199,742,211],[519,213,554,228],[519,213,554,228],[134,433,187,454],[130,467,204,480],[130,467,204,480],[130,467,204,480],[130,467,204,480],[130,467,204,480],[314,469,376,482],[504,684,582,706],[941,825,973,900],[941,825,973,900],[941,825,973,900],[941,825,973,900],[610,749,652,765],[130,659,168,672],[176,657,237,672],[238,657,312,672],[443,653,628,672],[443,653,628,672],[716,301,825,317],[1000,1000,1000,1000]]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:str 		=    torch.tensor([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			# these are sequence labels (i.e. at the token level)
			UpperCAmelCase__		:int 		=    torch.tensor([[-100,10,10,10,9,1,-100,7,7,-100,7,7,4,2,5,2,8,8,-100,-100,5,0,3,2,-100],[-100,12,12,12,-100,12,10,-100,-100,-100,-100,10,12,9,-100,-100,-100,10,10,10,9,12,-100,10,-100]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			# fmt: on

			return input_ids, attention_mask, bbox, token_type_ids, labels




@require_torch
class 	UpperCamelCase__       (  unittest.TestCase):

						'''simple docstring'''



						@slow
						def    A__       (  self	)  ->Optional[Any]:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMModel.from_pretrained('microsoft/layoutlm-base-uncased'	).to(A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Optional[Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:List[Any] 		=    model(input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A	)

									# test the sequence output on [0, :3, :3]
									UpperCAmelCase__		:List[str] 		=    torch.tensor(
									    [[0.1785, -0.1947, -0.0425], [-0.3254, -0.2807, 0.2553], [-0.5391, -0.3322, 0.3364]]  , device=A  , )

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

									# test the pooled output on [1, :3]
									UpperCAmelCase__		:Optional[Any] 		=    torch.tensor([-0.6580, -0.0214, 0.8552]  , device=A	)

									self.assertTrue(torch.allclose(outputs.pooler_output[1, :3]  , A  , atol=1e-3	)	)


						@slow
						def    A__       (  self	)  ->List[Any]:
									# initialize model with randomly initialized sequence classification head
									UpperCAmelCase__		:Tuple 		=    LayoutLMForSequenceClassification.from_pretrained('microsoft/layoutlm-base-uncased'  , num_labels=2	).to(
									    A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Union[str, Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:Tuple 		=    model(
									    input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A  , labels=torch.tensor([1, 1]  , device=A	)  , )

									# test whether we get a loss as a scalar
									UpperCAmelCase__		:Optional[int] 		=    outputs.loss
									UpperCAmelCase__		:str 		=    torch.Size([]	)
									self.assertEqual(loss.shape  , A	)

									# test the shape of the logits
									UpperCAmelCase__		:List[str] 		=    outputs.logits
									UpperCAmelCase__		:Tuple 		=    torch.Size((2, 2)	)
									self.assertEqual(logits.shape  , A	)


						@slow
						def    A__       (  self	)  ->str:
									# initialize model with randomly initialized token classification head
									UpperCAmelCase__		:List[Any] 		=    LayoutLMForTokenClassification.from_pretrained('microsoft/layoutlm-base-uncased'  , num_labels=13	).to(
									    A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:int 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:List[str] 		=    model(
									    input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A  , labels=A	)

									# test the loss calculation to be around 2.65
									# expected_loss = torch.tensor(2.65, device=torch_device)

									# The loss is currently somewhat random and can vary between 0.1-0.3 atol.
									# self.assertTrue(torch.allclose(outputs.loss, expected_loss, atol=0.1))

									# test the shape of the logits
									UpperCAmelCase__		:Any 		=    outputs.logits
									UpperCAmelCase__		:Any 		=    torch.Size((2, 25, 13)	)
									self.assertEqual(logits.shape  , A	)


						@slow
						def    A__       (  self	)  ->str:
									# initialize model with randomly initialized token classification head
									UpperCAmelCase__		:Optional[int] 		=    LayoutLMForQuestionAnswering.from_pretrained('microsoft/layoutlm-base-uncased'	).to(A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Optional[Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:Tuple 		=    model(input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A	)

									# test the shape of the logits
									UpperCAmelCase__		:Optional[int] 		=    torch.Size((2, 25)	)
									self.assertEqual(outputs.start_logits.shape  , A	)
									self.assertEqual(outputs.end_logits.shape  , A	)







import unittest

from transformers import LayoutLMConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

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


if is_torch_available():
						import torch

						from transformers import (
						    LayoutLMForMaskedLM,
						    LayoutLMForQuestionAnswering,
						    LayoutLMForSequenceClassification,
						    LayoutLMForTokenClassification,
						    LayoutLMModel,
						)


class 	UpperCamelCase__       :

						'''simple docstring'''



						def __init__(  self  , A  , A=13  , A=7  , A=True  , A=True  , A=True  , A=True  , A=99  , A=32  , A=5  , A=4  , A=37  , A="gelu"  , A=0.1  , A=0.1  , A=5_12  , A=16  , A=2  , A=0.02  , A=3  , A=4  , A=None  , A=10_00  , )  ->Dict:
									UpperCAmelCase__		:Optional[int] 		=    parent
									UpperCAmelCase__		:Any 		=    batch_size
									UpperCAmelCase__		:Union[str, Any] 		=    seq_length
									UpperCAmelCase__		:Tuple 		=    is_training
									UpperCAmelCase__		:Tuple 		=    use_input_mask
									UpperCAmelCase__		:Union[str, Any] 		=    use_token_type_ids
									UpperCAmelCase__		:List[Any] 		=    use_labels
									UpperCAmelCase__		:Any 		=    vocab_size
									UpperCAmelCase__		:str 		=    hidden_size
									UpperCAmelCase__		:Union[str, Any] 		=    num_hidden_layers
									UpperCAmelCase__		:int 		=    num_attention_heads
									UpperCAmelCase__		:Optional[Any] 		=    intermediate_size
									UpperCAmelCase__		:List[str] 		=    hidden_act
									UpperCAmelCase__		:Dict 		=    hidden_dropout_prob
									UpperCAmelCase__		:List[Any] 		=    attention_probs_dropout_prob
									UpperCAmelCase__		:Optional[int] 		=    max_position_embeddings
									UpperCAmelCase__		:List[str] 		=    type_vocab_size
									UpperCAmelCase__		:Tuple 		=    type_sequence_label_size
									UpperCAmelCase__		:int 		=    initializer_range
									UpperCAmelCase__		:Optional[Any] 		=    num_labels
									UpperCAmelCase__		:Dict 		=    num_choices
									UpperCAmelCase__		:Optional[Any] 		=    scope
									UpperCAmelCase__		:List[str] 		=    range_bbox


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:int 		=    ids_tensor([self.batch_size, self.seq_length]  , self.vocab_size	)

									UpperCAmelCase__		:int 		=    ids_tensor([self.batch_size, self.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__		:Dict 		=    bbox[i, j, 3]
																		UpperCAmelCase__		:int 		=    bbox[i, j, 1]
																		UpperCAmelCase__		:List[str] 		=    t
															if bbox[i, j, 2] < bbox[i, j, 0]:
																		UpperCAmelCase__		:Union[str, Any] 		=    bbox[i, j, 2]
																		UpperCAmelCase__		:Dict 		=    bbox[i, j, 0]
																		UpperCAmelCase__		:Optional[Any] 		=    t

									UpperCAmelCase__		:Union[str, Any] 		=    None
									if self.use_input_mask:
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size, self.seq_length]  , vocab_size=2	)

									UpperCAmelCase__		:List[Any] 		=    None
									if self.use_token_type_ids:
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size, self.seq_length]  , self.type_vocab_size	)

									UpperCAmelCase__		:Dict 		=    None
									UpperCAmelCase__		:int 		=    None
									UpperCAmelCase__		:Tuple 		=    None
									if self.use_labels:
												UpperCAmelCase__		:Union[str, Any] 		=    ids_tensor([self.batch_size]  , self.type_sequence_label_size	)
												UpperCAmelCase__		:Any 		=    ids_tensor([self.batch_size, self.seq_length]  , self.num_labels	)
												UpperCAmelCase__		:Dict 		=    ids_tensor([self.batch_size]  , self.num_choices	)

									UpperCAmelCase__		:Dict 		=    self.get_config()

									return config, input_ids, bbox, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels


						def    A__       (  self	)  ->Any:
									return LayoutLMConfig(
									    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  , )


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Tuple:
									UpperCAmelCase__		:Optional[int] 		=    LayoutLMModel(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:List[str] 		=    model(A  , A  , attention_mask=A  , token_type_ids=A	)
									UpperCAmelCase__		:Any 		=    model(A  , A  , token_type_ids=A	)
									UpperCAmelCase__		:List[str] 		=    model(A  , A	)
									self.parent.assertEqual(result.last_hidden_state.shape  , (self.batch_size, self.seq_length, self.hidden_size)	)
									self.parent.assertEqual(result.pooler_output.shape  , (self.batch_size, self.hidden_size)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Tuple:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMForMaskedLM(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:List[str] 		=    model(A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.seq_length, self.vocab_size)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->List[Any]:
									UpperCAmelCase__		:Any 		=    self.num_labels
									UpperCAmelCase__		:List[Any] 		=    LayoutLMForSequenceClassification(A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Optional[int] 		=    model(
									    A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.num_labels)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->Dict:
									UpperCAmelCase__		:Optional[Any] 		=    self.num_labels
									UpperCAmelCase__		:Dict 		=    LayoutLMForTokenClassification(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Dict 		=    model(A  , A  , attention_mask=A  , token_type_ids=A  , labels=A	)
									self.parent.assertEqual(result.logits.shape  , (self.batch_size, self.seq_length, self.num_labels)	)


						def    A__       (  self  , A  , A  , A  , A  , A  , A  , A  , A	)  ->List[str]:
									UpperCAmelCase__		:Tuple 		=    LayoutLMForQuestionAnswering(config=A	)
									model.to(A	)
									model.eval()
									UpperCAmelCase__		:Optional[int] 		=    model(
									    A  , bbox=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    A__       (  self	)  ->List[Any]:
									UpperCAmelCase__		:Union[str, Any] 		=    self.prepare_config_and_inputs()
									(
									    (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       (
									    UpperCAmelCase__
									)		,       
									)		:Optional[int] 		=    config_and_inputs
									UpperCAmelCase__		:str 		=    {
									    'input_ids': input_ids,
									    'bbox': bbox,
									    'token_type_ids': token_type_ids,
									    'attention_mask': input_mask,
									}
									return config, inputs_dict


@require_torch
class 	UpperCamelCase__       (  UpperCAmelCase__						,			UpperCAmelCase__						,			unittest.TestCase):

						'''simple docstring'''



						__a     :    Dict												=			(
						    (
						        LayoutLMModel,
						        LayoutLMForMaskedLM,
						        LayoutLMForSequenceClassification,
						        LayoutLMForTokenClassification,
						        LayoutLMForQuestionAnswering,
						    )
						    if is_torch_available()
						    else None
						)
						__a     :    Tuple												=			(
						    {
						        """document-question-answering""": LayoutLMForQuestionAnswering,
						        """feature-extraction""": LayoutLMModel,
						        """fill-mask""": LayoutLMForMaskedLM,
						        """text-classification""": LayoutLMForSequenceClassification,
						        """token-classification""": LayoutLMForTokenClassification,
						        """zero-shot""": LayoutLMForSequenceClassification,
						    }
						    if is_torch_available()
						    else {}
						)
						__a     :    str												=			True


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMModelTester(self	)
									UpperCAmelCase__		:Optional[Any] 		=    ConfigTester(self  , config_class=A  , hidden_size=37	)


						def    A__       (  self	)  ->Any:
									self.config_tester.run_common_tests()


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:Union[str, Any] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_model(*A	)


						def    A__       (  self	)  ->List[Any]:
									UpperCAmelCase__		:int 		=    self.model_tester.prepare_config_and_inputs()
									for type in ["absolute", "relative_key", "relative_key_query"]:
												UpperCAmelCase__		:List[Any] 		=    type
												self.model_tester.create_and_check_model(*A	)


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:Any 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_masked_lm(*A	)


						def    A__       (  self	)  ->int:
									UpperCAmelCase__		:Optional[int] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_sequence_classification(*A	)


						def    A__       (  self	)  ->Union[str, Any]:
									UpperCAmelCase__		:List[Any] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_token_classification(*A	)


						def    A__       (  self	)  ->List[str]:
									UpperCAmelCase__		:List[str] 		=    self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_for_question_answering(*A	)


						@unittest.skip('Will be fixed soon by reducing the size of the model used for common tests.'	)
						def    A__       (  self	)  ->Any:
									pass




def 		A						(  ):




			"""simple docstring"""


			UpperCAmelCase__		:Tuple 		=    torch.tensor([[101,1019,1014,1016,1037,12849,4747,1004,14246,2278,5439,4524,5002,2930,2193,2930,4341,3208,1005,1055,2171,2848,11300,3531,102],[101,4070,4034,7020,1024,3058,1015,1013,2861,1013,6070,19274,2772,6205,27814,16147,16147,4343,2047,10283,10969,14389,1012,2338,102]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:List[str] 		=    torch.tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:List[Any] 		=    torch.tensor([[[0,0,0,0],[423,237,440,251],[427,272,441,287],[419,115,437,129],[961,885,992,912],[256,38,330,58],[256,38,330,58],[336,42,353,57],[360,39,401,56],[360,39,401,56],[411,39,471,59],[479,41,528,59],[533,39,630,60],[67,113,134,131],[141,115,209,132],[68,149,133,166],[141,149,187,164],[195,148,287,165],[195,148,287,165],[195,148,287,165],[295,148,349,165],[441,149,492,166],[497,149,546,164],[64,201,125,218],[1000,1000,1000,1000]],[[0,0,0,0],[662,150,754,166],[665,199,742,211],[519,213,554,228],[519,213,554,228],[134,433,187,454],[130,467,204,480],[130,467,204,480],[130,467,204,480],[130,467,204,480],[130,467,204,480],[314,469,376,482],[504,684,582,706],[941,825,973,900],[941,825,973,900],[941,825,973,900],[941,825,973,900],[610,749,652,765],[130,659,168,672],[176,657,237,672],[238,657,312,672],[443,653,628,672],[443,653,628,672],[716,301,825,317],[1000,1000,1000,1000]]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			UpperCAmelCase__		:str 		=    torch.tensor([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			# these are sequence labels (i.e. at the token level)
			UpperCAmelCase__		:int 		=    torch.tensor([[-100,10,10,10,9,1,-100,7,7,-100,7,7,4,2,5,2,8,8,-100,-100,5,0,3,2,-100],[-100,12,12,12,-100,12,10,-100,-100,-100,-100,10,12,9,-100,-100,-100,10,10,10,9,12,-100,10,-100]]     ,						device=SCREAMING_SNAKE_CASE							)  # noqa: E231
			# fmt: on

			return input_ids, attention_mask, bbox, token_type_ids, labels




@require_torch
class 	UpperCamelCase__       (  unittest.TestCase):

						'''simple docstring'''



						@slow
						def    A__       (  self	)  ->Optional[Any]:
									UpperCAmelCase__		:Optional[Any] 		=    LayoutLMModel.from_pretrained('microsoft/layoutlm-base-uncased'	).to(A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Optional[Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:List[Any] 		=    model(input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A	)

									# test the sequence output on [0, :3, :3]
									UpperCAmelCase__		:List[str] 		=    torch.tensor(
									    [[0.1785, -0.1947, -0.0425], [-0.3254, -0.2807, 0.2553], [-0.5391, -0.3322, 0.3364]]  , device=A  , )

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

									# test the pooled output on [1, :3]
									UpperCAmelCase__		:Optional[Any] 		=    torch.tensor([-0.6580, -0.0214, 0.8552]  , device=A	)

									self.assertTrue(torch.allclose(outputs.pooler_output[1, :3]  , A  , atol=1e-3	)	)


						@slow
						def    A__       (  self	)  ->List[Any]:
									# initialize model with randomly initialized sequence classification head
									UpperCAmelCase__		:Tuple 		=    LayoutLMForSequenceClassification.from_pretrained('microsoft/layoutlm-base-uncased'  , num_labels=2	).to(
									    A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Union[str, Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:Tuple 		=    model(
									    input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A  , labels=torch.tensor([1, 1]  , device=A	)  , )

									# test whether we get a loss as a scalar
									UpperCAmelCase__		:Optional[int] 		=    outputs.loss
									UpperCAmelCase__		:str 		=    torch.Size([]	)
									self.assertEqual(loss.shape  , A	)

									# test the shape of the logits
									UpperCAmelCase__		:List[str] 		=    outputs.logits
									UpperCAmelCase__		:Tuple 		=    torch.Size((2, 2)	)
									self.assertEqual(logits.shape  , A	)


						@slow
						def    A__       (  self	)  ->str:
									# initialize model with randomly initialized token classification head
									UpperCAmelCase__		:List[Any] 		=    LayoutLMForTokenClassification.from_pretrained('microsoft/layoutlm-base-uncased'  , num_labels=13	).to(
									    A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:int 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:List[str] 		=    model(
									    input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A  , labels=A	)

									# test the loss calculation to be around 2.65
									# expected_loss = torch.tensor(2.65, device=torch_device)

									# The loss is currently somewhat random and can vary between 0.1-0.3 atol.
									# self.assertTrue(torch.allclose(outputs.loss, expected_loss, atol=0.1))

									# test the shape of the logits
									UpperCAmelCase__		:Any 		=    outputs.logits
									UpperCAmelCase__		:Any 		=    torch.Size((2, 25, 13)	)
									self.assertEqual(logits.shape  , A	)


						@slow
						def    A__       (  self	)  ->str:
									# initialize model with randomly initialized token classification head
									UpperCAmelCase__		:Optional[int] 		=    LayoutLMForQuestionAnswering.from_pretrained('microsoft/layoutlm-base-uncased'	).to(A	)

									UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		,       UpperCAmelCase__		:Optional[Any] 		=    prepare_layoutlm_batch_inputs()

									# forward pass
									UpperCAmelCase__		:Tuple 		=    model(input_ids=A  , bbox=A  , attention_mask=A  , token_type_ids=A	)

									# test the shape of the logits
									UpperCAmelCase__		:Optional[int] 		=    torch.Size((2, 25)	)
									self.assertEqual(outputs.start_logits.shape  , A	)
									self.assertEqual(outputs.end_logits.shape  , A	)





