



'''simple docstring'''





import argparse
from collections import defaultdict

import yaml


A__    :   int           =					'''docs/source/en/_toctree.yml'''





def   a_   (		_UpperCAmelCase    :      Any				)    ->  Optional[int]:
      __snake_case :   List[str]													=    defaultdict(_UpperCAmelCase				)
      for doc in model_doc:
            counts[doc["local"]] += 1
      __snake_case :   int													=    [key for key, value in counts.items() if value > 1]

      __snake_case :   Union[str, Any]													=    []
      for duplicate_key in duplicates:
            __snake_case :   Any													=    list({doc['title'] for doc in model_doc if doc['local'] == duplicate_key}				)
            if len(_UpperCAmelCase				) > 1:
                  raise ValueError(
                      f'''{duplicate_key} is present several times in the documentation table of content at '''
                      '`docs/source/en/_toctree.yml` with different *Title* values. Choose one of those and remove the '
                      'others.'				)
            # Only add this once
            new_doc.append({'local': duplicate_key, 'title': titles[0]}				)

      # Add none duplicate-keys
      new_doc.extend([doc for doc in model_doc if counts[doc['local']] == 1]				)

      # Sort
      return sorted(_UpperCAmelCase ,key=lambda _UpperCAmelCase				: s["title"].lower()				)





def   a_   (		_UpperCAmelCase    :      Optional[Any]=False				)    ->  Any:
      with open(_UpperCAmelCase ,encoding='utf-8'				) as f:
            __snake_case :   Tuple													=    yaml.safe_load(f.read()				)

      # Get to the API doc
      __snake_case :   Union[str, Any]													=    0
      while content[api_idx]["title"] != "API":
            api_idx += 1
      __snake_case :   List[str]													=    content[api_idx]['sections']

      # Then to the model doc
      __snake_case :   Optional[Any]													=    0
      while api_doc[model_idx]["title"] != "Models":
            model_idx += 1

      __snake_case :   Optional[int]													=    api_doc[model_idx]['sections']

      __snake_case :   int													=    [(idx, section) for idx, section in enumerate(_UpperCAmelCase				) if 'sections' in section]
      __snake_case :   Optional[int]													=    False
      for idx, modality_doc in modalities_docs:
            __snake_case :   Any													=    modality_doc['sections']
            __snake_case :   Union[str, Any]													=    clean_model_doc_toc(_UpperCAmelCase				)

            if old_modality_doc != new_modality_doc:
                  __snake_case :   str													=    True
                  if overwrite:
                        __snake_case :   Tuple													=    new_modality_doc

      if diff:
            if overwrite:
                  __snake_case :   Optional[int]													=    model_doc
                  __snake_case :   Optional[Any]													=    api_doc
                  with open(_UpperCAmelCase ,'w' ,encoding='utf-8'				) as f:
                        f.write(yaml.dump(_UpperCAmelCase ,allow_unicode=_UpperCAmelCase				)				)
            else:
                  raise ValueError(
                      'The model doc part of the table of content is not properly sorted, run `make style` to fix this.'				)


if __name__ == "__main__":
    A__    :   str           =					argparse.ArgumentParser()
    parser.add_argument('''--fix_and_overwrite''', action='''store_true''', help='''Whether to fix inconsistencies.''')
    A__    :   Tuple           =					parser.parse_args()

    check_model_doc(args.fix_and_overwrite)








'''simple docstring'''





import pickle

import numpy as np
from matplotlib import pyplot as plt



