






import time
import warnings
from abc import ABC
from copy import deepcopy
from typing import Optional

import torch

from ..utils import add_start_docstrings, logging


lowercase  :							Union[str, Any]			  =    logging.get_logger(__name__)


lowercase  :							Tuple			  =    r'''
    Args:
        input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
            Indices of input sequence tokens in the vocabulary.

            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        scores (`torch.FloatTensor` of shape `(batch_size, config.vocab_size)`):
            Prediction scores of a language modeling head. These can be scores for each vocabulary token before SoftMax
            or scores for each vocabulary token after SoftMax.
        kwargs (`Dict[str, Any]`, *optional*):
            Additional stopping criteria specific kwargs.

    Return:
        `bool`. `False` indicates we should continue, `True` indicates we should stop.

'''




class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


						'''simple docstring'''




						@add_start_docstrings(_SCREAMING_SNAKE_CASE				)
						def __call__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE		,				**_SCREAMING_SNAKE_CASE				) ->				bool:
								raise NotImplementedError("StoppingCriteria needs to be subclassed"				)




class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


						'''simple docstring'''




						def __init__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE = None				) ->				Any:
								snake_case_				:							List[str]						 =       max_length
								snake_case_				:							Any						 =       max_position_embeddings






						@add_start_docstrings(_SCREAMING_SNAKE_CASE				)
						def __call__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE		,				**_SCREAMING_SNAKE_CASE				) ->				bool:
								snake_case_				:							str						 =       input_ids.shape[-1]
								snake_case_				:							Dict						 =       cur_len >= self.max_length
								if self.max_position_embeddings is not None and not is_done and cur_len >= self.max_position_embeddings:
										logger.warning_once(
										    "This is a friendly reminder - the current text generation call will exceed the model's predefined "
										    f'''maximum length ({self.max_position_embeddings}). Depending on the model, you may observe '''
										    "exceptions, performance degradation, or nothing at all."				)
								return is_done




class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


						'''simple docstring'''




						def __init__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				) ->				Dict:
								warnings.warn(
								    "The class `MaxNewTokensCriteria` is deprecated. "
								    f'''Please use `MaxLengthCriteria(max_length={start_length + max_new_tokens})` '''
								    "with `max_length = start_length + max_new_tokens` instead."		,				_SCREAMING_SNAKE_CASE		,				)
								snake_case_				:							int						 =       start_length
								snake_case_				:							Union[str, Any]						 =       max_new_tokens
								snake_case_				:							List[Any]						 =       start_length + max_new_tokens






						@add_start_docstrings(_SCREAMING_SNAKE_CASE				)
						def __call__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE		,				**_SCREAMING_SNAKE_CASE				) ->				bool:
								return input_ids.shape[-1] >= self.max_length




class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


						'''simple docstring'''




						def __init__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE = None				) ->				List[Any]:
								snake_case_				:							Tuple						 =       max_time
								snake_case_				:							Optional[int]						 =       time.time() if initial_timestamp is None else initial_timestamp






						@add_start_docstrings(_SCREAMING_SNAKE_CASE				)
						def __call__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE		,				**_SCREAMING_SNAKE_CASE				) ->				bool:
								return time.time() - self.initial_timestamp > self.max_time




class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


						'''simple docstring'''




						@add_start_docstrings(_SCREAMING_SNAKE_CASE				)
						def __call__(	self		,				_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE		,				**_SCREAMING_SNAKE_CASE				) ->				bool:
								return any(criteria(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				) for criteria in self				)






						@property
						def       _lowerCAmelCase       (	self				) ->				Optional[int]:
								for stopping_criterium in self:
										if isinstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				):
												return stopping_criterium.max_length
										elif isinstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				):
												return stopping_criterium.max_length
								return None




def      lowerCAmelCase__	(    _a       :			StoppingCriteriaList  ,      _a       :			int    ):
		snake_case_				:							Union[str, Any]						 =       stopping_criteria.max_length
		snake_case_				:							List[Any]						 =       deepcopy(_a    )
		if stopping_max_length is not None and stopping_max_length != max_length:
				warnings.warn("You set different `max_length` for stopping criteria and `max_length` parameter"  ,      _a    )
		elif stopping_max_length is None:
				new_stopping_criteria.append(MaxLengthCriteria(max_length=_a    )    )
		return new_stopping_criteria








import importlib
import json
import os
import sys
import tempfile
import unittest
from pathlib import Path

import transformers
import transformers.models.auto
from transformers.models.auto.configuration_auto import CONFIG_MAPPING, AutoConfig
from transformers.models.bert.configuration_bert import BertConfig
from transformers.models.roberta.configuration_roberta import RobertaConfig
from transformers.testing_utils import DUMMY_UNKNOWN_IDENTIFIER, get_tests_dir


sys.path.append(str(Path(__file__).parent.parent.parent.parent / '''utils'''))

from test_module.custom_configuration import CustomConfig  # noqa E402


lowercase  :							Optional[Any]			  =    get_tests_dir('''fixtures/dummy-config.json''')




