





'''simple docstring'''


from typing import List, Optional, Tuple, Union

from . import logging
from .import_utils import is_torch_available, is_torch_version


if is_torch_available():
				import torch

_lowerCamelCase					:						int					     =							logging.get_logger(__name__)  # pylint: disable=invalid-name

try:
				from torch._dynamo import allow_in_graph as maybe_allow_in_graph
except (ImportError, ModuleNotFoundError):




				def  __a			(  cls     )   ->Dict:



					"""simple docstring"""







					return cls




def  __a			(  UpperCAmelCase							,      UpperCAmelCase = None							,      UpperCAmelCase = None							,      UpperCAmelCase = None							,      UpperCAmelCase = None							,      )   ->Union[str, Any]:



	"""simple docstring"""







	A					=   device
	A					=   shape[0]

	A					=   layout or torch.strided
	A					=   device or torch.device("""cpu"""     )

	if generator is not None:
		A					=   generator.device.type if not isinstance(UpperCAmelCase							,      UpperCAmelCase     ) else generator[0].device.type
		if gen_device_type != device.type and gen_device_type == "cpu":
			A					=   """cpu"""
			if device != "mps":
				logger.info(
				    f"""The passed generator was created on 'cpu' even though a tensor on {device} was expected."""
				    f""" Tensors will be created on 'cpu' and then moved to {device}. Note that one can probably"""
				    f""" slighly speed up this function by passing a generator that was created on the {device} device."""     )
		elif gen_device_type != device.type and gen_device_type == "cuda":
			raise ValueError(f"""Cannot generate a {device} tensor from a generator of type {gen_device_type}."""     )

	if isinstance(UpperCAmelCase							,      UpperCAmelCase     ):
		A					=   (1,) + shape[1:]
		A					=   [
		    torch.randn(UpperCAmelCase							,      generator=generator[i]							,      device=UpperCAmelCase							,      dtype=UpperCAmelCase							,      layout=UpperCAmelCase     )
		    for i in range(UpperCAmelCase     )
		]
		A					=   torch.cat(UpperCAmelCase							,      dim=0     ).to(UpperCAmelCase     )
	else:
		A					=   torch.randn(UpperCAmelCase							,      generator=UpperCAmelCase							,      device=UpperCAmelCase							,      dtype=UpperCAmelCase							,      layout=UpperCAmelCase     ).to(UpperCAmelCase     )

	return latents




def  __a			(  UpperCAmelCase     )   ->Tuple:



	"""simple docstring"""







	if is_torch_version("""<"""							,      """2.0.0"""     ) or not hasattr(UpperCAmelCase							,      """_dynamo"""     ):
		return False
	return isinstance(UpperCAmelCase							,      torch._dynamo.eval_frame.OptimizedModule     )








'''simple docstring'''


from __future__ import annotations

import unittest
import warnings

from transformers import AutoTokenizer, MarianConfig, MarianTokenizer, TranslationPipeline, is_tf_available
from transformers.testing_utils import require_sentencepiece, require_tf, require_tokenizers, slow
from transformers.utils import cached_property

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


if is_tf_available():
				import tensorflow as tf

				from transformers import TFAutoModelForSeqaSeqLM, TFMarianModel, TFMarianMTModel



