
import PIL.Image
import PIL.ImageOps
from packaging import version
from PIL import Image


if version.parse(version.parse(PIL.__version__).base_version) >= version.parse('9.1.0'):
					SCREAMING_SNAKE_CASE							:Any							 =				{
					    'linear': PIL.Image.Resampling.BILINEAR,
					    'bilinear': PIL.Image.Resampling.BILINEAR,
					    'bicubic': PIL.Image.Resampling.BICUBIC,
					    'lanczos': PIL.Image.Resampling.LANCZOS,
					    'nearest': PIL.Image.Resampling.NEAREST,
					}
else:
					SCREAMING_SNAKE_CASE							:int							 =				{
					    'linear': PIL.Image.LINEAR,
					    'bilinear': PIL.Image.BILINEAR,
					    'bicubic': PIL.Image.BICUBIC,
					    'lanczos': PIL.Image.LANCZOS,
					    'nearest': PIL.Image.NEAREST,
					}


def 						UpperCAmelCase			(	a_						)		->	Optional[Any]:







				"""simple docstring"""



				__A   			= (images / 2 + 0.5).clamp(0		,   1						)
				__A   			= images.cpu().permute(0		,   2		,   3		,   1						).float().numpy()
				__A   			= numpy_to_pil(a_						)
				return images


def 						UpperCAmelCase			(	a_						)		->	int:







				"""simple docstring"""



				if images.ndim == 3:
								__A   			= images[None, ...]
				__A   			= (images * 2_5_5).round().astype("uint8"						)
				if images.shape[-1] == 1:
								# special case for grayscale (single channel) images
								__A   			= [Image.fromarray(image.squeeze()		,   mode="L"						) for image in images]
				else:
								__A   			= [Image.fromarray(a_						) for image in images]

				return pil_images


SCREAMING_SNAKE_CASE							:Any							 =				256
# Modulus to hash a string
SCREAMING_SNAKE_CASE							:Union[str, Any]							 =				100_0003


def 						UpperCAmelCase			(	a_		,   a_						)		->	bool:







				"""simple docstring"""



				__A   			= len(a_						)
				__A   			= len(a_						)
				if p_len > t_len:
								return False

				__A   			= 0
				__A   			= 0
				__A   			= 1

				# Calculating the hash of pattern and substring of text
				for i in range(a_						):
								__A   			= (ord(pattern[i]						) + p_hash * alphabet_size) % modulus
								__A   			= (ord(text[i]						) + text_hash * alphabet_size) % modulus
								if i == p_len - 1:
												continue
								__A   			= (modulus_power * alphabet_size) % modulus

				for i in range(0		,   t_len - p_len + 1						):
								if text_hash == p_hash and text[i : i + p_len] == pattern:
												return True
								if i == t_len - p_len:
												continue
								# Calculate the https://en.wikipedia.org/wiki/Rolling_hash
								__A   			= (
								    (text_hash - ord(text[i]						) * modulus_power) * alphabet_size
								    + ord(text[i + p_len]						)
								) % modulus
				return False


def 						UpperCAmelCase			(	)		->	None:







				"""simple docstring"""



				__A   			= "abc1abc12"
				__A   			= "alskfjaldsabc1abc1abc12k23adsfabcabc"
				__A   			= "alskfjaldsk23adsfabcabc"
				assert rabin_karp(a_		,   a_						) and not rabin_karp(a_		,   a_						)

				# Test 2)
				__A   			= "ABABX"
				__A   			= "ABABZABABYABABX"
				assert rabin_karp(a_		,   a_						)

				# Test 3)
				__A   			= "AAAB"
				__A   			= "ABAAAAAB"
				assert rabin_karp(a_		,   a_						)

				# Test 4)
				__A   			= "abcdabcy"
				__A   			= "abcxabcdabxabcdabcdabcy"
				assert rabin_karp(a_		,   a_						)

				# Test 5)
				__A   			= "Lü"
				__A   			= "Lüsai"
				assert rabin_karp(a_		,   a_						)
				__A   			= "Lue"
				assert not rabin_karp(a_		,   a_						)
				print("Success."						)


if __name__ == "__main__":
					test_rabin_karp()
