





"""simple docstring"""
from __future__ import annotations

import os
import tempfile
import unittest

import numpy as np
from huggingface_hub import hf_hub_download

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

from ..test_modeling_tf_common import floats_tensor
from .test_framework_agnostic import GenerationIntegrationTestsMixin


if is_tf_available():
       import tensorflow as tf

       from transformers import (
           AutoTokenizer,
           TFAutoModelForCausalLM,
           TFAutoModelForSeqaSeqLM,
           TFAutoModelForSpeechSeqaSeq,
           TFAutoModelForVisionaSeq,
           TFBartForConditionalGeneration,
           TFLogitsProcessorList,
           TFMinLengthLogitsProcessor,
           tf_top_k_top_p_filtering,
       )

if is_tensorflow_text_available():
       import tensorflow_text as text







@require_tf
class       a							(   unittest.TestCase  ):



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= tf.convert_to_tensor(
      [
          [
              8.2_220_991,  # 3rd highest value; idx. 0
              -0.5_620_044,
              5.23_229_752,
              4.0_386_393,
              -6.8_798_378,
              -0.54_785_802,
              -3.2_012_153,
              2.92_777_176,
              1.88_171_953,
              7.35_341_276,  # 5th highest value; idx. 9
              8.43_207_833,  # 2nd highest value; idx. 10
              -9.85_711_836,
              -5.96_209_236,
              -1.13_039_161,
              -7.1_115_294,
              -0.8_369_633,
              -5.3_186_408,
              7.06_427_407,
              0.81_369_344,
              -0.82_023_817,
              -5.9_179_796,
              0.58_813_443,
              -6.99_778_438,
              4.71_551_189,
              -0.18_771_637,
              7.44_020_759,  # 4th highest value; idx. 25
              9.38_450_987,  # 1st highest value; idx. 26
              2.12_662_941,
              -9.32_562_038,
              2.35_652_522,
          ],  # cummulative prob of 5 highest values <= 0.6
          [
              0.58_425_518,
              4.53_139_238,
              -5.57_510_464,
              -6.28_030_699,
              -7.19_529_503,
              -4.02_122_551,
              1.39_337_037,
              -6.06_707_057,
              1.59_480_517,
              -9.643_119,
              0.03_907_799,
              0.67_231_762,
              -8.88_206_726,
              6.27_115_922,  # 4th highest value; idx. 13
              2.28_520_723,
              4.82_767_506,
              4.30_421_368,
              8.8_275_313,  # 2nd highest value; idx. 17
              5.44_029_958,  # 5th highest value; idx. 18
              -4.4_735_794,
              7.38_579_536,  # 3rd highest value; idx. 20
              -2.91_051_663,
              2.61_946_077,
              -2.5_674_762,
              -9.48_959_302,
              -4.02_922_645,
              -1.35_416_918,
              9.67_702_323,  # 1st highest value; idx. 27
              -5.89_478_553,
              1.85_370_467,
          ],  # cummulative prob of 5 highest values <= 0.6
      ]				,       dtype=tf.floataa				,       )

  lowerCAmelCase    				= tf.convert_to_tensor(
      [[0, 0], [0, 9], [0, 10], [0, 25], [0, 26], [1, 13], [1, 17], [1, 18], [1, 20], [1, 27]]				,       dtype=tf.intaa				,       )  # expected non filtered idx as noted above

  lowerCAmelCase    				= tf.convert_to_tensor(
      [8.222_099, 7.3_534_126, 8.432_078, 7.4_402_075, 9.38_451, 6.271_159, 8.827_531, 5.4_402_995, 7.3_857_956, 9.677_023]				,       dtype=tf.floataa				,       )  # expected non filtered values as noted above

  lowerCAmelCase    				= tf_top_k_top_p_filtering(_snake_case				,       top_k=10				,       top_p=0.6				,       min_tokens_to_keep=4     )

  lowerCAmelCase    				= output[output != -float('inf'     )]
  lowerCAmelCase    				= tf.cast(
      tf.where(tf.not_equal(_snake_case				,       tf.constant(-float('inf'     )				,       dtype=tf.floataa     )     )     )				,       dtype=tf.intaa				,       )

  tf.debugging.assert_near(_snake_case				,       _snake_case				,       rtol=1E-12     )
  tf.debugging.assert_equal(_snake_case				,       _snake_case     )