@require_tf
class 				__UpperCAmelCase	:







		'''simple docstring'''







		__lowerCAmelCase								=     MarianConfig
		__lowerCAmelCase								=     {}
		__lowerCAmelCase								=     '''gelu'''







		def __init__(self    :   Tuple   ,   _lowerCAmelCase    :   Union[str, Any]   ,   _lowerCAmelCase    :   Dict=13   ,   _lowerCAmelCase    :   Optional[int]=7   ,   _lowerCAmelCase    :   str=True   ,   _lowerCAmelCase    :   Optional[int]=False   ,   _lowerCAmelCase    :   Tuple=99   ,   _lowerCAmelCase    :   str=32   ,   _lowerCAmelCase    :   str=2   ,   _lowerCAmelCase    :   Union[str, Any]=4   ,   _lowerCAmelCase    :   Dict=37   ,   _lowerCAmelCase    :   int=0.1   ,   _lowerCAmelCase    :   List[Any]=0.1   ,   _lowerCAmelCase    :   Tuple=20   ,   _lowerCAmelCase    :   List[str]=2   ,   _lowerCAmelCase    :   Any=1   ,   _lowerCAmelCase    :   int=0   ,   ):
			A					=   parent
			A					=   batch_size
			A					=   seq_length
			A					=   is_training
			A					=   use_labels
			A					=   vocab_size
			A					=   hidden_size
			A					=   num_hidden_layers
			A					=   num_attention_heads
			A					=   intermediate_size

			A					=   hidden_dropout_prob
			A					=   attention_probs_dropout_prob
			A					=   max_position_embeddings
			A					=   eos_token_id
			A					=   pad_token_id
			A					=   bos_token_id







		def 							A  (self    :   int   ):
			A					=   ids_tensor([self.batch_size, self.seq_length - 1]   ,   self.vocab_size   )
			A					=   tf.expand_dims(tf.constant([self.eos_token_id] * self.batch_size   )   ,   1   )
			A					=   tf.concat([input_ids, eos_tensor]   ,   axis=1   )

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

			A					=   self.config_cls(
			    vocab_size=self.vocab_size   ,   d_model=self.hidden_size   ,   encoder_layers=self.num_hidden_layers   ,   decoder_layers=self.num_hidden_layers   ,   encoder_attention_heads=self.num_attention_heads   ,   decoder_attention_heads=self.num_attention_heads   ,   encoder_ffn_dim=self.intermediate_size   ,   decoder_ffn_dim=self.intermediate_size   ,   dropout=self.hidden_dropout_prob   ,   attention_dropout=self.attention_probs_dropout_prob   ,   max_position_embeddings=self.max_position_embeddings   ,   eos_token_ids=[2]   ,   bos_token_id=self.bos_token_id   ,   pad_token_id=self.pad_token_id   ,   decoder_start_token_id=self.pad_token_id   ,   **self.config_updates   ,   )
			A					=   prepare_marian_inputs_dict(_lowerCAmelCase   ,   _lowerCAmelCase   ,   _lowerCAmelCase   )
			return config, inputs_dict







		def 							A  (self    :   List[Any]   ,   _lowerCAmelCase    :   int   ,   _lowerCAmelCase    :   Any   ):
			A					=   TFMarianModel(config=_lowerCAmelCase   ).get_decoder()
			A					=   inputs_dict["""input_ids"""]

			A					=   input_ids[:1, :]
			A					=   inputs_dict["""attention_mask"""][:1, :]
			A					=   inputs_dict["""head_mask"""]
			A					=   1

			# first forward pass
			A					=   model(_lowerCAmelCase   ,   attention_mask=_lowerCAmelCase   ,   head_mask=_lowerCAmelCase   ,   use_cache=_lowerCAmelCase   )

			A	,     A					=   outputs.to_tuple()

			# create hypothetical next token and extent to next_input_ids
			A					=   ids_tensor((self.batch_size, 3)   ,   config.vocab_size   )
			A					=   tf.cast(ids_tensor((self.batch_size, 3)   ,   2   )   ,   tf.inta   )

			# append to next input_ids and
			A					=   tf.concat([input_ids, next_tokens]   ,   axis=-1   )
			A					=   tf.concat([attention_mask, next_attn_mask]   ,   axis=-1   )

			A					=   model(_lowerCAmelCase   ,   attention_mask=_lowerCAmelCase   )[0]
			A					=   model(_lowerCAmelCase   ,   attention_mask=_lowerCAmelCase   ,   past_key_values=_lowerCAmelCase   )[0]

			self.parent.assertEqual(next_tokens.shape[1]   ,   output_from_past.shape[1]   )

			# select random slice
			A					=   int(ids_tensor((1,)   ,   output_from_past.shape[-1]   )   )
			A					=   output_from_no_past[:, -3:, random_slice_idx]
			A					=   output_from_past[:, :, random_slice_idx]

			# test that outputs are equal for slice
			tf.debugging.assert_near(_lowerCAmelCase   ,   _lowerCAmelCase   ,   rtol=1e-3   )






