

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







    """simple docstring"""





    def __init__( self					:			Optional[int],lowercase_					:			Dict,lowercase_					:			List[Any]=1_3,lowercase_					:			Optional[int]=7,lowercase_					:			List[str]=True,lowercase_					:			Any=True,lowercase_					:			Dict=True,lowercase_					:			Optional[Any]=True,lowercase_					:			List[str]=9_9,lowercase_					:			Union[str, Any]=3_2,lowercase_					:			List[Any]=5,lowercase_					:			str=4,lowercase_					:			Union[str, Any]=3_7,lowercase_					:			List[str]="gelu",lowercase_					:			Dict=0.1,lowercase_					:			Any=0.1,lowercase_					:			Tuple=5_1_2,lowercase_					:			Union[str, Any]=1_6,lowercase_					:			List[str]=2,lowercase_					:			int=0.02,lowercase_					:			str=3,lowercase_					:			Union[str, Any]=4,lowercase_					:			int=None,lowercase_					:			str=1_0_0_0,)->       Optional[Any]:





        '''simple docstring'''







        A__        =  parent
        A__        =  batch_size
        A__        =  seq_length
        A__        =  is_training
        A__        =  use_input_mask
        A__        =  use_token_type_ids
        A__        =  use_labels
        A__        =  vocab_size
        A__        =  hidden_size
        A__        =  num_hidden_layers
        A__        =  num_attention_heads
        A__        =  intermediate_size
        A__        =  hidden_act
        A__        =  hidden_dropout_prob
        A__        =  attention_probs_dropout_prob
        A__        =  max_position_embeddings
        A__        =  type_vocab_size
        A__        =  type_sequence_label_size
        A__        =  initializer_range
        A__        =  num_labels
        A__        =  num_choices
        A__        =  scope
        A__        =  range_bbox


    def 		snake_case__	( self					:			Union[str, Any]						)->       Dict:





        '''simple docstring'''







        A__        =  ids_tensor([self.batch_size, self.seq_length],self.vocab_size						)

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

        A__        =  None
        if self.use_input_mask:
            A__        =  ids_tensor([self.batch_size, self.seq_length],vocab_size=2						)

        A__        =  None
        if self.use_token_type_ids:
            A__        =  ids_tensor([self.batch_size, self.seq_length],self.type_vocab_size						)

        A__        =  None
        A__        =  None
        A__        =  None
        if self.use_labels:
            A__        =  ids_tensor([self.batch_size],self.type_sequence_label_size						)
            A__        =  ids_tensor([self.batch_size, self.seq_length],self.num_labels						)
            A__        =  ids_tensor([self.batch_size],self.num_choices						)

        A__        =  self.get_config()

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


    def 		snake_case__	( self					:			Tuple						)->       Optional[Any]:





        '''simple docstring'''







        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 		snake_case__	( self					:			List[str],lowercase_					:			Dict,lowercase_					:			Tuple,lowercase_					:			Any,lowercase_					:			List[str],lowercase_					:			Optional[int],lowercase_					:			List[Any],lowercase_					:			Optional[Any],lowercase_					:			Dict						)->       Any:





        '''simple docstring'''







        A__        =  LayoutLMModel(config=lowercase_						)
        model.to(lowercase_						)
        model.eval()
        A__        =  model(lowercase_,lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_						)
        A__        =  model(lowercase_,lowercase_,token_type_ids=lowercase_						)
        A__        =  model(lowercase_,lowercase_						)
        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 		snake_case__	( self					:			Dict,lowercase_					:			Union[str, Any],lowercase_					:			int,lowercase_					:			Optional[int],lowercase_					:			str,lowercase_					:			str,lowercase_					:			Optional[Any],lowercase_					:			Optional[Any],lowercase_					:			Optional[Any]						)->       List[str]:





        '''simple docstring'''







        A__        =  LayoutLMForMaskedLM(config=lowercase_						)
        model.to(lowercase_						)
        model.eval()
        A__        =  model(lowercase_,lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,labels=lowercase_						)
        self.parent.assertEqual(result.logits.shape,(self.batch_size, self.seq_length, self.vocab_size)						)


    def 		snake_case__	( self					:			Any,lowercase_					:			Tuple,lowercase_					:			Optional[int],lowercase_					:			str,lowercase_					:			Optional[Any],lowercase_					:			Dict,lowercase_					:			Dict,lowercase_					:			int,lowercase_					:			List[str]						)->       List[str]:





        '''simple docstring'''







        A__        =  self.num_labels
        A__        =  LayoutLMForSequenceClassification(lowercase_						)
        model.to(lowercase_						)
        model.eval()
        A__        =  model(
            lowercase_,lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,labels=lowercase_						)
        self.parent.assertEqual(result.logits.shape,(self.batch_size, self.num_labels)						)


    def 		snake_case__	( self					:			Optional[int],lowercase_					:			Optional[Any],lowercase_					:			List[str],lowercase_					:			Tuple,lowercase_					:			List[str],lowercase_					:			Dict,lowercase_					:			int,lowercase_					:			List[Any],lowercase_					:			Dict						)->       Optional[Any]:





        '''simple docstring'''







        A__        =  self.num_labels
        A__        =  LayoutLMForTokenClassification(config=lowercase_						)
        model.to(lowercase_						)
        model.eval()
        A__        =  model(lowercase_,lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,labels=lowercase_						)
        self.parent.assertEqual(result.logits.shape,(self.batch_size, self.seq_length, self.num_labels)						)


    def 		snake_case__	( self					:			Optional[int],lowercase_					:			int,lowercase_					:			Optional[Any],lowercase_					:			str,lowercase_					:			Dict,lowercase_					:			Union[str, Any],lowercase_					:			Optional[Any],lowercase_					:			Optional[Any],lowercase_					:			Dict						)->       Optional[int]:





        '''simple docstring'''







        A__        =  LayoutLMForQuestionAnswering(config=lowercase_						)
        model.to(lowercase_						)
        model.eval()
        A__        =  model(
            lowercase_,bbox=lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,start_positions=lowercase_,end_positions=lowercase_,)
        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 		snake_case__	( self					:			Dict						)->       Optional[Any]:





        '''simple docstring'''







        A__        =  self.prepare_config_and_inputs()
        (
            (
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		(
            A__
        ) ,		
        )        =  config_and_inputs
        A__        =  {
            'input_ids': input_ids,
            'bbox': bbox,
            'token_type_ids': token_type_ids,
            'attention_mask': input_mask,
        }
        return config, inputs_dict




@require_torch
class 					A		(				_UpperCAmelCase       ,				_UpperCAmelCase       ,				unittest.TestCase					):







    """simple docstring"""





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


    def 		snake_case__	( self					:			str						)->       Dict:





        '''simple docstring'''







        A__        =  LayoutLMModelTester(self						)
        A__        =  ConfigTester(self,config_class=lowercase_,hidden_size=3_7						)


    def 		snake_case__	( self					:			List[str]						)->       Tuple:





        '''simple docstring'''







        self.config_tester.run_common_tests()


    def 		snake_case__	( self					:			Optional[int]						)->       Any:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_model(*lowercase_						)


    def 		snake_case__	( self					:			Optional[int]						)->       Dict:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        for type in ["absolute", "relative_key", "relative_key_query"]:
            A__        =  type
            self.model_tester.create_and_check_model(*lowercase_						)


    def 		snake_case__	( self					:			Union[str, Any]						)->       int:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_for_masked_lm(*lowercase_						)


    def 		snake_case__	( self					:			List[Any]						)->       List[str]:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_for_sequence_classification(*lowercase_						)


    def 		snake_case__	( self					:			int						)->       Optional[Any]:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_for_token_classification(*lowercase_						)


    def 		snake_case__	( self					:			Any						)->       Dict:





        '''simple docstring'''







        A__        =  self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_for_question_answering(*lowercase_						)


    @unittest.skip('Will be fixed soon by reducing the size of the model used for common tests.'						)
    def 		snake_case__	( self					:			Union[str, Any]						)->       str:





        '''simple docstring'''







        pass




def 		_snake_case(       )				-> List[Any]:





    '''simple docstring'''






    A__        =  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
    A__        =  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
    A__        =  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
    A__        =  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)
    A__        =  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 					A		(				unittest.TestCase					):







    """simple docstring"""





    @slow
    def 		snake_case__	( self					:			int						)->       Any:





        '''simple docstring'''







        A__        =  LayoutLMModel.from_pretrained('microsoft/layoutlm-base-uncased'						).to(lowercase_						)

        A__ ,		A__ ,		A__ ,		A__ ,		A__        =  prepare_layoutlm_batch_inputs()

        # forward pass
        A__        =  model(input_ids=lowercase_,bbox=lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_						)

        # test the sequence output on [0, :3, :3]
        A__        =  torch.tensor(
            [[0.1_785, -0.1_947, -0.0_425], [-0.3_254, -0.2_807, 0.2_553], [-0.5_391, -0.3_322, 0.3_364]],device=lowercase_,)

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

        # test the pooled output on [1, :3]
        A__        =  torch.tensor([-0.6_580, -0.0_214, 0.8_552],device=lowercase_						)

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


    @slow
    def 		snake_case__	( self					:			Union[str, Any]						)->       List[str]:





        '''simple docstring'''







        A__        =  LayoutLMForSequenceClassification.from_pretrained('microsoft/layoutlm-base-uncased',num_labels=2						).to(
            lowercase_						)

        A__ ,		A__ ,		A__ ,		A__ ,		A__        =  prepare_layoutlm_batch_inputs()

        # forward pass
        A__        =  model(
            input_ids=lowercase_,bbox=lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,labels=torch.tensor([1, 1],device=lowercase_						),)

        # test whether we get a loss as a scalar
        A__        =  outputs.loss
        A__        =  torch.Size([]						)
        self.assertEqual(loss.shape,lowercase_						)

        # test the shape of the logits
        A__        =  outputs.logits
        A__        =  torch.Size((2, 2)						)
        self.assertEqual(logits.shape,lowercase_						)


    @slow
    def 		snake_case__	( self					:			int						)->       Tuple:





        '''simple docstring'''







        A__        =  LayoutLMForTokenClassification.from_pretrained('microsoft/layoutlm-base-uncased',num_labels=1_3						).to(
            lowercase_						)

        A__ ,		A__ ,		A__ ,		A__ ,		A__        =  prepare_layoutlm_batch_inputs()

        # forward pass
        A__        =  model(
            input_ids=lowercase_,bbox=lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_,labels=lowercase_						)

        # 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
        A__        =  outputs.logits
        A__        =  torch.Size((2, 2_5, 1_3)						)
        self.assertEqual(logits.shape,lowercase_						)


    @slow
    def 		snake_case__	( self					:			Optional[Any]						)->       List[Any]:





        '''simple docstring'''







        A__        =  LayoutLMForQuestionAnswering.from_pretrained('microsoft/layoutlm-base-uncased'						).to(lowercase_						)

        A__ ,		A__ ,		A__ ,		A__ ,		A__        =  prepare_layoutlm_batch_inputs()

        # forward pass
        A__        =  model(input_ids=lowercase_,bbox=lowercase_,attention_mask=lowercase_,token_type_ids=lowercase_						)

        # test the shape of the logits
        A__        =  torch.Size((2, 2_5)						)
        self.assertEqual(outputs.start_logits.shape,lowercase_						)
        self.assertEqual(outputs.end_logits.shape,lowercase_						)




