Beispiel #1
0
        /// <summary>
        ///  Return the correct answer rate (from 0.0 to 1.0 inclusive) for the
        /// lesson recorded by the Turns from index start to index end
        /// </summary>
        /// <param name="start">Index where checking begins</param>
        /// <param name="end">Last index checked - if less than 0, then index
        /// is assumed to be last in list</param>
        /// <param name="noAnswers">The value to return if there are no answers
        /// for the given indexes</param>
        /// <returns>The correct answer rate (0.0 to 1.0 inclusive) for the turns
        /// from index start to index end.  If no answers are found in the given
        /// range, then noAnswers is returned</returns>
        public double AdhocCorrectAnswerRate(int start, int end, double noAnswers = 0.0)
        {
            if (start < 0)
            {
                return(noAnswers);
            }

            if (end < 0)
            {
                end = Turns.Count - 1;
            }
            if (end < start)
            {
                return(noAnswers);
            }

            int     correct = 0;
            Boolean ifFinished = false, getAnswer = false, skip = false, reachAskQ = false, reachAnyQ = false;
            int     incorrect = 0, attempt = 0;

            for (int i = start; i <= end; ++i)
            {
                try
                {
                    var turn1 = Turns[i];
                }
                catch (ArgumentOutOfRangeException e)
                {
                    break;
                }

                var turn = Turns.ElementAt(i);

                foreach (var action in turn.Transitions[0].Actions)
                {
                    if (action.Agent.Trim().ToLower() == "system" && action.Act.Trim().ToLower() == "end")
                    {
                        ifFinished = true;
                    }
                }

                if (turn.LessonID.Contains("Lesson2\"") || turn.LessonID.Contains("Lesson13") || turn.LessonID.Contains("Lesson14") || turn.LessonID.Contains("Lesson27") ||
                    turn.LessonID.Contains("Lesson31") || turn.LessonID.Contains("Lesson32") || turn.LessonID.Contains("Lesson33") || turn.LessonID.Contains("Lesson34"))
                {
                    // calculate score
                    if (turn.Input.Event == "Correct")
                    {
                        correct++;
                    }
                    else if (turn.Input.Event == "Incorrect")
                    {
                        incorrect++;
                    }
                }
                // specific rule in lesson3, incorrect1 and incorrect2 both means first attempt in each question
                if (turn.LessonID.Contains("Lesson3\""))
                {
                    // correctness
                    if (turn.Input.Event == "Correct")
                    {
                        correct++;
                    }
                    else if (turn.Input.Event == "Incorrect1" || turn.Input.Event == "Incorrect2")
                    {
                        incorrect++;
                    }
                }
                else if (turn.LessonID.Contains("Lesson15") || turn.LessonID.Contains("Lesson28"))
                {
                    foreach (var transition in turn.Transitions)
                    {
                        // get the question
                        if (transition.RuleID == "HasItem")
                        {
                            foreach (var action in transition.Actions)
                            {
                                if (action.Agent == "System" && action.Act == "Display")
                                {
                                    getAnswer = true;
                                }
                            }
                        }
                    }

                    if (turn.Input.Event.ToString().Contains("Incorrect") && getAnswer == true)
                    {
                        getAnswer = false;
                        incorrect++;
                    }

                    else if (turn.Input.Event == "Correct" && getAnswer == true)
                    {
                        // score & attempt
                        getAnswer = false;
                        correct++;
                    }
                }
                //lesson 20, only have 2 level, Medium and level2
                else if (turn.LessonID.Contains("Lesson20"))
                {
                    if (skip == true)
                    {
                        skip = false;
                    }
                    foreach (var transition in turn.Transitions)
                    {
                        // need to skip
                        if (transition.RuleID == "HintCorrect")
                        {
                            skip = true;
                        }
                    }

                    // calculate score
                    if (turn.Input.Event == "Correct" && skip == false)
                    {
                        correct++;
                    }
                    else if (turn.Input.Event == "Incorrect" && skip == false)
                    {
                        incorrect++;
                    }
                }

                // lesson 22
                else if (turn.LessonID.Contains("Lesson22"))
                {
                    foreach (var transition in turn.Transitions)
                    {
                        if (transition.StateID == "AskQ")
                        {
                            reachAskQ = true;
                        }
                    }

                    // calculate score
                    if (turn.Input.Event == "Correct" && reachAskQ == true)
                    {
                        reachAskQ = false;
                        correct++;
                    }
                    else if (turn.Input.Event == "Incorrect" && reachAskQ == true)
                    {
                        reachAskQ = false;
                        incorrect++;
                    }
                }

                else if (turn.LessonID.Contains("Lesson24"))
                {
                    foreach (var transition in turn.Transitions)
                    {
                        // calculate score
                        if (transition.RuleID == "Correct")
                        {
                            correct++;
                        }
                        else if (transition.RuleID == "Incorrect")
                        {
                            incorrect++;
                        }
                    }
                }
                // need to be fixed
                else if (turn.LessonID.Contains("Lesson5") || turn.LessonID.Contains("Lesson25"))
                {
                    if (turn.Input.Event == "Incorrect" || turn.Input.Event == "Incorrect1" || turn.Input.Event == "Incorrect2")
                    {
                        incorrect++;
                    }
                    else if (turn.Input.Event == "Correct")
                    {
                        correct++;
                    }
                }

                // lesson 4, 7, 9, 16, 30
                // lesson 4: one student only answered 3 in the medium level then went to hard
                if (turn.LessonID.Contains("Lesson4") || turn.LessonID.Contains("Lesson7") || turn.LessonID.Contains("Lesson9") ||
                    turn.LessonID.Contains("Lesson16") || turn.LessonID.Contains("Lesson29") || turn.LessonID.Contains("Lesson30"))
                {
                    // correctness
                    if (turn.Input.Event == "Correct")
                    {
                        correct++;
                    }
                    else if (turn.Input.Event == "Incorrect")
                    {
                        incorrect++;
                    }
                }

                // lesson 11, 18, 26
                else if (turn.LessonID.Contains("Lesson11") || turn.LessonID.Contains("Lesson18") || turn.LessonID.Contains("Lesson26"))
                {
                    foreach (var transition in turn.Transitions)
                    {
                        if (transition.RuleID.Contains("AskQ"))
                        {
                            reachAskQ = true;
                            int    index     = transition.RuleID.IndexOf("AskQ");
                            string cleanQues = (index < 0)
                                ? transition.RuleID
                                : transition.RuleID.Remove(index, "AskQ".Length);

                            attempt = Int32.Parse(cleanQues.Split(new Char[] { '.' })[1]);
                            break;
                        }
                    }

                    if (turn.Input.Event.Contains("Correct") && reachAskQ == true)
                    {
                        reachAskQ = false;
                        if (attempt == 1)
                        {
                            correct++;
                        }
                    }
                    else if (turn.Input.Event.Contains("Incorrect") && reachAskQ == true)
                    {
                        reachAskQ = false;
                        if (attempt == 1)
                        {
                            incorrect++;
                        }
                    }
                }
                else
                {
                    foreach (var transition in turn.Transitions)
                    {
                        // lesson 1, 5, 6, 10
                        if (turn.LessonID.Contains("Lesson1\"") || turn.LessonID.Contains("Lesson5\"") || turn.LessonID.Contains("Lesson6\"") ||
                            turn.LessonID.Contains("Lesson10") || turn.LessonID.Contains("Lesson12") || turn.LessonID.Contains("Lesson19") ||
                            turn.LessonID.Contains("Lesson21"))
                        {
                            // correctness
                            if ((transition.RuleID == "Correct" || transition.RuleID == "Correct1"))
                            {
                                correct++;
                            }
                            else if ((transition.RuleID == "Incorrect" || transition.RuleID == "Incorrect1"))
                            {
                                incorrect++;
                            }
                        }
                        if (turn.LessonID.Contains("Lesson23"))
                        {
                            if (transition.StateID == "AskQ" && transition.RuleID == "UserAnswer")
                            {
                                reachAskQ = true;
                                continue;
                            }
                            else if (transition.StateID == "AnyQ" || transition.StateID == "HintQ")
                            {
                                reachAnyQ = true;
                            }
                            // last question of Hard
                            if (transition.RuleID == "IncorrectSummary" && transition.StateID == "AskQ")
                            {
                                incorrect++;
                            }
                            // last question of Hard
                            else if (transition.RuleID == "CorrectSummary" && transition.StateID == "AskQ")
                            {
                                reachAskQ = false;
                                correct++;
                            }
                            // first attempt correct
                            else if (transition.RuleID.Contains("Correct") && transition.StateID == "AskQ")
                            {
                                correct++;
                            }
                            // first attempt incorrect
                            else if (transition.RuleID.Contains("Incorrect") && reachAskQ == true)
                            {
                                reachAskQ = false;
                                incorrect++;
                            }
                        }
                        if (turn.LessonID.Contains("Lesson17"))
                        {
                            // analyze the correct/incorrect of the question
                            if (transition.RuleID == "Correct1" || transition.RuleID == "Correct2" || transition.RuleID == "Correct")
                            {
                                correct++;
                            }
                            else if (transition.RuleID == "Incorrect" || transition.RuleID == "Incorrect1" || transition.RuleID == "Incorrect2")
                            {
                                incorrect++;
                            }
                        }
                    }
                }

                if (turn.LessonID.Contains("Lesson8"))
                {
                    foreach (var action in turn.Transitions[0].Actions)
                    {
                        if (action.Act == "AddUserScore" && action.Data == "1")
                        {
                            correct++;
                            break;
                        }
                        else if (action.Act == "GetMediaFeedback" && action.Data == "SAGoodAnswer")
                        {
                            incorrect++;
                            break;
                        }
                    }
                }
                else
                {
                    if (turn.Input != null && !String.IsNullOrWhiteSpace(turn.Input.Event))
                    {
                        string evt = turn.Input.Event.ToLower().Trim();
                        if (evt == "correct")
                        {
                            correct++;
                        }
                        else if (evt.StartsWith("incorrect"))
                        {
                            incorrect++;
                        }

                        if (evt == "end")
                        {
                            ifFinished = true;
                        }
                    }
                }
            }

            if (correct < 1)
            {
                if (incorrect < 1)
                {
                    return(noAnswers);
                }
                else
                {
                    return(0.0);
                }
            }

            double tot = (double)(correct + incorrect);

            // no need to specify if the students finish lesson

            // ask if they need to show this
            return((double)correct / tot);

            /*
             * if (ifFinished == true)
             * {
             *  return (double)correct / tot;
             * }
             * else
             * {
             *  return 2;
             * }
             */
        }