def  __a			(  UpperCAmelCase							,      UpperCAmelCase							,      UpperCAmelCase							,      UpperCAmelCase=None							,      UpperCAmelCase=None							,      UpperCAmelCase=None							,      UpperCAmelCase=None							,      UpperCAmelCase=None							,      )   ->List[str]:



	"""simple docstring"""







	if attention_mask is None:
		A					=   tf.cast(tf.math.not_equal(UpperCAmelCase							,      config.pad_token_id     )							,      tf.inta     )
	if decoder_attention_mask is None:
		A					=   tf.concat(
		    [
		        tf.ones(decoder_input_ids[:, :1].shape							,      dtype=tf.inta     ),
		        tf.cast(tf.math.not_equal(decoder_input_ids[:, 1:]							,      config.pad_token_id     )							,      tf.inta     ),
		    ]							,      axis=-1							,      )
	if head_mask is None:
		A					=   tf.ones((config.encoder_layers, config.encoder_attention_heads)     )
	if decoder_head_mask is None:
		A					=   tf.ones((config.decoder_layers, config.decoder_attention_heads)     )
	if cross_attn_head_mask is None:
		A					=   tf.ones((config.decoder_layers, config.decoder_attention_heads)     )
	return {
	    "input_ids": input_ids,
	    "decoder_input_ids": decoder_input_ids,
	    "attention_mask": attention_mask,
	    "decoder_attention_mask": decoder_attention_mask,
	    "head_mask": head_mask,
	    "decoder_head_mask": decoder_head_mask,
	    "cross_attn_head_mask": cross_attn_head_mask,
	}



@require_tf
class 				__UpperCAmelCase	(							A__		,       A__		,       unittest.TestCase    ):







		'''simple docstring'''







		__lowerCAmelCase								=     (TFMarianMTModel, TFMarianModel) if is_tf_available() else ()
		__lowerCAmelCase								=     (TFMarianMTModel,) if is_tf_available() else ()
		__lowerCAmelCase								=     (
		    {
		        '''conversational''': TFMarianMTModel,
		        '''feature-extraction''': TFMarianModel,
		        '''summarization''': TFMarianMTModel,
		        '''text2text-generation''': TFMarianMTModel,
		        '''translation''': TFMarianMTModel,
		    }
		    if is_tf_available()
		    else {}
		)
		__lowerCAmelCase								=     True
		__lowerCAmelCase								=     False
		__lowerCAmelCase								=     False







		def 							A  (self    :   Tuple   ):
			A					=   TFMarianModelTester(self   )
			A					=   ConfigTester(self   ,   config_class=_lowerCAmelCase   )







		def 							A  (self    :   List[str]   ):
			self.config_tester.run_common_tests()







		def 							A  (self    :   Any   ):
			A					=   self.model_tester.prepare_config_and_inputs_for_common()
			self.model_tester.check_decoder_model_past_large_inputs(*_lowerCAmelCase   )






