
"""simple docstring"""






import os
import pathlib
import tempfile
import uuid

import numpy as np

from ..utils import is_soundfile_availble, is_torch_available, is_vision_available, logging


UpperCamelCase_						   =   logging.get_logger(__name__)

if is_vision_available():
      import PIL.Image
      from PIL import Image
      from PIL.Image import Image as ImageType
else:
      UpperCamelCase_						   =   object

if is_torch_available():
      import torch

if is_soundfile_availble():
      import soundfile as sf





class 							snake_case       :







   def __init__( self       ,							__UpperCAmelCase)   ->Tuple:
      a_						   =     value







   def __str__( self)   ->Union[str, Any]:
      return self.to_string()







   def    UpperCAmelCase__	( self)   ->str:
      logger.error(
          "This is a raw AgentType of unknown type. Display in notebooks and string conversion will be unreliable")
      return self._value







   def    UpperCAmelCase__	( self)   ->str:
      logger.error(
          "This is a raw AgentType of unknown type. Display in notebooks and string conversion will be unreliable")
      return str(self._value)






class 							snake_case       (     _a							,       _a		):







   def    UpperCAmelCase__	( self)   ->str:
      return self._value







   def    UpperCAmelCase__	( self)   ->Union[str, Any]:
      return self._value






class 							snake_case       (     _a							,       _a		):







   def __init__( self       ,							__UpperCAmelCase)   ->List[str]:
      super().__init__(__UpperCAmelCase)

      if not is_vision_available():
         raise ImportError("PIL must be installed in order to handle images.")

      a_						   =     None
      a_						   =     None
      a_						   =     None

      if isinstance(__UpperCAmelCase       ,							__UpperCAmelCase):
         a_						   =     value
      elif isinstance(__UpperCAmelCase       ,							(str, pathlib.Path)):
         a_						   =     value
      elif isinstance(__UpperCAmelCase       ,							torch.Tensor):
         a_						   =     value
      else:
         raise ValueError(F'''Unsupported type for {self.__class__.__name__}: {type(__UpperCAmelCase)}''')







   def    UpperCAmelCase__	( self       ,							__UpperCAmelCase=None       ,							__UpperCAmelCase=None)   ->List[Any]:
      from IPython.display import Image, display

      display(Image(self.to_string()))







   def    UpperCAmelCase__	( self)   ->int:
      if self._raw is not None:
         return self._raw

      if self._path is not None:
         a_						   =     Image.open(self._path)
         return self._raw







   def    UpperCAmelCase__	( self)   ->Optional[int]:
      if self._path is not None:
         return self._path

      if self._raw is not None:
         a_						   =     tempfile.mkdtemp()
         a_						   =     os.path.join(__UpperCAmelCase       ,							str(uuid.uuida()) + ".png")
         self._raw.save(self._path)

         return self._path

      if self._tensor is not None:
         a_						   =     self._tensor.cpu().detach().numpy()

         # There is likely simpler than load into image into save
         a_						   =     Image.fromarray((array * 2_55).astype(np.uinta))

         a_						   =     tempfile.mkdtemp()
         a_						   =     os.path.join(__UpperCAmelCase       ,							str(uuid.uuida()) + ".png")

         img.save(self._path)

         return self._path






class 							snake_case       (     _a		):







   def __init__( self       ,							__UpperCAmelCase       ,							__UpperCAmelCase=1_60_00)   ->Any:
      super().__init__(__UpperCAmelCase)

      if not is_soundfile_availble():
         raise ImportError("soundfile must be installed in order to handle audio.")

      a_						   =     None
      a_						   =     None

      a_						   =     samplerate

      if isinstance(__UpperCAmelCase       ,							(str, pathlib.Path)):
         a_						   =     value
      elif isinstance(__UpperCAmelCase       ,							torch.Tensor):
         a_						   =     value
      else:
         raise ValueError(F'''Unsupported audio type: {type(__UpperCAmelCase)}''')







   def    UpperCAmelCase__	( self       ,							__UpperCAmelCase=None       ,							__UpperCAmelCase=None)   ->List[str]:
      from IPython.display import Audio, display

      display(Audio(self.to_string()       ,							rate=self.samplerate))







   def    UpperCAmelCase__	( self)   ->Union[str, Any]:
      if self._tensor is not None:
         return self._tensor

      if self._path is not None:
         a_   ,			a_						   =     sf.read(self._path)
         a_						   =     torch.tensor(__UpperCAmelCase)
         return self._tensor







   def    UpperCAmelCase__	( self)   ->List[str]:
      if self._path is not None:
         return self._path

      if self._tensor is not None:
         a_						   =     tempfile.mkdtemp()
         a_						   =     os.path.join(__UpperCAmelCase       ,							str(uuid.uuida()) + ".wav")
         sf.write(self._path       ,							self._tensor       ,							samplerate=self.samplerate)
         return self._path






