






import copy
import json
import os
import tempfile

from transformers import is_torch_available

from .test_configuration_utils import config_common_kwargs


class     __SCREAMING_SNAKE_CASE					(   __lowerCAmelCase):






						def __init__(	self     ,						_UpperCamelCase     ,						_UpperCamelCase=None     ,						_UpperCamelCase=True     ,						_UpperCamelCase=None     ,						**_UpperCamelCase   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						parent
												lowerCAmelCase__    						=						config_class
												lowerCAmelCase__    						=						has_text_modality
												lowerCAmelCase__    						=						kwargs
												lowerCAmelCase__    						=						common_properties






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict   )
												lowerCAmelCase__    						=						(
												    ['''hidden_size''', '''num_attention_heads''', '''num_hidden_layers''']
												    if self.common_properties is None
												    else self.common_properties
												)

												# Add common fields for text models
												if self.has_text_modality:
																		common_properties.extend(['vocab_size']   )

												# Test that config has the common properties as getters
												for prop in common_properties:
																		self.parent.assertTrue(hasattr(lowerCamelCase__     ,						lowerCamelCase__   )     ,						msg=F"`{prop}` does not exist"   )

												# Test that config has the common properties as setter
												for idx, name in enumerate(lowerCamelCase__   ):
																		try:
																								setattr(lowerCamelCase__     ,						lowerCamelCase__     ,						lowerCamelCase__   )
																								self.parent.assertEqual(
																								    getattr(lowerCamelCase__     ,						lowerCamelCase__   )     ,						lowerCamelCase__     ,						msg=F"`{name} value {idx} expected, but was {getattr(lowerCamelCase__     ,						lowerCamelCase__   )}"   )
																		except NotImplementedError:
																								# Some models might not be able to implement setters for common_properties
																								# In that case, a NotImplementedError is raised
																								pass

																								# Test if config class can be called with Config(prop_name=..)
												for idx, name in enumerate(lowerCamelCase__   ):
																		try:
																								lowerCAmelCase__    						=						self.config_class(**{name: idx}   )
																								self.parent.assertEqual(
																								    getattr(lowerCamelCase__     ,						lowerCamelCase__   )     ,						lowerCamelCase__     ,						msg=F"`{name} value {idx} expected, but was {getattr(lowerCamelCase__     ,						lowerCamelCase__   )}"   )
																		except NotImplementedError:
																								# Some models might not be able to implement setters for common_properties
																								# In that case, a NotImplementedError is raised
																								pass






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict   )
												lowerCAmelCase__    						=						json.loads(config.to_json_string()   )
												for key, value in self.inputs_dict.items():
																		self.parent.assertEqual(obj[key]     ,						lowerCamelCase__   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict   )

												with tempfile.TemporaryDirectory() as tmpdirname:
																		lowerCAmelCase__    						=						os.path.join(lowerCamelCase__     ,						'config.json'   )
																		config_first.to_json_file(lowerCamelCase__   )
																		lowerCAmelCase__    						=						self.config_class.from_json_file(lowerCamelCase__   )

												self.parent.assertEqual(config_second.to_dict()     ,						config_first.to_dict()   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict   )

												with tempfile.TemporaryDirectory() as tmpdirname:
																		config_first.save_pretrained(lowerCamelCase__   )
																		lowerCAmelCase__    						=						self.config_class.from_pretrained(lowerCamelCase__   )

												self.parent.assertEqual(config_second.to_dict()     ,						config_first.to_dict()   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict   )

												lowerCAmelCase__    						=						'''test'''
												with tempfile.TemporaryDirectory() as tmpdirname:
																		lowerCAmelCase__    						=						os.path.join(lowerCamelCase__     ,						lowerCamelCase__   )
																		config_first.save_pretrained(lowerCamelCase__   )
																		lowerCAmelCase__    						=						self.config_class.from_pretrained(lowerCamelCase__     ,						subfolder=lowerCamelCase__   )

												self.parent.assertEqual(config_second.to_dict()     ,						config_first.to_dict()   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						self.config_class(**self.inputs_dict     ,						num_labels=5   )
												self.parent.assertEqual(len(config.idalabel   )     ,						5   )
												self.parent.assertEqual(len(config.labelaid   )     ,						5   )

												lowerCAmelCase__    						=						3
												self.parent.assertEqual(len(config.idalabel   )     ,						3   )
												self.parent.assertEqual(len(config.labelaid   )     ,						3   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""






												if self.config_class.is_composition:
																		return
												lowerCAmelCase__    						=						self.config_class()
												self.parent.assertIsNotNone(lowerCamelCase__   )






						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												lowerCAmelCase__    						=						copy.deepcopy(lowerCamelCase__   )
												lowerCAmelCase__    						=						self.config_class(**lowerCamelCase__   )
												lowerCAmelCase__    						=						[]
												for key, value in config_common_kwargs.items():
																		if key == "torch_dtype":
																								if not is_torch_available():
																														continue
																								else:
																														import torch

																														if config.torch_dtype != torch.floataa:
																																				wrong_values.append(('torch_dtype', config.torch_dtype, torch.floataa)   )
																		elif getattr(lowerCamelCase__     ,						lowerCamelCase__   ) != value:
																								wrong_values.append((key, getattr(lowerCamelCase__     ,						lowerCamelCase__   ), value)   )

												if len(lowerCamelCase__   ) > 0:
																		lowerCAmelCase__    						=						'''\n'''.join([F"- {v[0]}: got {v[1]} instead of {v[2]}" for v in wrong_values]   )
																		raise ValueError(F"The following keys were not properly set in the config:\n{errors}"   )







						def       UpperCamelCase__      (	self   ):






												"""simple docstring"""
												self.create_and_test_config_common_properties()
												self.create_and_test_config_to_json_string()
												self.create_and_test_config_to_json_file()
												self.create_and_test_config_from_and_save_pretrained()
												self.create_and_test_config_from_and_save_pretrained_subfolder()
												self.create_and_test_config_with_num_labels()
												self.check_config_can_be_init_without_params()
												self.check_config_arguments_init()













import numpy as np
from PIL import Image







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

						"""simple docstring"""



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

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

						return updated_arr







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

						"""simple docstring"""



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

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

						return updated_arr


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

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

					# Loading the image
					__snake_case    :    List[str]         =     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()





