






"""simple docstring"""



import sys

from .dependency_versions_table import deps
from .utils.versions import require_version, require_version_core


# define which module versions we always want to check at run time
# (usually the ones defined in `install_requires` in setup.py)
#
# order specific notes:
# - tqdm must be checked before tokenizers

A__	:    List[Any]			 = 'python tqdm regex requests packaging filelock numpy tokenizers'.split()
if sys.version_info < (3, 7):
						pkgs_to_check_at_runtime.append('dataclasses')
if sys.version_info < (3, 8):
						pkgs_to_check_at_runtime.append('importlib_metadata')

for pkg in pkgs_to_check_at_runtime:
						if pkg in deps:
												if pkg == "tokenizers":
																		# must be loaded here, or else tqdm check may fail
																		from .utils import is_tokenizers_available

																		if not is_tokenizers_available():
																								continue  # not required, check version only if installed

												require_version_core(deps[pkg])
						else:
												raise ValueError(f'can\'t find {pkg} in {deps.keys()}, check dependency_versions_table.py')

def 			_snake_case    (					lowerCamelCase__     :   Tuple    ,						lowerCamelCase__     :   Optional[Any]=None  )    ->     List[Any]:
							require_version(deps[pkg]    ,						__SCREAMING_SNAKE_CASE  )












"""simple docstring"""



def 			_snake_case    (					lowerCamelCase__     :   list[list[int]]    ,						lowerCamelCase__     :   int    ,						lowerCamelCase__     :   int    ,						lowerCamelCase__     :   list[int]  )    ->     bool:

							# 1. Validate that path exists between current and next vertices
							if graph[path[curr_ind - 1]][next_ver] == 0:
														return False

							# 2. Validate that next vertex is not already in path
							return not any(vertex == next_ver for vertex in path  )

def 			_snake_case    (					lowerCamelCase__     :   list[list[int]]    ,						lowerCamelCase__     :   list[int]    ,						lowerCamelCase__     :   int  )    ->     bool:

							# Base Case
							if curr_ind == len(lowerCamelCase__  ):
														# return whether path exists between current and starting vertices
														return graph[path[curr_ind - 1]][path[0]] == 1

							# Recursive Step
							for next_ver in range(0    ,						len(lowerCamelCase__  )  ):
														if valid_connection(lowerCamelCase__    ,						lowerCamelCase__    ,						lowerCamelCase__    ,						lowerCamelCase__  ):
																					# Insert current vertex  into path as next transition
																					lowerCamelCase_	:							Tuple									=next_ver
																					# Validate created path
																					if util_hamilton_cycle(lowerCamelCase__    ,						lowerCamelCase__    ,						curr_ind + 1  ):
																												return True
																					# Backtrack
																					lowerCamelCase_	:							int									=-1
							return False

def 			_snake_case    (					lowerCamelCase__     :   list[list[int]]    ,						lowerCamelCase__     :   int = 0  )    ->     list[int]:
							lowerCamelCase_	:							Optional[Any]									=[-1] * (len(lowerCamelCase__  ) + 1)
							# initialize start and end of path with starting index
							lowerCamelCase_	:							Optional[int]									=start_index
							# evaluate and if we find answer return path either return empty array
							return path if util_hamilton_cycle(lowerCamelCase__    ,						lowerCamelCase__    ,						1  ) else []



