import pdb, os, random, copy
import pandas as pd
import numpy as np
import pickle as pkl
import torch
from torch.utils.data import DataLoader,Dataset
        
def str2bool(v):
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Unsupported value encountered.')

def set_seed(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    np.random.seed(seed)  # Numpy module.
    random.seed(seed)  # Python random module.
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True

def DFT(data, clicks=None):
    for idx, channel in enumerate(range(data.shape[-1])):
        freq = np.fft.fft(data[:,:,channel])
        freq = freq[:, :data.shape[1]//2] # symmetric
        mag = np.abs(freq)
        phase = np.angle(freq)
        mag = (mag - np.min(mag)) / (np.max(mag) - np.min(mag))
        phase = (phase - np.min(phase)) / (np.max(phase) - np.min(phase))
        if idx==0:
            mags, phases = mag, phase
        else:
            mags, phases = np.stack([mags, mag], axis=-1), np.stack([phases, phase], axis=-1)
    data = np.concatenate([data, mags, phases], axis=1)
    return data, clicks

def MakeDir(dirName):
	if not os.path.exists(dirName):
		os.makedirs(dirName)

class simpleSet(Dataset):
    def __init__(self, features, labels):        
        self.features = features
        labels = labels.astype(int)
        self.labels = labels - np.min(labels)
    def __getitem__(self, index):
        return self.features[index], self.labels[index]
    def __len__(self):
        return len(self.features)