
import importlib
import inspect
import os
import re


# All paths are set with the intent you should run this script from the root of the repo with the command
# python utils/check_config_docstrings.py
_lowerCamelCase	:    Union[str, Any]          =      'src/transformers'


# This is to make sure the transformers module imported is the one in the repo.
_lowerCamelCase	:    Any          =      importlib.util.spec_from_file_location(
    '''transformers''',
    os.path.join(PATH_TO_TRANSFORMERS, '''__init__.py'''),
    submodule_search_locations=[PATH_TO_TRANSFORMERS],
)
_lowerCamelCase	:    int          =      spec.loader.load_module()

_lowerCamelCase	:    Dict          =      transformers.models.auto.configuration_auto.CONFIG_MAPPING

# Regex pattern used to find the checkpoint mentioned in the docstring of `config_class`.
# For example, `[bert-base-uncased](https://huggingface.co/bert-base-uncased)`
_lowerCamelCase	:    str          =      re.compile('''\[(.+?)\]\((https://huggingface\.co/.+?)\)''')


_lowerCamelCase	:    str          =      {
    'CLIPConfigMixin',
    'DecisionTransformerConfigMixin',
    'EncoderDecoderConfigMixin',
    'RagConfigMixin',
    'SpeechEncoderDecoderConfigMixin',
    'VisionEncoderDecoderConfigMixin',
    'VisionTextDualEncoderConfigMixin',
}






def 	lowerCamelCase__		(	)			->  Any:
			_snake_case          =      []

			for config_class in list(CONFIG_MAPPING.values()			):
						_snake_case          =      False

						# source code of `config_class`
						_snake_case          =      inspect.getsource(__UpperCAmelCase			)
						_snake_case          =      _re_checkpoint.findall(__UpperCAmelCase			)

						for checkpoint in checkpoints:
									# Each `checkpoint` is a tuple of a checkpoint name and a checkpoint link.
									# For example, `('bert-base-uncased', 'https://huggingface.co/bert-base-uncased')`
									_snake_case     , _snake_case          =      checkpoint

									# verify the checkpoint name corresponds to the checkpoint link
									_snake_case          =      f'''https://huggingface.co/{ckpt_name}'''
									if ckpt_link == ckpt_link_from_name:
												_snake_case          =      True
												break

						_snake_case          =      config_class.__name__
						if not checkpoint_found and name not in CONFIG_CLASSES_TO_IGNORE_FOR_DOCSTRING_CHECKPOINT_CHECK:
									configs_without_checkpoint.append(__UpperCAmelCase			)

			if len(__UpperCAmelCase			) > 0:
						_snake_case          =      '\n'.join(sorted(__UpperCAmelCase			)			)
						raise ValueError(f'''The following configurations don\'t contain any valid checkpoint:\n{message}'''			)


if __name__ == "__main__":
			check_config_docstrings_have_checkpoints()

from functools import lru_cache






@lru_cache
def 	a_		(	__lowercase       :     int			)			->  int:
			if num < 0:
						raise ValueError('Number should not be negative.'			)

			return 1 if num in (0, 1) else num * factorial(num - 1			)


if __name__ == "__main__":
			import doctest

			doctest.testmod()