



'''simple docstring'''





import unittest

from transformers import BertGenerationConfig, is_torch_available
from transformers.testing_utils import require_torch, slow, torch_device

from ...generation.test_utils import GenerationTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
  import torch

  from transformers import BertGenerationDecoder, BertGenerationEncoder


class 				_lowerCAmelCase     :


 """simple docstring"""

 def __init__(	self ,  _lowerCamelCase ,  _lowerCamelCase=13 ,  _lowerCamelCase=7 ,  _lowerCamelCase=True ,  _lowerCamelCase=True ,  _lowerCamelCase=99 ,  _lowerCamelCase=32 ,  _lowerCamelCase=5 ,  _lowerCamelCase=4 ,  _lowerCamelCase=37 ,  _lowerCamelCase="gelu" ,  _lowerCamelCase=0.1 ,  _lowerCamelCase=0.1 ,  _lowerCamelCase=50 ,  _lowerCamelCase=0.02 ,  _lowerCamelCase=True ,  _lowerCamelCase=None ,  )  ->  Dict:
    A_   :						str		= parent
    A_   :						Optional[int]		= batch_size
    A_   :						Optional[Any]		= seq_length
    A_   :						Any		= is_training
    A_   :						Dict		= use_input_mask
    A_   :						Tuple		= vocab_size
    A_   :						int		= hidden_size
    A_   :						str		= num_hidden_layers
    A_   :						str		= num_attention_heads
    A_   :						Optional[Any]		= intermediate_size
    A_   :						int		= hidden_act
    A_   :						str		= hidden_dropout_prob
    A_   :						Optional[int]		= attention_probs_dropout_prob
    A_   :						int		= max_position_embeddings
    A_   :						int		= initializer_range
    A_   :						List[Any]		= use_labels
    A_   :						List[str]		= scope







 def 	UpperCAmelCase_    (	self   )  ->  Union[str, Any]:
    A_   :						Optional[Any]		= ids_tensor([self.batch_size, self.seq_length] ,  self.vocab_size   )

    A_   :						Tuple		= None
    if self.use_input_mask:
       A_   :						int		= random_attention_mask([self.batch_size, self.seq_length]   )

    if self.use_labels:
       A_   :						Optional[int]		= ids_tensor([self.batch_size, self.seq_length] ,  self.vocab_size   )

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

    return config, input_ids, input_mask, token_labels







 def 	UpperCAmelCase_    (	self   )  ->  Any:
    return BertGenerationConfig(
        vocab_size=self.vocab_size ,  hidden_size=self.hidden_size ,  num_hidden_layers=self.num_hidden_layers ,  num_attention_heads=self.num_attention_heads ,  intermediate_size=self.intermediate_size ,  hidden_act=self.hidden_act ,  hidden_dropout_prob=self.hidden_dropout_prob ,  attention_probs_dropout_prob=self.attention_probs_dropout_prob ,  max_position_embeddings=self.max_position_embeddings ,  is_decoder=lowercase_ ,  initializer_range=self.initializer_range ,  )







 def 	UpperCAmelCase_    (	self   )  ->  int:
    (
        A_
    )   :						Optional[int]		= self.prepare_config_and_inputs()

    A_   :						Union[str, Any]		= True
    A_   :						Dict		= floats_tensor([self.batch_size, self.seq_length, self.hidden_size]   )
    A_   :						str		= ids_tensor([self.batch_size, self.seq_length] ,  vocab_size=2   )

    return (
        config,
        input_ids,
        input_mask,
        token_labels,
        encoder_hidden_states,
        encoder_attention_mask,
    )







 def 	UpperCAmelCase_    (	self ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  **_lowerCamelCase ,  )  ->  Union[str, Any]:
    A_   :						int		= BertGenerationEncoder(config=lowercase_   )
    model.to(lowercase_   )
    model.eval()
    A_   :						Optional[Any]		= model(lowercase_ ,  attention_mask=lowercase_   )
    A_   :						int		= model(lowercase_   )
    self.parent.assertEqual(result.last_hidden_state.shape ,  (self.batch_size, self.seq_length, self.hidden_size)   )







 def 	UpperCAmelCase_    (	self ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  **_lowerCamelCase ,  )  ->  int:
    A_   :						str		= True
    A_   :						Dict		= BertGenerationEncoder(config=lowercase_   )
    model.to(lowercase_   )
    model.eval()
    A_   :						int		= model(
        lowercase_ ,  attention_mask=lowercase_ ,  encoder_hidden_states=lowercase_ ,  encoder_attention_mask=lowercase_ ,  )
    A_   :						int		= model(
        lowercase_ ,  attention_mask=lowercase_ ,  encoder_hidden_states=lowercase_ ,  )
    self.parent.assertEqual(result.last_hidden_state.shape ,  (self.batch_size, self.seq_length, self.hidden_size)   )







 def 	UpperCAmelCase_    (	self ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  **_lowerCamelCase ,  )  ->  Any:
    A_   :						Optional[Any]		= True
    A_   :						int		= True
    A_   :						Optional[int]		= BertGenerationDecoder(config=lowercase_   ).to(lowercase_   ).eval()

    # first forward pass
    A_   :						Union[str, Any]		= model(
        lowercase_ ,  attention_mask=lowercase_ ,  encoder_hidden_states=lowercase_ ,  encoder_attention_mask=lowercase_ ,  use_cache=lowercase_ ,  )
    A_   :						Dict		= outputs.past_key_values

    # create hypothetical multiple next token and extent to next_input_ids
    A_   :						Any		= ids_tensor((self.batch_size, 3) ,  config.vocab_size   )
    A_   :						Optional[Any]		= ids_tensor((self.batch_size, 3) ,  vocab_size=2   )

    # append to next input_ids and
    A_   :						Optional[Any]		= torch.cat([input_ids, next_tokens] ,  dim=-1   )
    A_   :						Dict		= torch.cat([input_mask, next_mask] ,  dim=-1   )

    A_   :						Union[str, Any]		= model(
        lowercase_ ,  attention_mask=lowercase_ ,  encoder_hidden_states=lowercase_ ,  encoder_attention_mask=lowercase_ ,  output_hidden_states=lowercase_ ,  )['''hidden_states'''][0]
    A_   :						str		= model(
        lowercase_ ,  attention_mask=lowercase_ ,  encoder_hidden_states=lowercase_ ,  encoder_attention_mask=lowercase_ ,  past_key_values=lowercase_ ,  output_hidden_states=lowercase_ ,  )['''hidden_states'''][0]

    # select random slice
    A_   :						List[str]		= ids_tensor((1,) ,  output_from_past.shape[-1]   ).item()
    A_   :						List[Any]		= output_from_no_past[:, -3:, random_slice_idx].detach()
    A_   :						Any		= output_from_past[:, :, random_slice_idx].detach()

    self.parent.assertTrue(output_from_past_slice.shape[1] == next_tokens.shape[1]   )

    # test that outputs are equal for slice
    self.parent.assertTrue(torch.allclose(lowercase_ ,  lowercase_ ,  atol=1e-3   )   )







 def 	UpperCAmelCase_    (	self ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  _lowerCamelCase ,  *_lowerCamelCase ,  )  ->  Optional[Any]:
    A_   :						Optional[Any]		= BertGenerationDecoder(lowercase_   )
    model.to(lowercase_   )
    model.eval()
    A_   :						int		= model(lowercase_ ,  attention_mask=lowercase_ ,  labels=lowercase_   )
    self.parent.assertEqual(result.logits.shape ,  (self.batch_size, self.seq_length, self.vocab_size)   )







 def 	UpperCAmelCase_    (	self   )  ->  Any:
    A_   :						Tuple		= self.prepare_config_and_inputs()
    A_   :						Any		= {'''input_ids''': input_ids, '''attention_mask''': input_mask}
    return config, inputs_dict


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


 """simple docstring"""

 lowerCamelCase		       =			(BertGenerationEncoder, BertGenerationDecoder) if is_torch_available() else ()
 lowerCamelCase		       =			(BertGenerationDecoder,) if is_torch_available() else ()
 lowerCamelCase		       =			(
     {'''feature-extraction''': BertGenerationEncoder, '''text-generation''': BertGenerationDecoder}
     if is_torch_available()
     else {}
 )







 def 	UpperCAmelCase_    (	self   )  ->  int:
    A_   :						Tuple		= BertGenerationEncoderTester(self   )
    A_   :						List[str]		= ConfigTester(self ,  config_class=lowercase_ ,  hidden_size=37   )







 def 	UpperCAmelCase_    (	self   )  ->  Optional[int]:
    self.config_tester.run_common_tests()







 def 	UpperCAmelCase_    (	self   )  ->  str:
    A_   :						List[Any]		= self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_model(*lowercase_   )







 def 	UpperCAmelCase_    (	self   )  ->  Any:
    A_   :						str		= self.model_tester.prepare_config_and_inputs()
    A_   :						Optional[Any]		= '''bert'''
    self.model_tester.create_and_check_model(lowercase_ ,  lowercase_ ,  lowercase_ ,  lowercase_   )







 def 	UpperCAmelCase_    (	self   )  ->  Optional[int]:
    A_   :						Union[str, Any]		= self.model_tester.prepare_config_and_inputs_for_decoder()
    self.model_tester.create_and_check_model_as_decoder(*lowercase_   )







 def 	UpperCAmelCase_    (	self   )  ->  List[Any]:
    A_   :						Dict		= self.model_tester.prepare_config_and_inputs_for_decoder()
    self.model_tester.create_and_check_decoder_model_past_large_inputs(*lowercase_   )







 def 	UpperCAmelCase_    (	self   )  ->  Any:
    # This regression test was failing with PyTorch < 1.3
    (
        A_
    )   :						List[Any]		= self.model_tester.prepare_config_and_inputs_for_decoder()

    A_   :						Union[str, Any]		= None

    self.model_tester.create_and_check_model_as_decoder(
        lowercase_ ,  lowercase_ ,  lowercase_ ,  lowercase_ ,  lowercase_ ,  lowercase_ ,  )







 def 	UpperCAmelCase_    (	self   )  ->  List[Any]:
    A_   :						int		= self.model_tester.prepare_config_and_inputs_for_decoder()
    self.model_tester.create_and_check_for_causal_lm(*lowercase_   )







 @slow
 def 	UpperCAmelCase_    (	self   )  ->  Union[str, Any]:
    A_   :						str		= BertGenerationEncoder.from_pretrained("""google/bert_for_seq_generation_L-24_bbc_encoder"""   )
    self.assertIsNotNone(lowercase_   )


