From d25098093a95ef34d2be5806842c7e0de37d7021 Mon Sep 17 00:00:00 2001 From: Ken Holstein Date: Mon, 26 Jun 2017 01:47:03 -0400 Subject: [PATCH] updates to system_misuse detector --- .../Lumilo/System_Misuse/system_misuse.js | 237 ++---------------- 1 file changed, 27 insertions(+), 210 deletions(-) diff --git a/HTML/Assets/Detectors/Lumilo/System_Misuse/system_misuse.js b/HTML/Assets/Detectors/Lumilo/System_Misuse/system_misuse.js index 7900963..e6b3138 100644 --- a/HTML/Assets/Detectors/Lumilo/System_Misuse/system_misuse.js +++ b/HTML/Assets/Detectors/Lumilo/System_Misuse/system_misuse.js @@ -33,8 +33,7 @@ var timerId; var timerId2; var timerId3; var timerId4; var timerId5; // //[optional] single out TUNABLE PARAMETERS below var windowSize = 7; //arbitrary: need to tune -var gamingThreshold = 1; //arbitrary: need to tune -var hintAbuseThreshold = 1; //arbitrary: need to tune +var threshold = 1; //arbitrary: need to tune var errorThreshold = 2; //currently arbitrary var newStepThreshold = 1; //currently arbitrary var familiarityThreshold = 0.4; @@ -42,228 +41,40 @@ var senseOfWhatToDoThreshold = 0.6; var hintIsHelpfulPlaceholder = true; //currently a dummy value (assumption that hint is always helpful...) -// -//############################### -//##### Help model ###### -//############################### -//############################### -// - -//non-controversial -function lastActionIsHint(e){ - if (help_variables.lastAction == "hint"){return true;} - else{return false;} -} -function lastActionIsError(e){ - if (help_variables.lastAction == "error"){return true;} - else{return false;} -} -function seenAllHintLevels(e){ - if (e.data.tutor_data.action_evaluation.toLowerCase() == "hint"){ - if (e.data.tutor_data.selection in help_variables.seenAllHints){ - return help_variables.seenAllHints[e.data.tutor_data.selection]; - } - else{return false;} - } - else{ - if (e.data.tool_data.selection in help_variables.seenAllHints){ - return help_variables.seenAllHints[e.data.tool_data.selection]; - } - else{return false;} - } -} -function isCorrect(e){ - if (e.data.tutor_data.action_evaluation.toLowerCase() == "correct"){return true;} - else{return false;} -} -function secondsSinceLastAction(e){ - var currTime = new Date(); - diff = currTime.getTime() - help_variables.lastActionTime.getTime(); - console.log("time elapsed: ", diff/1000) - return (diff / 1000); -} - -//less controversial -function isDeliberate(e){ - var hintThreshold = (help_variables.lastHintLength/600)*60; - - if (lastActionIsError(e)){ - return (secondsSinceLastAction(e) > errorThreshold); - } - else if (lastActionIsHint(e)){ - return (secondsSinceLastAction(e) > hintThreshold); - } - else{ - return (secondsSinceLastAction(e) > newStepThreshold); - } -} - -//more controversial... -function isFamiliar(e){ - var rawSkills = e.data.tutor_data.skills; - for (var property in rawSkills) { - if (rawSkills.hasOwnProperty(property)) { - if (parseFloat(rawSkills[property].pKnown)<=familiarityThreshold){ - return false; - } - } - } - return true; -} - -function isLowSkillStep_All(e){ - var rawSkills = e.data.tutor_data.skills; - for (var property in rawSkills) { - if (rawSkills.hasOwnProperty(property)) { - if (parseFloat(rawSkills[property].pKnown)>=familiarityThreshold){ - return false; - } - } - } - return true; -} - -function isLowSkillStep_Some(e){ - var rawSkills = e.data.tutor_data.skills; - for (var property in rawSkills) { - if (rawSkills.hasOwnProperty(property)) { - if (parseFloat(rawSkills[property].pKnown)<=familiarityThreshold){ - return true; - } - } - } +function is_gaming(e){ return false; } -function hintIsHelpful(e){ - return hintIsHelpfulPlaceholder; -} -function lastActionUnclearFix(e){ - if (help_variables.lastSenseOfWhatToDo == false){return true;} - else{return false;} -} -function senseOfWhatToDo(e){ - var sel = e.data.tutor_data.selection; - var rawSkills = e.data.tutor_data.skills; - for (var property in rawSkills) { - if (rawSkills.hasOwnProperty(property)) { - if (parseFloat(rawSkills[property].pKnown)<=senseOfWhatToDoThreshold){ - return false; - } - } - } - return true; -} - -//evaluation of each step -function evaluateAction(e){ - var sel = e.data.tutor_data.selection; - var outcome = e.data.tutor_data.action_evaluation.toLowerCase(); - - if (e.data.tutor_data.action_evaluation.toLowerCase() == "hint"){ - console.log("isHint") - if (isDeliberate(e)){ - console.log("isDeliberate") - if (!seenAllHintLevels(e) && - (!isFamiliar(e) - || (lastActionIsError(e) && lastActionUnclearFix(e)) - || (lastActionIsHint(e) && !hintIsHelpful(e))) ){ - return "preferred/ask hint"; - } - else if ( (isFamiliar(e) && !senseOfWhatToDo(e) ) - || (lastActionIsHint(e)) ){ - return "acceptable/ask hint"; - } - else{ - return "not acceptable/hint abuse"; - } - - } - else{ - console.log("not deliberate") - return "not acceptable/hint abuse"; - } - +function is_abusing_hints(help_model_output){ + if (help_model_output == "hint abuse"){ + return true; } else{ - if (isDeliberate(e)){ - if ( (isFamiliar(e) && (!(lastActionIsError(e) && lastActionUnclearFix(e))) ) - || (lastActionIsHint(e) && hintIsHelpful(e)) - ){ - return "preferred/try step"; - } - else if (seenAllHintLevels(e) && - (!(lastActionIsError(e) && lastActionUnclearFix(e))) ){ - return "preferred/try step"; - } - else if (isCorrect(e)){ - return "acceptable/try step"; - } - else if (seenAllHintLevels(e)){ - if (lastActionIsError(e) && lastActionUnclearFix(e)){ - return "ask teacher for help/try step"; - } - } - else{ - return "not acceptable/hint avoidance"; - } - } - else{ - return "not acceptable/not deliberate"; - } + return false; } - } -function updateHistory(e){ - help_variables.lastActionTime = new Date(); - if (e.data.tutor_data.action_evaluation.toLowerCase() == "hint"){ - help_variables.lastAction = "hint"; - help_variables.lastHintLength = e.data.tutor_data.tutor_advice.split(' ').length; - if (help_variables.seenAllHints[e.data.tutor_data.selection] != true){ - help_variables.seenAllHints[e.data.tutor_data.selection] = (e.data.tutor_data.current_hint_number == e.data.tutor_data.total_hints_available); - } - } - if (e.data.tutor_data.action_evaluation.toLowerCase() == "incorrect"){ - help_variables.lastAction = "error"; +function is_not_deliberate(help_model_output){ + if (help_model_output == "not deliberate"){ + return true; } - if (e.data.tutor_data.action_evaluation.toLowerCase() == "correct"){ - help_variables.lastAction = "correct"; + else{ + return false; } - - help_variables.lastSenseOfWhatToDo = senseOfWhatToDo(e); - } -function is_gaming(e){ - return false; -} - -function is_abusing_hints(help_model_output){ - return (help_model_output == "not acceptable/hint abuse"); -} - -function is_not_deliberate(help_model_output){ - return (help_model_output == "not acceptable/not deliberate"); -} - - -//hint abuse detector params -var help_variables = {"lastAction": "null", - "lastActionTime": "", - "seenAllHints": {}, - "lastHintLength": "", - "lastSenseOfWhatToDo": false - }; +// +// +// +//############ +//############ +//############ +//############ +// +// -//TUNABLE PARAMETERS -var errorThreshold = 3; //currently arbitrary -var newStepThreshold = 3; //currently arbitrary -var familiarityThreshold = 0.4; -var senseOfWhatToDoThreshold = 0.6; -var hintIsHelpfulPlaceholder = true; //currently a dummy value (assumption that hint is always helpful...) //non-controversial function lastActionIsHint(e){ @@ -495,13 +306,19 @@ function receive_transaction( e ){ help_model_output = "preferred"; //first action in whole tutor is set to "preferred" by default } + console.log(help_model_output); + var isGaming = is_gaming(e); var isAbusingHints = is_abusing_hints(help_model_output); var isNotDeliberate = is_not_deliberate(help_model_output); + console.log(isGaming); + console.log(isAbusingHints); + console.log(isNotDeliberate); + attemptWindow.shift(); - attemptWindow.push( (isGaming || isAbusingHints || isWheelSpinning) ? 1 : 0 ); + attemptWindow.push( (isGaming || isAbusingHints || isNotDeliberate) ? 1 : 0 ); var sumAskTeacherForHelp = attemptWindow.reduce(function(pv, cv) { return pv + cv; }, 0); console.log(attemptWindow);