Esempio n. 1
0
        /// <summary>
        /// Filters loaded data based on a given criteria set
        /// </summary>
        /// <param name="vm"></param>
        private void FilterStudentsByGrade(TimelineAnalysisViewModel vm)
        {
            //present options to filter by
            List <string> gradingCriteria = vm.GetAllGrades();

            Console.WriteLine("***Grading Categories***");
            for (int i = 0; i < gradingCriteria.Count; i++)
            {
                Console.WriteLine("{0}: {1}", i, gradingCriteria[i]);
            }
            Console.Write("Select category: ");
            string categoryStr = Console.ReadLine();

            //ask for min/max filter
            Console.Write("Enter max score [100%]: ");
            string maxScoreStr = Console.ReadLine();

            Console.Write("Enter min score [0%]: ");
            string minScoreStr = Console.ReadLine();

            //parse strings, send off to VM for processing
            int    category = -1;
            double maxScore = 200;
            double minScore = 0;

            if (Int32.TryParse(categoryStr, out category) && category > -1)
            {
                if (Double.TryParse(maxScoreStr, out maxScore) == false)
                {
                    maxScore = 200;
                }
                if (Double.TryParse(minScoreStr, out minScore) == false)
                {
                    minScore = 0;
                }

                int result = vm.FilterByGrade(gradingCriteria[category], minScore, maxScore);
                Console.WriteLine("{0} entries removed from dataset.", result);
            }
            else
            {
                Console.WriteLine("Error parsing user input.");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Locates common transition sequence cycles
        /// </summary>
        /// <param name="vm"></param>
        private void LocateCommonTransitionCycles(TimelineAnalysisViewModel vm)
        {
            //write results to a file
            vm.NormalizeProgrammingStates();
            vm.AttachGrades();
            CsvWriter writer = new CsvWriter();

            //build header
            writer.AddToCurrentLine("UserId");
            writer.AddToCurrentLine("TotalTimeProgramming");
            writer.AddToCurrentLine("NumberOfCycles");
            foreach (string[] sequence in vm.InterestingSequences)
            {
                string sequenceHeader = String.Join("_", sequence);
                writer.AddToCurrentLine("Time_" + sequenceHeader);
                writer.AddToCurrentLine("NormalizedTime_" + sequenceHeader);
                writer.AddToCurrentLine("Count_" + sequenceHeader);
                writer.AddToCurrentLine("NormalizedCount_" + sequenceHeader);
            }
            writer.AddToCurrentLine("CycleTime");
            writer.AddToCurrentLine("PercentTimeAccountedFor");

            //add grades if loaded
            List <string> grades = vm.GetAllGrades();

            foreach (string grade in grades)
            {
                writer.AddToCurrentLine(grade);
            }

            writer.CreateNewRow();

            //write data cells
            foreach (int userId in vm.StatesByUser.Keys)
            {
                writer.AddToCurrentLine(userId);

                //get total time spent programming
                StudentTimeline userTimeline = vm.Timeline[userId];
                TimelineState   timeState    = userTimeline.GetAggregateState("normalized_total_time");
                TimeSpan        totalTime    = timeState.EndTime - timeState.StartTime;
                writer.AddToCurrentLine(totalTime.TotalMinutes);
                TimeSpan cycleTime = new TimeSpan();

                //and total number of cycles
                int totalCycles = 0;
                foreach (string[] sequence in vm.InterestingSequences)
                {
                    string sequenceKey = String.Join("_", sequence);
                    totalCycles += vm.StatesByUser[userId][sequenceKey].Count;
                }
                writer.AddToCurrentLine(totalCycles);

                //write total time spent in cycle
                foreach (string[] sequence in vm.InterestingSequences)
                {
                    string   sequenceKey  = String.Join("_", sequence);
                    TimeSpan sequenceTime = new TimeSpan();
                    foreach (PatternParserResult pattern in vm.StatesByUser[userId][sequenceKey])
                    {
                        foreach (TimelineState state in pattern.StateSequence)
                        {
                            if (state.EndTime < state.StartTime)
                            {
                                throw new Exception("EndTime must be larger than StartTime");
                            }
                            sequenceTime += state.EndTime - state.StartTime;
                        }
                    }
                    cycleTime += sequenceTime;

                    //total time
                    writer.AddToCurrentLine(sequenceTime.TotalMinutes);

                    //normalized time
                    writer.AddToCurrentLine(Math.Round((sequenceTime.TotalMinutes / totalTime.TotalMinutes) * 100, 2));

                    //count
                    writer.AddToCurrentLine(vm.StatesByUser[userId][sequenceKey].Count);

                    //normalized count
                    double normalizedCount = ((vm.StatesByUser[userId][sequenceKey].Count) / (double)totalCycles) * 100;
                    writer.AddToCurrentLine(Math.Round(normalizedCount, 2));
                }
                writer.AddToCurrentLine(cycleTime.TotalMinutes);
                writer.AddToCurrentLine(Math.Round((cycleTime.TotalMinutes / totalTime.TotalMinutes) * 100, 2));

                //add grade information
                foreach (string grade in grades)
                {
                    if (userTimeline.Grades.ContainsKey(grade) == true)
                    {
                        writer.AddToCurrentLine(userTimeline.Grades[grade].ToString());
                    }
                    else
                    {
                        writer.AddToCurrentLine("0");
                    }
                }

                writer.CreateNewRow();
            }

            using (TextWriter tw = File.CreateText("sequence_cycles.csv"))
            {
                tw.Write(writer.ToString());
            }

            Console.WriteLine("Finished locating sequences.");
        }