###### ------------------- nastavení hyperparametrů a konstant pro DP -----------------

### importy
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
import random
import json
import os
import matplotlib.pyplot as plt

class Config:

    ##### ##################### volba modelu #####################

    #### ########## ---------- model Optim 1 ---------- ###########

    ### -------------- hyperparametry --------------
    batch_size = 30
    learning_rate = 0.001
    num_epochs = 54
    drop_out = 0.1

    ### -------------- parametry modelu --------------
    ## optim1
    model_note = 'optim1'
    levels = 6  ## počet residuálních bloků (= ResNet) = 6
    lvl1_size = 4  ## počet filtrů každé konvoluční vrstvy uvnitř 1. residuálního bloku - o násobky se zvětšuje hloubka v blocích = 12
    convs_in_layer = 2  ## počet konvolučních vrstev uvnitř jednotlivých bloků = 4
    init_conv = lvl1_size  ## počet filtrů v úvodní konvoluční vrstvě - init_conv = výstupní počet příznaků pro self.init_conv (1. konv. vrstva) = 12
    filter_size = 7  ## velikost kernelu = 3

    ## název souboru s parametry modelu
    load_model_name = 'model_optim1_1376_ep_100_bs_30_lr_0.001_do_0.1_epoch_54.pth.tar'

    ### -------------- klasifikace paroxysmální FiS --------------
    ## optim 1
    threshold_std = 1.1
    threshold_max = 5.3



    #### ########## ---------- model Default ---------- ###########

    # ### -------------- hyperparametry --------------
    # batch_size = 30
    # learning_rate = 0.001
    # num_epochs = 66
    # drop_out = 0.1
    #
    # ### -------------- parametry modelu --------------
    #
    # ## default
    # model_note = 'default'
    # levels = 6                ## počet residuálních bloků (= ResNet) = 6
    # lvl1_size = 12            ## počet filtrů každé konvoluční vrstvy uvnitř 1. residuálního bloku - o násobky se zvětšuje hloubka v blocích = 12
    # convs_in_layer = 4        ## počet konvolučních vrstev uvnitř jednotlivých bloků = 4
    # init_conv = lvl1_size     ## počet filtrů v úvodní konvoluční vrstvě - init_conv = výstupní počet příznaků pro self.init_conv (1. konv. vrstva) = 12
    # filter_size = 3           ## velikost kernelu = 3
    #
    # ## název souboru s parametry modelu
    # load_model_name = 'model_default_1376_ep_100_bs_30_lr_0.001_do_0.1_epoch_66.pth.tar'
    #
    # ### -------------- klasifikace paroxysmální FiS --------------
    # ## default
    # threshold_std = 0.9
    # threshold_max = 4.2



    #### ########## ---------- model Optim 2 ---------- ###########

    # ### -------------- hyperparametry --------------
    # batch_size = 30
    # learning_rate = 0.001
    # num_epochs = 52
    # drop_out = 0.1
    #
    # ### -------------- parametry modelu --------------
    #
    # ## optim2
    # model_note = 'optim2'
    # levels = 6                  ## počet residuálních bloků (= ResNet) = 6
    # lvl1_size = 6               ## počet filtrů každé konvoluční vrstvy uvnitř 1. residuálního bloku - o násobky se zvětšuje hloubka v blocích = 12
    # convs_in_layer = 3          ## počet konvolučních vrstev uvnitř jednotlivých bloků = 4
    # init_conv = lvl1_size       ## počet filtrů v úvodní konvoluční vrstvě - init_conv = výstupní počet příznaků pro self.init_conv (1. konv. vrstva) = 12
    # filter_size = 5             ## velikost kernelu = 3
    #
    # ## název souboru s parametry modelu
    # load_model_name = 'model_optim2_1376_ep_100_bs_30_lr_0.001_do_0.1_epoch_52.pth.tar'
    #
    # ### klasifikace paroxysmální FiS
    # ## optim 2
    # threshold_std = 0.95
    # threshold_max = 5.5

    #####  ###############################################################



    input_size = 2 ## train data
    output_size = 2
    mil_solution = 'max'
    # mil_solution = 'mean'

    ## -------------- délka signálu - počet sekund --------------
    number_of_secs = 30
    factor = 3  ## proměnná na vytvoření intervalu (okna) - 30 a 3 = 10s

    ## -------------- konstanty pro načtení daného počtu signálů s danou délkou --------------
    max_number_of_parox = 344   # 30 a 3 = 344

    max_number_of_persi = max_number_of_parox
    max_number_of_non = max_number_of_parox + max_number_of_persi
    number_of_signals = max_number_of_parox + max_number_of_persi + max_number_of_non
    ## -------------- název modelu pro uložení do souboru --------------
    model_name = f'model_{model_note}_{number_of_signals}_ep_{num_epochs}_bs_{batch_size}_lr_{learning_rate}_do_{drop_out}.pth.tar'

    ### -------------- proměnné pro načtení parametrů modelu ze souboru --------------
    ## True = načtení modelu; False = trénování modelu od začátku
    load_model = True
    # load_model = False

    ### -------------- načtení dat ve složce - datareader --------------
    ## cesta pro načtení trénovacích a testovacích dat
    path_train = 'ECG_records'
    ## název souboru s názvy trénovacích a testovacích dat, které jsou použity pro trénování
    file_of_sample_names = 'RECORDS_train_all.txt' ## všechny soubory
    file_of_sample_names_trial = 'trial_RECORDS.txt'  ## zkušební soubory

    ### -------------- lokalizace --------------
    ## mediánový filtr
    kernel_size = 9



