





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       __A					(					unittest.TestCase				):

   '''simple docstring'''







   lowerCAmelCase_							  =		MODEL_FOR_CAUSAL_LM_MAPPING
   lowerCAmelCase_							  =		TF_MODEL_FOR_CAUSAL_LM_MAPPING





   @require_torch
   def 	__lowerCamelCase       (					self							):



    '''simple docstring'''







    lowerCamelCase__              =	pipeline(task='''text-generation''' ,						model='''sshleifer/tiny-ctrl''' ,						framework='''pt'''							)
    # Using `do_sample=False` to force deterministic output
    lowerCamelCase__              =	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__              =	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__              =	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__              =	text_generator.model.config.eos_token_id
    lowerCamelCase__              =	'''<pad>'''
    lowerCamelCase__              =	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							):



    '''simple docstring'''







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

    # Using `do_sample=False` to force deterministic output
    lowerCamelCase__              =	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__              =	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							):



    '''simple docstring'''







    lowerCamelCase__              =	TextGenerationPipeline(model=__lowerCAmelCase ,						tokenizer=__lowerCAmelCase							)
    return text_generator, ["This is a test", "Another test"]





   def 	__lowerCamelCase       (					self							):



    '''simple docstring'''







    lowerCamelCase__              =	'''Hello I believe in'''
    lowerCamelCase__              =	pipeline('''text-generation''' ,						model='''hf-internal-testing/tiny-random-gpt2'''							)
    lowerCamelCase__              =	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__              =	text_generator(__lowerCAmelCase ,						stop_sequence=''' fe'''							)
    self.assertEqual(__lowerCAmelCase ,						[{'''generated_text''': '''Hello I believe in fe'''}]							)





   def 	__lowerCamelCase       (					self ,						__lowerCAmelCase ,						__lowerCAmelCase							):



    '''simple docstring'''







    lowerCamelCase__              =	text_generator.model
    lowerCamelCase__              =	text_generator.tokenizer

    lowerCamelCase__              =	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__              =	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__              =	pipeline(task='''text-generation''' ,						model=__lowerCAmelCase ,						tokenizer=__lowerCAmelCase ,						return_full_text=__lowerCAmelCase							)
    lowerCamelCase__              =	text_generator('''This is a test'''							)
    self.assertEqual(__lowerCAmelCase ,						[{'''generated_text''': ANY(__lowerCAmelCase							)}]							)
    self.assertNotIn('''This is a test''' ,						outputs[0]['''generated_text''']							)

    lowerCamelCase__              =	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__              =	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__              =	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__              =	text_generator('''test''' ,						return_full_text=__lowerCAmelCase ,						return_text=__lowerCAmelCase							)
    with self.assertRaises(__lowerCAmelCase							):
     lowerCamelCase__              =	text_generator('''test''' ,						return_full_text=__lowerCAmelCase ,						return_tensors=__lowerCAmelCase							)
    with self.assertRaises(__lowerCAmelCase							):
     lowerCamelCase__              =	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__              =	text_generator(''''''							)
     self.assertEqual(__lowerCAmelCase ,						[{'''generated_text''': ANY(__lowerCAmelCase							)}]							)
    else:
     with self.assertRaises((ValueError, AssertionError)							):
      lowerCamelCase__              =	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__              =	['''RwkvForCausalLM''', '''XGLMForCausalLM''', '''GPTNeoXForCausalLM''']
    if (
        tokenizer.model_max_length < 1_0_0_0_0
        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_0_0 ,						max_new_tokens=2_0							)

     lowerCamelCase__              =	text_generator('''This is a test''' * 5_0_0 ,						handle_long_generation='''hole''' ,						max_new_tokens=2_0							)
     # Hole strategy cannot work
     with self.assertRaises(__lowerCAmelCase							):
      text_generator(
          '''This is a test''' * 5_0_0 ,						handle_long_generation='''hole''' ,						max_new_tokens=tokenizer.model_max_length + 1_0 ,						)





   @require_torch
   @require_accelerate
   @require_torch_gpu
   def 	__lowerCamelCase       (					self							):



    '''simple docstring'''







    import torch

    # Classic `model_kwargs`
    lowerCamelCase__              =	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__              =	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__              =	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__              =	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__              =	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__              =	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							):



    '''simple docstring'''







    import torch

    lowerCamelCase__              =	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							):



    '''simple docstring'''







    import torch

    lowerCamelCase__              =	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							):



    '''simple docstring'''







    lowerCamelCase__              =	'''Hello world'''
    lowerCamelCase__              =	pipeline('''text-generation''' ,						model='''hf-internal-testing/tiny-random-gpt2'''							)
    if text_generator.model.framework == "tf":
     lowerCamelCase__              =	logging.get_logger('''transformers.generation.tf_utils'''							)
    else:
     lowerCamelCase__              =	logging.get_logger('''transformers.generation.utils'''							)
    lowerCamelCase__              =	'''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__              =	text_generator(__lowerCAmelCase ,						max_length=1_0 ,						max_new_tokens=1							)
    self.assertIn(__lowerCAmelCase ,						cl.out							)

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

    with CaptureLogger(__lowerCAmelCase							) as cl:
     lowerCamelCase__              =	text_generator(__lowerCAmelCase ,						max_length=1_0							)
    self.assertNotIn(__lowerCAmelCase ,						cl.out							)










import warnings

from ...utils import logging
from .image_processing_segformer import SegformerImageProcessor


_a						=   logging.get_logger(__name__)






class       __A					(					lowerCAmelCase				):

			'''simple docstring'''







			def __init__(					self ,						*__lowerCAmelCase ,						**__lowerCAmelCase							):



				'''simple docstring'''







				warnings.warn(
				    '''The class SegformerFeatureExtractor is deprecated and will be removed in version 5 of Transformers.'''
				    ''' Please use SegformerImageProcessor instead.''' ,						__lowerCAmelCase ,						)
				super().__init__(*__lowerCAmelCase ,						**__lowerCAmelCase							)