import timeit


class 					A		:







    """simple docstring"""





    def __init__( self					:			Optional[int],lowercase_					:			Union[str, Any]						)->       List[str]:





        '''simple docstring'''







        if isinstance(lowercase_,lowercase_						):  # Initializes a matrix identical to the one provided.
            A__        =  arg
            A__        =  len(lowercase_						)
        else:  # Initializes a square matrix of the given size and set values to zero.
            A__        =  arg
            A__        =  [[0 for _ in range(self.n						)] for _ in range(self.n						)]


    def __mul__( self					:			Union[str, Any],lowercase_					:			List[Any]						)->       List[str]:





        '''simple docstring'''







        A__        =  Matrix(self.n						)
        for i in range(self.n						):
            for j in range(self.n						):
                for k in range(self.n						):
                    matrix.t[i][j] += self.t[i][k] * b.t[k][j]
        return matrix




def 		_snake_case(       SCREAMING_SNAKE_CASE__     :      List[Any]       ,     SCREAMING_SNAKE_CASE__     :      Optional[Any] )				-> Union[str, Any]:





    '''simple docstring'''






    A__        =  Matrix([[1, 0], [0, 1]] )
    while b > 0:
        if b & 1:
            matrix *= a
        a *= a
        b >>= 1
    return matrix
