



import unittest

import numpy as np

from transformers.testing_utils import require_pytesseract, require_torch
from transformers.utils import is_pytesseract_available, is_torch_available

from ...test_image_processing_common import ImageProcessingSavingTestMixin, prepare_image_inputs


if is_torch_available():
							import torch

if is_pytesseract_available():
							from PIL import Image

							from transformers import LayoutLMvaImageProcessor
class 				_snake_case			(					unittest.TestCase):




				def __init__(						self					:						int,					__lowercase					:						List[Any],					__lowercase					:						Union[str, Any]=7,					__lowercase					:						str=3,					__lowercase					:						Optional[Any]=18,					__lowercase					:						Tuple=30,					__lowercase					:						Any=400,					__lowercase					:						Any=True,					__lowercase					:						str=None,					__lowercase					:						Optional[int]=True,					):
							lowercase__					  =				size if size is not None else {"height": 18, "width": 18}
							lowercase__					  =				parent
							lowercase__					  =				batch_size
							lowercase__					  =				num_channels
							lowercase__					  =				image_size
							lowercase__					  =				min_resolution
							lowercase__					  =				max_resolution
							lowercase__					  =				do_resize
							lowercase__					  =				size
							lowercase__					  =				apply_ocr




				def 							A__      (						self					:						Optional[int]						):
							return {"do_resize": self.do_resize, "size": self.size, "apply_ocr": self.apply_ocr}