class 		UpperCAmelCase_						(	unittest.TestCase					):


						'''simple docstring'''




						def       _lowerCAmelCase       (	self				) ->				int:
								snake_case_				:							str						 =       0






						def       _lowerCAmelCase       (	self				) ->				str:
								self.assertIsNotNone(transformers.models.auto.__spec__				)
								self.assertIsNotNone(importlib.util.find_spec("transformers.models.auto"				)				)






						def       _lowerCAmelCase       (	self				) ->				int:
								snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained("bert-base-uncased"				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Optional[int]:
								snake_case_				:							List[str]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				str:
								snake_case_				:							str						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Dict:
								snake_case_				:							Tuple						 =       AutoConfig.for_model("roberta"				)
								self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Tuple:
								with tempfile.TemporaryDirectory() as tmp_dir:
										# This model name contains bert and roberta, but roberta ends up being picked.
										snake_case_				:							str						 =       os.path.join(_SCREAMING_SNAKE_CASE		,				"fake-roberta"				)
										os.makedirs(_SCREAMING_SNAKE_CASE		,				exist_ok=_SCREAMING_SNAKE_CASE				)
										with open(os.path.join(_SCREAMING_SNAKE_CASE		,				"config.json"				)		,				"w"				) as f:
												f.write(json.dumps({}				)				)
										snake_case_				:							int						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
										self.assertEqual(type(_SCREAMING_SNAKE_CASE				)		,				_SCREAMING_SNAKE_CASE				)






						def       _lowerCAmelCase       (	self				) ->				Dict:
								try:
										AutoConfig.register("custom"		,				_SCREAMING_SNAKE_CASE				)
										# Wrong model type will raise an error
										with self.assertRaises(_SCREAMING_SNAKE_CASE				):
												AutoConfig.register("model"		,				_SCREAMING_SNAKE_CASE				)
										# Trying to register something existing in the Transformers library will raise an error
										with self.assertRaises(_SCREAMING_SNAKE_CASE				):
												AutoConfig.register("bert"		,				_SCREAMING_SNAKE_CASE				)

										# Now that the config is registered, it can be used as any other config with the auto-API
										snake_case_				:							Union[str, Any]						 =       CustomConfig()
										with tempfile.TemporaryDirectory() as tmp_dir:
												config.save_pretrained(_SCREAMING_SNAKE_CASE				)
												snake_case_				:							int						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE				)
												self.assertIsInstance(_SCREAMING_SNAKE_CASE		,				_SCREAMING_SNAKE_CASE				)

								finally:
										if "custom" in CONFIG_MAPPING._extra_content:
												del CONFIG_MAPPING._extra_content["custom"]






						def       _lowerCAmelCase       (	self				) ->				int:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				"bert-base is not a local folder and is not a valid model identifier"				):
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("bert-base"				)






						def       _lowerCAmelCase       (	self				) ->				Tuple:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				r"aaaaaa is not a valid git identifier \(branch name, tag name or commit id\)"				):
										snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE		,				revision="aaaaaa"				)






						def       _lowerCAmelCase       (	self				) ->				str:
								with self.assertRaisesRegex(
								    _SCREAMING_SNAKE_CASE		,				"hf-internal-testing/no-config-test-repo does not appear to have a file named config.json."		,				):
										snake_case_				:							Dict						 =       AutoConfig.from_pretrained("hf-internal-testing/no-config-test-repo"				)






						def       _lowerCAmelCase       (	self				) ->				Optional[int]:
								# If remote code is not set, we will time out when asking whether to load the model.
								with self.assertRaises(_SCREAMING_SNAKE_CASE				):
										snake_case_				:							Tuple						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"				)
								# If remote code is disabled, we can't load this config.
								with self.assertRaises(_SCREAMING_SNAKE_CASE				):
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)

								snake_case_				:							List[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
								self.assertEqual(config.__class__.__name__		,				"NewModelConfig"				)

								# Test config can be reloaded.
								with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(_SCREAMING_SNAKE_CASE				)
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained(_SCREAMING_SNAKE_CASE		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
								self.assertEqual(reloaded_config.__class__.__name__		,				"NewModelConfig"				)






						def       _lowerCAmelCase       (	self				) ->				Optional[Any]:




								class 		UpperCAmelCase_						(	SCREAMING_SNAKE_CASE__					):


														'''simple docstring'''




														A     :   List[Any]						=					'new-model'

								try:
										AutoConfig.register("new-model"		,				_SCREAMING_SNAKE_CASE				)
										# If remote code is not set, the default is to use local
										snake_case_				:							Union[str, Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfigLocal"				)

										# If remote code is disabled, we load the local one.
										snake_case_				:							Optional[Any]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfigLocal"				)

										# If remote is enabled, we load from the Hub
										snake_case_				:							List[str]						 =       AutoConfig.from_pretrained("hf-internal-testing/test_dynamic_model"		,				trust_remote_code=_SCREAMING_SNAKE_CASE				)
										self.assertEqual(config.__class__.__name__		,				"NewModelConfig"				)

								finally:
										if "new-model" in CONFIG_MAPPING._extra_content:
												del CONFIG_MAPPING._extra_content["new-model"]