@require_torch
class 				_lowerCAmelCase     (   unittest.TestCase				):


 """simple docstring"""

 @slow
 def 	UpperCAmelCase_    (	self   )  ->  int:
    A_   :						List[str]		= BertGenerationEncoder.from_pretrained("""google/bert_for_seq_generation_L-24_bbc_encoder"""   )
    A_   :						List[Any]		= torch.tensor([[101, 7592, 1010, 2026, 3899, 2003, 1_0140, 102]]   )
    with torch.no_grad():
       A_   :						List[Any]		= model(lowercase_   )[0]
    A_   :						Any		= torch.Size([1, 8, 1024]   )
    self.assertEqual(output.shape ,  lowercase_   )
    A_   :						int		= torch.tensor(
        [[[0.1775, 0.0083, -0.0321], [1.6002, 0.1287, 0.3912], [2.1473, 0.5791, 0.6066]]]   )
    self.assertTrue(torch.allclose(output[:, :3, :3] ,  lowercase_ ,  atol=1e-4   )   )


@require_torch
class 				_lowerCAmelCase     (   unittest.TestCase				):


 """simple docstring"""

 @slow
 def 	UpperCAmelCase_    (	self   )  ->  List[Any]:
    A_   :						Optional[Any]		= BertGenerationDecoder.from_pretrained("""google/bert_for_seq_generation_L-24_bbc_encoder"""   )
    A_   :						Optional[int]		= torch.tensor([[101, 7592, 1010, 2026, 3899, 2003, 1_0140, 102]]   )
    with torch.no_grad():
       A_   :						Optional[Any]		= model(lowercase_   )[0]
    A_   :						Union[str, Any]		= torch.Size([1, 8, 5_0358]   )
    self.assertEqual(output.shape ,  lowercase_   )
    A_   :						Dict		= torch.tensor(
        [[[-0.5788, -2.5994, -3.7054], [0.0438, 4.7997, 1.8795], [1.5862, 6.6409, 4.4638]]]   )
    self.assertTrue(torch.allclose(output[:, :3, :3] ,  lowercase_ ,  atol=1e-4   )   )



