
from dataclasses import dataclass
from typing import Optional, Tuple, Union

import torch
import torch.nn as nn

from ..configuration_utils import ConfigMixin, register_to_config
from ..utils import BaseOutput
from .embeddings import GaussianFourierProjection, TimestepEmbedding, Timesteps
from .modeling_utils import ModelMixin
from .unet_ad_blocks import UNetMidBlockaD, get_down_block, get_up_block






@dataclass
class     a_       (			a__							):



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					torch.FloatTensor






class     a_       (			a__				,    a__							):



       """simple docstring"""






       @register_to_config
       def __init__(		self				,       _lowerCamelCase = None				,       _lowerCamelCase = 3				,       _lowerCamelCase = 3				,       _lowerCamelCase = False				,       _lowerCamelCase = "positional"				,       _lowerCamelCase = 0				,       _lowerCamelCase = True				,       _lowerCamelCase = ("DownBlock2D", "AttnDownBlock2D", "AttnDownBlock2D", "AttnDownBlock2D")				,       _lowerCamelCase = ("AttnUpBlock2D", "AttnUpBlock2D", "AttnUpBlock2D", "UpBlock2D")				,       _lowerCamelCase = (224, 448, 672, 896)				,       _lowerCamelCase = 2				,       _lowerCamelCase = 1				,       _lowerCamelCase = 1				,       _lowerCamelCase = "conv"				,       _lowerCamelCase = "conv"				,       _lowerCamelCase = "silu"				,       _lowerCamelCase = 8				,       _lowerCamelCase = 32				,       _lowerCamelCase = 1e-5				,       _lowerCamelCase = "default"				,       _lowerCamelCase = True				,       _lowerCamelCase = None				,       _lowerCamelCase = None				,       )					->List[Any]:
           super().__init__()

           SCREAMING_SNAKE_CASE				:				Tuple				      = sample_size
           SCREAMING_SNAKE_CASE				:				str				      = block_out_channels[0] * 4

           # Check inputs
           if len(_lowerCamelCase   ) != len(_lowerCamelCase   ):
               raise ValueError(
                   F"""Must provide the same number of `down_block_types` as `up_block_types`. `down_block_types`: {down_block_types}. `up_block_types`: {up_block_types}."""   )

           if len(_lowerCamelCase   ) != len(_lowerCamelCase   ):
               raise ValueError(
                   F"""Must provide the same number of `block_out_channels` as `down_block_types`. `block_out_channels`: {block_out_channels}. `down_block_types`: {down_block_types}."""   )

           # input
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = nn.Convad(_lowerCamelCase				,       block_out_channels[0]				,       kernel_size=3				,       padding=(1, 1)   )

           # time
           if time_embedding_type == "fourier":
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = GaussianFourierProjection(embedding_size=block_out_channels[0]				,       scale=16   )
               SCREAMING_SNAKE_CASE				:				int				      = 2 * block_out_channels[0]
           elif time_embedding_type == "positional":
               SCREAMING_SNAKE_CASE				:				Dict				      = Timesteps(block_out_channels[0]				,       _lowerCamelCase				,       _lowerCamelCase   )
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = block_out_channels[0]

           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = TimestepEmbedding(_lowerCamelCase				,       _lowerCamelCase   )

           # class embedding
           if class_embed_type is None and num_class_embeds is not None:
               SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = nn.Embedding(_lowerCamelCase				,       _lowerCamelCase   )
           elif class_embed_type == "timestep":
               SCREAMING_SNAKE_CASE				:				Any				      = TimestepEmbedding(_lowerCamelCase				,       _lowerCamelCase   )
           elif class_embed_type == "identity":
               SCREAMING_SNAKE_CASE				:				Any				      = nn.Identity(_lowerCamelCase				,       _lowerCamelCase   )
           else:
               SCREAMING_SNAKE_CASE				:				str				      = None

           SCREAMING_SNAKE_CASE				:				Tuple				      = nn.ModuleList([]   )
           SCREAMING_SNAKE_CASE				:				Any				      = None
           SCREAMING_SNAKE_CASE				:				List[Any]				      = nn.ModuleList([]   )

           # down
           SCREAMING_SNAKE_CASE				:				Any				      = block_out_channels[0]
           for i, down_block_type in enumerate(_lowerCamelCase   ):
               SCREAMING_SNAKE_CASE				:				Optional[int]				      = output_channel
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = block_out_channels[i]
               SCREAMING_SNAKE_CASE				:				Any				      = i == len(_lowerCamelCase   ) - 1

               SCREAMING_SNAKE_CASE				:				List[str]				      = get_down_block(
                   _lowerCamelCase				,       num_layers=_lowerCamelCase				,       in_channels=_lowerCamelCase				,       out_channels=_lowerCamelCase				,       temb_channels=_lowerCamelCase				,       add_downsample=not is_final_block				,       resnet_eps=_lowerCamelCase				,       resnet_act_fn=_lowerCamelCase				,       resnet_groups=_lowerCamelCase				,       attention_head_dim=attention_head_dim if attention_head_dim is not None else output_channel				,       downsample_padding=_lowerCamelCase				,       resnet_time_scale_shift=_lowerCamelCase				,       downsample_type=_lowerCamelCase				,       )
               self.down_blocks.append(_lowerCamelCase   )

           # mid
           SCREAMING_SNAKE_CASE				:				Tuple				      = UNetMidBlockaD(
               in_channels=block_out_channels[-1]				,       temb_channels=_lowerCamelCase				,       resnet_eps=_lowerCamelCase				,       resnet_act_fn=_lowerCamelCase				,       output_scale_factor=_lowerCamelCase				,       resnet_time_scale_shift=_lowerCamelCase				,       attention_head_dim=attention_head_dim if attention_head_dim is not None else block_out_channels[-1]				,       resnet_groups=_lowerCamelCase				,       add_attention=_lowerCamelCase				,       )

           # up
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = list(reversed(_lowerCamelCase   )   )
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = reversed_block_out_channels[0]
           for i, up_block_type in enumerate(_lowerCamelCase   ):
               SCREAMING_SNAKE_CASE				:				int				      = output_channel
               SCREAMING_SNAKE_CASE				:				List[Any]				      = reversed_block_out_channels[i]
               SCREAMING_SNAKE_CASE				:				List[str]				      = reversed_block_out_channels[min(i + 1				,       len(_lowerCamelCase   ) - 1   )]

               SCREAMING_SNAKE_CASE				:				Optional[int]				      = i == len(_lowerCamelCase   ) - 1

               SCREAMING_SNAKE_CASE				:				Tuple				      = get_up_block(
                   _lowerCamelCase				,       num_layers=layers_per_block + 1				,       in_channels=_lowerCamelCase				,       out_channels=_lowerCamelCase				,       prev_output_channel=_lowerCamelCase				,       temb_channels=_lowerCamelCase				,       add_upsample=not is_final_block				,       resnet_eps=_lowerCamelCase				,       resnet_act_fn=_lowerCamelCase				,       resnet_groups=_lowerCamelCase				,       attention_head_dim=attention_head_dim if attention_head_dim is not None else output_channel				,       resnet_time_scale_shift=_lowerCamelCase				,       upsample_type=_lowerCamelCase				,       )
               self.up_blocks.append(_lowerCamelCase   )
               SCREAMING_SNAKE_CASE				:				Dict				      = output_channel

           # out
           SCREAMING_SNAKE_CASE				:				List[str]				      = norm_num_groups if norm_num_groups is not None else min(block_out_channels[0] // 4				,       32   )
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = nn.GroupNorm(num_channels=block_out_channels[0]				,       num_groups=_lowerCamelCase				,       eps=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Tuple				      = nn.SiLU()
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = nn.Convad(block_out_channels[0]				,       _lowerCamelCase				,       kernel_size=3				,       padding=1   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase = None				,       _lowerCamelCase = True				,       )					->Union[UNetaDOutput, Tuple]:
           # 0. center input if necessary
           if self.config.center_input_sample:
               SCREAMING_SNAKE_CASE				:				List[Any]				      = 2 * sample - 1.0

           # 1. time
           SCREAMING_SNAKE_CASE				:				Dict				      = timestep
           if not torch.is_tensor(_lowerCamelCase   ):
               SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = torch.tensor([timesteps]				,       dtype=torch.long				,       device=sample.device   )
           elif torch.is_tensor(_lowerCamelCase   ) and len(timesteps.shape   ) == 0:
               SCREAMING_SNAKE_CASE				:				str				      = timesteps[None].to(sample.device   )

           # broadcast to batch dimension in a way that's compatible with ONNX/Core ML
           SCREAMING_SNAKE_CASE				:				List[Any]				      = timesteps * torch.ones(sample.shape[0]				,       dtype=timesteps.dtype				,       device=timesteps.device   )

           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = self.time_proj(_lowerCamelCase   )

           # timesteps does not contain any weights and will always return f32 tensors
           # but time_embedding might actually be running in fp16. so we need to cast here.
           # there might be better ways to encapsulate this.
           SCREAMING_SNAKE_CASE				:				List[str]				      = t_emb.to(dtype=self.dtype   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.time_embedding(_lowerCamelCase   )

           if self.class_embedding is not None:
               if class_labels is None:
                   raise ValueError('''class_labels should be provided when doing class conditioning'''   )

               if self.config.class_embed_type == "timestep":
                   SCREAMING_SNAKE_CASE				:				List[str]				      = self.time_proj(_lowerCamelCase   )

               SCREAMING_SNAKE_CASE				:				Dict				      = self.class_embedding(_lowerCamelCase   ).to(dtype=self.dtype   )
               SCREAMING_SNAKE_CASE				:				Tuple				      = emb + class_emb

           # 2. pre-process
           SCREAMING_SNAKE_CASE				:				Tuple				      = sample
           SCREAMING_SNAKE_CASE				:				int				      = self.conv_in(_lowerCamelCase   )

           # 3. down
           SCREAMING_SNAKE_CASE				:				Any				      = (sample,)
           for downsample_block in self.down_blocks:
               if hasattr(_lowerCamelCase				,       '''skip_conv'''   ):
                   SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				Dict				      = downsample_block(
                       hidden_states=_lowerCamelCase				,       temb=_lowerCamelCase				,       skip_sample=_lowerCamelCase   )
               else:
                   SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				str				      = downsample_block(hidden_states=_lowerCamelCase				,       temb=_lowerCamelCase   )

               down_block_res_samples += res_samples

           # 4. mid
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = self.mid_block(_lowerCamelCase				,       _lowerCamelCase   )

           # 5. up
           SCREAMING_SNAKE_CASE				:				Tuple				      = None
           for upsample_block in self.up_blocks:
               SCREAMING_SNAKE_CASE				:				int				      = down_block_res_samples[-len(upsample_block.resnets   ) :]
               SCREAMING_SNAKE_CASE				:				Any				      = down_block_res_samples[: -len(upsample_block.resnets   )]

               if hasattr(_lowerCamelCase				,       '''skip_conv'''   ):
                   SCREAMING_SNAKE_CASE      ,							SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = upsample_block(_lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase   )
               else:
                   SCREAMING_SNAKE_CASE				:				List[str]				      = upsample_block(_lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase   )

        # 6. post-process
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.conv_norm_out(_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				str				      = self.conv_act(_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				List[Any]				      = self.conv_out(_lowerCamelCase   )

           if skip_sample is not None:
               sample += skip_sample

           if self.config.time_embedding_type == "fourier":
               SCREAMING_SNAKE_CASE				:				List[str]				      = timesteps.reshape((sample.shape[0], *([1] * len(sample.shape[1:]   )))   )
               SCREAMING_SNAKE_CASE				:				str				      = sample / timesteps

           if not return_dict:
               return (sample,)

           return UNetaDOutput(sample=_lowerCamelCase   )


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				,       )					->List[str]:
           SCREAMING_SNAKE_CASE				:				Any				      = parent
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = batch_size
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = seq_length
           SCREAMING_SNAKE_CASE				:				Dict				      = is_training
           SCREAMING_SNAKE_CASE				:				int				      = use_input_mask
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = use_token_type_ids
           SCREAMING_SNAKE_CASE				:				Tuple				      = use_labels
           SCREAMING_SNAKE_CASE				:				List[str]				      = vocab_size
           SCREAMING_SNAKE_CASE				:				Tuple				      = block_sizes
           SCREAMING_SNAKE_CASE				:				str				      = num_decoder_layers
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = d_model
           SCREAMING_SNAKE_CASE				:				str				      = n_head
           SCREAMING_SNAKE_CASE				:				List[str]				      = d_head
           SCREAMING_SNAKE_CASE				:				Dict				      = d_inner
           SCREAMING_SNAKE_CASE				:				Any				      = hidden_act
           SCREAMING_SNAKE_CASE				:				Dict				      = hidden_dropout
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = attention_dropout
           SCREAMING_SNAKE_CASE				:				List[Any]				      = activation_dropout
           SCREAMING_SNAKE_CASE				:				str				      = max_position_embeddings
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = type_vocab_size
           SCREAMING_SNAKE_CASE				:				Dict				      = 2
           SCREAMING_SNAKE_CASE				:				Tuple				      = num_labels
           SCREAMING_SNAKE_CASE				:				str				      = num_choices
           SCREAMING_SNAKE_CASE				:				Tuple				      = scope
           SCREAMING_SNAKE_CASE				:				List[str]				      = initializer_std

           # Used in the tests to check the size of the first attention layer
           SCREAMING_SNAKE_CASE				:				str				      = n_head
           # Used in the tests to check the size of the first hidden state
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.d_model
           # Used in the tests to check the number of output hidden states/attentions
           SCREAMING_SNAKE_CASE				:				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				:				Tuple				      = self.num_hidden_layers + 2






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

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

           SCREAMING_SNAKE_CASE				:				List[str]				      = 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				:				Union[str, Any]				      = None
           SCREAMING_SNAKE_CASE				:				Tuple				      = None
           SCREAMING_SNAKE_CASE				:				List[str]				      = None
           if self.use_labels:
               SCREAMING_SNAKE_CASE				:				Tuple				      = ids_tensor([self.batch_size]				,       self.type_sequence_label_size   )
               SCREAMING_SNAKE_CASE				:				str				      = ids_tensor([self.batch_size, self.seq_length]				,       self.num_labels   )
               SCREAMING_SNAKE_CASE				:				Any				      = ids_tensor([self.batch_size]				,       self.num_choices   )
               SCREAMING_SNAKE_CASE				:				Optional[Any]				      = ids_tensor([self.batch_size, self.seq_length]				,       1   )

           SCREAMING_SNAKE_CASE				:				Tuple				      = self.get_config()

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






       def 	__lowerCAmelCase     (		self   )					->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				,       )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelModel(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Dict				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				List[str]				      = model(_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, self.seq_length, self.d_model)   )

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

           SCREAMING_SNAKE_CASE				:				str				      = False
           SCREAMING_SNAKE_CASE				:				List[str]				      = model(_lowerCamelCase   )
           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				,       )					->Any:
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = FunnelBaseModel(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Dict				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				str				      = model(_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = model(_lowerCamelCase   )
           self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, 2, self.d_model)   )

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

           SCREAMING_SNAKE_CASE				:				List[Any]				      = False
           SCREAMING_SNAKE_CASE				:				Tuple				      = model(_lowerCamelCase   )
           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				,       )					->int:
           SCREAMING_SNAKE_CASE				:				int				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				int				      = FunnelForPreTraining(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				str				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.seq_length)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->List[str]:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = FunnelForMaskedLM(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Optional[int]				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           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[str]:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.num_labels
           SCREAMING_SNAKE_CASE				:				Any				      = FunnelForSequenceClassification(_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				int				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase   )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.num_labels)   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       _lowerCamelCase				,       )					->str:
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.num_choices
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = FunnelForMultipleChoice(config=_lowerCamelCase   )
           model.to(_lowerCamelCase   )
           model.eval()
           SCREAMING_SNAKE_CASE				:				Tuple				      = input_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Dict				      = token_type_ids.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = input_mask.unsqueeze(1   ).expand(-1				,       self.num_choices				,       -1   ).contiguous()
           SCREAMING_SNAKE_CASE				:				str				      = model(
               _lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase				,       labels=_lowerCamelCase				,       )
           self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.num_choices)   )






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






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



       """simple docstring"""
       __SCREAMING_SNAKE_CASE       :					str						=  False
       __SCREAMING_SNAKE_CASE       :					List[str]						=  False
       __SCREAMING_SNAKE_CASE       :					Tuple						=  (
           (
               FunnelModel,
               FunnelForMaskedLM,
               FunnelForPreTraining,
               FunnelForQuestionAnswering,
               FunnelForTokenClassification,
           )
           if is_torch_available()
           else ()
       )
       __SCREAMING_SNAKE_CASE       :					Tuple						=  (
           {
               '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				:				Union[str, Any]				      = super()._prepare_for_class(_lowerCamelCase				,       _lowerCamelCase				,       return_labels=_lowerCamelCase   )

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






       def 	__lowerCAmelCase     (		self   )					->int:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = FunnelModelTester(self   )
           SCREAMING_SNAKE_CASE				:				Any				      = ConfigTester(self				,       config_class=_lowerCamelCase   )






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






       def 	__lowerCAmelCase     (		self   )					->Optional[Any]:
           SCREAMING_SNAKE_CASE				:				List[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_model(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->int:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_pretraining(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_masked_lm(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_token_classification(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_question_answering(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->List[Any]:
           if hasattr(_lowerCamelCase				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(_lowerCamelCase				,       '''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(_lowerCamelCase				,       _lowerCamelCase   ) and getattr(_lowerCamelCase				,       _lowerCamelCase   ) is not None:
                   SCREAMING_SNAKE_CASE				:				int				      = getattr(_lowerCamelCase				,       _lowerCamelCase   )
                   weight.data.fill_(3   )






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



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






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				str				      = FunnelModelTester(self				,       base=_lowerCamelCase   )
           SCREAMING_SNAKE_CASE				:				Dict				      = ConfigTester(self				,       config_class=_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Union[str, Any]:
           self.config_tester.run_common_tests()






       def 	__lowerCAmelCase     (		self   )					->Any:
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_base_model(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Tuple:
           SCREAMING_SNAKE_CASE				:				Tuple				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_sequence_classification(*_lowerCamelCase   )






       def 	__lowerCAmelCase     (		self   )					->Dict:
           SCREAMING_SNAKE_CASE				:				Any				      = self.model_tester.prepare_config_and_inputs()
           self.model_tester.create_and_check_for_multiple_choice(*_lowerCamelCase   )






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

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






       def 	__lowerCAmelCase     (		self				,       _lowerCamelCase   )					->Union[str, Any]:
           if hasattr(_lowerCamelCase				,       '''weight'''   ) and module.weight is not None:
               module.weight.data.fill_(3   )
           if hasattr(_lowerCamelCase				,       '''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(_lowerCamelCase				,       _lowerCamelCase   ) and getattr(_lowerCamelCase				,       _lowerCamelCase   ) is not None:
                   SCREAMING_SNAKE_CASE				:				List[str]				      = getattr(_lowerCamelCase				,       _lowerCamelCase   )
                   weight.data.fill_(3   )






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



       """simple docstring"""






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

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

           SCREAMING_SNAKE_CASE				:				str				      = torch.tensor(2_3_4_4.8_3_5_2   )
           SCREAMING_SNAKE_CASE				:				Any				      = torch.tensor(0.8_0_5_2   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )

           SCREAMING_SNAKE_CASE				:				List[Any]				      = torch.tensor([[1] * 7, [1] * 4 + [0] * 3] * 6 + [[0, 1, 1, 0, 0, 1, 1]]   )
           SCREAMING_SNAKE_CASE				:				Optional[Any]				      = model(_lowerCamelCase				,       attention_mask=_lowerCamelCase				,       token_type_ids=_lowerCamelCase   )[0].abs()

           SCREAMING_SNAKE_CASE				:				Union[str, Any]				      = torch.tensor(2_3_4_3.8_4_2_5   )
           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(0.8_0_4_9   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )






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

           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(2_3_5.7_2_4_6   )
           SCREAMING_SNAKE_CASE				:				Dict				      = torch.tensor(0.0_2_5_6   )
           self.assertTrue(torch.allclose(output.sum()				,       _lowerCamelCase				,       atol=1e-4   )   )
           self.assertTrue(torch.allclose(output.mean()				,       _lowerCamelCase				,       atol=1e-4   )   )
