


from timeit import timeit

__a       =					{
    '''MALAYALAM''': True,
    '''String''': False,
    '''rotor''': True,
    '''level''': True,
    '''A''': True,
    '''BB''': True,
    '''ABC''': False,
    '''amanaplanacanalpanama''': True,  # "a man a plan a canal panama"
}
# Ensure our test data is valid
assert all((key == key[::-1]) is value for key, value in test_data.items())




def 	__lowercase		(  _UpperCamelCase   )			->bool:







      """simple docstring"""

      lowercase	:      Optional[int]          =						0
      lowercase	:      Tuple          =						len(__lowerCAmelCase   ) - 1
      while start_i < end_i:
            if s[start_i] == s[end_i]:
                  start_i += 1
                  end_i -= 1
            else:
                  return False
      return True




def 	__lowercase		(  _UpperCamelCase   )			->bool:







      """simple docstring"""

      lowercase	:      Tuple          =						len(__lowerCAmelCase   ) // 2
      lowercase	:      Optional[int]          =						len(__lowerCAmelCase   )

      # We need to traverse till half of the length of string
      # as we can get access of the i'th last element from
      # i'th index.
      # eg: [0,1,2,3,4,5] => 4th index can be accessed
      # with the help of 1st index (i==n-i-1)
      # where n is length of string
      return all(s[i] == s[n - i - 1] for i in range(__lowerCAmelCase   )   )




def 	__lowercase		(  _UpperCamelCase   )			->bool:







      """simple docstring"""

      if len(__lowerCAmelCase   ) <= 2:
            return True
      if s[0] == s[len(__lowerCAmelCase   ) - 1]:
            return is_palindrome_recursive(s[1:-1]   )
      else:
            return False




def 	__lowercase		(  _UpperCamelCase   )			->bool:







      """simple docstring"""

      return s == s[::-1]




def 	__lowercase		(  _UpperCamelCase   )			->None:







      """simple docstring"""

      lowercase	:      List[str]          =						f"""all({name}(key) is value for key, value in test_data.items())"""
      lowercase	:      List[str]          =						f"""from __main__ import test_data, {name}"""
      lowercase	:      Union[str, Any]          =						500000
      lowercase	:      Any          =						timeit(stmt=__lowerCAmelCase,			setup=__lowerCAmelCase,			number=__lowerCAmelCase   )
      print(f"""{name:<35} finished {number:,} runs in {result:.5f} seconds"""   )


if __name__ == "__main__":
  for key, value in test_data.items():
    assert is_palindrome(key) is is_palindrome_recursive(key)
    assert is_palindrome(key) is is_palindrome_slice(key)
    print(F'''{key:21} {value}''')
  print('''a man a plan a canal panama''')

  # finished 500,000 runs in 0.46793 seconds
  benchmark_function('''is_palindrome_slice''')
  # finished 500,000 runs in 0.85234 seconds
  benchmark_function('''is_palindrome''')
  # finished 500,000 runs in 1.32028 seconds
  benchmark_function('''is_palindrome_recursive''')
  # finished 500,000 runs in 2.08679 seconds
  benchmark_function('''is_palindrome_traversal''')






from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_tf_available, is_torch_available


A__								=						{
    '''configuration_ctrl''': ['''CTRL_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''CTRLConfig'''],
    '''tokenization_ctrl''': ['''CTRLTokenizer'''],
}

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				A__								=						[
				    '''CTRL_PRETRAINED_MODEL_ARCHIVE_LIST''',
				    '''CTRLForSequenceClassification''',
				    '''CTRLLMHeadModel''',
				    '''CTRLModel''',
				    '''CTRLPreTrainedModel''',
				]

try:
				if not is_tf_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				A__								=						[
				    '''TF_CTRL_PRETRAINED_MODEL_ARCHIVE_LIST''',
				    '''TFCTRLForSequenceClassification''',
				    '''TFCTRLLMHeadModel''',
				    '''TFCTRLModel''',
				    '''TFCTRLPreTrainedModel''',
				]


if TYPE_CHECKING:
				from .configuration_ctrl import CTRL_PRETRAINED_CONFIG_ARCHIVE_MAP, CTRLConfig
				from .tokenization_ctrl import CTRLTokenizer

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_ctrl import (
								    CTRL_PRETRAINED_MODEL_ARCHIVE_LIST,
								    CTRLForSequenceClassification,
								    CTRLLMHeadModel,
								    CTRLModel,
								    CTRLPreTrainedModel,
								)

				try:
								if not is_tf_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_tf_ctrl import (
								    TF_CTRL_PRETRAINED_MODEL_ARCHIVE_LIST,
								    TFCTRLForSequenceClassification,
								    TFCTRLLMHeadModel,
								    TFCTRLModel,
								    TFCTRLPreTrainedModel,
								)

else:
				import sys

				A__								=						_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)