"""simple docstring"""





__UpperCamelCase  :      Optional[Any]							      =		[
    9_9_9,
    8_0_0,
    7_9_9,
    6_0_0,
    5_9_9,
    5_0_0,
    4_0_0,
    3_9_9,
    3_7_7,
    3_5_5,
    3_3_3,
    3_1_1,
    2_8_8,
    2_6_6,
    2_4_4,
    2_2_2,
    2_0_0,
    1_9_9,
    1_7_7,
    1_5_5,
    1_3_3,
    1_1_1,
    8_8,
    6_6,
    4_4,
    2_2,
    0,
]

__UpperCamelCase  :      Tuple							      =		[
    9_9_9,
    9_7_6,
    9_5_2,
    9_2_8,
    9_0_5,
    8_8_2,
    8_5_8,
    8_5_7,
    8_1_0,
    7_6_2,
    7_1_5,
    7_1_4,
    5_7_2,
    4_2_9,
    4_2_8,
    2_8_6,
    2_8_5,
    2_3_8,
    1_9_0,
    1_4_3,
    1_4_2,
    1_1_8,
    9_5,
    7_1,
    4_7,
    2_4,
    0,
]

__UpperCamelCase  :      Optional[int]							      =		[
    9_9_9,
    9_8_8,
    9_7_7,
    9_6_6,
    9_5_5,
    9_4_4,
    9_3_3,
    9_2_2,
    9_1_1,
    9_0_0,
    8_9_9,
    8_7_9,
    8_5_9,
    8_4_0,
    8_2_0,
    8_0_0,
    7_9_9,
    7_6_6,
    7_3_3,
    7_0_0,
    6_9_9,
    6_5_0,
    6_0_0,
    5_9_9,
    5_0_0,
    4_9_9,
    4_0_0,
    3_9_9,
    3_5_0,
    3_0_0,
    2_9_9,
    2_6_6,
    2_3_3,
    2_0_0,
    1_9_9,
    1_7_9,
    1_5_9,
    1_4_0,
    1_2_0,
    1_0_0,
    9_9,
    8_8,
    7_7,
    6_6,
    5_5,
    4_4,
    3_3,
    2_2,
    1_1,
    0,
]

