


"""simple docstring"""

import unittest

from transformers import XLMConfig, 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, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
       import torch

       from transformers import (
           XLMForMultipleChoice,
           XLMForQuestionAnswering,
           XLMForQuestionAnsweringSimple,
           XLMForSequenceClassification,
           XLMForTokenClassification,
           XLMModel,
           XLMWithLMHeadModel,
       )
       from transformers.models.xlm.modeling_xlm import XLM_PRETRAINED_MODEL_ARCHIVE_LIST





class    lowerCamelCase__						:
      def __init__(		self	:	Tuple      ,       A_	:	Optional[Any]      ,       A_	:	Any=1_3      ,       A_	:	Any=7      ,       A_	:	Dict=True      ,       A_	:	Optional[int]=True      ,       A_	:	List[str]=True      ,       A_	:	Any=True      ,       A_	:	Optional[int]=True      ,       A_	:	List[str]=False      ,       A_	:	List[str]=False      ,       A_	:	Optional[Any]=False      ,       A_	:	Tuple=2      ,       A_	:	Optional[Any]=9_9      ,       A_	:	Optional[int]=0      ,       A_	:	Tuple=3_2      ,       A_	:	Optional[Any]=5      ,       A_	:	Union[str, Any]=4      ,       A_	:	List[Any]=0.1      ,       A_	:	Optional[Any]=0.1      ,       A_	:	Any=5_1_2      ,       A_	:	Dict=2      ,       A_	:	int=0.02      ,       A_	:	Tuple=2      ,       A_	:	List[str]=4      ,       A_	:	Any="last"      ,       A_	:	Tuple=True      ,       A_	:	Tuple=None      ,       A_	:	List[Any]=0      ,       ):






       '''simple docstring'''


       __lowercase									=	parent
       __lowercase									=	batch_size
       __lowercase									=	seq_length
       __lowercase									=	is_training
       __lowercase									=	use_input_lengths
       __lowercase									=	use_token_type_ids
       __lowercase									=	use_labels
       __lowercase									=	gelu_activation
       __lowercase									=	sinusoidal_embeddings
       __lowercase									=	causal
       __lowercase									=	asm
       __lowercase									=	n_langs
       __lowercase									=	vocab_size
       __lowercase									=	n_special
       __lowercase									=	hidden_size
       __lowercase									=	num_hidden_layers
       __lowercase									=	num_attention_heads
       __lowercase									=	hidden_dropout_prob
       __lowercase									=	attention_probs_dropout_prob
       __lowercase									=	max_position_embeddings
       __lowercase									=	type_sequence_label_size
       __lowercase									=	initializer_range
       __lowercase									=	num_labels
       __lowercase									=	num_choices
       __lowercase									=	summary_type
       __lowercase									=	use_proj
       __lowercase									=	scope
       __lowercase									=	bos_token_id
      def SCREAMING_SNAKE_CASE_	(		self	:	int							):






       '''simple docstring'''


       __lowercase									=	ids_tensor([self.batch_size, self.seq_length]      ,       self.vocab_size							)
       __lowercase									=	random_attention_mask([self.batch_size, self.seq_length]							)

       __lowercase									=	None
       if self.use_input_lengths:
        __lowercase									=	(
            ids_tensor([self.batch_size]      ,       vocab_size=2							) + self.seq_length - 2
        )  # small variation of seq_length

       __lowercase									=	None
       if self.use_token_type_ids:
        __lowercase									=	ids_tensor([self.batch_size, self.seq_length]      ,       self.n_langs							)

       __lowercase									=	None
       __lowercase									=	None
       __lowercase									=	None
       if self.use_labels:
        __lowercase									=	ids_tensor([self.batch_size]      ,       self.type_sequence_label_size							)
        __lowercase									=	ids_tensor([self.batch_size, self.seq_length]      ,       self.num_labels							)
        __lowercase									=	ids_tensor([self.batch_size]      ,       2							).float()
        __lowercase									=	ids_tensor([self.batch_size]      ,       self.num_choices							)

       __lowercase									=	self.get_config()

       return (
           config,
           input_ids,
           token_type_ids,
           input_lengths,
           sequence_labels,
           token_labels,
           is_impossible_labels,
           choice_labels,
           input_mask,
       )
      def SCREAMING_SNAKE_CASE_	(		self	:	int							):






       '''simple docstring'''


       return XLMConfig(
           vocab_size=self.vocab_size      ,       n_special=self.n_special      ,       emb_dim=self.hidden_size      ,       n_layers=self.num_hidden_layers      ,       n_heads=self.num_attention_heads      ,       dropout=self.hidden_dropout_prob      ,       attention_dropout=self.attention_probs_dropout_prob      ,       gelu_activation=self.gelu_activation      ,       sinusoidal_embeddings=self.sinusoidal_embeddings      ,       asm=self.asm      ,       causal=self.causal      ,       n_langs=self.n_langs      ,       max_position_embeddings=self.max_position_embeddings      ,       initializer_range=self.initializer_range      ,       summary_type=self.summary_type      ,       use_proj=self.use_proj      ,       num_labels=self.num_labels      ,       bos_token_id=self.bos_token_id      ,       )
      def SCREAMING_SNAKE_CASE_	(		self	:	List[str]      ,       A_	:	List[Any]      ,       A_	:	int      ,       A_	:	Optional[int]      ,       A_	:	Optional[int]      ,       A_	:	str      ,       A_	:	Dict      ,       A_	:	str      ,       A_	:	Optional[int]      ,       A_	:	Optional[Any]      ,       ):






       '''simple docstring'''


       __lowercase									=	XLMModel(config=A_							)
       model.to(A_							)
       model.eval()
       __lowercase									=	model(A_      ,       lengths=A_      ,       langs=A_							)
       __lowercase									=	model(A_      ,       langs=A_							)
       __lowercase									=	model(A_							)
       self.parent.assertEqual(result.last_hidden_state.shape      ,       (self.batch_size, self.seq_length, self.hidden_size)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	int      ,       A_	:	List[Any]      ,       A_	:	Union[str, Any]      ,       A_	:	Optional[int]      ,       A_	:	str      ,       A_	:	List[str]      ,       A_	:	List[str]      ,       A_	:	List[Any]      ,       A_	:	Dict      ,       A_	:	Optional[Any]      ,       ):






       '''simple docstring'''


       __lowercase									=	XLMWithLMHeadModel(A_							)
       model.to(A_							)
       model.eval()

       __lowercase									=	model(A_      ,       token_type_ids=A_      ,       labels=A_							)
       self.parent.assertEqual(result.loss.shape      ,       ()							)
       self.parent.assertEqual(result.logits.shape      ,       (self.batch_size, self.seq_length, self.vocab_size)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	int      ,       A_	:	List[Any]      ,       A_	:	Dict      ,       A_	:	Optional[int]      ,       A_	:	List[Any]      ,       A_	:	Dict      ,       A_	:	Optional[Any]      ,       A_	:	List[str]      ,       A_	:	Any      ,       A_	:	int      ,       ):






       '''simple docstring'''


       __lowercase									=	XLMForQuestionAnsweringSimple(A_							)
       model.to(A_							)
       model.eval()

       __lowercase									=	model(A_							)

       __lowercase									=	model(A_      ,       start_positions=A_      ,       end_positions=A_							)
       __lowercase									=	outputs
       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 SCREAMING_SNAKE_CASE_	(		self	:	Any      ,       A_	:	List[Any]      ,       A_	:	Tuple      ,       A_	:	Tuple      ,       A_	:	str      ,       A_	:	Tuple      ,       A_	:	int      ,       A_	:	str      ,       A_	:	Any      ,       A_	:	Tuple      ,       ):






       '''simple docstring'''


       __lowercase									=	XLMForQuestionAnswering(A_							)
       model.to(A_							)
       model.eval()

       __lowercase									=	model(A_							)

       __lowercase									=	model(
           A_      ,       start_positions=A_      ,       end_positions=A_      ,       cls_index=A_      ,       is_impossible=A_      ,       p_mask=A_      ,       )

       __lowercase									=	model(
           A_      ,       start_positions=A_      ,       end_positions=A_      ,       cls_index=A_      ,       is_impossible=A_      ,       )

       ((__lowercase)							,		)									=	result_with_labels.to_tuple()

       __lowercase									=	model(A_      ,       start_positions=A_      ,       end_positions=A_							)

       ((__lowercase)							,		)									=	result_with_labels.to_tuple()

       self.parent.assertEqual(result_with_labels.loss.shape      ,       ()							)
       self.parent.assertEqual(result.start_top_log_probs.shape      ,       (self.batch_size, model.config.start_n_top)							)
       self.parent.assertEqual(result.start_top_index.shape      ,       (self.batch_size, model.config.start_n_top)							)
       self.parent.assertEqual(
           result.end_top_log_probs.shape      ,       (self.batch_size, model.config.start_n_top * model.config.end_n_top)							)
       self.parent.assertEqual(
           result.end_top_index.shape      ,       (self.batch_size, model.config.start_n_top * model.config.end_n_top)							)
       self.parent.assertEqual(result.cls_logits.shape      ,       (self.batch_size,)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	str      ,       A_	:	Optional[int]      ,       A_	:	Dict      ,       A_	:	Tuple      ,       A_	:	Union[str, Any]      ,       A_	:	List[Any]      ,       A_	:	Optional[int]      ,       A_	:	Dict      ,       A_	:	List[Any]      ,       A_	:	Dict      ,       ):






       '''simple docstring'''


       __lowercase									=	XLMForSequenceClassification(A_							)
       model.to(A_							)
       model.eval()

       __lowercase									=	model(A_							)
       __lowercase									=	model(A_      ,       labels=A_							)
       self.parent.assertEqual(result.loss.shape      ,       ()							)
       self.parent.assertEqual(result.logits.shape      ,       (self.batch_size, self.type_sequence_label_size)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Tuple      ,       A_	:	Optional[int]      ,       A_	:	Any      ,       A_	:	str      ,       A_	:	int      ,       A_	:	Dict      ,       A_	:	Optional[Any]      ,       A_	:	Optional[Any]      ,       A_	:	Dict      ,       A_	:	List[str]      ,       ):






       '''simple docstring'''


       __lowercase									=	self.num_labels
       __lowercase									=	XLMForTokenClassification(A_							)
       model.to(A_							)
       model.eval()

       __lowercase									=	model(A_      ,       attention_mask=A_      ,       labels=A_							)
       self.parent.assertEqual(result.logits.shape      ,       (self.batch_size, self.seq_length, self.num_labels)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Dict      ,       A_	:	int      ,       A_	:	Tuple      ,       A_	:	List[Any]      ,       A_	:	Union[str, Any]      ,       A_	:	Union[str, Any]      ,       A_	:	Optional[int]      ,       A_	:	Union[str, Any]      ,       A_	:	Tuple      ,       A_	:	Optional[Any]      ,       ):






       '''simple docstring'''


       __lowercase									=	self.num_choices
       __lowercase									=	XLMForMultipleChoice(config=A_							)
       model.to(A_							)
       model.eval()
       __lowercase									=	input_ids.unsqueeze(1							).expand(-1      ,       self.num_choices      ,       -1							).contiguous()
       __lowercase									=	token_type_ids.unsqueeze(1							).expand(-1      ,       self.num_choices      ,       -1							).contiguous()
       __lowercase									=	input_mask.unsqueeze(1							).expand(-1      ,       self.num_choices      ,       -1							).contiguous()
       __lowercase									=	model(
           A_      ,       attention_mask=A_      ,       token_type_ids=A_      ,       labels=A_      ,       )
       self.parent.assertEqual(result.logits.shape      ,       (self.batch_size, self.num_choices)							)






      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[int]							):






       '''simple docstring'''


       __lowercase									=	self.prepare_config_and_inputs()
       (
           (
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		(
           __lowercase
       )							,		
       )									=	config_and_inputs
       __lowercase									=	{"""input_ids""": input_ids, """token_type_ids""": token_type_ids, """lengths""": input_lengths}
       return config, inputs_dict






@require_torch
class    lowerCamelCase__						(		_a			,   _a			,   _a			,   unittest.TestCase    ):
      a :     Optional[int]											=		(
          (
              XLMModel,
              XLMWithLMHeadModel,
              XLMForQuestionAnswering,
              XLMForSequenceClassification,
              XLMForQuestionAnsweringSimple,
              XLMForTokenClassification,
              XLMForMultipleChoice,
          )
          if is_torch_available()
          else ()
      )
      a :     int											=		(
          (XLMWithLMHeadModel,) if is_torch_available() else ()
      )  # TODO (PVP): Check other models whether language generation is also applicable
      a :     Union[str, Any]											=		(
          {
              """feature-extraction""": XLMModel,
              """fill-mask""": XLMWithLMHeadModel,
              """question-answering""": XLMForQuestionAnsweringSimple,
              """text-classification""": XLMForSequenceClassification,
              """text-generation""": XLMWithLMHeadModel,
              """token-classification""": XLMForTokenClassification,
              """zero-shot""": XLMForSequenceClassification,
          }
          if is_torch_available()
          else {}
      )
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[Any]      ,       A_	:	int      ,       A_	:	Optional[Any]      ,       A_	:	List[str]      ,       A_	:	Union[str, Any]      ,       A_	:	Optional[int]							):






       '''simple docstring'''


       if (
           pipeline_test_casse_name == "QAPipelineTests"
           and tokenizer_name is not None
           and not tokenizer_name.endswith("""Fast"""							)
       ):
        # `QAPipelineTests` fails for a few models when the slower tokenizer are used.
        # (The slower tokenizers were never used for pipeline tests before the pipeline testing rework)
        # TODO: check (and possibly fix) the `QAPipelineTests` with slower tokenizer
        return True

       return False
      def SCREAMING_SNAKE_CASE_	(		self	:	List[str]      ,       A_	:	Union[str, Any]      ,       A_	:	List[str]      ,       A_	:	Any=False							):






       '''simple docstring'''


       __lowercase									=	super()._prepare_for_class(A_      ,       A_      ,       return_labels=A_							)

       if return_labels:
        if model_class.__name__ == "XLMForQuestionAnswering":
         __lowercase									=	torch.zeros(
             self.model_tester.batch_size      ,       dtype=torch.long      ,       device=A_							)
         __lowercase									=	torch.zeros(
             self.model_tester.batch_size      ,       dtype=torch.long      ,       device=A_							)

       return inputs_dict
      def SCREAMING_SNAKE_CASE_	(		self	:	Dict							):






       '''simple docstring'''


       __lowercase									=	XLMModelTester(self							)
       __lowercase									=	ConfigTester(self      ,       config_class=A_      ,       emb_dim=3_7							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Union[str, Any]							):






       '''simple docstring'''


       self.config_tester.run_common_tests()
      def SCREAMING_SNAKE_CASE_	(		self	:	Any							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_model(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[int]							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_lm_head(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Tuple							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_simple_qa(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	int							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_qa(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[int]							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_sequence_classif(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[Any]							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_token_classif(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Any							):






       '''simple docstring'''


       __lowercase									=	self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_xlm_for_multiple_choice(*A_							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[Any]      ,       A_	:	int      ,       A_	:	int      ,       A_	:	Union[str, Any]      ,       A_	:	Tuple      ,       A_	:	str      ,       A_	:	Union[str, Any]=False      ,       A_	:	Dict=1							):






       '''simple docstring'''


       self.assertIsInstance(A_      ,       A_							)
       self.assertListEqual(
           [isinstance(A_      ,       A_							) for iter_attentions in attentions]      ,       [True] * len(A_							)							)
       self.assertEqual(len(A_							)      ,       (max_length - min_length) * num_beam_groups							)

       for idx, iter_attentions in enumerate(A_							):
        # adds PAD dummy token
        __lowercase									=	min_length + idx + 1
        __lowercase									=	min_length + idx + 1

        __lowercase									=	(
            batch_size * num_beam_groups,
            config.num_attention_heads,
            tgt_len,
            src_len,
        )
        # check attn size
        self.assertListEqual(
            [layer_attention.shape for layer_attention in iter_attentions]      ,       [expected_shape] * len(A_							)							)
      def SCREAMING_SNAKE_CASE_	(		self	:	Tuple      ,       A_	:	Tuple      ,       A_	:	Tuple      ,       A_	:	int      ,       A_	:	int      ,       A_	:	str      ,       A_	:	Dict=False      ,       A_	:	int=1							):






       '''simple docstring'''


       self.assertIsInstance(A_      ,       A_							)
       self.assertListEqual(
           [isinstance(A_      ,       A_							) for iter_hidden_states in hidden_states]      ,       [True] * len(A_							)      ,       )
       self.assertEqual(len(A_							)      ,       (max_length - min_length) * num_beam_groups							)

       for idx, iter_hidden_states in enumerate(A_							):
        # adds PAD dummy token
        __lowercase									=	min_length + idx + 1
        __lowercase									=	(batch_size * num_beam_groups, seq_len, config.hidden_size)
        # check hidden size
        self.assertListEqual(
            [layer_hidden_states.shape for layer_hidden_states in iter_hidden_states]      ,       [expected_shape] * len(A_							)      ,       )
       pass






      @slow
      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[Any]							):






       '''simple docstring'''


       for model_name in XLM_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
        __lowercase									=	XLMModel.from_pretrained(A_							)
        self.assertIsNotNone(A_							)






@require_torch
class    lowerCamelCase__						(		unittest.TestCase    ):
      @slow
      def SCREAMING_SNAKE_CASE_	(		self	:	Any							):






       '''simple docstring'''


       __lowercase									=	XLMWithLMHeadModel.from_pretrained("""xlm-mlm-en-2048"""							)
       model.to(A_							)
       __lowercase									=	torch.tensor([[1_4, 4_4_7]]      ,       dtype=torch.long      ,       device=A_							)  # the president
       __lowercase									=	[
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
           1_4,
           4_4_7,
       ]  # the president the president the president the president the president the president the president the president the president the president
       # TODO(PVP): this and other input_ids I tried for generation give pretty bad results. Not sure why. Model might just not be made for auto-regressive inference
       __lowercase									=	model.generate(A_      ,       do_sample=A_							)
       self.assertListEqual(output_ids[0].cpu().numpy().tolist()      ,       A_							)




"""simple docstring"""

import inspect
import unittest





class    lowerCamelCase__						(		unittest.TestCase    ):
      def SCREAMING_SNAKE_CASE_	(		self	:	int							):






       '''simple docstring'''


       try:
        import diffusers  # noqa: F401
       except ImportError:
        assert False






      def SCREAMING_SNAKE_CASE_	(		self	:	Optional[Any]							):






       '''simple docstring'''


       import diffusers
       from diffusers.dependency_versions_table import deps

       __lowercase									=	inspect.getmembers(A_      ,       inspect.isclass							)

       for cls_name, cls_module in all_classes:
        if "dummy_" in cls_module.__module__:
         for backend in cls_module._backends:
          if backend == "k_diffusion":
           __lowercase									=	"""k-diffusion"""
          elif backend == "invisible_watermark":
           __lowercase									=	"""invisible-watermark"""
          assert backend in deps, F'''{backend} is not in the deps table!'''
