static private List<User> LoadDataset(string datasetFileName)
        {
            //Get The dataset folder path.
            var splittedPath = datasetFileName.Split('\\');
            string folderPath = "";
            for (int i = 0; i < splittedPath.Length - 1; i++)
            {
                folderPath += splittedPath[i] + '\\';
            }
            folderPath += "audiofiles\\";


            //read the training samples files names
            Dictionary<string, User> users = new Dictionary<string, User>();
            StreamReader reader = new StreamReader(datasetFileName);
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                string userName = line.Split('/')[0];
                string fileName = line.Split('/')[1] + ".wav";
                //check if user already exists, if not add an entry in the dictionary.
                if (users.ContainsKey(userName) == false)
                {
                    User user = new User();
                    user.UserTemplates = new List<AudioSignal>();
                    user.UserName = userName;
                    users.Add(userName, user);
                }
                AudioSignal audio;
                string fullFileName = folderPath + userName + '\\' + fileName;
                try
                {
                    audio = openNISTWav(fullFileName);
                }
                catch (Exception)
                {
                    audio = AudioOperations.OpenAudioFile(folderPath + userName + '\\' + fileName);
                }
                audio = AudioOperations.RemoveSilence(audio);
                users[userName].UserTemplates.Add(audio);
            }
            reader.Close();

            //move the users to a list for convenience reasons only.
            List<User> usersList = new List<User>();
            foreach (var user in users)
            {
                usersList.Add(user.Value);
            }

            return usersList;
        }
        static private List<User> ConcatenateSamples(List<User> dataset, int shrinkagefactor)
        {
            List<User> newDataset = new List<User>();
            foreach (User user in dataset)
            {
                
                int numberOfSequences = user.UserTemplates.Count;
                //NOTE: i didn't handle the case if the number of sequences is not divisible by the shrinkage factor :)
                int newNumberOfSequences = numberOfSequences / shrinkagefactor;
                User concUser = new User();
                concUser.UserName = user.UserName;
                concUser.UserTemplates = new List<AudioSignal>(newNumberOfSequences);
                int startIndex = 0;
                for (int i = 0; i < newNumberOfSequences; i++)
                {
                    int currentConcSeqLength = 0;
                    double currentConcSeqDuration = 0;
                    for (int j = startIndex; j < startIndex + shrinkagefactor; j++)
                    {
                        currentConcSeqLength += user.UserTemplates[j].data.Length;
                        currentConcSeqDuration += user.UserTemplates[j].signalLengthInMilliSec;
                    }
                    concUser.UserTemplates.Add(new AudioSignal());
                    concUser.UserTemplates[i].sampleRate = user.UserTemplates[0].sampleRate;
                    concUser.UserTemplates[i].signalLengthInMilliSec = currentConcSeqDuration;
                    concUser.UserTemplates[i].data = new double[currentConcSeqLength];
                    int concIndex = 0;
                    for (int j = startIndex; j < startIndex + shrinkagefactor; j++)
                    {
                        user.UserTemplates[j].data.CopyTo(concUser.UserTemplates[i].data, concIndex);
                        concIndex += user.UserTemplates[j].data.Length;
                    }
                    
                    startIndex += shrinkagefactor;
                }

                newDataset.Add(concUser);
            }
            return newDataset;
        }