__UpperCamelCase  :      Tuple							      =		[
    9_9_9,
    9_9_5,
    9_9_2,
    9_8_9,
    9_8_5,
    9_8_1,
    9_7_8,
    9_7_5,
    9_7_1,
    9_6_7,
    9_6_4,
    9_6_1,
    9_5_7,
    9_5_6,
    9_5_1,
    9_4_7,
    9_4_2,
    9_3_7,
    9_3_3,
    9_2_8,
    9_2_3,
    9_1_9,
    9_1_4,
    9_1_3,
    9_0_8,
    9_0_3,
    8_9_7,
    8_9_2,
    8_8_7,
    8_8_1,
    8_7_6,
    8_7_1,
    8_7_0,
    8_6_4,
    8_5_8,
    8_5_2,
    8_4_6,
    8_4_0,
    8_3_4,
    8_2_8,
    8_2_7,
    8_2_0,
    8_1_3,
    8_0_6,
    7_9_9,
    7_9_2,
    7_8_5,
    7_8_4,
    7_7_7,
    7_7_0,
    7_6_3,
    7_5_6,
    7_4_9,
    7_4_2,
    7_4_1,
    7_3_3,
    7_2_4,
    7_1_6,
    7_0_7,
    6_9_9,
    6_9_8,
    6_8_8,
    6_7_7,
    6_6_6,
    6_5_6,
    6_5_5,
    6_4_5,
    6_3_4,
    6_2_3,
    6_1_3,
    6_1_2,
    5_9_8,
    5_8_4,
    5_7_0,
    5_6_9,
    5_5_5,
    5_4_1,
    5_2_7,
    5_2_6,
    5_0_5,
    4_8_4,
    4_8_3,
    4_6_2,
    4_4_0,
    4_3_9,
    3_9_6,
    3_9_5,
    3_5_2,
    3_5_1,
    3_0_8,
    3_0_7,
    2_6_4,
    2_6_3,
    2_2_0,
    2_1_9,
    1_7_6,
    1_3_2,
    8_8,
    4_4,
    0,
]

