public double MeanCompare(WordData word, List <WordData> wordList)
        {
            double answer = 0;

            int[] timing = new int[word.GetTiming().Length];
            for (int i = 0; i < word.GetTiming().Length; ++i)
            {
                int mean = 0;
                foreach (WordData listWord in wordList)
                {
                    mean += listWord.GetTiming()[i];
                }
                mean     /= wordList.Count;
                timing[i] = mean;
            }
            WordData meanWord = new WordData(word.GetWord(), timing, -1);

            answer = Compare(word, meanWord);
            return(answer);
        }
        public double MedianCompare(WordData word, List <WordData> wordList)
        {
            double answer = 0;

            int[] timing = new int[word.GetTiming().Length];
            for (int i = 0; i < word.GetTiming().Length; ++i)
            {
                List <int> medianList = new List <int>();
                int        median     = 0;
                foreach (WordData listWord in wordList)
                {
                    medianList.Add(listWord.GetTiming()[i]);
                }
                medianList.Sort();
                median    = medianList[(wordList.Count / 2)];
                timing[i] = median;
            }
            WordData meanWord = new WordData(word.GetWord(), timing, -1);

            answer = Compare(word, meanWord);
            return(answer);
        }
        private KeyValuePair <int, double> predict(UserClient client)
        {
            KeyValuePair <int, double>         answer;
            List <KeyValuePair <int, double> > answerlist = new List <KeyValuePair <int, double> >(), meanAnswerList = new List <KeyValuePair <int, double> >(),
                                               medianAnswerList = new List <KeyValuePair <int, double> >();
            double          likeness = 0, meanLikeness = 0, medianLikeness = 0;
            List <WordData> predictionData = ToWords(client.GetPredictionData());

            if (predictionData.Count > 0)
            {
                UserDBDataSetWorkerTableAdapters.UserClientTableAdapter userAdapt = new UserDBDataSetWorkerTableAdapters.UserClientTableAdapter();
                UserDBDataSetWorker.UserClientDataTable userTable = userAdapt.GetUserClientData();
                foreach (UserDBDataSetWorker.UserClientRow userRow in userTable)
                {
                    int count = 0;
                    foreach (WordData word in predictionData)
                    {
                        UserDBDataSetWorkerTableAdapters.WordDataTableAdapter wordAdapt = new UserDBDataSetWorkerTableAdapters.WordDataTableAdapter();
                        UserDBDataSetWorker.WordDataDataTable wordTable = wordAdapt.GetDataByUserIDandWord(userRow.UserID, word.GetWord());
                        if (wordTable.Count > 0)
                        {
                            List <WordData> wordList = new List <WordData>();
                            foreach (UserDBDataSetWorker.WordDataRow wordRow in wordTable)
                            {
                                UserDBDataSetWorkerTableAdapters.TimingTableAdapter timeAdapt = new UserDBDataSetWorkerTableAdapters.TimingTableAdapter();
                                UserDBDataSetWorker.TimingDataTable timeTable = timeAdapt.GetDataByWordID(wordRow.WordID);
                                if (timeTable.Count > 0)
                                {
                                    int[] timing = new int[timeTable.Count];
                                    for (int i = 0; i < timeTable.Count; i++)
                                    {
                                        timing[i] = timeTable[i].Timing;
                                    }
                                    WordData learnedWord = new WordData(wordRow.Word, timing, userRow.UserID);
                                    double   comp        = Compare(word, learnedWord);
                                    if (comp > 0)
                                    {
                                        likeness += Compare(word, learnedWord);
                                        count++;
                                    }
                                    wordList.Add(learnedWord);
                                }
                            }
                            if (word.GetTiming().Length > 0)
                            {
                                meanLikeness   = MeanCompare(word, wordList);
                                medianLikeness = MedianCompare(word, wordList);
                            }
                            //meanaverage
                        }
                    }
                    likeness /= count;
                    answerlist.Add(new KeyValuePair <int, double>(userRow.UserID, likeness));
                    meanAnswerList.Add(new KeyValuePair <int, double>(userRow.UserID, meanLikeness));
                    medianAnswerList.Add(new KeyValuePair <int, double>(userRow.UserID, medianLikeness));
                    meanAList   = meanAnswerList;
                    medianAList = medianAnswerList;
                    bool problem;
                    if (likeness > 1)
                    {
                        problem = true;
                    }
                    likeness = 0;
                    count    = 0;
                }
            }
            if (answerlist.Count > 1)
            {
                switch (predictionMode)
                {
                case 0:                            //compare
                    answer = MaxValue(answerlist); //most probable prediction
                    break;

                case 1:                                //mean
                    answer = MaxValue(meanAnswerList); //most probable prediction
                    break;

                default:
                case 2:                                  //median
                    answer = MaxValue(medianAnswerList); //most probable prediction
                    break;
                }
            }
            else
            {
                answer = new KeyValuePair <int, double>(0, 0);
            }
            return(answer);
        }