@require_torch
@require_pytesseract
class 				_snake_case			(					lowercase__    ,	unittest.TestCase):
				UpperCamelCase__				:					List[str]     		=LayoutLMvaImageProcessor if is_pytesseract_available() else None




				def 							A__      (						self					:						Optional[int]						):
							lowercase__					  =				LayoutLMvaImageProcessingTester(self						)




				@property
				def 							A__      (						self					:						Tuple						):
							return self.image_processor_tester.prepare_image_processor_dict()




				def 							A__      (						self					:						int						):
							lowercase__					  =				self.image_processing_class(**self.image_processor_dict						)
							self.assertTrue(hasattr(__lowercase,					"do_resize"						)						)
							self.assertTrue(hasattr(__lowercase,					"size"						)						)
							self.assertTrue(hasattr(__lowercase,					"apply_ocr"						)						)




				def 							A__      (						self					:						Optional[int]						):
							lowercase__					  =				self.image_processing_class.from_dict(self.image_processor_dict						)
							self.assertEqual(image_processor.size,					{"height": 18, "width": 18}						)

							lowercase__					  =				self.image_processing_class.from_dict(self.image_processor_dict,					size=42						)
							self.assertEqual(image_processor.size,					{"height": 42, "width": 42}						)




				def 							A__      (						self					:						Any						):
							pass




				def 							A__      (						self					:						List[Any]						):
							# Initialize image_processing
							lowercase__					  =				self.image_processing_class(**self.image_processor_dict						)
							# create random PIL images
							lowercase__					  =				prepare_image_inputs(self.image_processor_tester,					equal_resolution=__lowercase						)
							for image in image_inputs:
										self.assertIsInstance(__lowercase,					Image.Image						)

							# Test not batched input
							lowercase__					  =				image_processing(image_inputs[0],					return_tensors="pt"						)
							self.assertEqual(
							    encoding.pixel_values.shape,					(
							        1,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)

							self.assertIsInstance(encoding.words,					__lowercase						)
							self.assertIsInstance(encoding.boxes,					__lowercase						)

							# Test batched
							lowercase__					  =				image_processing(__lowercase,					return_tensors="pt"						).pixel_values
							self.assertEqual(
							    encoded_images.shape,					(
							        self.image_processor_tester.batch_size,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)




				def 							A__      (						self					:						Any						):
							# Initialize image_processing
							lowercase__					  =				self.image_processing_class(**self.image_processor_dict						)
							# create random numpy tensors
							lowercase__					  =				prepare_image_inputs(self.image_processor_tester,					equal_resolution=__lowercase,					numpify=__lowercase						)
							for image in image_inputs:
										self.assertIsInstance(__lowercase,					np.ndarray						)

							# Test not batched input
							lowercase__					  =				image_processing(image_inputs[0],					return_tensors="pt"						).pixel_values
							self.assertEqual(
							    encoded_images.shape,					(
							        1,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)

							# Test batched
							lowercase__					  =				image_processing(__lowercase,					return_tensors="pt"						).pixel_values
							self.assertEqual(
							    encoded_images.shape,					(
							        self.image_processor_tester.batch_size,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)




				def 							A__      (						self					:						List[Any]						):
							# Initialize image_processing
							lowercase__					  =				self.image_processing_class(**self.image_processor_dict						)
							# create random PyTorch tensors
							lowercase__					  =				prepare_image_inputs(self.image_processor_tester,					equal_resolution=__lowercase,					torchify=__lowercase						)
							for image in image_inputs:
										self.assertIsInstance(__lowercase,					torch.Tensor						)

							# Test not batched input
							lowercase__					  =				image_processing(image_inputs[0],					return_tensors="pt"						).pixel_values
							self.assertEqual(
							    encoded_images.shape,					(
							        1,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)

							# Test batched
							lowercase__					  =				image_processing(__lowercase,					return_tensors="pt"						).pixel_values
							self.assertEqual(
							    encoded_images.shape,					(
							        self.image_processor_tester.batch_size,
							        self.image_processor_tester.num_channels,
							        self.image_processor_tester.size["height"],
							        self.image_processor_tester.size["width"],
							    ),					)




				def 							A__      (						self					:						List[str]						):
							# with apply_OCR = True
							lowercase__					  =				LayoutLMvaImageProcessor()

							from datasets import load_dataset

							lowercase__					  =				load_dataset("hf-internal-testing/fixtures_docvqa",					split="test"						)

							lowercase__					  =				Image.open(ds[0]["file"]						).convert("RGB"						)

							lowercase__					  =				image_processing(__lowercase,					return_tensors="pt"						)

							self.assertEqual(encoding.pixel_values.shape,					(1, 3, 224, 224)						)
							self.assertEqual(len(encoding.words						),					len(encoding.boxes						)						)

							# fmt: off
							# the words and boxes were obtained with Tesseract 4.1.1
							lowercase__					  =				[["11:14", "to", "11:39", "a.m", "11:39", "to", "11:44", "a.m.", "11:44", "a.m.", "to", "12:25", "p.m.", "12:25", "to", "12:58", "p.m.", "12:58", "to", "4:00", "p.m.", "2:00", "to", "5:00", "p.m.", "Coffee", "Break", "Coffee", "will", "be", "served", "for", "men", "and", "women", "in", "the", "lobby", "adjacent", "to", "exhibit", "area.", "Please", "move", "into", "exhibit", "area.", "(Exhibits", "Open)", "TRRF", "GENERAL", "SESSION", "(PART", "|)", "Presiding:", "Lee", "A.", "Waller", "TRRF", "Vice", "President", "“Introductory", "Remarks”", "Lee", "A.", "Waller,", "TRRF", "Vice", "Presi-", "dent", "Individual", "Interviews", "with", "TRRF", "Public", "Board", "Members", "and", "Sci-", "entific", "Advisory", "Council", "Mem-", "bers", "Conducted", "by", "TRRF", "Treasurer", "Philip", "G.", "Kuehn", "to", "get", "answers", "which", "the", "public", "refrigerated", "warehousing", "industry", "is", "looking", "for.", "Plus", "questions", "from", "the", "floor.", "Dr.", "Emil", "M.", "Mrak,", "University", "of", "Cal-", "ifornia,", "Chairman,", "TRRF", "Board;", "Sam", "R.", "Cecil,", "University", "of", "Georgia", "College", "of", "Agriculture;", "Dr.", "Stanley", "Charm,", "Tufts", "University", "School", "of", "Medicine;", "Dr.", "Robert", "H.", "Cotton,", "ITT", "Continental", "Baking", "Company;", "Dr.", "Owen", "Fennema,", "University", "of", "Wis-", "consin;", "Dr.", "Robert", "E.", "Hardenburg,", "USDA.", "Questions", "and", "Answers", "Exhibits", "Open", "Capt.", "Jack", "Stoney", "Room", "TRRF", "Scientific", "Advisory", "Council", "Meeting", "Ballroom", "Foyer"]]  # noqa: E231
							lowercase__					  =				[[[141, 57, 214, 69], [228, 58, 252, 69], [141, 75, 216, 88], [230, 79, 280, 88], [142, 260, 218, 273], [230, 261, 255, 273], [143, 279, 218, 290], [231, 282, 290, 291], [143, 342, 218, 354], [231, 345, 289, 355], [202, 362, 227, 373], [143, 379, 220, 392], [231, 382, 291, 394], [144, 714, 220, 726], [231, 715, 256, 726], [144, 732, 220, 745], [232, 736, 291, 747], [144, 769, 218, 782], [231, 770, 256, 782], [141, 788, 202, 801], [215, 791, 274, 804], [143, 826, 204, 838], [215, 826, 240, 838], [142, 844, 202, 857], [215, 847, 274, 859], [334, 57, 427, 69], [440, 57, 522, 69], [369, 75, 461, 88], [469, 75, 516, 88], [528, 76, 562, 88], [570, 76, 667, 88], [675, 75, 711, 87], [721, 79, 778, 88], [789, 75, 840, 88], [369, 97, 470, 107], [484, 94, 507, 106], [518, 94, 562, 107], [576, 94, 655, 110], [668, 94, 792, 109], [804, 95, 829, 107], [369, 113, 465, 125], [477, 116, 547, 125], [562, 113, 658, 125], [671, 116, 748, 125], [761, 113, 811, 125], [369, 131, 465, 143], [477, 133, 548, 143], [563, 130, 698, 145], [710, 130, 802, 146], [336, 171, 412, 183], [423, 171, 572, 183], [582, 170, 716, 184], [728, 171, 817, 187], [829, 171, 844, 186], [338, 197, 482, 212], [507, 196, 557, 209], [569, 196, 595, 208], [610, 196, 702, 209], [505, 214, 583, 226], [595, 214, 656, 227], [670, 215, 807, 227], [335, 259, 543, 274], [556, 259, 708, 272], [372, 279, 422, 291], [435, 279, 460, 291], [474, 279, 574, 292], [587, 278, 664, 291], [676, 278, 738, 291], [751, 279, 834, 291], [372, 298, 434, 310], [335, 341, 483, 354], [497, 341, 655, 354], [667, 341, 728, 354], [740, 341, 825, 354], [335, 360, 430, 372], [442, 360, 534, 372], [545, 359, 687, 372], [697, 360, 754, 372], [765, 360, 823, 373], [334, 378, 428, 391], [440, 378, 577, 394], [590, 378, 705, 391], [720, 378, 801, 391], [334, 397, 400, 409], [370, 416, 529, 429], [544, 416, 576, 432], [587, 416, 665, 428], [677, 416, 814, 429], [372, 435, 452, 450], [465, 434, 495, 447], [511, 434, 600, 447], [611, 436, 637, 447], [649, 436, 694, 451], [705, 438, 824, 447], [369, 453, 452, 466], [464, 454, 509, 466], [522, 453, 611, 469], [625, 453, 792, 469], [370, 472, 556, 488], [570, 472, 684, 487], [697, 472, 718, 485], [732, 472, 835, 488], [369, 490, 411, 503], [425, 490, 484, 503], [496, 490, 635, 506], [645, 490, 707, 503], [718, 491, 761, 503], [771, 490, 840, 503], [336, 510, 374, 521], [388, 510, 447, 522], [460, 510, 489, 521], [503, 510, 580, 522], [592, 509, 736, 525], [745, 509, 770, 522], [781, 509, 840, 522], [338, 528, 434, 541], [448, 528, 596, 541], [609, 527, 687, 540], [700, 528, 792, 541], [336, 546, 397, 559], [407, 546, 431, 559], [443, 546, 525, 560], [537, 546, 680, 562], [688, 546, 714, 559], [722, 546, 837, 562], [336, 565, 449, 581], [461, 565, 485, 577], [497, 565, 665, 581], [681, 565, 718, 577], [732, 565, 837, 580], [337, 584, 438, 597], [452, 583, 521, 596], [535, 584, 677, 599], [690, 583, 787, 596], [801, 583, 825, 596], [338, 602, 478, 615], [492, 602, 530, 614], [543, 602, 638, 615], [650, 602, 676, 614], [688, 602, 788, 615], [802, 602, 843, 614], [337, 621, 502, 633], [516, 621, 615, 637], [629, 621, 774, 636], [789, 621, 827, 633], [337, 639, 418, 652], [432, 640, 571, 653], [587, 639, 731, 655], [743, 639, 769, 652], [780, 639, 841, 652], [338, 658, 440, 673], [455, 658, 491, 670], [508, 658, 602, 671], [616, 658, 638, 670], [654, 658, 835, 674], [337, 677, 429, 689], [337, 714, 482, 726], [495, 714, 548, 726], [561, 714, 683, 726], [338, 770, 461, 782], [474, 769, 554, 785], [489, 788, 562, 803], [576, 788, 643, 801], [656, 787, 751, 804], [764, 788, 844, 801], [334, 825, 421, 838], [430, 824, 574, 838], [584, 824, 723, 841], [335, 844, 450, 857], [464, 843, 583, 860], [628, 862, 755, 875], [769, 861, 848, 878]]]  # noqa: E231
							# fmt: on

							self.assertListEqual(encoding.words,					__lowercase						)
							self.assertListEqual(encoding.boxes,					__lowercase						)

							# with apply_OCR = False
							lowercase__					  =				LayoutLMvaImageProcessor(apply_ocr=__lowercase						)

							lowercase__					  =				image_processing(__lowercase,					return_tensors="pt"						)

							self.assertEqual(encoding.pixel_values.shape,					(1, 3, 224, 224)						)









import pickle

import numpy as np
from matplotlib import pyplot as plt
class 				_snake_case			:




				def __init__(						self					:						Tuple,					__lowercase					:						Union[str, Any],					__lowercase					:						int,					__lowercase					:						Union[str, Any],					__lowercase					:						str,					__lowercase					:						List[Any],					__lowercase					:						List[str]=0.2,					__lowercase					:						List[str]=0.2						):
							lowercase__					  =				bp_numa
							lowercase__					  =				bp_numa
							lowercase__					  =				bp_numa
							lowercase__					  =				conva_get[:2]
							lowercase__					  =				conva_get[2]
							lowercase__					  =				size_pa
							lowercase__					  =				rate_w
							lowercase__					  =				rate_t
							lowercase__					  =				[
							    np.mat(-1 * np.random.rand(self.conva[0],					self.conva[0]						) + 0.5						)
							    for i in range(self.conva[1]						)
							]
							lowercase__					  =				np.mat(-1 * np.random.rand(self.num_bpa,					self.num_bpa						) + 0.5						)
							lowercase__					  =				np.mat(-1 * np.random.rand(self.num_bpa,					self.num_bpa						) + 0.5						)
							lowercase__					  =				-2 * np.random.rand(self.conva[1]						) + 1
							lowercase__					  =				-2 * np.random.rand(self.num_bpa						) + 1
							lowercase__					  =				-2 * np.random.rand(self.num_bpa						) + 1




				def 							A__      (						self					:						Any,					__lowercase					:						List[str]						):
							# save model dict with pickle
							lowercase__					  =				{
							    "num_bp1": self.num_bpa,
							    "num_bp2": self.num_bpa,
							    "num_bp3": self.num_bpa,
							    "conv1": self.conva,
							    "step_conv1": self.step_conva,
							    "size_pooling1": self.size_poolinga,
							    "rate_weight": self.rate_weight,
							    "rate_thre": self.rate_thre,
							    "w_conv1": self.w_conva,
							    "wkj": self.wkj,
							    "vji": self.vji,
							    "thre_conv1": self.thre_conva,
							    "thre_bp2": self.thre_bpa,
							    "thre_bp3": self.thre_bpa,
							}
							with open(__lowercase,					"wb"						) as f:
										pickle.dump(__lowercase,					__lowercase						)

							print(F'''Model saved： {save_path}'''						)




				@classmethod
				def 							A__      (						cls					:						Dict,					__lowercase					:						Union[str, Any]						):
							# read saved model
							with open(__lowercase,					"rb"						) as f:
										lowercase__					  =				pickle.load(__lowercase						)  # noqa: S301

							lowercase__					  =				model_dic.get("conv1"						)
							conv_get.append(model_dic.get("step_conv1"						)						)
							lowercase__					  =				model_dic.get("size_pooling1"						)
							lowercase__					  =				model_dic.get("num_bp1"						)
							lowercase__					  =				model_dic.get("num_bp2"						)
							lowercase__					  =				model_dic.get("num_bp3"						)
							lowercase__					  =				model_dic.get("rate_weight"						)
							lowercase__					  =				model_dic.get("rate_thre"						)
							# create model instance
							lowercase__					  =				CNN(__lowercase,					__lowercase,					__lowercase,					__lowercase,					__lowercase,					__lowercase,					__lowercase						)
							# modify model parameter
							lowercase__					  =				model_dic.get("w_conv1"						)
							lowercase__					  =				model_dic.get("wkj"						)
							lowercase__					  =				model_dic.get("vji"						)
							lowercase__					  =				model_dic.get("thre_conv1"						)
							lowercase__					  =				model_dic.get("thre_bp2"						)
							lowercase__					  =				model_dic.get("thre_bp3"						)
							return conv_ins




				def 							A__      (						self					:						str,					__lowercase					:						List[Any]						):
							return 1 / (1 + np.exp(-1 * x						))




				def 							A__      (						self					:						List[str],					__lowercase					:						Optional[Any]						):
							return round(__lowercase,					3						)




				def 							A__      (						self					:						Optional[Any],					__lowercase					:						Dict,					__lowercase					:						Optional[int],					__lowercase					:						Optional[int],					__lowercase					:						Optional[Any],					__lowercase					:						str						):
							# convolution process
							lowercase__					  =				convs[0]
							lowercase__					  =				convs[1]
							lowercase__					  =				np.shape(__lowercase						)[0]
							# get the data slice of original image data, data_focus
							lowercase__					  =				[]
							for i_focus in range(0,					size_data - size_conv + 1,					__lowercase						):
										for j_focus in range(0,					size_data - size_conv + 1,					__lowercase						):
													lowercase__					  =				data[
													    i_focus : i_focus + size_conv, j_focus : j_focus + size_conv
													]
													data_focus.append(__lowercase						)
        # calculate the feature map of every single kernel, and saved as list of matrix
							lowercase__					  =				[]
							lowercase__					  =				int((size_data - size_conv) / conv_step + 1						)
							for i_map in range(__lowercase						):
										lowercase__					  =				[]
										for i_focus in range(len(__lowercase						)						):
													lowercase__					  =				(
													    np.sum(np.multiply(data_focus[i_focus],					w_convs[i_map]						)						)
													    - thre_convs[i_map]
													)
													featuremap.append(self.sig(__lowercase						)						)
										lowercase__					  =				np.asmatrix(__lowercase						).reshape(
										    __lowercase,					__lowercase						)
										data_featuremap.append(__lowercase						)

							# expanding the data slice to One dimenssion
							lowercase__					  =				[]
							for each_focus in data_focus:
										focusa_list.extend(self.Expand_Mat(__lowercase						)						)
							lowercase__					  =				np.asarray(__lowercase						)
							return focus_list, data_featuremap




				def 							A__      (						self					:						List[Any],					__lowercase					:						Any,					__lowercase					:						List[Any],					__lowercase					:						Union[str, Any]="average_pool"						):
							# pooling process
							lowercase__					  =				len(featuremaps[0]						)
							lowercase__					  =				int(size_map / size_pooling						)
							lowercase__					  =				[]
							for i_map in range(len(__lowercase						)						):
										lowercase__					  =				featuremaps[i_map]
										lowercase__					  =				[]
										for i_focus in range(0,					__lowercase,					__lowercase						):
													for j_focus in range(0,					__lowercase,					__lowercase						):
																lowercase__					  =				feature_map[
																    i_focus : i_focus + size_pooling,
																    j_focus : j_focus + size_pooling,
																]
																if pooling_type == "average_pool":
																			# average pooling
																			map_pooled.append(np.average(__lowercase						)						)
																elif pooling_type == "max_pooling":
																			# max pooling
																			map_pooled.append(np.max(__lowercase						)						)
										lowercase__					  =				np.asmatrix(__lowercase						).reshape(__lowercase,					__lowercase						)
										featuremap_pooled.append(__lowercase						)
							return featuremap_pooled




				def 							A__      (						self					:						str,					__lowercase					:						Optional[Any]						):
							# expanding three dimension data to one dimension list
							lowercase__					  =				[]
							for i in range(len(__lowercase						)						):
										lowercase__					  =				np.shape(data[i]						)
										lowercase__					  =				data[i].reshape(1,					shapes[0] * shapes[1]						)
										lowercase__					  =				data_listed.getA().tolist()[0]
										data_expanded.extend(__lowercase						)
							lowercase__					  =				np.asarray(__lowercase						)
							return data_expanded




				def 							A__      (						self					:						Optional[int],					__lowercase					:						Optional[int]						):
							# expanding matrix to one dimension list
							lowercase__					  =				np.asarray(__lowercase						)
							lowercase__					  =				np.shape(__lowercase						)
							lowercase__					  =				data_mat.reshape(1,					shapes[0] * shapes[1]						)
							return data_expanded




				def 							A__      (						self					:						str,					__lowercase					:						Tuple,					__lowercase					:						List[Any],					__lowercase					:						Any,					__lowercase					:						Union[str, Any],					__lowercase					:						Tuple						):
							lowercase__					  =				[]
							lowercase__					  =				0
							for i_map in range(__lowercase						):
										lowercase__					  =				np.ones((size_map, size_map)						)
										for i in range(0,					__lowercase,					__lowercase						):
													for j in range(0,					__lowercase,					__lowercase						):
																lowercase__					  =				pd_pool[
																    i_pool
																]
																lowercase__					  =				i_pool + 1
										lowercase__					  =				np.multiply(
										    __lowercase,					np.multiply(out_map[i_map],					(1 - out_map[i_map])						)						)
										pd_all.append(__lowercase						)
							return pd_all




				def 							A__      (						self					:						Tuple,					__lowercase					:						int,					__lowercase					:						Optional[Any],					__lowercase					:						List[Any],					__lowercase					:						Optional[Any],					__lowercase					:						List[Any],					__lowercase					:						List[str]=bool						):
							# model traning
							print("----------------------Start Training-------------------------"						)
							print((" - - Shape: Train_Data  ", np.shape(__lowercase						))						)
							print((" - - Shape: Teach_Data  ", np.shape(__lowercase						))						)
							lowercase__					  =				0
							lowercase__					  =				[]
							lowercase__					  =				1_0000
							while rp < n_repeat and mse >= error_accuracy:
										lowercase__					  =				0
										print(F'''-------------Learning Time {rp}--------------'''						)
										for p in range(len(__lowercase						)						):
													# print('------------Learning Image: %d--------------'%p)
													lowercase__					  =				np.asmatrix(datas_train[p]						)
													lowercase__					  =				np.asarray(datas_teach[p]						)
													lowercase__  ,       lowercase__					  =				self.convolute(
													    __lowercase,					self.conva,					self.w_conva,					self.thre_conva,					conv_step=self.step_conva,					)
													lowercase__					  =				self.pooling(__lowercase,					self.size_poolinga						)
													lowercase__					  =				np.shape(__lowercase						)
													lowercase__					  =				self._expand(__lowercase						)
													lowercase__					  =				data_bp_input

													lowercase__					  =				np.dot(__lowercase,					self.vji.T						) - self.thre_bpa
													lowercase__					  =				self.sig(__lowercase						)
													lowercase__					  =				np.dot(__lowercase,					self.wkj.T						) - self.thre_bpa
													lowercase__					  =				self.sig(__lowercase						)

													# --------------Model Leaning ------------------------
													# calculate error and gradient---------------
													lowercase__					  =				np.multiply(
													    (data_teach - bp_outa),					np.multiply(__lowercase,					(1 - bp_outa)						)						)
													lowercase__					  =				np.multiply(
													    np.dot(__lowercase,					self.wkj						),					np.multiply(__lowercase,					(1 - bp_outa)						)						)
													lowercase__					  =				np.dot(__lowercase,					self.vji						)

													lowercase__					  =				pd_i_all / (self.size_poolinga * self.size_poolinga)
													lowercase__					  =				pd_conva_pooled.T.getA().tolist()
													lowercase__					  =				self._calculate_gradient_from_pool(
													    __lowercase,					__lowercase,					shape_featuremapa[0],					shape_featuremapa[1],					self.size_poolinga,					)
													# weight and threshold learning process---------
													# convolution layer
													for k_conv in range(self.conva[1]						):
																lowercase__					  =				self._expand_mat(pd_conva_all[k_conv]						)
																lowercase__					  =				self.rate_weight * np.dot(__lowercase,					__lowercase						)

																lowercase__					  =				self.w_conva[k_conv] + delta_w.reshape(
																    (self.conva[0], self.conva[0])						)

																lowercase__					  =				(
																    self.thre_conva[k_conv]
																    - np.sum(pd_conva_all[k_conv]						) * self.rate_thre
																)
													# all connected layer
													lowercase__					  =				self.wkj + pd_k_all.T * bp_outa * self.rate_weight
													lowercase__					  =				self.vji + pd_j_all.T * bp_outa * self.rate_weight
													lowercase__					  =				self.thre_bpa - pd_k_all * self.rate_thre
													lowercase__					  =				self.thre_bpa - pd_j_all * self.rate_thre
													# calculate the sum error of all single image
													lowercase__					  =				np.sum(abs(data_teach - bp_outa						)						)
													error_count += errors
													# print('   ----Teach      ',data_teach)
													# print('   ----BP_output  ',bp_out3)
										lowercase__					  =				rp + 1
										lowercase__					  =				error_count / patterns
										all_mse.append(__lowercase						)

							def draw_error():
										lowercase__					  =				[error_accuracy for i in range(int(n_repeat * 1.2						)						)]
										plt.plot(__lowercase,					"+-"						)
										plt.plot(__lowercase,					"r--"						)
										plt.xlabel("Learning Times"						)
										plt.ylabel("All_mse"						)
										plt.grid(__lowercase,					alpha=0.5						)
										plt.show()

							print("------------------Training Complished---------------------"						)
							print((" - - Training epoch: ", rp, F'''     - - Mse: {mse:.6f}''')						)
							if draw_e:
										draw_error()
							return mse




				def 							A__      (						self					:						List[str],					__lowercase					:						Optional[int]						):
							# model predict
							lowercase__					  =				[]
							print("-------------------Start Testing-------------------------"						)
							print((" - - Shape: Test_Data  ", np.shape(__lowercase						))						)
							for p in range(len(__lowercase						)						):
										lowercase__					  =				np.asmatrix(datas_test[p]						)
										lowercase__  ,       lowercase__					  =				self.convolute(
										    __lowercase,					self.conva,					self.w_conva,					self.thre_conva,					conv_step=self.step_conva,					)
										lowercase__					  =				self.pooling(__lowercase,					self.size_poolinga						)
										lowercase__					  =				self._expand(__lowercase						)

										lowercase__					  =				data_bp_input
										lowercase__					  =				bp_outa * self.vji.T - self.thre_bpa
										lowercase__					  =				self.sig(__lowercase						)
										lowercase__					  =				bp_outa * self.wkj.T - self.thre_bpa
										lowercase__					  =				self.sig(__lowercase						)
										produce_out.extend(bp_outa.getA().tolist()						)
							lowercase__					  =				[list(map(self.do_round,					__lowercase						)						) for each in produce_out]
							return np.asarray(__lowercase						)




				def 							A__      (						self					:						int,					__lowercase					:						Any						):
							# return the data of image after convoluting process so we can check it out
							lowercase__					  =				np.asmatrix(__lowercase						)
							lowercase__  ,       lowercase__					  =				self.convolute(
							    __lowercase,					self.conva,					self.w_conva,					self.thre_conva,					conv_step=self.step_conva,					)
							lowercase__					  =				self.pooling(__lowercase,					self.size_poolinga						)

							return data_conveda, data_pooleda


if __name__ == "__main__":
							pass