__UpperCamelCase  :      str							      =		[
    9_9_9,
    9_9_7,
    9_9_5,
    9_9_2,
    9_9_0,
    9_8_8,
    9_8_6,
    9_8_4,
    9_8_1,
    9_7_9,
    9_7_7,
    9_7_5,
    9_7_2,
    9_7_0,
    9_6_8,
    9_6_6,
    9_6_4,
    9_6_1,
    9_5_9,
    9_5_7,
    9_5_6,
    9_5_4,
    9_5_1,
    9_4_9,
    9_4_6,
    9_4_4,
    9_4_1,
    9_3_9,
    9_3_6,
    9_3_4,
    9_3_1,
    9_2_9,
    9_2_6,
    9_2_4,
    9_2_1,
    9_1_9,
    9_1_6,
    9_1_4,
    9_1_3,
    9_1_0,
    9_0_7,
    9_0_5,
    9_0_2,
    8_9_9,
    8_9_6,
    8_9_3,
    8_9_1,
    8_8_8,
    8_8_5,
    8_8_2,
    8_7_9,
    8_7_7,
    8_7_4,
    8_7_1,
    8_7_0,
    8_6_7,
    8_6_4,
    8_6_1,
    8_5_8,
    8_5_5,
    8_5_2,
    8_4_9,
    8_4_6,
    8_4_3,
    8_4_0,
    8_3_7,
    8_3_4,
    8_3_1,
    8_2_8,
    8_2_7,
    8_2_4,
    8_2_1,
    8_1_7,
    8_1_4,
    8_1_1,
    8_0_8,
    8_0_4,
    8_0_1,
    7_9_8,
    7_9_5,
    7_9_1,
    7_8_8,
    7_8_5,
    7_8_4,
    7_8_0,
    7_7_7,
    7_7_4,
    7_7_0,
    7_6_6,
    7_6_3,
    7_6_0,
    7_5_6,
    7_5_2,
    7_4_9,
    7_4_6,
    7_4_2,
    7_4_1,
    7_3_7,
    7_3_3,
    7_3_0,
    7_2_6,
    7_2_2,
    7_1_8,
    7_1_4,
    7_1_0,
    7_0_7,
    7_0_3,
    6_9_9,
    6_9_8,
    6_9_4,
    6_9_0,
    6_8_5,
    6_8_1,
    6_7_7,
    6_7_3,
    6_6_9,
    6_6_4,
    6_6_0,
    6_5_6,
    6_5_5,
    6_5_0,
    6_4_6,
    6_4_1,
    6_3_6,
    6_3_2,
    6_2_7,
    6_2_2,
    6_1_8,
    6_1_3,
    6_1_2,
    6_0_7,
    6_0_2,
    5_9_6,
    5_9_1,
    5_8_6,
    5_8_0,
    5_7_5,
    5_7_0,
    5_6_9,
    5_6_3,
    5_5_7,
    5_5_1,
    5_4_5,
    5_3_9,
    5_3_3,
    5_2_7,
    5_2_6,
    5_1_9,
    5_1_2,
    5_0_5,
    4_9_8,
    4_9_1,
    4_8_4,
    4_8_3,
    4_7_4,
    4_6_6,
    4_5_7,
    4_4_9,
    4_4_0,
    4_3_9,
    4_2_8,
    4_1_8,
    4_0_7,
    3_9_6,
    3_9_5,
    3_8_1,
    3_6_6,
    3_5_2,
    3_5_1,
    3_3_0,
    3_0_8,
    3_0_7,
    2_8_6,
    2_6_4,
    2_6_3,
    2_4_2,
    2_2_0,
    2_1_9,
    1_7_6,
    1_7_5,
    1_3_2,
    1_3_1,
    8_8,
    4_4,
    0,
]