UpperCamelCase_						   =   {"""text""": AgentText, """image""": AgentImage, """audio""": AgentAudio}
UpperCamelCase_						   =   {str: AgentText}

if is_vision_available():
      UpperCamelCase_						   =   AgentImage
def    UpperCamelCase						(					*UpperCAmelCase ,   **UpperCAmelCase     )						->List[Any]:

   """simple docstring"""



   a_						   =     [(arg.to_raw() if isinstance(UpperCAmelCase ,   UpperCAmelCase     ) else arg) for arg in args]
   a_						   =     {k: (v.to_raw() if isinstance(UpperCAmelCase ,   UpperCAmelCase     ) else v) for k, v in kwargs.items()}
   return args, kwargs



def    UpperCamelCase						(					UpperCAmelCase ,   UpperCAmelCase=None     )						->Any:

   """simple docstring"""



   if isinstance(UpperCAmelCase ,   UpperCAmelCase     ):
      a_						   =     {}
      for i, (k, v) in enumerate(outputs.items()     ):
         if output_types is not None:
            # If the class has defined outputs, we can map directly according to the class definition
            if output_types[i] in AGENT_TYPE_MAPPING:
               a_						   =     AGENT_TYPE_MAPPING[output_types[i]](UpperCAmelCase     )
            else:
               a_						   =     AgentType(UpperCAmelCase     )

         else:
            # If the class does not have defined output, then we map according to the type
            for _k, _v in INSTANCE_TYPE_MAPPING.items():
               if isinstance(UpperCAmelCase ,   _k     ):
                  a_						   =     _v(UpperCAmelCase     )
            if k not in decoded_outputs:
               a_						   =     AgentType[v]

   elif isinstance(UpperCAmelCase ,   (list, tuple)     ):
      a_						   =     type(UpperCAmelCase     )()
      for i, v in enumerate(UpperCAmelCase     ):
         if output_types is not None:
            # If the class has defined outputs, we can map directly according to the class definition
            if output_types[i] in AGENT_TYPE_MAPPING:
               decoded_outputs.append(AGENT_TYPE_MAPPING[output_types[i]](UpperCAmelCase     )     )
            else:
               decoded_outputs.append(AgentType(UpperCAmelCase     )     )
         else:
            # If the class does not have defined output, then we map according to the type
            a_						   =     False
            for _k, _v in INSTANCE_TYPE_MAPPING.items():
               if isinstance(UpperCAmelCase ,   _k     ):
                  decoded_outputs.append(_v(UpperCAmelCase     )     )
                  a_						   =     True

            if not found:
               decoded_outputs.append(AgentType(UpperCAmelCase     )     )

   else:
      if output_types[0] in AGENT_TYPE_MAPPING:
         # If the class has defined outputs, we can map directly according to the class definition
         a_						   =     AGENT_TYPE_MAPPING[output_types[0]](UpperCAmelCase     )

      else:
         # If the class does not have defined output, then we map according to the type
         for _k, _v in INSTANCE_TYPE_MAPPING.items():
            if isinstance(UpperCAmelCase ,   _k     ):
               return _v(UpperCAmelCase     )
         return AgentType(UpperCAmelCase     )

   return decoded_outputs






from __future__ import annotations

import unittest

from transformers import is_tf_available
from transformers.testing_utils import require_tf, slow

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
    import tensorflow as tf

    from transformers import (
        TF_XLM_PRETRAINED_MODEL_ARCHIVE_LIST,
        TFXLMForMultipleChoice,
        TFXLMForQuestionAnsweringSimple,
        TFXLMForSequenceClassification,
        TFXLMForTokenClassification,
        TFXLMModel,
        TFXLMWithLMHeadModel,
        XLMConfig,
    )