@require_tf
class       a							(   unittest.TestCase   , a__  ):
 # setting framework_dependent_parameters needs to be gated, just like its contents' imports
 if is_tf_available():
  snake_case__             =       {
      '''AutoModelForCausalLM''': TFAutoModelForCausalLM,
      '''AutoModelForSpeechSeq2Seq''': TFAutoModelForSpeechSeqaSeq,
      '''AutoModelForSeq2SeqLM''': TFAutoModelForSeqaSeqLM,
      '''AutoModelForVision2Seq''': TFAutoModelForVisionaSeq,
      '''LogitsProcessorList''': TFLogitsProcessorList,
      '''MinLengthLogitsProcessor''': TFMinLengthLogitsProcessor,
      '''create_tensor_fn''': tf.convert_to_tensor,
      '''floats_tensor''': floats_tensor,
      '''return_tensors''': '''tf''',
  }



 @slow
 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= TFAutoModelForCausalLM.from_pretrained('hf-internal-testing/tiny-random-gpt2'     )
  lowerCAmelCase    				= 2
  lowerCAmelCase    				= 2







  class       a							(   tf.Module  ):



   def __init__(     self				,       _snake_case     ):







    """simple docstring"""






    super(_snake_case				,       self     ).__init__()
    lowerCAmelCase    				= model



   @tf.function(
       input_signature=(
           tf.TensorSpec((None, input_length)				,       tf.intaa				,       name='input_ids'     ),
           tf.TensorSpec((None, input_length)				,       tf.intaa				,       name='attention_mask'     ),
       )				,       jit_compile=_snake_case				,       )
   def    UpperCamelCase__  (     self				,       _snake_case				,       _snake_case     ):







    """simple docstring"""






    lowerCAmelCase    				= self.model.generate(
        input_ids=_snake_case				,       attention_mask=_snake_case				,       max_new_tokens=_snake_case				,       return_dict_in_generate=_snake_case				,       )
    return {"sequences": outputs["sequences"]}


  lowerCAmelCase    				= [[2, 0], [1_02, 1_03]]
  lowerCAmelCase    				= [[1, 0], [1, 1]]
  lowerCAmelCase    				= DummyModel(model=_snake_case     )
  with tempfile.TemporaryDirectory() as tmp_dir:
   tf.saved_model.save(_snake_case				,       _snake_case				,       signatures={'serving_default': dummy_model.serving}     )
   lowerCAmelCase    				= tf.saved_model.load(_snake_case     ).signatures['serving_default']
   for batch_size in range(1				,       len(_snake_case     ) + 1     ):
    lowerCAmelCase    				= {
        'input_ids': tf.constant(dummy_input_ids[:batch_size]     ),
        'attention_mask': tf.constant(dummy_attention_masks[:batch_size]     ),
    }
    lowerCAmelCase    				= serving_func(**_snake_case     )['sequences']
    lowerCAmelCase    				= test_model.generate(**_snake_case				,       max_new_tokens=_snake_case     )
    tf.debugging.assert_equal(_snake_case				,       _snake_case     )



 @slow
 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= TFAutoModelForCausalLM.from_pretrained('hf-internal-testing/tiny-random-gpt2'     )
  lowerCAmelCase    				= 1
  lowerCAmelCase    				= 2







  class       a							(   tf.Module  ):



   def __init__(     self				,       _snake_case     ):







    """simple docstring"""






    super(_snake_case				,       self     ).__init__()
    lowerCAmelCase    				= model



   @tf.function(
       input_signature=(
           tf.TensorSpec((batch_size, None)				,       tf.intaa				,       name='input_ids'     ),
           tf.TensorSpec((batch_size, None)				,       tf.intaa				,       name='attention_mask'     ),
       )				,       jit_compile=_snake_case				,       )
   def    UpperCamelCase__  (     self				,       _snake_case				,       _snake_case     ):







    """simple docstring"""






    lowerCAmelCase    				= self.model.generate(
        input_ids=_snake_case				,       attention_mask=_snake_case				,       max_new_tokens=_snake_case				,       return_dict_in_generate=_snake_case				,       )
    return {"sequences": outputs["sequences"]}


  lowerCAmelCase    				= [[2], [1_02, 1_03]]
  lowerCAmelCase    				= [[1], [1, 1]]
  lowerCAmelCase    				= DummyModel(model=_snake_case     )
  with tempfile.TemporaryDirectory() as tmp_dir:
   tf.saved_model.save(_snake_case				,       _snake_case				,       signatures={'serving_default': dummy_model.serving}     )
   lowerCAmelCase    				= tf.saved_model.load(_snake_case     ).signatures['serving_default']
   for input_row in range(len(_snake_case     )     ):
    lowerCAmelCase    				= {
        'input_ids': tf.constant([dummy_input_ids[input_row]]     ),
        'attention_mask': tf.constant([dummy_attention_masks[input_row]]     ),
    }
    lowerCAmelCase    				= serving_func(**_snake_case     )['sequences']
    lowerCAmelCase    				= test_model.generate(**_snake_case				,       max_new_tokens=_snake_case     )
    tf.debugging.assert_equal(_snake_case				,       _snake_case     )



 @slow
 @require_tensorflow_text
 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  with tempfile.TemporaryDirectory() as tmp_dir:
   # file needed to load the TF tokenizer
   hf_hub_download(repo_id='google/flan-t5-small'				,       filename='spiece.model'				,       local_dir=_snake_case     )







   class       a							(   tf.keras.layers.Layer  ):



    def __init__(     self     ):







     """simple docstring"""






     super().__init__()
     lowerCAmelCase    				= text.SentencepieceTokenizer(
         model=tf.io.gfile.GFile(os.path.join(_snake_case				,       'spiece.model'     )				,       'rb'     ).read()     )
     lowerCAmelCase    				= TFAutoModelForSeqaSeqLM.from_pretrained('hf-internal-testing/tiny-random-t5'     )



    def    UpperCamelCase__  (     self				,       _snake_case				,       *_snake_case				,       **_snake_case     ):







     """simple docstring"""






     lowerCAmelCase    				= self.tokenizer.tokenize(_snake_case     )
     lowerCAmelCase				,lowerCAmelCase    				= text.pad_model_inputs(
         _snake_case				,       max_seq_length=64				,       pad_value=self.model.config.pad_token_id     )
     lowerCAmelCase    				= self.model.generate(input_ids=_snake_case				,       attention_mask=_snake_case     )
     return self.tokenizer.detokenize(_snake_case     )


   lowerCAmelCase    				= CompleteSentenceTransformer()
   lowerCAmelCase    				= tf.keras.layers.Input(shape=(1,)				,       dtype=tf.string				,       name='inputs'     )
   lowerCAmelCase    				= complete_model(_snake_case     )
   lowerCAmelCase    				= tf.keras.Model(_snake_case				,       _snake_case     )
   keras_model.save(_snake_case     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= {
      'do_sample': True,
      'num_beams': 1,
      'top_p': 0.7,
      'top_k': 10,
      'temperature': 0.7,
  }
  lowerCAmelCase    				= 14

  lowerCAmelCase    				= AutoTokenizer.from_pretrained('hf-internal-testing/tiny-random-gpt2'     )
  lowerCAmelCase    				= 'Hello, my dog is cute and'
  lowerCAmelCase    				= tokenizer(_snake_case				,       return_tensors='tf'     )
  lowerCAmelCase    				= TFAutoModelForCausalLM.from_pretrained('hf-internal-testing/tiny-random-gpt2'     )

  lowerCAmelCase    				= 6_38
  # forces the generation to happen on CPU, to avoid GPU-related quirks
  with tf.device(':/CPU:0'     ):
   tf.random.set_seed(0     )
   lowerCAmelCase    				= model.generate(**_snake_case				,       eos_token_id=_snake_case				,       **_snake_case     )
  self.assertTrue(expectation == len(generated_tokens[0]     )     )

  lowerCAmelCase    				= [6_38, 1_98]
  with tf.device(':/CPU:0'     ):
   tf.random.set_seed(0     )
   lowerCAmelCase    				= model.generate(**_snake_case				,       eos_token_id=_snake_case				,       **_snake_case     )
  self.assertTrue(expectation == len(generated_tokens[0]     )     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= AutoTokenizer.from_pretrained('hf-internal-testing/tiny-random-bart'     )
  lowerCAmelCase    				= 'Hugging Face is a technology company based in New York and Paris.'
  lowerCAmelCase    				= bart_tokenizer(_snake_case				,       return_tensors='tf'     ).input_ids
  lowerCAmelCase    				= TFBartForConditionalGeneration.from_pretrained('hf-internal-testing/tiny-random-bart'     )
  lowerCAmelCase    				= bart_model.generate(_snake_case     ).numpy()







  class       a							(   a__  ):



   def    UpperCamelCase__  (     self				,       _snake_case				,       _snake_case=None				,       **_snake_case     ):







    """simple docstring"""






    return super().call(_snake_case				,       **_snake_case     )


  lowerCAmelCase    				= FakeBart.from_pretrained('hf-internal-testing/tiny-random-bart'     )
  lowerCAmelCase    				= bart_model.generate(_snake_case				,       foo='bar'     ).numpy()
  self.assertTrue(np.array_equal(_snake_case				,       _snake_case     )     )







  class       a							(   bart_model.model.encoder.__class__  ):



   def    UpperCamelCase__  (     self				,       _snake_case				,       **_snake_case     ):







    """simple docstring"""






    return super().call(_snake_case				,       **_snake_case     )


  lowerCAmelCase    				= FakeEncoder(bart_model.config				,       bart_model.model.shared     )
  lowerCAmelCase    				= fake_encoder

  # Normal generation still works (the output will be different because the encoder weights are different)
  lowerCAmelCase    				= bart_model.generate(_snake_case     ).numpy()
  with self.assertRaises(_snake_case     ):
   # FakeEncoder.call() accepts **kwargs -> no filtering -> value error due to unexpected input "foo"
   bart_model.generate(_snake_case				,       foo='bar'     )









def 							__lowerCamelCase		(					UpperCAmelCase_		:						int					,    UpperCAmelCase_		:						int		):




      """simple docstring"""





      while b:
            a				,							a		:int									=			b, a % b
      return a
def 							__lowerCamelCase		(					UpperCAmelCase_		:						int					,    UpperCAmelCase_		:						int		):




      """simple docstring"""





      return a if b == 0 else euclidean_gcd_recursive(UpperCAmelCase_					,    a % b		)
def 							__lowerCamelCase		(					):




      """simple docstring"""





      print(F'''euclidean_gcd(3, 5) = {euclidean_gcd(3					,    5		)}'''		)
      print(F'''euclidean_gcd(5, 3) = {euclidean_gcd(5					,    3		)}'''		)
      print(F'''euclidean_gcd(1, 3) = {euclidean_gcd(1					,    3		)}'''		)
      print(F'''euclidean_gcd(3, 6) = {euclidean_gcd(3					,    6		)}'''		)
      print(F'''euclidean_gcd(6, 3) = {euclidean_gcd(6					,    3		)}'''		)

      print(F'''euclidean_gcd_recursive(3, 5) = {euclidean_gcd_recursive(3					,    5		)}'''		)
      print(F'''euclidean_gcd_recursive(5, 3) = {euclidean_gcd_recursive(5					,    3		)}'''		)
      print(F'''euclidean_gcd_recursive(1, 3) = {euclidean_gcd_recursive(1					,    3		)}'''		)
      print(F'''euclidean_gcd_recursive(3, 6) = {euclidean_gcd_recursive(3					,    6		)}'''		)
      print(F'''euclidean_gcd_recursive(6, 3) = {euclidean_gcd_recursive(6					,    3		)}'''		)


if __name__ == "__main__":
     main()