def 		_snake_case(       SCREAMING_SNAKE_CASE__     :      Optional[int]       ,     SCREAMING_SNAKE_CASE__     :      str       ,     SCREAMING_SNAKE_CASE__     :      Any )				-> List[str]:





    '''simple docstring'''






    if n == 1:
        return fa
    elif n == 2:
        return fa
    A__        =  Matrix([[1, 1], [1, 0]] )
    A__        =  modular_exponentiation(SCREAMING_SNAKE_CASE__       ,     n - 2 )
    return fa * matrix.t[0][0] + fa * matrix.t[0][1]
def 		_snake_case(       SCREAMING_SNAKE_CASE__     :      Dict       ,     SCREAMING_SNAKE_CASE__     :      Tuple       ,     SCREAMING_SNAKE_CASE__     :      Tuple )				-> Dict:





    '''simple docstring'''






    if n == 1:
        return fa
    elif n == 2:
        return fa

    A__        =  fa
    A__        =  fa
    n -= 2

    while n > 0:
        A__ ,		A__        =  fn_a + fn_a, fn_a
        n -= 1

    return fn_a
def 		_snake_case(       )				-> Optional[Any]:





    '''simple docstring'''






    A__        =  '\nfrom random import randint\nfrom __main__ import fibonacci_with_matrix_exponentiation\n'
    A__        =  'fibonacci_with_matrix_exponentiation(randint(1,70000), 1, 1)'
    A__        =  timeit.timeit(setup=SCREAMING_SNAKE_CASE__       ,     stmt=SCREAMING_SNAKE_CASE__       ,     number=100 )
    print('With matrix exponentiation the average execution time is '       ,     exec_time / 100 )
    return exec_time
def 		_snake_case(       )				-> Optional[int]:





    '''simple docstring'''






    A__        =  '\nfrom random import randint\nfrom __main__ import simple_fibonacci\n'
    A__        =  'simple_fibonacci(randint(1,70000), 1, 1)'
    A__        =  timeit.timeit(setup=SCREAMING_SNAKE_CASE__       ,     stmt=SCREAMING_SNAKE_CASE__       ,     number=100 )
    print(
        'Without matrix exponentiation the average execution time is '       ,     exec_time / 100 )
    return exec_time
def 		_snake_case(       )				-> Union[str, Any]:





    '''simple docstring'''






    matrix_exponentiation_time()
    simple_fibonacci_time()


if __name__ == "__main__":
     main()

