/// <summary> /// Prompt the learner modeling component to update its node probabilities. /// </summary> /// <param name="session">Session</param> /// <param name="addTopic">Topic used in addition</param> /// <param name="subTopic">Topic used in subtraction</param> private void UpdateNode(StabilizationSession session, SceneTopic addTopic, SceneTopic subTopic) { if (this.learnerModelingComponent == null) { InitializeLearnerModelingComponent(); } //count the correct and wrong attempts for addition float correctAdditionCount = (float)session.Count(true, SessionTags.Operation.ADDITION); float wrongAdditionCount = (float)session.Count(false, SessionTags.Operation.ADDITION); //add them together to get total addition attempts float additionCount = correctAdditionCount + wrongAdditionCount; //if there are addition attempts... if (additionCount != 0) { //get score by dividing correct attempts over total attempts float score = correctAdditionCount / additionCount; Debug.Log("num den for score IS " + correctAdditionCount + " " + additionCount); // score = score - (float)(session.SessionTime () / session.GetSceneAvgSolveTime ()); // Debug.LogError ("SCORE MINUS IS "+(session.SessionTime () / session.GetSceneAvgSolveTime ())); // score = score; Debug.Log("SCORE IS " + score); //depending on topic, update the respective node switch (addTopic) { case SceneTopic.SIMILAR_ADD: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Similar, LearnerModel.Operation.ADDITION, score); break; case SceneTopic.EQUIVALENT_ADD: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Equivalent, LearnerModel.Operation.ADDITION, score); break; case SceneTopic.DISSIMILAR_ADD: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Dissimilar, LearnerModel.Operation.ADDITION, score); break; } } //count the correct and wrong attempts for subtraction float correctSubtractionCount = (float)session.Count(true, SessionTags.Operation.SUBTRACTION); float wrongSubtractionCount = (float)session.Count(false, SessionTags.Operation.SUBTRACTION); //add them together to get total subtraction attempts float subtractionCount = correctSubtractionCount + wrongSubtractionCount; //if there are subtraction attempts... if (subtractionCount != 0) { //get score by dividing correct attempts over total attempts float score = correctSubtractionCount / subtractionCount; // TODO Also removed // score = score - (float)(session.SessionTime () / session.GetSceneAvgSolveTime ()); //depending on topic, update the respective node switch (subTopic) { case SceneTopic.SIMILAR_SUB: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Similar, LearnerModel.Operation.SUBTRACTION, score); break; case SceneTopic.EQUIVALENT_SUB: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Equivalent, LearnerModel.Operation.SUBTRACTION, score); break; case SceneTopic.DISSIMILAR_SUB: this.learnerModelingComponent.UpdateNode(LearnerModel.Node.Dissimilar, LearnerModel.Operation.SUBTRACTION, score); break; } } }
/// <summary> /// Initializes a new session. Subset sum set is cleared. /// </summary> private void InitSession() { additionRight.Clear(); this.currentSession = new StabilizationSession(topic, sceneAvgSolveTime); }
/// <summary> /// Prompt the learner modeling component to update its denominator masteries. /// </summary> /// <param name="session">Session</param> /// <param name="addTopic">Topic used in addition</param> /// <param name="subTopic">Topic used in subtraction</param> private void UpdateDenominatorMastery(StabilizationSession session, SceneTopic addTopic, SceneTopic subTopic) { if (this.learnerModelingComponent == null) { InitializeLearnerModelingComponent(); } //Update the denominator mastery List <int> correctAddition = new List <int>(session.GetDenominaorsIn(true, SessionTags.Operation.ADDITION)); List <int> correctSubtraction = new List <int> (session.GetDenominaorsIn(true, SessionTags.Operation.SUBTRACTION)); List <int> wrongAddition = new List <int> (session.GetDenominaorsIn(false, SessionTags.Operation.ADDITION)); List <int> wrongSubtraction = new List <int> (session.GetDenominaorsIn(false, SessionTags.Operation.SUBTRACTION)); List <int> denominators = new List <int> (session.GetAllDistinct()); float additionCount = 0f; float subtractionCount = 0f; float correctAdditionCount = 0f; float wrongAdditionCount = 0f; float correctSubtractionCount = 0f; float wrongSubtractionCount = 0f; float scoreAdd = 0f; float scoreSub = 0f; foreach (int denominator in denominators) { //number of times denominator was used correctly in addition correctAdditionCount = correctAddition.FindAll(x => x == denominator).Count; //number of times denominator was used wrongly in addition wrongAdditionCount = wrongAddition.FindAll(x => x == denominator).Count; //number of times denominator was used correctly in subtraction correctSubtractionCount = correctSubtraction.FindAll(x => x == denominator).Count; //number of times denominator was used wrongly in subraction wrongSubtractionCount = wrongSubtraction.FindAll(x => x == denominator).Count; //total occurences of denominator in addition additionCount = correctAdditionCount + wrongAdditionCount; //total occurences of denominator in subtraction subtractionCount = correctSubtractionCount + wrongSubtractionCount; //if denominator did occur in addition... if (additionCount != 0) { //correct over all occurences = score scoreAdd = correctAdditionCount / additionCount; // TODO: Removed this 3 // scoreAdd = scoreAdd - (float)(session.SessionTime () / session.GetSceneAvgSolveTime ()); //update the learner modeling component's mastery for that denominator in addTopic (addition topic) this.learnerModelingComponent.UpdateDenominatorMastery(denominator, scoreAdd, addTopic); } //if denominator did occur in subtraction... if (subtractionCount != 0) { //correct over all occurences = score scoreSub = correctSubtractionCount / subtractionCount; // TODO: Removed this 4 // scoreSub = scoreSub - (float)(session.SessionTime () / session.GetSceneAvgSolveTime ()); //update the learner modeling component's mastery for that denominator in subTopic (subtraction topic) this.learnerModelingComponent.UpdateDenominatorMastery(denominator, scoreSub, subTopic); } } }
/// <summary> /// Takes all currently registered ghost blocks and checks their values to determine what topic the puzzle is. /// Also updates the stability number line based on the currently registered blocks' values. /// </summary> private void UpdateSession() { List <int> denominators = new List <int> (); FractionSet fset = new FractionSet(); bool similar = true; bool oddEquiv = true; bool evenEquiv = true; int currentDenom = (int)hollowBlocks [0].GetDenominator(); for (int i = 0; i < hollowBlocks.Count; i++) { denominators.Add((int)hollowBlocks[i].GetDenominator()); FractionData fraction = hollowBlocks [i].GetFraction(); if (i > 0) { if (similar && currentDenom == fraction.denominator) { similar = true; } else { similar = false; } if (evenEquiv && currentDenom % 2 == 0 && (currentDenom % fraction.denominator == 0 || fraction.denominator % currentDenom == 0 || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 1.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 2.0f))) { evenEquiv = true; } else { evenEquiv = false; } if (oddEquiv && currentDenom % 3 == 0 && (currentDenom % fraction.denominator == 0 || fraction.denominator % currentDenom == 0 || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 1.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 3.0f) || (General.SimplifyFraction(fraction.numerator, fraction.denominator) [0] == 2.0f && General.SimplifyFraction(fraction.numerator, fraction.denominator) [1] == 3.0f))) { oddEquiv = true; } else { oddEquiv = false; } // if (similar && fraction.denominator == (int)hollowBlocks [i - 1].GetDenominator ()) // similar = true; // else // similar = false; // // if (evenEquiv && (fraction.denominator % 2) == ((int)hollowBlocks [i - 1].GetDenominator () % 2)) // evenEquiv = true; // else // evenEquiv = false; // // if (oddEquiv && (fraction.denominator % 3) == ((int)hollowBlocks [i - 1].GetDenominator () % 3)) // oddEquiv = true; // else // oddEquiv = false; } fset.fractions.Add(fraction); } if (similar) { topic = SessionTopic.SIMILAR; } else if (evenEquiv || oddEquiv) { topic = SessionTopic.EQUIVALENT; } else { topic = SessionTopic.DISSIMILAR; } this.currentSession = new StabilizationSession(topic, this.sceneAvgSolveTime); if (numberLine == null) { this.numberLine = FindObjectOfType <StabilityNumberLine> (); } FractionData target = this.stabilityController.UpdateStabilityNumberLine(hollowBlocks); // FractionData target = new FractionData (); // target.numerator = (int)numberLine.GetTargetNumerator (); // target.denominator = (int)numberLine.GetTargetDenominator (); foreach (FractionSet s in SubsetSumFractions.SubsetSum(fset, target)) { additionRight.Add(s); } }