'''simple docstring'''

import numpy as np
from PIL import Image






def       __lowercase  (_SCREAMING_SNAKE_CASE      :np.ndarray    ,	_SCREAMING_SNAKE_CASE      :int    ,	_SCREAMING_SNAKE_CASE      :int       ):
				SCREAMING_SNAKE_CASE  :						str      					= np.array(_SCREAMING_SNAKE_CASE       )
				if arr.shape[0] != arr.shape[1]:
								raise ValueError('''The input array is not a square matrix'''       )
				SCREAMING_SNAKE_CASE  :						List[Any]      					= 0
				SCREAMING_SNAKE_CASE  :						Optional[int]      					= 0
				SCREAMING_SNAKE_CASE  :						str      					= 0
				SCREAMING_SNAKE_CASE  :						Optional[int]      					= 0

				# compute the shape of the output matrix
				SCREAMING_SNAKE_CASE  :						Dict      					= (arr.shape[0] - size) // stride + 1
				# initialize the output matrix with zeros of shape maxpool_shape
				SCREAMING_SNAKE_CASE  :						Tuple      					= np.zeros((maxpool_shape, maxpool_shape)       )

				while i < arr.shape[0]:
								if i + size > arr.shape[0]:
												# if the end of the matrix is reached, break
												break
								while j < arr.shape[1]:
												# if the end of the matrix is reached, break
												if j + size > arr.shape[1]:
																break
												# compute the maximum of the pooling matrix
												SCREAMING_SNAKE_CASE  :						Dict      					= np.max(arr[i : i + size, j : j + size]       )
												# shift the pooling matrix by stride of column pixels
												j += stride
												mat_j += 1

								# shift the pooling matrix by stride of row pixels
								i += stride
								mat_i += 1

								# reset the column index to 0
								SCREAMING_SNAKE_CASE  :						Dict      					= 0
								SCREAMING_SNAKE_CASE  :						Union[str, Any]      					= 0

				return updated_arr






def       __lowercase  (_SCREAMING_SNAKE_CASE      :np.ndarray    ,	_SCREAMING_SNAKE_CASE      :int    ,	_SCREAMING_SNAKE_CASE      :int       ):
				SCREAMING_SNAKE_CASE  :						Optional[int]      					= np.array(_SCREAMING_SNAKE_CASE       )
				if arr.shape[0] != arr.shape[1]:
								raise ValueError('''The input array is not a square matrix'''       )
				SCREAMING_SNAKE_CASE  :						Tuple      					= 0
				SCREAMING_SNAKE_CASE  :						List[Any]      					= 0
				SCREAMING_SNAKE_CASE  :						Any      					= 0
				SCREAMING_SNAKE_CASE  :						List[Any]      					= 0

				# compute the shape of the output matrix
				SCREAMING_SNAKE_CASE  :						Any      					= (arr.shape[0] - size) // stride + 1
				# initialize the output matrix with zeros of shape avgpool_shape
				SCREAMING_SNAKE_CASE  :						str      					= np.zeros((avgpool_shape, avgpool_shape)       )

				while i < arr.shape[0]:
								# if the end of the matrix is reached, break
								if i + size > arr.shape[0]:
												break
								while j < arr.shape[1]:
												# if the end of the matrix is reached, break
												if j + size > arr.shape[1]:
																break
												# compute the average of the pooling matrix
												SCREAMING_SNAKE_CASE  :						str      					= int(np.average(arr[i : i + size, j : j + size]       )       )
												# shift the pooling matrix by stride of column pixels
												j += stride
												mat_j += 1

								# shift the pooling matrix by stride of row pixels
								i += stride
								mat_i += 1
								# reset the column index to 0
								SCREAMING_SNAKE_CASE  :						Optional[int]      					= 0
								SCREAMING_SNAKE_CASE  :						List[Any]      					= 0

				return updated_arr


# Main Function
if __name__ == "__main__":
	from doctest import testmod

	testmod(name="""avgpooling""", verbose=True)

	# Loading the image
	snake_case_			=     Image.open("""path_to_image""")

	# Converting the image to numpy array and maxpooling, displaying the result
	# Ensure that the image is a square matrix

	Image.fromarray(maxpooling(np.array(image), size=3, stride=2)).show()

	# Converting the image to numpy array and averagepooling, displaying the result
	# Ensure that the image is a square matrix

	Image.fromarray(avgpooling(np.array(image), size=3, stride=2)).show()









'''simple docstring'''

from ...utils import is_torch_available, is_transformers_available


if is_transformers_available() and is_torch_available():
	from .pipeline_vq_diffusion import LearnedClassifierFreeSamplingEmbeddings, VQDiffusionPipeline