@require_tf
class 				__UpperCAmelCase	(							unittest.TestCase    ):







		'''simple docstring'''







		__lowerCAmelCase								=     10_00  # show more chars for failing integration tests







		@classmethod
		def 							A  (cls    :   Union[str, Any]   ):
			A					=   F"""Helsinki-NLP/opus-mt-{cls.src}-{cls.tgt}"""
			return cls







		@cached_property
		def 							A  (self    :   str   ):
			return AutoTokenizer.from_pretrained(self.model_name   )







		@property
		def 							A  (self    :   Optional[int]   ):
			return self.tokenizer.eos_token_id







		@cached_property
		def 							A  (self    :   Optional[Any]   ):
			warnings.simplefilter("""error"""   )
			A					=   TFAutoModelForSeqaSeqLM.from_pretrained(self.model_name   )
			assert isinstance(_lowerCAmelCase   ,   _lowerCAmelCase   )
			A					=   model.config
			self.assertListEqual(c.bad_words_ids   ,   [[c.pad_token_id]]   )
			self.assertEqual(c.max_length   ,   512   )
			self.assertEqual(c.decoder_start_token_id   ,   c.pad_token_id   )
			return model







		def 							A  (self    :   Optional[int]   ,   **_lowerCAmelCase    :   Any   ):
			A					=   self.translate_src_text(**_lowerCAmelCase   )
			self.assertListEqual(self.expected_text   ,   _lowerCAmelCase   )







		def 							A  (self    :   Union[str, Any]   ,   **_lowerCAmelCase    :   Union[str, Any]   ):
			A					=   self.tokenizer(self.src_text   ,   **_lowerCAmelCase   ,   padding=_lowerCAmelCase   ,   return_tensors="""tf"""   )
			A					=   self.model.generate(
			    model_inputs.input_ids   ,   attention_mask=model_inputs.attention_mask   ,   num_beams=2   ,   max_length=128   )
			A					=   self.tokenizer.batch_decode(generated_ids.numpy()   ,   skip_special_tokens=_lowerCAmelCase   )
			return generated_words






@require_sentencepiece
@require_tokenizers
@require_tf
class 				__UpperCAmelCase	(							A__    ):







		'''simple docstring'''







		__lowerCAmelCase								=     '''mt'''
		__lowerCAmelCase								=     '''en'''
		__lowerCAmelCase								=     ['''Billi messu b\'mod ġentili, Ġesù fejjaq raġel li kien milqut bil - marda kerha tal - ġdiem.''']
		__lowerCAmelCase								=     ['''Touching gently, Jesus healed a man who was affected by the sad disease of leprosy.''']







		@unittest.skip("""Skipping until #12647 is resolved."""   )
		@slow
		def 							A  (self    :   str   ):
			self._assert_generated_batch_equal_expected()






@require_sentencepiece
@require_tokenizers
@require_tf
class 				__UpperCAmelCase	(							A__    ):







		'''simple docstring'''







		__lowerCAmelCase								=     '''en'''
		__lowerCAmelCase								=     '''zh'''
		__lowerCAmelCase								=     ['''My name is Wolfgang and I live in Berlin''']
		__lowerCAmelCase								=     ['''我叫沃尔夫冈 我住在柏林''']







		@unittest.skip("""Skipping until #12647 is resolved."""   )
		@slow
		def 							A  (self    :   Any   ):
			self._assert_generated_batch_equal_expected()






@require_sentencepiece
@require_tokenizers
@require_tf
class 				__UpperCAmelCase	(							A__    ):







		'''simple docstring'''







		__lowerCAmelCase								=     '''en'''
		__lowerCAmelCase								=     '''ROMANCE'''
		__lowerCAmelCase								=     [
		    '''>>fr<< Don\'t spend so much time watching TV.''',
		    '''>>pt<< Your message has been sent.''',
		    '''>>es<< He\'s two years older than me.''',
		]
		__lowerCAmelCase								=     [
		    '''Ne passez pas autant de temps à regarder la télé.''',
		    '''A sua mensagem foi enviada.''',
		    '''Es dos años más viejo que yo.''',
		]







		@unittest.skip("""Skipping until #12647 is resolved."""   )
		@slow
		def 							A  (self    :   Union[str, Any]   ):
			self._assert_generated_batch_equal_expected()







		@unittest.skip("""Skipping until #12647 is resolved."""   )
		@slow
		def 							A  (self    :   Union[str, Any]   ):
			A					=   TranslationPipeline(self.model   ,   self.tokenizer   ,   framework="""tf"""   )
			A					=   pipeline(self.src_text   )
			self.assertEqual(self.expected_text   ,   [x["""translation_text"""] for x in output]   )

