text: # coding=utf-8
  # Copyright 2010, The Microsoft Research Asia LayoutLM Team authors
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  """ LayoutLM model configuration """
  from collections import OrderedDict
  from typing import Any, List, Mapping, Optional
  
  from transformers import PretrainedConfig, PreTrainedTokenizer, TensorType
  
  from ... import is_torch_available
  from ...onnx import OnnxConfig, PatchingSpec
  from ...utils import logging
  from ..bert.configuration_bert import BertConfig
  
  
  logger = logging.get_logger(__name__)
  
  LAYOUTLM_PRETRAINED_CONFIG_ARCHIVE_MAP = {
      "layoutlm-base-uncased": "https://huggingface.co/microsoft/layoutlm-base-uncased/resolve/main/config.json",
      "layoutlm-large-uncased": "https://huggingface.co/microsoft/layoutlm-large-uncased/resolve/main/config.json",
  }
  
  
  class LayoutLMConfig(BertConfig):
      r"""
      This is the configuration class to store the configuration of a [`LayoutLMModel`]. It is used to
      instantiate a LayoutLM model according to the specified arguments, defining the model architecture. Instantiating a
      configuration with the defaults will yield a similar configuration to that of the LayoutLM [layoutlm-base-uncased](https://huggingface.co/microsoft/layoutlm-base-uncased) architecture.
  
      Configuration objects inherit from [`BertConfig`] and can be used to control the model outputs.
      Read the documentation from [`BertConfig`] for more information.
  
  
      Args:
          vocab_size (`int`, *optional*, defaults to 30522):
              Vocabulary size of the LayoutLM model. Defines the different tokens that can be represented by the
              *inputs_ids* passed to the forward method of [`LayoutLMModel`].
          hidden_size (`int`, *optional*, defaults to 768):
              Dimensionality of the encoder layers and the pooler layer.
          num_hidden_layers (`int`, *optional*, defaults to 12):
              Number of hidden layers in the Transformer encoder.
          num_attention_heads (`int`, *optional*, defaults to 12):
              Number of attention heads for each attention layer in the Transformer encoder.
          intermediate_size (`int`, *optional*, defaults to 3072):
              Dimensionality of the "intermediate" (i.e., feed-forward) layer in the Transformer encoder.
          hidden_act (`str` or `function`, *optional*, defaults to `"gelu"`):
              The non-linear activation function (function or string) in the encoder and pooler. If string,
              `"gelu"`, `"relu"`, `"silu"` and `"gelu_new"` are supported.
          hidden_dropout_prob (`float`, *optional*, defaults to 0.1):
              The dropout probability for all fully connected layers in the embeddings, encoder, and pooler.
          attention_probs_dropout_prob (`float`, *optional*, defaults to 0.1):
              The dropout ratio for the attention probabilities.
          max_position_embeddings (`int`, *optional*, defaults to 512):
              The maximum sequence length that this model might ever be used with. Typically set this to something large
              just in case (e.g., 512 or 1024 or 2048).
          type_vocab_size (`int`, *optional*, defaults to 2):
              The vocabulary size of the `token_type_ids` passed into [`LayoutLMModel`].
          initializer_range (`float`, *optional*, defaults to 0.02):
              The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
          layer_norm_eps (`float`, *optional*, defaults to 1e-12):
              The epsilon used by the layer normalization layers.
          max_2d_position_embeddings (`int`, *optional*, defaults to 1024):
              The maximum value that the 2D position embedding might ever used. Typically set this to something large
              just in case (e.g., 1024).
  
      Examples:
  
      ```python
      >>> from transformers import LayoutLMModel, LayoutLMConfig
  
      >>> # Initializing a LayoutLM configuration
      >>> configuration = LayoutLMConfig()
  
      >>> # Initializing a model from the configuration
      >>> model = LayoutLMModel(configuration)
  
      >>> # Accessing the model configuration
      >>> configuration = model.config
      ```"""
      model_type = "layoutlm"
  
      def __init__(
          self,
          vocab_size=30522,
          hidden_size=768,
          num_hidden_layers=12,
          num_attention_heads=12,
          intermediate_size=3072,
          hidden_act="gelu",
          hidden_dropout_prob=0.1,
          attention_probs_dropout_prob=0.1,
          max_position_embeddings=512,
          type_vocab_size=2,
          initializer_range=0.02,
          layer_norm_eps=1e-12,
          pad_token_id=0,
          max_2d_position_embeddings=1024,
          **kwargs
      ):
          super().__init__(
              vocab_size=vocab_size,
              hidden_size=hidden_size,
              num_hidden_layers=num_hidden_layers,
              num_attention_heads=num_attention_heads,
              intermediate_size=intermediate_size,
              hidden_act=hidden_act,
              hidden_dropout_prob=hidden_dropout_prob,
              attention_probs_dropout_prob=attention_probs_dropout_prob,
              max_position_embeddings=max_position_embeddings,
              type_vocab_size=type_vocab_size,
              initializer_range=initializer_range,
              layer_norm_eps=layer_norm_eps,
              pad_token_id=pad_token_id,
              **kwargs,
          )
          self.max_2d_position_embeddings = max_2d_position_embeddings
  
  
  class LayoutLMOnnxConfig(OnnxConfig):
      def __init__(
          self,
          config: PretrainedConfig,
          task: str = "default",
          patching_specs: List[PatchingSpec] = None,
      ):
          super().__init__(config, task=task, patching_specs=patching_specs)
          self.max_2d_positions = config.max_2d_position_embeddings - 1
  
      @property
      def inputs(self) -> Mapping[str, Mapping[int, str]]:
          return OrderedDict(
              [
                  ("input_ids", {0: "batch", 1: "sequence"}),
                  ("bbox", {0: "batch", 1: "sequence"}),
                  ("attention_mask", {0: "batch", 1: "sequence"}),
                  ("token_type_ids", {0: "batch", 1: "sequence"}),
              ]
          )
  
      def generate_dummy_inputs(
          self,
          tokenizer: PreTrainedTokenizer,
          batch_size: int = -1,
          seq_length: int = -1,
          is_pair: bool = False,
          framework: Optional[TensorType] = None,
      ) -> Mapping[str, Any]:
          """
          Generate inputs to provide to the ONNX exporter for the specific framework
  
          Args:
              tokenizer: The tokenizer associated with this model configuration
              batch_size: The batch size (int) to export the model for (-1 means dynamic axis)
              seq_length: The sequence length (int) to export the model for (-1 means dynamic axis)
              is_pair: Indicate if the input is a pair (sentence 1, sentence 2)
              framework: The framework (optional) the tokenizer will generate tensor for
  
          Returns:
              Mapping[str, Tensor] holding the kwargs to provide to the model's forward function
          """
  
          input_dict = super().generate_dummy_inputs(tokenizer, batch_size, seq_length, is_pair, framework)
  
          # Generate a dummy bbox
          box = [48, 84, 73, 128]
  
          if not framework == TensorType.PYTORCH:
              raise NotImplementedError("Exporting LayoutLM to ONNX is currently only supported for PyTorch.")
  
          if not is_torch_available():
              raise ValueError("Cannot generate dummy inputs without PyTorch installed.")
          import torch
  
          batch_size, seq_length = input_dict["input_ids"].shape
          input_dict["bbox"] = torch.tensor([*[box] * seq_length]).tile(batch_size, 1, 1)
          return input_dict
  