__UpperCamelCase  :      Dict							      =		[
    9_9_9,
    9_9_1,
    9_8_2,
    9_7_4,
    9_6_6,
    9_5_8,
    9_5_0,
    9_4_1,
    9_3_3,
    9_2_5,
    9_1_6,
    9_0_8,
    9_0_0,
    8_9_9,
    8_7_4,
    8_5_0,
    8_2_5,
    8_0_0,
    7_9_9,
    7_0_0,
    6_0_0,
    5_0_0,
    4_0_0,
    3_0_0,
    2_0_0,
    1_0_0,
    0,
]

__UpperCamelCase  :      int							      =		[
    9_9_9,
    9_9_2,
    9_8_5,
    9_7_8,
    9_7_1,
    9_6_4,
    9_5_7,
    9_4_9,
    9_4_2,
    9_3_5,
    9_2_8,
    9_2_1,
    9_1_4,
    9_0_7,
    9_0_0,
    8_9_9,
    8_7_9,
    8_5_9,
    8_4_0,
    8_2_0,
    8_0_0,
    7_9_9,
    7_6_6,
    7_3_3,
    7_0_0,
    6_9_9,
    6_5_0,
    6_0_0,
    5_9_9,
    5_0_0,
    4_9_9,
    4_0_0,
    3_9_9,
    3_0_0,
    2_9_9,
    2_0_0,
    1_9_9,
    1_0_0,
    9_9,
    0,
]

__UpperCamelCase  :      Optional[int]							      =		[
    9_9_9,
    9_9_6,
    9_9_2,
    9_8_9,
    9_8_5,
    9_8_2,
    9_7_9,
    9_7_5,
    9_7_2,
    9_6_8,
    9_6_5,
    9_6_1,
    9_5_8,
    9_5_5,
    9_5_1,
    9_4_8,
    9_4_4,
    9_4_1,
    9_3_8,
    9_3_4,
    9_3_1,
    9_2_7,
    9_2_4,
    9_2_0,
    9_1_7,
    9_1_4,
    9_1_0,
    9_0_7,
    9_0_3,
    9_0_0,
    8_9_9,
    8_9_1,
    8_8_4,
    8_7_6,
    8_6_9,
    8_6_1,
    8_5_3,
    8_4_6,
    8_3_8,
    8_3_0,
    8_2_3,
    8_1_5,
    8_0_8,
    8_0_0,
    7_9_9,
    7_8_8,
    7_7_7,
    7_6_6,
    7_5_5,
    7_4_4,
    7_3_3,
    7_2_2,
    7_1_1,
    7_0_0,
    6_9_9,
    6_8_8,
    6_7_7,
    6_6_6,
    6_5_5,
    6_4_4,
    6_3_3,
    6_2_2,
    6_1_1,
    6_0_0,
    5_9_9,
    5_8_5,
    5_7_1,
    5_5_7,
    5_4_2,
    5_2_8,
    5_1_4,
    5_0_0,
    4_9_9,
    4_8_5,
    4_7_1,
    4_5_7,
    4_4_2,
    4_2_8,
    4_1_4,
    4_0_0,
    3_9_9,
    3_7_9,
    3_5_9,
    3_4_0,
    3_2_0,
    3_0_0,
    2_9_9,
    2_7_9,
    2_5_9,
    2_4_0,
    2_2_0,
    2_0_0,
    1_9_9,
    1_6_6,
    1_3_3,
    1_0_0,
    9_9,
    6_6,
    3_3,
    0,
]




