



import unittest

from transformers import (
    MODEL_FOR_CAUSAL_LM_MAPPING,
    TF_MODEL_FOR_CAUSAL_LM_MAPPING,
    TextGenerationPipeline,
    logging,
    pipeline,
)
from transformers.testing_utils import (
    CaptureLogger,
    is_pipeline_test,
    require_accelerate,
    require_tf,
    require_torch,
    require_torch_gpu,
    require_torch_or_tf,
)

from .test_pipelines_common import ANY



@is_pipeline_test
@require_torch_or_tf
class  lowerCamelCase__    (							unittest.TestCase):




  '''simple docstring'''



  snake_case_			=MODEL_FOR_CAUSAL_LM_MAPPING
  snake_case_			=TF_MODEL_FOR_CAUSAL_LM_MAPPING



  @require_torch
  def 	lowerCAmelCase__   (self				)  ->    int:

      """simple docstring"""






      lowerCAmelCase__  :       str				=  pipeline(task='''text-generation'''	,model='''sshleifer/tiny-ctrl'''	,framework='''pt'''				)
      # Using `do_sample=False` to force deterministic output
      lowerCAmelCase__  :       Optional[int]				=  text_generator('''This is a test'''	,do_sample=__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[
              {
                  '''generated_text''': (
                      '''This is a test ☃ ☃ segmental segmental segmental 议议eski eski flutter flutter Lacy oscope.'''
                      ''' oscope. FiliFili@@'''
                  )
              }
          ]	,)

      lowerCAmelCase__  :       Dict				=  text_generator(['''This is a test''', '''This is a second test''']				)
      self.assertEqual(
          __lowerCamelCase	,[
              [
                  {
                      '''generated_text''': (
                          '''This is a test ☃ ☃ segmental segmental segmental 议议eski eski flutter flutter Lacy oscope.'''
                          ''' oscope. FiliFili@@'''
                      )
                  }
              ],
              [
                  {
                      '''generated_text''': (
                          '''This is a second test ☃ segmental segmental segmental 议议eski eski flutter flutter Lacy'''
                          ''' oscope. oscope. FiliFili@@'''
                      )
                  }
              ],
          ]	,)

      lowerCAmelCase__  :       Optional[int]				=  text_generator('''This is a test'''	,do_sample=__lowerCamelCase	,num_return_sequences=2	,return_tensors=__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[
              {'''generated_token_ids''': ANY(__lowerCamelCase				)},
              {'''generated_token_ids''': ANY(__lowerCamelCase				)},
          ]	,)
      lowerCAmelCase__  :       Union[str, Any]				=  text_generator.model.config.eos_token_id
      lowerCAmelCase__  :       str				=  '''<pad>'''
      lowerCAmelCase__  :       Optional[int]				=  text_generator(
          ['''This is a test''', '''This is a second test''']	,do_sample=__lowerCamelCase	,num_return_sequences=2	,batch_size=2	,return_tensors=__lowerCamelCase	,)
      self.assertEqual(
          __lowerCamelCase	,[
              [
                  {'''generated_token_ids''': ANY(__lowerCamelCase				)},
                  {'''generated_token_ids''': ANY(__lowerCamelCase				)},
              ],
              [
                  {'''generated_token_ids''': ANY(__lowerCamelCase				)},
                  {'''generated_token_ids''': ANY(__lowerCamelCase				)},
              ],
          ]	,)



  @require_tf
  def 	lowerCAmelCase__   (self				)  ->    Any:

      """simple docstring"""






      lowerCAmelCase__  :       int				=  pipeline(task='''text-generation'''	,model='''sshleifer/tiny-ctrl'''	,framework='''tf'''				)

      # Using `do_sample=False` to force deterministic output
      lowerCAmelCase__  :       str				=  text_generator('''This is a test'''	,do_sample=__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[
              {
                  '''generated_text''': (
                      '''This is a test FeyFeyFey(Croatis.), s.), Cannes Cannes Cannes 閲閲Cannes Cannes Cannes 攵'''
                      ''' please,'''
                  )
              }
          ]	,)

      lowerCAmelCase__  :       List[str]				=  text_generator(['''This is a test''', '''This is a second test''']	,do_sample=__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[
              [
                  {
                      '''generated_text''': (
                          '''This is a test FeyFeyFey(Croatis.), s.), Cannes Cannes Cannes 閲閲Cannes Cannes Cannes 攵'''
                          ''' please,'''
                      )
                  }
              ],
              [
                  {
                      '''generated_text''': (
                          '''This is a second test Chieftain Chieftain prefecture prefecture prefecture Cannes Cannes'''
                          ''' Cannes 閲閲Cannes Cannes Cannes 攵 please,'''
                      )
                  }
              ],
          ]	,)



  def 	lowerCAmelCase__   (self	,__lowerCamelCase	,__lowerCamelCase	,__lowerCamelCase				)  ->    List[Any]:

      """simple docstring"""






      lowerCAmelCase__  :       int				=  TextGenerationPipeline(model=__lowerCamelCase	,tokenizer=__lowerCamelCase				)
      return text_generator, ["This is a test", "Another test"]



  def 	lowerCAmelCase__   (self				)  ->    Dict:

      """simple docstring"""






      lowerCAmelCase__  :       Tuple				=  '''Hello I believe in'''
      lowerCAmelCase__  :       str				=  pipeline('''text-generation'''	,model='''hf-internal-testing/tiny-random-gpt2'''				)
      lowerCAmelCase__  :       Dict				=  text_generator(__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[{'''generated_text''': '''Hello I believe in fe fe fe fe fe fe fe fe fe fe fe fe'''}]	,)

      lowerCAmelCase__  :       Dict				=  text_generator(__lowerCamelCase	,stop_sequence=''' fe'''				)
      self.assertEqual(__lowerCamelCase	,[{'''generated_text''': '''Hello I believe in fe'''}]				)



  def 	lowerCAmelCase__   (self	,__lowerCamelCase	,__lowerCamelCase				)  ->    Any:

      """simple docstring"""






      lowerCAmelCase__  :       Optional[Any]				=  text_generator.model
      lowerCAmelCase__  :       Union[str, Any]				=  text_generator.tokenizer

      lowerCAmelCase__  :       Optional[int]				=  text_generator('''This is a test'''				)
      self.assertEqual(__lowerCamelCase	,[{'''generated_text''': ANY(__lowerCamelCase				)}]				)
      self.assertTrue(outputs[0]['''generated_text'''].startswith('''This is a test'''				)				)

      lowerCAmelCase__  :       List[Any]				=  text_generator('''This is a test'''	,return_full_text=__lowerCamelCase				)
      self.assertEqual(__lowerCamelCase	,[{'''generated_text''': ANY(__lowerCamelCase				)}]				)
      self.assertNotIn('''This is a test'''	,outputs[0]['''generated_text''']				)

      lowerCAmelCase__  :       str				=  pipeline(task='''text-generation'''	,model=__lowerCamelCase	,tokenizer=__lowerCamelCase	,return_full_text=__lowerCamelCase				)
      lowerCAmelCase__  :       Optional[Any]				=  text_generator('''This is a test'''				)
      self.assertEqual(__lowerCamelCase	,[{'''generated_text''': ANY(__lowerCamelCase				)}]				)
      self.assertNotIn('''This is a test'''	,outputs[0]['''generated_text''']				)

      lowerCAmelCase__  :       List[Any]				=  text_generator('''This is a test'''	,return_full_text=__lowerCamelCase				)
      self.assertEqual(__lowerCamelCase	,[{'''generated_text''': ANY(__lowerCamelCase				)}]				)
      self.assertTrue(outputs[0]['''generated_text'''].startswith('''This is a test'''				)				)

      lowerCAmelCase__  :       List[str]				=  text_generator(['''This is great !''', '''Something else''']	,num_return_sequences=2	,do_sample=__lowerCamelCase				)
      self.assertEqual(
          __lowerCamelCase	,[
              [{'''generated_text''': ANY(__lowerCamelCase				)}, {'''generated_text''': ANY(__lowerCamelCase				)}],
              [{'''generated_text''': ANY(__lowerCamelCase				)}, {'''generated_text''': ANY(__lowerCamelCase				)}],
          ]	,)

      if text_generator.tokenizer.pad_token is not None:
          lowerCAmelCase__  :       List[str]				=  text_generator(
              ['''This is great !''', '''Something else''']	,num_return_sequences=2	,batch_size=2	,do_sample=__lowerCamelCase				)
          self.assertEqual(
              __lowerCamelCase	,[
                  [{'''generated_text''': ANY(__lowerCamelCase				)}, {'''generated_text''': ANY(__lowerCamelCase				)}],
                  [{'''generated_text''': ANY(__lowerCamelCase				)}, {'''generated_text''': ANY(__lowerCamelCase				)}],
              ]	,)

      with self.assertRaises(__lowerCamelCase				):
          lowerCAmelCase__  :       List[str]				=  text_generator('''test'''	,return_full_text=__lowerCamelCase	,return_text=__lowerCamelCase				)
      with self.assertRaises(__lowerCamelCase				):
          lowerCAmelCase__  :       List[Any]				=  text_generator('''test'''	,return_full_text=__lowerCamelCase	,return_tensors=__lowerCamelCase				)
      with self.assertRaises(__lowerCamelCase				):
          lowerCAmelCase__  :       Union[str, Any]				=  text_generator('''test'''	,return_text=__lowerCamelCase	,return_tensors=__lowerCamelCase				)

      # Empty prompt is slighly special
      # it requires BOS token to exist.
      # Special case for Pegasus which will always append EOS so will
      # work even without BOS.
      if (
          text_generator.tokenizer.bos_token_id is not None
          or "Pegasus" in tokenizer.__class__.__name__
          or "Git" in model.__class__.__name__
      ):
          lowerCAmelCase__  :       int				=  text_generator(''''''				)
          self.assertEqual(__lowerCamelCase	,[{'''generated_text''': ANY(__lowerCamelCase				)}]				)
      else:
          with self.assertRaises((ValueError, AssertionError)				):
              lowerCAmelCase__  :       List[Any]				=  text_generator(''''''				)

      if text_generator.framework == "tf":
          # TF generation does not support max_new_tokens, and it's impossible
          # to control long generation with only max_length without
          # fancy calculation, dismissing tests for now.
          return
      # We don't care about infinite range models.
      # They already work.
      # Skip this test for XGLM, since it uses sinusoidal positional embeddings which are resized on-the-fly.
      lowerCAmelCase__  :       Tuple				=  ['''RwkvForCausalLM''', '''XGLMForCausalLM''', '''GPTNeoXForCausalLM''']
      if (
          tokenizer.model_max_length < 1_00_00
          and text_generator.model.__class__.__name__ not in EXTRA_MODELS_CAN_HANDLE_LONG_INPUTS
      ):
          # Handling of large generations
          with self.assertRaises((RuntimeError, IndexError, ValueError, AssertionError)				):
              text_generator('''This is a test''' * 5_00	,max_new_tokens=20				)

          lowerCAmelCase__  :       List[str]				=  text_generator('''This is a test''' * 5_00	,handle_long_generation='''hole'''	,max_new_tokens=20				)
          # Hole strategy cannot work
          with self.assertRaises(__lowerCamelCase				):
              text_generator(
                  '''This is a test''' * 5_00	,handle_long_generation='''hole'''	,max_new_tokens=tokenizer.model_max_length + 10	,)



  @require_torch
  @require_accelerate
  @require_torch_gpu
  def 	lowerCAmelCase__   (self				)  ->    Tuple:

      """simple docstring"""






      import torch

      # Classic `model_kwargs`
      lowerCAmelCase__  :       List[str]				=  pipeline(
          model='''hf-internal-testing/tiny-random-bloom'''	,model_kwargs={'''device_map''': '''auto''', '''torch_dtype''': torch.bfloataa}	,)
      self.assertEqual(pipe.model.device	,torch.device(0				)				)
      self.assertEqual(pipe.model.lm_head.weight.dtype	,torch.bfloataa				)
      lowerCAmelCase__  :       Any				=  pipe('''This is a test'''				)
      self.assertEqual(
          __lowerCamelCase	,[
              {
                  '''generated_text''': (
                      '''This is a test test test test test test test test test test test test test test test test'''
                      ''' test'''
                  )
              }
          ]	,)

      # Upgraded those two to real pipeline arguments (they just get sent for the model as they're unlikely to mean anything else.)
      lowerCAmelCase__  :       Union[str, Any]				=  pipeline(model='''hf-internal-testing/tiny-random-bloom'''	,device_map='''auto'''	,torch_dtype=torch.bfloataa				)
      self.assertEqual(pipe.model.device	,torch.device(0				)				)
      self.assertEqual(pipe.model.lm_head.weight.dtype	,torch.bfloataa				)
      lowerCAmelCase__  :       List[Any]				=  pipe('''This is a test'''				)
      self.assertEqual(
          __lowerCamelCase	,[
              {
                  '''generated_text''': (
                      '''This is a test test test test test test test test test test test test test test test test'''
                      ''' test'''
                  )
              }
          ]	,)

      # torch_dtype will be automatically set to float32 if not provided - check: https://github.com/huggingface/transformers/pull/20602
      lowerCAmelCase__  :       Optional[Any]				=  pipeline(model='''hf-internal-testing/tiny-random-bloom'''	,device_map='''auto'''				)
      self.assertEqual(pipe.model.device	,torch.device(0				)				)
      self.assertEqual(pipe.model.lm_head.weight.dtype	,torch.floataa				)
      lowerCAmelCase__  :       Tuple				=  pipe('''This is a test'''				)
      self.assertEqual(
          __lowerCamelCase	,[
              {
                  '''generated_text''': (
                      '''This is a test test test test test test test test test test test test test test test test'''
                      ''' test'''
                  )
              }
          ]	,)



  @require_torch
  @require_torch_gpu
  def 	lowerCAmelCase__   (self				)  ->    Optional[int]:

      """simple docstring"""






      import torch

      lowerCAmelCase__  :       Any				=  pipeline(model='''hf-internal-testing/tiny-random-bloom'''	,device=0	,torch_dtype=torch.floataa				)
      pipe('''This is a test'''				)



  @require_torch
  @require_accelerate
  @require_torch_gpu
  def 	lowerCAmelCase__   (self				)  ->    Union[str, Any]:

      """simple docstring"""






      import torch

      lowerCAmelCase__  :       Any				=  pipeline(model='''hf-internal-testing/tiny-random-bloom'''	,device_map='''auto'''	,torch_dtype=torch.floataa				)
      pipe('''This is a test'''	,do_sample=__lowerCamelCase	,top_p=0.5				)



  def 	lowerCAmelCase__   (self				)  ->    Any:

      """simple docstring"""






      lowerCAmelCase__  :       str				=  '''Hello world'''
      lowerCAmelCase__  :       Optional[int]				=  pipeline('''text-generation'''	,model='''hf-internal-testing/tiny-random-gpt2'''				)
      if text_generator.model.framework == "tf":
          lowerCAmelCase__  :       Tuple				=  logging.get_logger('''transformers.generation.tf_utils'''				)
      else:
          lowerCAmelCase__  :       str				=  logging.get_logger('''transformers.generation.utils'''				)
      lowerCAmelCase__  :       Tuple				=  '''Both `max_new_tokens`'''  # The beggining of the message to be checked in this test

      # Both are set by the user -> log warning
      with CaptureLogger(__lowerCamelCase				) as cl:
          lowerCAmelCase__  :       Union[str, Any]				=  text_generator(__lowerCamelCase	,max_length=10	,max_new_tokens=1				)
      self.assertIn(__lowerCamelCase	,cl.out				)

      # The user only sets one -> no warning
      with CaptureLogger(__lowerCamelCase				) as cl:
          lowerCAmelCase__  :       Dict				=  text_generator(__lowerCamelCase	,max_new_tokens=1				)
      self.assertNotIn(__lowerCamelCase	,cl.out				)

      with CaptureLogger(__lowerCamelCase				) as cl:
          lowerCAmelCase__  :       Tuple				=  text_generator(__lowerCamelCase	,max_length=10				)
      self.assertNotIn(__lowerCamelCase	,cl.out				)






from __future__ import annotations






def 			lowerCAmelCase__	(					lowerCamelCase_	:	list[int]):





				'''simple docstring'''

				return len(set(lowerCamelCase_)) == len(lowerCamelCase_)


if __name__ == "__main__":
							import doctest

							doctest.testmod()