class  snake_case__						:
 def __init__(   self						:							List[Any]      ,     __a						:							str      ,     __a						:							Dict      ,     __a						:							List[Any]      ,     __a						:							str      ,     __a						:							str      ,     __a						:							List[str]=0.2      ,     __a						:							Any=0.2  )      ->   Any:







       '''simple docstring'''
       __snake_case :   Any													=    bp_numa
       __snake_case :   str													=    bp_numa
       __snake_case :   Optional[Any]													=    bp_numa
       __snake_case :   Any													=    conva_get[:2]
       __snake_case :   Dict													=    conva_get[2]
       __snake_case :   Optional[int]													=    size_pa
       __snake_case :   str													=    rate_w
       __snake_case :   Optional[Any]													=    rate_t
       __snake_case :   Optional[Any]													=    [
           np.mat(-1 * np.random.rand(self.conva[0]      ,     self.conva[0]  ) + 0.5  )
           for i in range(self.conva[1]  )
       ]
       __snake_case :   List[Any]													=    np.mat(-1 * np.random.rand(self.num_bpa      ,     self.num_bpa  ) + 0.5  )
       __snake_case :   Any													=    np.mat(-1 * np.random.rand(self.num_bpa      ,     self.num_bpa  ) + 0.5  )
       __snake_case :   Optional[int]													=    -2 * np.random.rand(self.conva[1]  ) + 1
       __snake_case :   Optional[Any]													=    -2 * np.random.rand(self.num_bpa  ) + 1
       __snake_case :   str													=    -2 * np.random.rand(self.num_bpa  ) + 1
 def A_   (   self						:							int      ,     __a						:							Dict  )      ->   Optional[Any]:







       '''simple docstring'''
       # save model dict with pickle
       __snake_case :   int													=    {
           '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(__a      ,     'wb'  ) as f:
             pickle.dump(__a      ,     __a  )

       print(f'''Model saved： {save_path}'''  )
 @classmethod
 def A_   (   cls						:							List[Any]      ,     __a						:							Union[str, Any]  )      ->   int:







       '''simple docstring'''
       # read saved model
       with open(__a      ,     'rb'  ) as f:
             __snake_case :   Dict													=    pickle.load(__a  )  # noqa: S301

       __snake_case :   Tuple													=    model_dic.get('conv1'  )
       conv_get.append(model_dic.get('step_conv1'  )  )
       __snake_case :   Optional[Any]													=    model_dic.get('size_pooling1'  )
       __snake_case :   int													=    model_dic.get('num_bp1'  )
       __snake_case :   Optional[Any]													=    model_dic.get('num_bp2'  )
       __snake_case :   Optional[Any]													=    model_dic.get('num_bp3'  )
       __snake_case :   Any													=    model_dic.get('rate_weight'  )
       __snake_case :   Optional[int]													=    model_dic.get('rate_thre'  )
       # create model instance
       __snake_case :   Any													=    CNN(__a      ,     __a      ,     __a      ,     __a      ,     __a      ,     __a      ,     __a  )
       # modify model parameter
       __snake_case :   Dict													=    model_dic.get('w_conv1'  )
       __snake_case :   Any													=    model_dic.get('wkj'  )
       __snake_case :   List[str]													=    model_dic.get('vji'  )
       __snake_case :   int													=    model_dic.get('thre_conv1'  )
       __snake_case :   Optional[int]													=    model_dic.get('thre_bp2'  )
       __snake_case :   List[Any]													=    model_dic.get('thre_bp3'  )
       return conv_ins
 def A_   (   self						:							List[Any]      ,     __a						:							Tuple  )      ->   Optional[int]:







       '''simple docstring'''
       return 1 / (1 + np.exp(-1 * x  ))
 def A_   (   self						:							Any      ,     __a						:							Union[str, Any]  )      ->   List[Any]:







       '''simple docstring'''
       return round(__a      ,     3  )
 def A_   (   self						:							Optional[Any]      ,     __a						:							Tuple      ,     __a						:							List[str]      ,     __a						:							Dict      ,     __a						:							Optional[int]      ,     __a						:							List[str]  )      ->   str:







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

       # expanding the data slice to One dimenssion
       __snake_case :   Union[str, Any]													=    []
       for each_focus in data_focus:
             focusa_list.extend(self.Expand_Mat(__a  )  )
       __snake_case :   List[Any]													=    np.asarray(__a  )
       return focus_list, data_featuremap
 def A_   (   self						:							Any      ,     __a						:							int      ,     __a						:							Tuple      ,     __a						:							List[Any]="average_pool"  )      ->   Dict:







       '''simple docstring'''
       # pooling process
       __snake_case :   List[str]													=    len(featuremaps[0]  )
       __snake_case :   Tuple													=    int(size_map / size_pooling  )
       __snake_case :   int													=    []
       for i_map in range(len(__a  )  ):
             __snake_case :   str													=    featuremaps[i_map]
             __snake_case :   Optional[Any]													=    []
             for i_focus in range(0      ,     __a      ,     __a  ):
                   for j_focus in range(0      ,     __a      ,     __a  ):
                         __snake_case :   Dict													=    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(__a  )  )
                         elif pooling_type == "max_pooling":
                               # max pooling
                               map_pooled.append(np.max(__a  )  )
             __snake_case :   List[str]													=    np.asmatrix(__a  ).reshape(__a      ,     __a  )
             featuremap_pooled.append(__a  )
       return featuremap_pooled
 def A_   (   self						:							List[str]      ,     __a						:							Union[str, Any]  )      ->   int:







       '''simple docstring'''
       # expanding three dimension data to one dimension list
       __snake_case :   Tuple													=    []
       for i in range(len(__a  )  ):
             __snake_case :   Optional[int]													=    np.shape(data[i]  )
             __snake_case :   List[str]													=    data[i].reshape(1      ,     shapes[0] * shapes[1]  )
             __snake_case :   List[Any]													=    data_listed.getA().tolist()[0]
             data_expanded.extend(__a  )
       __snake_case :   Optional[int]													=    np.asarray(__a  )
       return data_expanded
 def A_   (   self						:							Union[str, Any]      ,     __a						:							int  )      ->   Any:







       '''simple docstring'''
       # expanding matrix to one dimension list
       __snake_case :   int													=    np.asarray(__a  )
       __snake_case :   str													=    np.shape(__a  )
       __snake_case :   Any													=    data_mat.reshape(1      ,     shapes[0] * shapes[1]  )
       return data_expanded
 def A_   (   self						:							List[Any]      ,     __a						:							str      ,     __a						:							Optional[int]      ,     __a						:							List[str]      ,     __a						:							int      ,     __a						:							List[str]  )      ->   Dict:







       '''simple docstring'''
       __snake_case :   Union[str, Any]													=    []
       __snake_case :   Tuple													=    0
       for i_map in range(__a  ):
             __snake_case :   Union[str, Any]													=    np.ones((size_map, size_map)  )
             for i in range(0      ,     __a      ,     __a  ):
                   for j in range(0      ,     __a      ,     __a  ):
                         __snake_case :   Any													=    pd_pool[
                             i_pool
                         ]
                         __snake_case :   List[Any]													=    i_pool + 1
             __snake_case :   List[Any]													=    np.multiply(
                 __a      ,     np.multiply(out_map[i_map]      ,     (1 - out_map[i_map])  )  )
             pd_all.append(__a  )
       return pd_all
 def A_   (   self						:							Tuple      ,     __a						:							List[str]      ,     __a						:							Optional[int]      ,     __a						:							Union[str, Any]      ,     __a						:							Dict      ,     __a						:							Tuple      ,     __a						:							Optional[int]=bool  )      ->   List[Any]:







       '''simple docstring'''
       # model traning
       print('----------------------Start Training-------------------------'  )
       print((' - - Shape: Train_Data  ', np.shape(__a  ))  )
       print((' - - Shape: Teach_Data  ', np.shape(__a  ))  )
       __snake_case :   str													=    0
       __snake_case :   List[str]													=    []
       __snake_case :   List[Any]													=    10000
       while rp < n_repeat and mse >= error_accuracy:
             __snake_case :   int													=    0
             print(f'''-------------Learning Time {rp}--------------'''  )
             for p in range(len(__a  )  ):
                   # print('------------Learning Image: %d--------------'%p)
                   __snake_case :   List[Any]													=    np.asmatrix(datas_train[p]  )
                   __snake_case :   Optional[Any]													=    np.asarray(datas_teach[p]  )
                   __snake_case							,     __snake_case :   List[Any]													=    self.convolute(
                       __a      ,     self.conva      ,     self.w_conva      ,     self.thre_conva      ,     conv_step=self.step_conva      ,     )
                   __snake_case :   Tuple													=    self.pooling(__a      ,     self.size_poolinga  )
                   __snake_case :   Dict													=    np.shape(__a  )
                   __snake_case :   Tuple													=    self._expand(__a  )
                   __snake_case :   str													=    data_bp_input

                   __snake_case :   List[Any]													=    np.dot(__a      ,     self.vji.T  ) - self.thre_bpa
                   __snake_case :   Any													=    self.sig(__a  )
                   __snake_case :   Tuple													=    np.dot(__a      ,     self.wkj.T  ) - self.thre_bpa
                   __snake_case :   Optional[Any]													=    self.sig(__a  )

                   # --------------Model Leaning ------------------------
                   # calculate error and gradient---------------
                   __snake_case :   Tuple													=    np.multiply(
                       (data_teach - bp_outa)      ,     np.multiply(__a      ,     (1 - bp_outa)  )  )
                   __snake_case :   Tuple													=    np.multiply(
                       np.dot(__a      ,     self.wkj  )      ,     np.multiply(__a      ,     (1 - bp_outa)  )  )
                   __snake_case :   Union[str, Any]													=    np.dot(__a      ,     self.vji  )

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

                         __snake_case :   List[Any]													=    self.w_conva[k_conv] + delta_w.reshape(
                             (self.conva[0], self.conva[0])  )

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

       def draw_error():
             __snake_case :   Union[str, Any]													=    [error_accuracy for i in range(int(n_repeat * 1.2  )  )]
             plt.plot(__a      ,     '+-'  )
             plt.plot(__a      ,     'r--'  )
             plt.xlabel('Learning Times'  )
             plt.ylabel('All_mse'  )
             plt.grid(__a      ,     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						:							Tuple      ,     __a						:							Union[str, Any]  )      ->   List[Any]:







       '''simple docstring'''
       # model predict
       __snake_case :   str													=    []
       print('-------------------Start Testing-------------------------'  )
       print((' - - Shape: Test_Data  ', np.shape(__a  ))  )
       for p in range(len(__a  )  ):
             __snake_case :   int													=    np.asmatrix(datas_test[p]  )
             __snake_case							,     __snake_case :   str													=    self.convolute(
                 __a      ,     self.conva      ,     self.w_conva      ,     self.thre_conva      ,     conv_step=self.step_conva      ,     )
             __snake_case :   List[str]													=    self.pooling(__a      ,     self.size_poolinga  )
             __snake_case :   List[Any]													=    self._expand(__a  )

             __snake_case :   Optional[Any]													=    data_bp_input
             __snake_case :   Optional[Any]													=    bp_outa * self.vji.T - self.thre_bpa
             __snake_case :   Any													=    self.sig(__a  )
             __snake_case :   Any													=    bp_outa * self.wkj.T - self.thre_bpa
             __snake_case :   str													=    self.sig(__a  )
             produce_out.extend(bp_outa.getA().tolist()  )
       __snake_case :   List[Any]													=    [list(map(self.do_round      ,     __a  )  ) for each in produce_out]
       return np.asarray(__a  )





 def A_   (   self						:							Optional[Any]      ,     __a						:							Optional[int]  )      ->   Tuple:







       '''simple docstring'''
       # return the data of image after convoluting process so we can check it out
       __snake_case :   int													=    np.asmatrix(__a  )
       __snake_case							,     __snake_case :   int													=    self.convolute(
           __a      ,     self.conva      ,     self.w_conva      ,     self.thre_conva      ,     conv_step=self.step_conva      ,     )
       __snake_case :   Dict													=    self.pooling(__a      ,     self.size_poolinga  )

       return data_conveda, data_pooleda


if __name__ == "__main__":
    pass



