


import numpy as np
from PIL import Image


def 	UpperCAmelCase__      (      UpperCAmelCase__ :np.ndarray ,					UpperCAmelCase__ :int ,					UpperCAmelCase__ :int					):






 '''simple docstring'''

 a						=		np.array(UpperCAmelCase__					)
 if arr.shape[0] != arr.shape[1]:
  raise ValueError("The input array is not a square matrix"					)
 a						=		0
 a						=		0
 a						=		0
 a						=		0

 # compute the shape of the output matrix
 a						=		(arr.shape[0] - size) // stride + 1
 # initialize the output matrix with zeros of shape maxpool_shape
 a						=		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
   a						=		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
  a						=		0
  a						=		0

 return updated_arr


def 	UpperCAmelCase__      (      UpperCAmelCase__ :np.ndarray ,					UpperCAmelCase__ :int ,					UpperCAmelCase__ :int					):






 '''simple docstring'''

 a						=		np.array(UpperCAmelCase__					)
 if arr.shape[0] != arr.shape[1]:
  raise ValueError("The input array is not a square matrix"					)
 a						=		0
 a						=		0
 a						=		0
 a						=		0

 # compute the shape of the output matrix
 a						=		(arr.shape[0] - size) // stride + 1
 # initialize the output matrix with zeros of shape avgpool_shape
 a						=		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
   a						=		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
  a						=		0
  a						=		0

 return updated_arr


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

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

     # Loading the image
     A_		:     int        =     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()






from __future__ import annotations


def 	UpperCAmelCase__      (      UpperCAmelCase__ :int					):






 '''simple docstring'''

 a						=		str(UpperCAmelCase__					)
 return len(UpperCAmelCase__					) == 9 and set(UpperCAmelCase__					) == set("123456789"					)


def 	UpperCAmelCase__      (      ):






 '''simple docstring'''

 for base_num in range(99_99 ,					49_99 ,					-1					):
  a						=		10_00_02 * base_num
  if is_9_pandigital(UpperCAmelCase__					):
   return candidate

 for base_num in range(3_33 ,					99 ,					-1					):
  a						=		1_00_20_03 * base_num
  if is_9_pandigital(UpperCAmelCase__					):
   return candidate

 return None


if __name__ == "__main__":
     print(F"""{solution() = }""")