class 		_lowerCAmelCase:

  """simple docstring"""







  def __init__(   self    ,							UpperCAmelCase    ,							)->   List[Any]:
     __A    =  parent
     __A    =  13
     __A    =  7
     __A    =  True
     __A    =  True
     __A    =  True
     __A    =  True
     __A    =  True
     __A    =  False
     __A    =  False
     __A    =  False
     __A    =  2
     __A    =  99
     __A    =  0
     __A    =  32
     __A    =  2
     __A    =  4
     __A    =  0.1
     __A    =  0.1
     __A    =  5_12
     __A    =  16
     __A    =  2
     __A    =  0.02
     __A    =  3
     __A    =  4
     __A    =  '''last'''
     __A    =  True
     __A    =  None
     __A    =  0

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Optional[Any]:
     __A    =  ids_tensor([self.batch_size, self.seq_length]    ,							self.vocab_size      )
     __A    =  random_attention_mask([self.batch_size, self.seq_length]    ,							dtype=tf.floataa      )

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

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

     __A    =  None
     __A    =  None
     __A    =  None
     if self.use_labels:
        __A    =  ids_tensor([self.batch_size]    ,							self.type_sequence_label_size      )
        __A    =  ids_tensor([self.batch_size, self.seq_length]    ,							self.num_labels      )
        __A    =  ids_tensor([self.batch_size]    ,							2    ,							dtype=tf.floataa      )
        __A    =  ids_tensor([self.batch_size]    ,							self.num_choices      )

     __A    =  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    ,							bos_token_id=self.bos_token_id    ,							)

     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    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Optional[Any]:
     __A    =  TFXLMModel(config=UpperCAmelCase      )
     __A    =  {'''input_ids''': input_ids, '''lengths''': input_lengths, '''langs''': token_type_ids}
     __A    =  model(UpperCAmelCase      )

     __A    =  [input_ids, input_mask]
     __A    =  model(UpperCAmelCase      )
     self.parent.assertEqual(result.last_hidden_state.shape    ,							(self.batch_size, self.seq_length, self.hidden_size)      )

  def 						SCREAMING_SNAKE_CASE__			(   self    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Tuple:
     __A    =  TFXLMWithLMHeadModel(UpperCAmelCase      )

     __A    =  {'''input_ids''': input_ids, '''lengths''': input_lengths, '''langs''': token_type_ids}
     __A    =  model(UpperCAmelCase      )

     __A    =  outputs

     self.parent.assertEqual(result.logits.shape    ,							(self.batch_size, self.seq_length, self.vocab_size)      )

  def 						SCREAMING_SNAKE_CASE__			(   self    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Dict:
     __A    =  TFXLMForQuestionAnsweringSimple(UpperCAmelCase      )

     __A    =  {'''input_ids''': input_ids, '''lengths''': input_lengths}

     __A    =  model(UpperCAmelCase      )

     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    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Union[str, Any]:
     __A    =  TFXLMForSequenceClassification(UpperCAmelCase      )

     __A    =  {'''input_ids''': input_ids, '''lengths''': input_lengths}

     __A    =  model(UpperCAmelCase      )

     self.parent.assertEqual(result.logits.shape    ,							(self.batch_size, self.type_sequence_label_size)      )

  def 						SCREAMING_SNAKE_CASE__			(   self    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Tuple:
     __A    =  self.num_labels
     __A    =  TFXLMForTokenClassification(config=UpperCAmelCase      )
     __A    =  {'''input_ids''': input_ids, '''attention_mask''': input_mask, '''token_type_ids''': token_type_ids}
     __A    =  model(UpperCAmelCase      )
     self.parent.assertEqual(result.logits.shape    ,							(self.batch_size, self.seq_length, self.num_labels)      )

  def 						SCREAMING_SNAKE_CASE__			(   self    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							)->   Union[str, Any]:
     __A    =  self.num_choices
     __A    =  TFXLMForMultipleChoice(config=UpperCAmelCase      )
     __A    =  tf.tile(tf.expand_dims(UpperCAmelCase    ,							1      )    ,							(1, self.num_choices, 1)      )
     __A    =  tf.tile(tf.expand_dims(UpperCAmelCase    ,							1      )    ,							(1, self.num_choices, 1)      )
     __A    =  tf.tile(tf.expand_dims(UpperCAmelCase    ,							1      )    ,							(1, self.num_choices, 1)      )
     __A    =  {
         '''input_ids''': multiple_choice_inputs_ids,
         '''attention_mask''': multiple_choice_input_mask,
         '''token_type_ids''': multiple_choice_token_type_ids,
     }
     __A    =  model(UpperCAmelCase      )
     self.parent.assertEqual(result.logits.shape    ,							(self.batch_size, self.num_choices)      )





  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Optional[Any]:
     __A    =  self.prepare_config_and_inputs()
     (
         (
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		(
         __A
     )   ,		
     )    =  config_and_inputs
     __A    =  {
         '''input_ids''': input_ids,
         '''token_type_ids''': token_type_ids,
         '''langs''': token_type_ids,
         '''lengths''': input_lengths,
     }
     return config, inputs_dict







@require_tf
class 		_lowerCAmelCase(		_a						,       _a						,       unittest.TestCase):

  """simple docstring"""







  lowerCamelCase__     	=       (
      (
          TFXLMModel,
          TFXLMWithLMHeadModel,
          TFXLMForSequenceClassification,
          TFXLMForQuestionAnsweringSimple,
          TFXLMForTokenClassification,
          TFXLMForMultipleChoice,
      )
      if is_tf_available()
      else ()
  )
  lowerCamelCase__     	=       (
      (TFXLMWithLMHeadModel,) if is_tf_available() else ()
  )  # TODO (PVP): Check other models whether language generation is also applicable
  lowerCamelCase__     	=       (
      {
          '''feature-extraction''': TFXLMModel,
          '''fill-mask''': TFXLMWithLMHeadModel,
          '''question-answering''': TFXLMForQuestionAnsweringSimple,
          '''text-classification''': TFXLMForSequenceClassification,
          '''text-generation''': TFXLMWithLMHeadModel,
          '''token-classification''': TFXLMForTokenClassification,
          '''zero-shot''': TFXLMForSequenceClassification,
      }
      if is_tf_available()
      else {}
  )
  lowerCamelCase__     	=       False
  lowerCamelCase__     	=       False

  def 						SCREAMING_SNAKE_CASE__			(   self    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase    ,							UpperCAmelCase      )->   List[Any]:
     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      )->   Any:
     __A    =  TFXLMModelTester(self      )
     __A    =  ConfigTester(self    ,							config_class=UpperCAmelCase    ,							emb_dim=37      )

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

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Any:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_model(*UpperCAmelCase      )

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Any:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_lm_head(*UpperCAmelCase      )

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   List[Any]:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_qa(*UpperCAmelCase      )

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Any:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_sequence_classif(*UpperCAmelCase      )

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Tuple:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_for_token_classification(*UpperCAmelCase      )

  def 						SCREAMING_SNAKE_CASE__			(   self      )->   int:
     __A    =  self.model_tester.prepare_config_and_inputs()
     self.model_tester.create_and_check_xlm_for_multiple_choice(*UpperCAmelCase      )





  @slow
  def 						SCREAMING_SNAKE_CASE__			(   self      )->   Optional[int]:
     for model_name in TF_XLM_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
        __A    =  TFXLMModel.from_pretrained(UpperCAmelCase      )
        self.assertIsNotNone(UpperCAmelCase      )







@require_tf
class 		_lowerCAmelCase(		unittest.TestCase):

  """simple docstring"""







  @slow
  def 						SCREAMING_SNAKE_CASE__			(   self      )->   int:
     __A    =  TFXLMWithLMHeadModel.from_pretrained('''xlm-mlm-en-2048'''      )
     __A    =  tf.convert_to_tensor([[14, 4_47]]    ,							dtype=tf.intaa      )  # the president
     __A    =  [
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
         14,
         4_47,
     ]  # 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
     __A    =  model.generate(UpperCAmelCase    ,							do_sample=UpperCAmelCase      )
     self.assertListEqual(output_ids[0].numpy().tolist()    ,							UpperCAmelCase      )

