
import unittest

from transformers import FunnelConfig, FunnelTokenizer, is_torch_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_sentencepiece, require_tokenizers, 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 (
          MODEL_FOR_PRETRAINING_MAPPING,
          FunnelBaseModel,
          FunnelForMaskedLM,
          FunnelForMultipleChoice,
          FunnelForPreTraining,
          FunnelForQuestionAnswering,
          FunnelForSequenceClassification,
          FunnelForTokenClassification,
          FunnelModel,
      )






class     a_       :



       """simple docstring"""






       def __init__(		self				,       _lowerCamelCase				,       _lowerCamelCase=13				,       _lowerCamelCase=7				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=True				,       _lowerCamelCase=99				,       _lowerCamelCase=[1, 1, 2]				,       _lowerCamelCase=1				,       _lowerCamelCase=32				,       _lowerCamelCase=4				,       _lowerCamelCase=8				,       _lowerCamelCase=37				,       _lowerCamelCase="gelu_new"				,       _lowerCamelCase=0.1				,       _lowerCamelCase=0.1				,       _lowerCamelCase=0.0				,       _lowerCamelCase=512				,       _lowerCamelCase=3				,       _lowerCamelCase=0.0_2				,       _lowerCamelCase=3				,       _lowerCamelCase=4				,       _lowerCamelCase=None				,       _lowerCamelCase=False				,       )					->str:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = parent
           SCREAMING_SNAKE_CASE				:				Dict				      = batch_size
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = seq_length
           SCREAMING_SNAKE_CASE				:				Tuple				      = is_training
           SCREAMING_SNAKE_CASE				:				List[Any]				      = use_input_mask
           SCREAMING_SNAKE_CASE				:				Tuple				      = use_token_type_ids
           SCREAMING_SNAKE_CASE				:				Tuple				      = use_labels
           SCREAMING_SNAKE_CASE				:				Tuple				      = vocab_size
           SCREAMING_SNAKE_CASE				:				str				      = block_sizes
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = num_decoder_layers
           SCREAMING_SNAKE_CASE				:				List[str]				      = d_model
           SCREAMING_SNAKE_CASE				:				List[Any]				      = n_head
           SCREAMING_SNAKE_CASE				:				int				      = d_head
           SCREAMING_SNAKE_CASE				:				List[str]				      = d_inner
           SCREAMING_SNAKE_CASE				:				Tuple				      = hidden_act
           SCREAMING_SNAKE_CASE				:				List[Any]				      = hidden_dropout
           SCREAMING_SNAKE_CASE				:				List[Any]				      = attention_dropout
           SCREAMING_SNAKE_CASE				:				Tuple				      = activation_dropout
           SCREAMING_SNAKE_CASE				:				List[str]				      = max_position_embeddings
           SCREAMING_SNAKE_CASE				:				Tuple				      = type_vocab_size
           SCREAMING_SNAKE_CASE				:				List[str]				      = 2
           SCREAMING_SNAKE_CASE				:				Any				      = num_labels
           SCREAMING_SNAKE_CASE				:				Tuple				      = num_choices
           SCREAMING_SNAKE_CASE				:				str				      = scope
           SCREAMING_SNAKE_CASE				:				List[str]				      = initializer_std

           # Used in the tests to check the size of the first attention layer
           SCREAMING_SNAKE_CASE				:				List[Any]				      = n_head
           # Used in the tests to check the size of the first hidden state
           SCREAMING_SNAKE_CASE				:				List[str]				      = self.d_model
           # Used in the tests to check the number of output hidden states/attentions
           SCREAMING_SNAKE_CASE				:				List[str]				      = sum(self.block_sizes   ) + (0 if base else self.num_decoder_layers)
           # FunnelModel adds two hidden layers: input embeddings and the sum of the upsampled encoder hidden state with
           # the last hidden state of the first block (which is the first hidden state of the decoder).
           if not base:
               SCREAMING_SNAKE_CASE				:				Optional[int]				      = self.num_hidden_layers + 2






       def 	__lowerCAmelCase     (		self   )					->Any:
           SCREAMING_SNAKE_CASE				:				List[str]				      = ids_tensor([self.batch_size, self.seq_length]				,       self.vocab_size   )

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

           SCREAMING_SNAKE_CASE				:				Optional[int]				      = None
           if self.use_token_type_ids:
               SCREAMING_SNAKE_CASE				:				Dict				      = ids_tensor([self.batch_size, self.seq_length]				,       self.type_vocab_size   )

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

           SCREAMING_SNAKE_CASE				:				List[str]				      = self.get_config()

           return (
               config,
               input_ids,
               token_type_ids,
               input_mask,
               sequence_labels,
               token_labels,
               choice_labels,
               fake_token_labels,
           )






       def 	__lowerCAmelCase     (		self   )					->List[str]:
           return FunnelConfig(
               vocab_size=self.vocab_size				,       block_sizes=self.block_sizes				,       num_decoder_layers=self.num_decoder_layers				,       d_model=self.d_model				,       n_head=self.n_head				,       d_head=self.d_head				,       d_inner=self.d_inner				,       hidden_act=self.hidden_act				,       hidden_dropout=self.hidden_dropout				,       attention_dropout=self.attention_dropout				,       activation_dropout=self.activation_dropout				,       max_position_embeddings=self.max_position_embeddings				,       type_vocab_size=self.type_vocab_size				,       initializer_std=self.initializer_std				,       )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->str:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelModel(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				str				      = model(SCREAMING_SNAKE_CASE_				,       attention_mask=SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				List[str]				      = model(SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				Any				      = False
           SCREAMING_SNAKE_CASE				:				Tuple				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				List[Any]				      = False
           SCREAMING_SNAKE_CASE				:				int				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				str				      = FunnelBaseModel(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(SCREAMING_SNAKE_CASE_				,       attention_mask=SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				List[Any]				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 2, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = False
           SCREAMING_SNAKE_CASE				:				int				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 3, self.d_model)   )

           SCREAMING_SNAKE_CASE				:				List[str]				      = False
           SCREAMING_SNAKE_CASE				:				Dict				      = model(SCREAMING_SNAKE_CASE_   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 2, self.d_model)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->List[Any]:
           SCREAMING_SNAKE_CASE				:				str				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				Tuple				      = FunnelForPreTraining(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				str				      = model(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.seq_length)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Dict:
           SCREAMING_SNAKE_CASE				:				List[str]				      = FunnelForMaskedLM(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = model(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.seq_length, self.vocab_size)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->List[Any]:
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = FunnelForSequenceClassification(SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				str				      = model(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 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Dict:
           SCREAMING_SNAKE_CASE				:				Dict				      = self.num_choices
           SCREAMING_SNAKE_CASE				:				Dict				      = FunnelForMultipleChoice(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Any				      = input_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				str				      = token_type_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = input_mask.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(
               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_choices)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				Tuple				      = FunnelForTokenClassification(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Any				      = model(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.seq_length, self.num_labels)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->Tuple:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelForQuestionAnswering(config=SCREAMING_SNAKE_CASE_   )
           model.to(SCREAMING_SNAKE_CASE_   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				int				      = model(
               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 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Any				      = self.prepare_config_and_inputs()
           (
               (
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,							(
               SCREAMING_SNAKE_CASE				
           )      ,											
           )				:				Optional[Any]				      = config_and_inputs
           SCREAMING_SNAKE_CASE				:				Tuple				      = {'''input_ids''': input_ids, '''token_type_ids''': token_type_ids, '''attention_mask''': input_mask}
           return config, inputs_dict






@require_torch
class     a_       (			SCREAMING_SNAKE_CASE_				,    SCREAMING_SNAKE_CASE_				,    unittest.TestCase							):



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					Dict						=  False
       __SCREAMING_SNAKE_CASE       :					Optional[int]						=  False
       __SCREAMING_SNAKE_CASE       :					int						=  (
           (
               FunnelModel,
               FunnelForMaskedLM,
               FunnelForPreTraining,
               FunnelForQuestionAnswering,
               FunnelForTokenClassification,
           )
           if is_torch_available()
           else ()
       )
       __SCREAMING_SNAKE_CASE       :					List[str]						=  (
           {
               'feature-extraction': (FunnelBaseModel, FunnelModel),
               'fill-mask': FunnelForMaskedLM,
               'question-answering': FunnelForQuestionAnswering,
               'text-classification': FunnelForSequenceClassification,
               'token-classification': FunnelForTokenClassification,
               'zero-shot': FunnelForSequenceClassification,
           }
           if is_torch_available()
           else {}
       )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase=False   )					->str:
           SCREAMING_SNAKE_CASE				:				Tuple				      = super()._prepare_for_class(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_				,       return_labels=SCREAMING_SNAKE_CASE_   )

           if return_labels:
               if model_class in get_values(SCREAMING_SNAKE_CASE_   ):
                   SCREAMING_SNAKE_CASE				:				Optional[int]				      = torch.zeros(
                       (self.model_tester.batch_size, self.model_tester.seq_length)				,       dtype=torch.long				,       device=SCREAMING_SNAKE_CASE_   )
           return inputs_dict






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = FunnelModelTester(self   )
           SCREAMING_SNAKE_CASE				:				Tuple				      = ConfigTester(self				,       config_class=SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->str:
           self.config_tester.run_common_tests()






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_model(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				List[str]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_pretraining(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[str]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_masked_lm(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->Optional[int]:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_token_classification(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->int:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_question_answering(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->Optional[int]:






           if hasattr(SCREAMING_SNAKE_CASE_				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(SCREAMING_SNAKE_CASE_				,       '''bias'''   ) and module.bias is not None:
               module.bias.data.fill_(3   )

           for param in ["r_w_bias", "r_r_bias", "r_kernel", "r_s_bias", "seg_embed"]:
               if hasattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   ) and getattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   ) is not None:
                   SCREAMING_SNAKE_CASE				:				Optional[Any]				      = getattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   )
                   weight.data.fill_(3   )






@require_torch
class     a_       (			SCREAMING_SNAKE_CASE_				,    unittest.TestCase							):



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					Tuple						=  False
       __SCREAMING_SNAKE_CASE       :					List[Any]						=  False
       __SCREAMING_SNAKE_CASE       :					Optional[int]						=  (
           (FunnelBaseModel, FunnelForMultipleChoice, FunnelForSequenceClassification) if is_torch_available() else ()
       )






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				int				      = FunnelModelTester(self				,       base=SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				List[str]				      = ConfigTester(self				,       config_class=SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->List[str]:
           self.config_tester.run_common_tests()






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_base_model(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				str				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_sequence_classification(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				Dict				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_multiple_choice(*SCREAMING_SNAKE_CASE_   )






       def 	__lowerCAmelCase     (		self   )					->List[Any]:
           SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs_for_common()
           SCREAMING_SNAKE_CASE				:				List[Any]				      = True

           for model_class in self.all_model_classes:
               if model_class.__name__ == "FunnelBaseModel":
                   continue
               SCREAMING_SNAKE_CASE				:				int				      = model_class(SCREAMING_SNAKE_CASE_   )
               model.to(SCREAMING_SNAKE_CASE_   )
               model.train()
               SCREAMING_SNAKE_CASE				:				Optional[int]				      = self._prepare_for_class(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_				,       return_labels=SCREAMING_SNAKE_CASE_   )
               SCREAMING_SNAKE_CASE				:				int				      = model(**SCREAMING_SNAKE_CASE_   ).loss
               loss.backward()






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->str:






           if hasattr(SCREAMING_SNAKE_CASE_				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(SCREAMING_SNAKE_CASE_				,       '''bias'''   ) and module.bias is not None:
               module.bias.data.fill_(3   )

           for param in ["r_w_bias", "r_r_bias", "r_kernel", "r_s_bias", "seg_embed"]:
               if hasattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   ) and getattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   ) is not None:
                   SCREAMING_SNAKE_CASE				:				int				      = getattr(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   )
                   weight.data.fill_(3   )






@require_torch
@require_sentencepiece
@require_tokenizers
class     a_       (			unittest.TestCase							):



       """simple docstring"""






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[str]				      = 13
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = 7
           SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.arange(0				,       batch_size * sequence_length   ).long().reshape(SCREAMING_SNAKE_CASE_				,       SCREAMING_SNAKE_CASE_   )
           SCREAMING_SNAKE_CASE				:				str				      = [0, 1, 2, 3, 4, 5, 6, 4, 1, 3, 5, 0, 1]
           SCREAMING_SNAKE_CASE				:				Any				      = torch.tensor([[2] + [0] * a + [1] * (sequence_length - a - 1) for a in lengths]   )

           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = FunnelModel.from_pretrained('''sgugger/funnel-random-tiny'''   )
           SCREAMING_SNAKE_CASE				:				int				      = model(SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )[0].abs()

           SCREAMING_SNAKE_CASE				:				List[str]				      = torch.tensor(2344.8352   )
           SCREAMING_SNAKE_CASE				:				str				      = torch.tensor(0.8_0_5_2   )
           self.assertTrue(torch.allclose(output.sum()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )

           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor([[1] * 7, [1] * 4 + [0] * 3] * 6 + [[0, 1, 1, 0, 0, 1, 1]]   )
           SCREAMING_SNAKE_CASE				:				Dict				      = model(SCREAMING_SNAKE_CASE_				,       attention_mask=SCREAMING_SNAKE_CASE_				,       token_type_ids=SCREAMING_SNAKE_CASE_   )[0].abs()

           SCREAMING_SNAKE_CASE				:				List[str]				      = torch.tensor(2343.8425   )
           SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.tensor(0.8_0_4_9   )
           self.assertTrue(torch.allclose(output.sum()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )






       @slow
       def 	__lowerCAmelCase     (		self   )					->Union[str, Any]:
           SCREAMING_SNAKE_CASE				:				Any				      = FunnelTokenizer.from_pretrained('''huggingface/funnel-small'''   )
           SCREAMING_SNAKE_CASE				:				Any				      = FunnelModel.from_pretrained('''huggingface/funnel-small'''   )
           SCREAMING_SNAKE_CASE				:				Dict				      = tokenizer('''Hello! I am the Funnel Transformer model.'''				,       return_tensors='''pt'''   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(**SCREAMING_SNAKE_CASE_   )[0]

           SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.tensor(235.7246   )
           SCREAMING_SNAKE_CASE				:				List[str]				      = torch.tensor(0.0_2_5_6   )
           self.assertTrue(torch.allclose(output.sum()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       SCREAMING_SNAKE_CASE_				,       atol=1e-4   )   )


import argparse
import json
from pathlib import Path

import requests
import torch
from datasets import load_dataset
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import (
    BeitConfig,
    BeitForImageClassification,
    BeitForMaskedImageModeling,
    BeitForSemanticSegmentation,
    BeitImageProcessor,
)
from transformers.image_utils import PILImageResampling
from transformers.utils import logging


logging.set_verbosity_info()
lowercase__				:				List[Any]						=      logging.get_logger(__name__)




def 						A_			(				snake_case				: int			,   snake_case				: Tuple=False			,   snake_case				: List[Any]=False			)   ->     List[str]:



						'''simple docstring'''

						__UpperCamelCase  	=      '''backbone.''' if is_semantic else ''''''

						__UpperCamelCase  	=      []
						for i in range(config.num_hidden_layers			):
												# encoder layers: output projection, 2 feedforward neural networks and 2 layernorms
												rename_keys.append((f"{prefix}blocks.{i}.norm1.weight", f"beit.encoder.layer.{i}.layernorm_before.weight")			)
												rename_keys.append((f"{prefix}blocks.{i}.norm1.bias", f"beit.encoder.layer.{i}.layernorm_before.bias")			)
												rename_keys.append(
												    (f"{prefix}blocks.{i}.attn.proj.weight", f"beit.encoder.layer.{i}.attention.output.dense.weight")			)
												rename_keys.append(
												    (f"{prefix}blocks.{i}.attn.proj.bias", f"beit.encoder.layer.{i}.attention.output.dense.bias")			)
												rename_keys.append((f"{prefix}blocks.{i}.norm2.weight", f"beit.encoder.layer.{i}.layernorm_after.weight")			)
												rename_keys.append((f"{prefix}blocks.{i}.norm2.bias", f"beit.encoder.layer.{i}.layernorm_after.bias")			)
												rename_keys.append((f"{prefix}blocks.{i}.mlp.fc1.weight", f"beit.encoder.layer.{i}.intermediate.dense.weight")			)
												rename_keys.append((f"{prefix}blocks.{i}.mlp.fc1.bias", f"beit.encoder.layer.{i}.intermediate.dense.bias")			)
												rename_keys.append((f"{prefix}blocks.{i}.mlp.fc2.weight", f"beit.encoder.layer.{i}.output.dense.weight")			)
												rename_keys.append((f"{prefix}blocks.{i}.mlp.fc2.bias", f"beit.encoder.layer.{i}.output.dense.bias")			)

						# projection layer + position embeddings
						rename_keys.extend(
						    [
						        (f"{prefix}cls_token", '''beit.embeddings.cls_token'''),
						        (f"{prefix}patch_embed.proj.weight", '''beit.embeddings.patch_embeddings.projection.weight'''),
						        (f"{prefix}patch_embed.proj.bias", '''beit.embeddings.patch_embeddings.projection.bias'''),
						    ]			)

						if has_lm_head:
												# mask token + shared relative position bias + layernorm
												rename_keys.extend(
												    [
												        ('''mask_token''', '''beit.embeddings.mask_token'''),
												        (
												            '''rel_pos_bias.relative_position_bias_table''',
												            '''beit.encoder.relative_position_bias.relative_position_bias_table''',
												        ),
												        (
												            '''rel_pos_bias.relative_position_index''',
												            '''beit.encoder.relative_position_bias.relative_position_index''',
												        ),
												        ('''norm.weight''', '''layernorm.weight'''),
												        ('''norm.bias''', '''layernorm.bias'''),
												    ]			)
						elif is_semantic:
												# semantic segmentation classification heads
												rename_keys.extend(
												    [
												        ('''decode_head.conv_seg.weight''', '''decode_head.classifier.weight'''),
												        ('''decode_head.conv_seg.bias''', '''decode_head.classifier.bias'''),
												        ('''auxiliary_head.conv_seg.weight''', '''auxiliary_head.classifier.weight'''),
												        ('''auxiliary_head.conv_seg.bias''', '''auxiliary_head.classifier.bias'''),
												    ]			)
						else:
												# layernorm + classification head
												rename_keys.extend(
												    [
												        ('''fc_norm.weight''', '''beit.pooler.layernorm.weight'''),
												        ('''fc_norm.bias''', '''beit.pooler.layernorm.bias'''),
												        ('''head.weight''', '''classifier.weight'''),
												        ('''head.bias''', '''classifier.bias'''),
												    ]			)

						return rename_keys




def 						A_			(				snake_case				: Union[str, Any]			,   snake_case				: List[Any]			,   snake_case				: Union[str, Any]=False			,   snake_case				: List[str]=False			)   ->     Union[str, Any]:



						'''simple docstring'''

						for i in range(config.num_hidden_layers			):
												__UpperCamelCase  	=      '''backbone.''' if is_semantic else ''''''
												# queries, keys and values
												__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.attn.qkv.weight"			)
												__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.attn.q_bias"			)
												__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.attn.v_bias"			)

												__UpperCamelCase  	=      in_proj_weight[
												    : config.hidden_size, :
												]
												__UpperCamelCase  	=      q_bias
												__UpperCamelCase  	=      in_proj_weight[
												    config.hidden_size : config.hidden_size * 2, :
												]
												__UpperCamelCase  	=      in_proj_weight[
												    -config.hidden_size :, :
												]
												__UpperCamelCase  	=      v_bias

												# gamma_1 and gamma_2
												# we call them lambda because otherwise they are renamed when using .from_pretrained
												__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.gamma_1"			)
												__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.gamma_2"			)

												__UpperCamelCase  	=      gamma_a
												__UpperCamelCase  	=      gamma_a

												# relative_position bias table + index
												if not has_lm_head:
																		# each layer has its own relative position bias
																		__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.attn.relative_position_bias_table"			)
																		__UpperCamelCase  	=      state_dict.pop(f"{prefix}blocks.{i}.attn.relative_position_index"			)

																		__UpperCamelCase  	=      table
																		__UpperCamelCase  	=      index




def 						A_			(				snake_case				: Dict			,   snake_case				: Optional[int]			,   snake_case				: int			)   ->     Dict:



						'''simple docstring'''

						__UpperCamelCase  	=      dct.pop(snake_case			)
						__UpperCamelCase  	=      val




def 						A_			(				)   ->     Optional[Any]:



						'''simple docstring'''

						__UpperCamelCase  	=      '''http://images.cocodataset.org/val2017/000000039769.jpg'''
						__UpperCamelCase  	=      Image.open(requests.get(snake_case			,   stream=snake_case			).raw			)
						return im




@torch.no_grad()
def 						A_			(				snake_case				: Optional[Any]			,   snake_case				: Any			)   ->     Tuple:



						'''simple docstring'''

						__UpperCamelCase  	=      BeitConfig()
						__UpperCamelCase  	=      False
						__UpperCamelCase  	=      False
						__UpperCamelCase  	=      '''huggingface/label-files'''
						# set config parameters based on URL
						if checkpoint_url[-9:-4] == "pt22k":
												# masked image modeling
												__UpperCamelCase  	=      True
												__UpperCamelCase  	=      True
												__UpperCamelCase  	=      True
						elif checkpoint_url[-9:-4] == "ft22k":
												# intermediate fine-tuning on ImageNet-22k
												__UpperCamelCase  	=      True
												__UpperCamelCase  	=      21841
												__UpperCamelCase  	=      '''imagenet-22k-id2label.json'''
												__UpperCamelCase  	=      json.load(open(hf_hub_download(snake_case			,   snake_case			,   repo_type='''dataset'''			)			,   '''r'''			)			)
												__UpperCamelCase  	=      {int(snake_case			): v for k, v in idalabel.items()}
												# this dataset contains 21843 labels but the model only has 21841
												# we delete the classes as mentioned in https://github.com/google-research/big_transfer/issues/18
												del idalabel[9205]
												del idalabel[15027]
												__UpperCamelCase  	=      idalabel
												__UpperCamelCase  	=      {v: k for k, v in idalabel.items()}
						elif checkpoint_url[-8:-4] == "to1k":
												# fine-tuning on ImageNet-1k
												__UpperCamelCase  	=      True
												__UpperCamelCase  	=      1000
												__UpperCamelCase  	=      '''imagenet-1k-id2label.json'''
												__UpperCamelCase  	=      json.load(open(hf_hub_download(snake_case			,   snake_case			,   repo_type='''dataset'''			)			,   '''r'''			)			)
												__UpperCamelCase  	=      {int(snake_case			): v for k, v in idalabel.items()}
												__UpperCamelCase  	=      idalabel
												__UpperCamelCase  	=      {v: k for k, v in idalabel.items()}
												if "384" in checkpoint_url:
																		__UpperCamelCase  	=      384
												if "512" in checkpoint_url:
																		__UpperCamelCase  	=      512
						elif "ade20k" in checkpoint_url:
												# fine-tuning
												__UpperCamelCase  	=      True
												__UpperCamelCase  	=      150
												__UpperCamelCase  	=      '''ade20k-id2label.json'''
												__UpperCamelCase  	=      json.load(open(hf_hub_download(snake_case			,   snake_case			,   repo_type='''dataset'''			)			,   '''r'''			)			)
												__UpperCamelCase  	=      {int(snake_case			): v for k, v in idalabel.items()}
												__UpperCamelCase  	=      idalabel
												__UpperCamelCase  	=      {v: k for k, v in idalabel.items()}
												__UpperCamelCase  	=      640
												__UpperCamelCase  	=      True
						else:
												raise ValueError('''Checkpoint not supported, URL should either end with \'pt22k\', \'ft22k\', \'to1k\' or \'ade20k\''''			)

						# size of the architecture
						if "base" in checkpoint_url:
												pass
						elif "large" in checkpoint_url:
												__UpperCamelCase  	=      1024
												__UpperCamelCase  	=      4096
												__UpperCamelCase  	=      24
												__UpperCamelCase  	=      16
												if "ade20k" in checkpoint_url:
																		__UpperCamelCase  	=      640
																		__UpperCamelCase  	=      [7, 11, 15, 23]
						else:
												raise ValueError('''Should either find \'base\' or \'large\' in checkpoint URL'''			)

						# load state_dict of original model, remove and rename some keys
						__UpperCamelCase  	=      torch.hub.load_state_dict_from_url(snake_case			,   map_location='''cpu'''			,   check_hash=snake_case			)
						__UpperCamelCase  	=      state_dict['''model'''] if '''ade20k''' not in checkpoint_url else state_dict['''state_dict''']

						__UpperCamelCase  	=      create_rename_keys(snake_case			,   has_lm_head=snake_case			,   is_semantic=snake_case			)
						for src, dest in rename_keys:
												rename_key(snake_case			,   snake_case			,   snake_case			)
						read_in_q_k_v(snake_case			,   snake_case			,   has_lm_head=snake_case			,   is_semantic=snake_case			)
						if is_semantic:
												# add prefix to decoder keys
												for key, val in state_dict.copy().items():
																		__UpperCamelCase  	=      state_dict.pop(snake_case			)
																		if key.startswith('''backbone.fpn'''			):
																								__UpperCamelCase  	=      key.replace('''backbone.fpn'''			,   '''fpn'''			)
																		__UpperCamelCase  	=      val

    # load HuggingFace model
						if checkpoint_url[-9:-4] == "pt22k":
												__UpperCamelCase  	=      BeitForMaskedImageModeling(snake_case			)
						elif "ade20k" in checkpoint_url:
												__UpperCamelCase  	=      BeitForSemanticSegmentation(snake_case			)
						else:
												__UpperCamelCase  	=      BeitForImageClassification(snake_case			)
						model.eval()
						model.load_state_dict(snake_case			)

						# Check outputs on an image
						if is_semantic:
												__UpperCamelCase  	=      BeitImageProcessor(size=config.image_size			,   do_center_crop=snake_case			)
												__UpperCamelCase  	=      load_dataset('''hf-internal-testing/fixtures_ade20k'''			,   split='''test'''			)
												__UpperCamelCase  	=      Image.open(ds[0]['''file''']			)
						else:
												__UpperCamelCase  	=      BeitImageProcessor(
												    size=config.image_size			,   resample=PILImageResampling.BILINEAR			,   do_center_crop=snake_case			)
												__UpperCamelCase  	=      prepare_img()

						__UpperCamelCase  	=      image_processor(images=snake_case			,   return_tensors='''pt'''			)
						__UpperCamelCase  	=      encoding['''pixel_values''']

						__UpperCamelCase  	=      model(snake_case			)
						__UpperCamelCase  	=      outputs.logits

						# verify logits
						__UpperCamelCase  	=      torch.Size([1, 1000]			)
						if checkpoint_url[:-4].endswith('''beit_base_patch16_224_pt22k'''			):
												__UpperCamelCase  	=      torch.Size([1, 196, 8192]			)
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_224_pt22k'''			):
												__UpperCamelCase  	=      torch.Size([1, 196, 8192]			)
						elif checkpoint_url[:-4].endswith('''beit_base_patch16_224_pt22k_ft22k'''			):
												__UpperCamelCase  	=      torch.Size([1, 21841]			)
												__UpperCamelCase  	=      torch.tensor([2.2288, 2.4671, 0.7395]			)
												__UpperCamelCase  	=      2397
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_224_pt22k_ft22k'''			):
												__UpperCamelCase  	=      torch.Size([1, 21841]			)
												__UpperCamelCase  	=      torch.tensor([1.6881, -0.2787, 0.5901]			)
												__UpperCamelCase  	=      2396
						elif checkpoint_url[:-4].endswith('''beit_base_patch16_224_pt22k_ft1k'''			):
												__UpperCamelCase  	=      torch.tensor([0.1241, 0.0798, -0.6569]			)
												__UpperCamelCase  	=      285
						elif checkpoint_url[:-4].endswith('''beit_base_patch16_224_pt22k_ft22kto1k'''			):
												__UpperCamelCase  	=      torch.tensor([-1.2385, -1.0987, -1.0108]			)
												__UpperCamelCase  	=      281
						elif checkpoint_url[:-4].endswith('''beit_base_patch16_384_pt22k_ft22kto1k'''			):
												__UpperCamelCase  	=      torch.tensor([-1.5303, -0.9484, -0.3147]			)
												__UpperCamelCase  	=      761
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_224_pt22k_ft1k'''			):
												__UpperCamelCase  	=      torch.tensor([0.4610, -0.0928, 0.2086]			)
												__UpperCamelCase  	=      761
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_224_pt22k_ft22kto1k'''			):
												__UpperCamelCase  	=      torch.tensor([-0.4804, 0.6257, -0.1837]			)
												__UpperCamelCase  	=      761
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_384_pt22k_ft22kto1k'''			):
												__UpperCamelCase  	=      torch.tensor([[-0.5122, 0.5117, -0.2113]]			)
												__UpperCamelCase  	=      761
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_512_pt22k_ft22kto1k'''			):
												__UpperCamelCase  	=      torch.tensor([-0.3062, 0.7261, 0.4852]			)
												__UpperCamelCase  	=      761
						elif checkpoint_url[:-4].endswith('''beit_base_patch16_640_pt22k_ft22ktoade20k'''			):
												__UpperCamelCase  	=      (1, 150, 160, 160)
												__UpperCamelCase  	=      torch.tensor(
												    [
												        [[-4.9225, -2.3954, -3.0522], [-2.8822, -1.0046, -1.7561], [-2.9549, -1.3228, -2.1347]],
												        [[-5.8168, -3.4129, -4.0778], [-3.8651, -2.2214, -3.0277], [-3.8356, -2.4643, -3.3535]],
												        [[-0.0078, 3.9952, 4.0754], [2.9856, 4.6944, 5.0035], [3.2413, 4.7813, 4.9969]],
												    ]			)
						elif checkpoint_url[:-4].endswith('''beit_large_patch16_640_pt22k_ft22ktoade20k'''			):
												__UpperCamelCase  	=      (1, 150, 160, 160)
												__UpperCamelCase  	=      torch.tensor(
												    [
												        [[-4.3305, -2.3049, -3.0161], [-2.9591, -1.5305, -2.2251], [-3.4198, -1.8004, -2.9062]],
												        [[-5.8922, -3.7435, -4.3978], [-4.2063, -2.7872, -3.4755], [-4.2791, -3.1874, -4.1681]],
												        [[0.9895, 4.3467, 4.7663], [4.2476, 5.6830, 6.1518], [4.5550, 6.2495, 6.5154]],
												    ]			)
						else:
												raise ValueError('''Can\'t verify logits as model is not supported'''			)

						assert logits.shape == expected_shape, "Shape of logits not as expected"
						if not has_lm_head:
												if is_semantic:
																		assert torch.allclose(
																		    logits[0, :3, :3, :3]			,   snake_case			,   atol=1e-3			), "First elements of logits not as expected"
												else:
																		print('''Predicted class idx:'''			,   logits.argmax(-1			).item()			)
																		assert torch.allclose(
																		    logits[0, :3]			,   snake_case			,   atol=1e-3			), "First elements of logits not as expected"
																		assert logits.argmax(-1			).item() == expected_class_idx, "Predicted class index not as expected"

						Path(snake_case			).mkdir(exist_ok=snake_case			)
						print(f"Saving model to {pytorch_dump_folder_path}"			)
						model.save_pretrained(snake_case			)
						print(f"Saving image processor to {pytorch_dump_folder_path}"			)
						image_processor.save_pretrained(snake_case			)


if __name__ == "__main__":
				lowercase__				:				Any						=      argparse.ArgumentParser()

				parser.add_argument(
				    "--checkpoint_url",
				    default="https://conversationhub.blob.core.windows.net/beit-share-public/beit/beit_base_patch16_224_pt22k_ft22kto1k.pth",
				    type=str,
				    help="URL to the original PyTorch checkpoint (.pth file).",
				)
				parser.add_argument(
				    "--pytorch_dump_folder_path", default=None, type=str, help="Path to the folder to output PyTorch model."
				)
				lowercase__				:				int						=      parser.parse_args()
				convert_beit_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)




