"""simple docstring"""
import numpy as np

from transformers import Pipeline





def    lowerCAmelCase__    (			_UpperCamelCase       :				Tuple					)					->				str:





						"""simple docstring"""






						snake_case								=			np.max(_UpperCamelCase ,			axis=-1 ,			keepdims=_UpperCamelCase					)
						snake_case								=			np.exp(outputs - maxes					)
						return shifted_exp / shifted_exp.sum(axis=-1 ,			keepdims=_UpperCamelCase					)



class   lowerCAmelCase_    (			lowerCAmelCase					):



				"""simple docstring"""

				def 		snake_case (				self		,    **lowerCAmelCase    ):






										"""simple docstring"""

										snake_case								=			{}
										if "second_text" in kwargs:
																snake_case								=			kwargs['second_text']
										return preprocess_kwargs, {}, {}

				def 		snake_case (				self		,    lowerCAmelCase		,    lowerCAmelCase=None    ):






										"""simple docstring"""

										return self.tokenizer(lowerCAmelCase		,    text_pair=lowerCAmelCase		,    return_tensors=self.framework    )

				def 		snake_case (				self		,    lowerCAmelCase    ):






										"""simple docstring"""

										return self.model(**lowerCAmelCase    )

				def 		snake_case (				self		,    lowerCAmelCase    ):






										"""simple docstring"""

										snake_case								=			model_outputs.logits[0].numpy()
										snake_case								=			softmax(lowerCAmelCase    )

										snake_case								=			np.argmax(lowerCAmelCase    )
										snake_case								=			self.model.config.idalabel[best_class]
										snake_case								=			probabilities[best_class].item()
										snake_case								=			logits.tolist()
										return {"label": label, "score": score, "logits": logits}



"""simple docstring"""
import numpy as np
from PIL import Image





def    lowerCAmelCase__    (			_UpperCamelCase       :				np.ndarray ,			_UpperCamelCase       :				int ,			_UpperCamelCase       :				int					)					->				np.ndarray:





						"""simple docstring"""






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

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

						return updated_arr





def    lowerCAmelCase__    (			_UpperCamelCase       :				np.ndarray ,			_UpperCamelCase       :				int ,			_UpperCamelCase       :				int					)					->				np.ndarray:





						"""simple docstring"""






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

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

						return updated_arr


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

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

					# Loading the image
					SCREAMING_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()


