




'''simple docstring'''





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.0_2 ,_SCREAMING_SNAKE_CASE=6 ,_SCREAMING_SNAKE_CASE=6 ,_SCREAMING_SNAKE_CASE=3 ,_SCREAMING_SNAKE_CASE=4 ,_SCREAMING_SNAKE_CASE=None ,_SCREAMING_SNAKE_CASE=1_000 ,)							->      Optional[int]:
          _snake_case							=				parent
          _snake_case							=				batch_size
          _snake_case							=				num_channels
          _snake_case							=				image_size
          _snake_case							=				patch_size
          _snake_case							=				text_seq_length
          _snake_case							=				is_training
          _snake_case							=				use_input_mask
          _snake_case							=				use_token_type_ids
          _snake_case							=				use_labels
          _snake_case							=				vocab_size
          _snake_case							=				hidden_size
          _snake_case							=				num_hidden_layers
          _snake_case							=				num_attention_heads
          _snake_case							=				intermediate_size
          _snake_case							=				hidden_act
          _snake_case							=				hidden_dropout_prob
          _snake_case							=				attention_probs_dropout_prob
          _snake_case							=				max_position_embeddings
          _snake_case							=				type_vocab_size
          _snake_case							=				type_sequence_label_size
          _snake_case							=				initializer_range
          _snake_case							=				coordinate_size
          _snake_case							=				shape_size
          _snake_case							=				num_labels
          _snake_case							=				num_choices
          _snake_case							=				scope
          _snake_case							=				range_bbox

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






     def     _lowercase     (			self   )							->      Any:
          _snake_case							=				ids_tensor([self.batch_size, self.text_seq_length] ,self.vocab_size   )

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

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

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

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

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

          _snake_case							=				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     _lowercase     (			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   )							->      Tuple:
          _snake_case							=				LayoutLMvaModel(config=_SCREAMING_SNAKE_CASE   )
          model.to(_SCREAMING_SNAKE_CASE   )
          model.eval()

          # text + image
          _snake_case							=				model(_SCREAMING_SNAKE_CASE ,pixel_values=_SCREAMING_SNAKE_CASE   )
          _snake_case							=				model(
              _SCREAMING_SNAKE_CASE ,bbox=_SCREAMING_SNAKE_CASE ,pixel_values=_SCREAMING_SNAKE_CASE ,attention_mask=_SCREAMING_SNAKE_CASE ,token_type_ids=_SCREAMING_SNAKE_CASE   )
          _snake_case							=				model(_SCREAMING_SNAKE_CASE ,bbox=_SCREAMING_SNAKE_CASE ,pixel_values=_SCREAMING_SNAKE_CASE ,token_type_ids=_SCREAMING_SNAKE_CASE   )
          _snake_case							=				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
          _snake_case							=				model(_SCREAMING_SNAKE_CASE   )
          self.parent.assertEqual(
              result.last_hidden_state.shape ,(self.batch_size, self.text_seq_length, self.hidden_size)   )

          # image only
          _snake_case							=				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     _lowercase     (			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   )							->      Union[str, Any]:
          _snake_case							=				self.num_labels
          _snake_case							=				LayoutLMvaForSequenceClassification(_SCREAMING_SNAKE_CASE   )
          model.to(_SCREAMING_SNAKE_CASE   )
          model.eval()
          _snake_case							=				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     _lowercase     (			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   )							->      List[Any]:
          _snake_case							=				self.num_labels
          _snake_case							=				LayoutLMvaForTokenClassification(config=_SCREAMING_SNAKE_CASE   )
          model.to(_SCREAMING_SNAKE_CASE   )
          model.eval()
          _snake_case							=				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     _lowercase     (			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   )							->      List[Any]:
          _snake_case							=				LayoutLMvaForQuestionAnswering(config=_SCREAMING_SNAKE_CASE   )
          model.to(_SCREAMING_SNAKE_CASE   )
          model.eval()
          _snake_case							=				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     _lowercase     (			self   )							->      Tuple:
          _snake_case							=				self.prepare_config_and_inputs()
          (
              (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, (
              _snake_case
          )							, 
          )							=				config_and_inputs
          _snake_case							=				{
              "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    (						__lowerCAmelCase , __lowerCAmelCase , unittest.TestCase							):
     SCREAMING_SNAKE_CASE_							:   Any       =						False
     SCREAMING_SNAKE_CASE_							:   Tuple       =						False
     SCREAMING_SNAKE_CASE_							:   Optional[int]       =						False

     SCREAMING_SNAKE_CASE_							:   Union[str, Any]       =						(
         (
             LayoutLMvaModel,
             LayoutLMvaForSequenceClassification,
             LayoutLMvaForTokenClassification,
             LayoutLMvaForQuestionAnswering,
         )
         if is_torch_available()
         else ()
     )
     SCREAMING_SNAKE_CASE_							:   Tuple       =						(
         {"""document-question-answering""": LayoutLMvaForQuestionAnswering, """feature-extraction""": LayoutLMvaModel}
         if is_torch_available()
         else {}
     )






     def     _lowercase     (			self ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE   )							->      int:
          # `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     _lowercase     (			self   )							->      str:
          _snake_case							=				LayoutLMvaModelTester(self   )
          _snake_case							=				ConfigTester(self ,config_class=_SCREAMING_SNAKE_CASE ,hidden_size=37   )






     def     _lowercase     (			self ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE ,_SCREAMING_SNAKE_CASE=False   )							->      List[Any]:
          _snake_case							=				copy.deepcopy(_SCREAMING_SNAKE_CASE   )
          if model_class in get_values(_SCREAMING_SNAKE_CASE   ):
               _snake_case							=				{
                   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   ):
                    _snake_case							=				torch.ones(self.model_tester.batch_size ,dtype=torch.long ,device=_SCREAMING_SNAKE_CASE   )
               elif model_class in get_values(_SCREAMING_SNAKE_CASE   ):
                    _snake_case							=				torch.zeros(
                        self.model_tester.batch_size ,dtype=torch.long ,device=_SCREAMING_SNAKE_CASE   )
                    _snake_case							=				torch.zeros(
                        self.model_tester.batch_size ,dtype=torch.long ,device=_SCREAMING_SNAKE_CASE   )
               elif model_class in [
                   *get_values(_SCREAMING_SNAKE_CASE   ),
               ]:
                    _snake_case							=				torch.zeros(
                        self.model_tester.batch_size ,dtype=torch.long ,device=_SCREAMING_SNAKE_CASE   )
               elif model_class in [
                   *get_values(_SCREAMING_SNAKE_CASE   ),
               ]:
                    _snake_case							=				torch.zeros(
                        (self.model_tester.batch_size, self.model_tester.text_seq_length) ,dtype=torch.long ,device=_SCREAMING_SNAKE_CASE ,)

          return inputs_dict






     def     _lowercase     (			self   )							->      Optional[Any]:
          self.config_tester.run_common_tests()






     def     _lowercase     (			self   )							->      List[Any]:
          _snake_case							=				self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_model(*_SCREAMING_SNAKE_CASE   )






     def     _lowercase     (			self   )							->      int:
          _snake_case							=				self.model_tester.prepare_config_and_inputs()
          for type in ["absolute", "relative_key", "relative_key_query"]:
               _snake_case							=				type
               self.model_tester.create_and_check_model(*_SCREAMING_SNAKE_CASE   )






     def     _lowercase     (			self   )							->      Any:
          _snake_case							=				self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_sequence_classification(*_SCREAMING_SNAKE_CASE   )






     def     _lowercase     (			self   )							->      Dict:
          _snake_case							=				self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_token_classification(*_SCREAMING_SNAKE_CASE   )






     def     _lowercase     (			self   )							->      Any:
          _snake_case							=				self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_question_answering(*_SCREAMING_SNAKE_CASE   )






     @slow
     def     _lowercase     (			self   )							->      Optional[Any]:
          for model_name in LAYOUTLMV3_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
               _snake_case							=				LayoutLMvaModel.from_pretrained(_SCREAMING_SNAKE_CASE   )
               self.assertIsNotNone(_SCREAMING_SNAKE_CASE   )







def      __a     (       )						->			List[Any]:

     """simple docstring"""




     _snake_case							=				Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"   )
     return image





@require_torch
class        _a    (						unittest.TestCase							):






     @cached_property
     def     _lowercase     (			self   )							->      List[Any]:
          return LayoutLMvaImageProcessor(apply_ocr=_SCREAMING_SNAKE_CASE   ) if is_vision_available() else None






     @slow
     def     _lowercase     (			self   )							->      Optional[Any]:
          _snake_case							=				LayoutLMvaModel.from_pretrained("microsoft/layoutlmv3-base"   ).to(_SCREAMING_SNAKE_CASE   )

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

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

          # forward pass
          _snake_case							=				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
          _snake_case							=				torch.Size((1, 199, 768)   )
          self.assertEqual(outputs.last_hidden_state.shape ,_SCREAMING_SNAKE_CASE   )

          _snake_case							=				torch.tensor(
              [[-0.0_5_2_9, 0.3_6_1_8, 0.1_6_3_2], [-0.1_5_8_7, -0.1_6_6_7, -0.0_4_0_0], [-0.1_5_5_7, -0.1_6_7_1, -0.0_5_0_5]]   ).to(_SCREAMING_SNAKE_CASE   )

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








'''simple docstring'''





def      __a     (       _UpperCamelCase:   int   )						->			None:

     """simple docstring"""




     _snake_case							=				generate_pascal_triangle(_UpperCamelCase   )
     for row_idx in range(_UpperCamelCase   ):
          # Print left spaces
          for _ in range(num_rows - row_idx - 1   ):
               print(end=" "   )
          # Print row values
          for col_idx in range(row_idx + 1   ):
               if col_idx != row_idx:
                    print(triangle[row_idx][col_idx] ,						end=" "   )
               else:
                    print(triangle[row_idx][col_idx] ,						end=""   )
          print()





def      __a     (       _UpperCamelCase:   int   )						->			list[list[int]]:

     """simple docstring"""




     if not isinstance(_UpperCamelCase ,						_UpperCamelCase   ):
          raise TypeError("The input value of 'num_rows' should be 'int'"   )

     if num_rows == 0:
          return []
     elif num_rows < 0:
          raise ValueError(
              "The input value of 'num_rows' should be greater than or equal to 0"   )

     _snake_case							=				[]
     for current_row_idx in range(_UpperCamelCase   ):
          _snake_case							=				populate_current_row(_UpperCamelCase ,						_UpperCamelCase   )
          triangle.append(_UpperCamelCase   )
     return triangle





def      __a     (       _UpperCamelCase:   list[list[int]] ,						_UpperCamelCase:   int   )						->			list[int]:

     """simple docstring"""




     _snake_case							=				[-1] * (current_row_idx + 1)
     # first and last elements of current row are equal to 1
     _snake_case							, _snake_case							=				1, 1
     for current_col_idx in range(1 ,						_UpperCamelCase   ):
          calculate_current_element(
              _UpperCamelCase ,						_UpperCamelCase ,						_UpperCamelCase ,						_UpperCamelCase   )
     return current_row





def      __a     (       _UpperCamelCase:   list[list[int]] ,						_UpperCamelCase:   list[int] ,						_UpperCamelCase:   int ,						_UpperCamelCase:   int ,						)						->			None:

     """simple docstring"""




     _snake_case							=				triangle[current_row_idx - 1][current_col_idx - 1]
     _snake_case							=				triangle[current_row_idx - 1][current_col_idx]
     _snake_case							=				above_to_left_elt + above_to_right_elt





def      __a     (       _UpperCamelCase:   int   )						->			list[list[int]]:

     """simple docstring"""




     if not isinstance(_UpperCamelCase ,						_UpperCamelCase   ):
          raise TypeError("The input value of 'num_rows' should be 'int'"   )

     if num_rows == 0:
          return []
     elif num_rows < 0:
          raise ValueError(
              "The input value of 'num_rows' should be greater than or equal to 0"   )

     _snake_case							=				[[1]]

     for row_index in range(1 ,						_UpperCamelCase   ):
          _snake_case							=				[0] + result[-1] + [0]
          _snake_case							=				row_index + 1
          # Calculate the number of distinct elements in a row
          _snake_case							=				sum(divmod(_UpperCamelCase ,						2   )   )
          _snake_case							=				[
              temp_row[i - 1] + temp_row[i] for i in range(1 ,						distinct_elements + 1   )
          ]
          _snake_case							=				row_first_half[: (row_index + 1) // 2]
          row_second_half.reverse()
          _snake_case							=				row_first_half + row_second_half
          result.append(_UpperCamelCase   )

     return result





def      __a     (       )						->			None:

     """simple docstring"""




     from collections.abc import Callable
     from timeit import timeit

     def benchmark_a_function(_UpperCamelCase:   Callable ,						_UpperCamelCase:   int   ) -> None:
          _snake_case							=				F"""{func.__name__}({value})"""
          _snake_case							=				timeit(F"""__main__.{call}""" ,						setup="import __main__"   )
          # print(f"{call:38} = {func(value)} -- {timing:.4f} seconds")
          print(F"""{call:38} -- {timing:.4f} seconds"""   )

     for value in range(15   ):  # (1, 7, 14):
          for func in (generate_pascal_triangle, generate_pascal_triangle_optimized):
               benchmark_a_function(_UpperCamelCase ,						_UpperCamelCase   )
          print()


if __name__ == "__main__":
   import doctest

   doctest.testmod()
   benchmark()


