


"""simple docstring"""







import argparse
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_dummies.py
__a      			= "src/transformers"

# Matches is_xxx_available()
__a      			= re.compile(r"is\_([a-z_]*)_available()")
# Matches from xxx import bla
__a      			= re.compile(r"\s+from\s+\S*\s+import\s+([^\(\s].*)\n")
__a      			= re.compile(r"^\s+if\s+not\s+\(?is\_[a-z_]*\_available\(\)")


__a      			= "\n{0} = None\n"

__a      			= "\nclass {0}(metaclass=DummyObject):\n    _backends = {1}\n\n    def __init__(self, *args, **kwargs):\n        requires_backends(self, {1})\n"


__a      			= "\ndef {0}(*args, **kwargs):\n    requires_backends({0}, {1})\n"






def        a__			(							_UpperCamelCase			):





						"""simple docstring"""

						if _re_test_backend.search(UpperCamelCase__			) is None:
												return None
						UpperCAmelCase__												=     [b[0] for b in _re_backend.findall(UpperCamelCase__			)]
						backends.sort()
						return "_and_".join(UpperCamelCase__			)






def        a__			(							):





						"""simple docstring"""

						with open(os.path.join(UpperCamelCase__						,      '''__init__.py'''			)						,      '''r'''						,      encoding='''utf-8'''						,      newline='''\n'''			) as f:
												UpperCAmelCase__												=     f.readlines()

						# Get to the point we do the actual imports for type checking
						UpperCAmelCase__												=     0
						while not lines[line_index].startswith('''if TYPE_CHECKING'''			):
												line_index += 1

						UpperCAmelCase__												=     {}
						# Go through the end of the file
						while line_index < len(UpperCamelCase__			):
												# If the line is an if is_backend_available, we grab all objects associated.
												UpperCAmelCase__												=     find_backend(lines[line_index]			)
												if backend is not None:
																		while not lines[line_index].startswith('''    else:'''			):
																								line_index += 1
																		line_index += 1

																		UpperCAmelCase__												=     []
																		# Until we unindent, add backend objects to the list
																		while len(lines[line_index]			) <= 1 or lines[line_index].startswith(''' ''' * 8			):
																								UpperCAmelCase__												=     lines[line_index]
																								UpperCAmelCase__												=     _re_single_line_import.search(UpperCamelCase__			)
																								if single_line_import_search is not None:
																														objects.extend(single_line_import_search.groups()[0].split(''', '''			)			)
																								elif line.startswith(''' ''' * 12			):
																														objects.append(line[12:-2]			)
																								line_index += 1

																		UpperCAmelCase__												=     objects
												else:
																		line_index += 1

						return backend_specific_objects






def        a__			(							_UpperCamelCase						,      _UpperCamelCase			):





						"""simple docstring"""

						if name.isupper():
												return DUMMY_CONSTANT.format(UpperCamelCase__			)
						elif name.islower():
												return DUMMY_FUNCTION.format(UpperCamelCase__						,      UpperCamelCase__			)
						else:
												return DUMMY_CLASS.format(UpperCamelCase__						,      UpperCamelCase__			)






def        a__			(							_UpperCamelCase=None			):





						"""simple docstring"""

						if backend_specific_objects is None:
												UpperCAmelCase__												=     read_init()
						# For special correspondence backend to module name as used in the function requires_modulename
						UpperCAmelCase__												=     {}

						for backend, objects in backend_specific_objects.items():
												UpperCAmelCase__												=     '''[''' + ''', '''.join(F"""\"{b}\"""" for b in backend.split('''_and_'''			)			) + ''']'''
												UpperCAmelCase__												=     '''# This file is autogenerated by the command `make fix-copies`, do not edit.\n'''
												dummy_file += "from ..utils import DummyObject, requires_backends\n\n"
												dummy_file += "\n".join([create_dummy_object(UpperCamelCase__						,      UpperCamelCase__			) for o in objects]			)
												UpperCAmelCase__												=     dummy_file

						return dummy_files






def        a__			(							_UpperCamelCase=False			):





						"""simple docstring"""

						UpperCAmelCase__												=     create_dummy_files()
						# For special correspondence backend to shortcut as used in utils/dummy_xxx_objects.py
						UpperCAmelCase__												=     {'''torch''': '''pt'''}

						# Locate actual dummy modules and read their content.
						UpperCAmelCase__												=     os.path.join(UpperCamelCase__						,      '''utils'''			)
						UpperCAmelCase__												=     {
						    backend: os.path.join(UpperCamelCase__						,      F"""dummy_{short_names.get(UpperCamelCase__						,      UpperCamelCase__			)}_objects.py"""			)
						    for backend in dummy_files.keys()
						}

						UpperCAmelCase__												=     {}
						for backend, file_path in dummy_file_paths.items():
												if os.path.isfile(UpperCamelCase__			):
																		with open(UpperCamelCase__						,      '''r'''						,      encoding='''utf-8'''						,      newline='''\n'''			) as f:
																								UpperCAmelCase__												=     f.read()
												else:
																		UpperCAmelCase__												=     ''''''

						for backend in dummy_files.keys():
												if dummy_files[backend] != actual_dummies[backend]:
																		if overwrite:
																								print(
																								    F"""Updating transformers.utils.dummy_{short_names.get(UpperCamelCase__						,      UpperCamelCase__			)}_objects.py as the main """
																								    '''__init__ has new objects.'''			)
																								with open(dummy_file_paths[backend]						,      '''w'''						,      encoding='''utf-8'''						,      newline='''\n'''			) as f:
																														f.write(dummy_files[backend]			)
																		else:
																								raise ValueError(
																								    '''The main __init__ has objects that are not present in '''
																								    F"""transformers.utils.dummy_{short_names.get(UpperCamelCase__						,      UpperCamelCase__			)}_objects.py. Run `make fix-copies` """
																								    '''to fix this.'''			)


if __name__ == "__main__":
						__a      			= argparse.ArgumentParser()
						parser.add_argument("--fix_and_overwrite", action="store_true", help="Whether to fix inconsistencies.")
						__a      			= parser.parse_args()

						check_dummies(args.fix_and_overwrite)






import math
from timeit import timeit





def     lowerCamelCase__  (  UpperCamelCase__      :							int    )      ->			int:



					'''simple docstring'''




					_snake_case						=					0
					_snake_case						=					abs(UpperCamelCase__    )
					while True:
										_snake_case						=					n // 10
										digits += 1
										if n == 0:
															break
					return digits





def     lowerCamelCase__  (  UpperCamelCase__      :							int    )      ->			int:



					'''simple docstring'''




					return 1 if n == 0 else math.floor(math.log(abs(UpperCamelCase__    )							,     10    ) + 1    )





def     lowerCamelCase__  (  UpperCamelCase__      :							int    )      ->			int:



					'''simple docstring'''




					return len(str(abs(UpperCamelCase__    )    )    )





def     lowerCamelCase__  (  )      ->			None:



					'''simple docstring'''




					from collections.abc import Callable

					def benchmark_a_function(UpperCamelCase__      :							Callable							,     UpperCamelCase__      :							int    ) -> None:
										_snake_case						=					F'''{func.__name__}({value})'''
										_snake_case						=					timeit(F'''__main__.{call}'''							,     setup='import __main__'    )
										print(F'''{call}: {func(UpperCamelCase__    )} -- {timing} seconds'''    )

					for value in (262_144, 1_125_899_906_842_624, 1_267_650_600_228_229_401_496_703_205_376):
										for func in (num_digits, num_digits_fast, num_digits_faster):
															benchmark_a_function(UpperCamelCase__							,     UpperCamelCase__    )
										print()


if __name__ == "__main__":
					import doctest

					doctest.testmod()
					benchmark()



