/// <summary> /// Method returning all interventions appropriate for a player. /// </summary> /// /// <returns> List containing all appropriate interventions at the moment. </returns> public List <String> getInterventions() { List <String> interventions = new List <String>(); MotivationModel mm = loadMotivationModel(); Boolean val; foreach (Intervention iv in mm.motivationInterventions.motivationInterventionList) { try { val = FormulaInterpreterBool.eval(iv.rule); if (val) { interventions.Add(iv.name); } } catch (Exception e) { loggingMAd("ERROR: Evaluation of Boolean value for intervention trigger failed!"); loggingMAd(e.Message); } } return(interventions); }
public void performTest2() { log("***************TEST 2********************"); MotivationModel mm = createExampleMM(); string id = "MotivationAssessmentTestId.xml"; writeMMToFile(id, mm); MotivationAssessmentAssetSettings maass = new MotivationAssessmentAssetSettings(); maass.XMLLoadingId = id; getMAsA().Settings = maass; MotivationModel mm2 = getMAsA().loadMotivationModel(); if (mm.toXmlString().Equals(mm2.toXmlString())) { log("MotivationModels before and after the loading are identically!"); } else { log("MotivationModels before and after the loading are NOT identically!", Severity.Error); Assert.Fail(); } }
public void Add(MotivationModel model) { if (motivations == null) { motivations = new List <MotivationModel> (); } motivations.Add(model); }
/// <summary> /// Method performing a simple test: creating example MotivationModel and feeding hints for a testplayer. /// </summary> internal void performTest1() { log("***************TEST 1********************"); MotivationModel mm = createExampleMM(); setMotivationModel(mm); DateTime now = DateTime.Now; //reaching a new level getMAsA().addMotivationHint(MotivationHintEnum.NewLevel); //perfect solution - 0 error - 0 help requests - 10 seconds getMAsA().addMotivationHint(MotivationHintEnum.NewProblem); log("Sleeping for 10 seconds..."); Thread.Sleep(10 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Success); //too early guess - 2 seconds getMAsA().addMotivationHint(MotivationHintEnum.NewProblem); log("Sleeping for 2 seconds..."); Thread.Sleep(2 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Success); //too many errors - 11/7 seconds - 4 errors - 0 help requests getMAsA().addMotivationHint(MotivationHintEnum.NewProblem); log("Sleeping for 7 seconds..."); Thread.Sleep(7 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Fail); log("Sleeping for 1 second..."); Thread.Sleep(1 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Fail); log("Sleeping for 1 second..."); Thread.Sleep(1 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Fail); log("Sleeping for 1 second..."); Thread.Sleep(1 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Fail); log("Sleeping for 1 second..."); Thread.Sleep(1 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Success); //too late solution - 15 seconds getMAsA().addMotivationHint(MotivationHintEnum.NewProblem); log("Sleeping for 20 seconds..."); Thread.Sleep(20 * 1000); getMAsA().addMotivationHint(MotivationHintEnum.Success); }
/// <summary> /// Method for storing a Motivation Model as XML in a file. /// </summary> /// <param name="fileId"> File-Id for storing the model. </param> /// <param name="mm"> The Motivation model to store. </param> internal void writeMMToFile(string fileId, MotivationModel mm) { IDataStorage ids = (IDataStorage)AssetManager.Instance.Bridge; if (ids != null) { log("Storing DomainModel to File."); ids.Save(fileId, mm.toXmlString()); } else { log("No IDataStorage - Bridge implemented!", Severity.Error); } }
/// <summary> /// Method returning intervention instances to a list of instances provided. /// </summary> /// /// <param name="interventions"> List of intervenentions provided. </param> /// /// <returns> List of intervention instances. </returns> internal List <String> getInterventionInstances(List <String> interventions, String playerId) { List <String> instances = new List <String>(); MotivationModel mm = loadMotivationModel(); Random rnd = new Random(); int pos; foreach (Intervention iv in mm.motivationInterventions.motivationInterventionList) { if (interventions.Contains(iv.name)) { pos = rnd.Next(1, iv.interventionInstances.instance.Count + 1) - 1; instances.Add(iv.interventionInstances.instance.ElementAt(pos)); } } return(instances); }
/// <summary> /// Method for setting the motivation model /// </summary> /// <param name="mm"> The motivation model to load</param> public void setMotivationModel(MotivationModel mm) { string fileId = "MotivationAssessmentAssetTestId.xml"; IDataStorage ids = (IDataStorage)AssetManager.Instance.Bridge; if (ids != null) { log("Storing DomainModel to File."); ids.Save(fileId, mm.toXmlString()); } else { log("No IDataStorage - Bridge implemented!", Severity.Warning); } //change Settings to load local file MotivationAssessmentAssetSettings newMAS = new MotivationAssessmentAssetSettings(); newMAS.XMLLoadingId = fileId; ((MotivationAssessmentAsset)AssetManager.Instance.findAssetByClass("MotivationAssessmentAsset")).Settings = newMAS; }
/// <summary> /// Method for creating an example Motivation Model. /// </summary> /// /// <returns> /// MotivationModel with example values. /// </returns> internal MotivationModel createExampleMM() { MotivationAspect ma1 = new MotivationAspect(); ma1.name = "attention"; ma1.up = "attention+(1-attention)*0.5"; ma1.down = "attention*0.5"; ma1.rule = ""; MotivationAspect ma2 = new MotivationAspect(); ma2.name = "satisfaction"; ma2.up = "satisfaction+(1-satisfaction)*0.5"; ma2.down = "satisfaction*0.5"; ma2.rule = ""; MotivationAspect ma3 = new MotivationAspect(); ma3.name = "confidence"; ma3.up = "confidence+(1-confidence)*0.5"; ma3.down = "confidence*0.5"; ma3.rule = ""; MotivationAspect ma4 = new MotivationAspect(); ma4.name = "motivation"; ma4.up = ""; ma4.down = ""; ma4.rule = "(satisfaction+confidence+attention)/3"; MotivationAspectList mal = new MotivationAspectList(); List <MotivationAspect> maList = new List <MotivationAspect>(); maList.Add(ma1); maList.Add(ma2); maList.Add(ma3); maList.Add(ma4); mal.motivationAspectList = maList; String ii11 = "Hey, my friend! Are you sleeping?!"; String ii12 = "Sorry for interrupting you; we need to go on."; Intervention i1 = new Intervention(); List <String> i1List = new List <String>(); i1List.Add(ii11); i1List.Add(ii12); i1.interventionInstances = new InterventionInstance(); i1.interventionInstances.instance = i1List; i1.name = "attention catcher"; i1.rule = "attention < 0.4"; String ii21 = "Once this mission is over, it's time to celebrate."; String ii22 = "By solving this task you will earn another 10000 points."; Intervention i2 = new Intervention(); List <String> i2List = new List <String>(); i2List.Add(ii21); i2List.Add(ii22); i2.interventionInstances = new InterventionInstance(); i2.interventionInstances.instance = i2List; i2.name = "incitation intervention"; i2.rule = "satisfaction < 0.4"; String ii31 = "Don't give up. Try again."; String ii32 = "It is a challenge, I know. Let's give it another trial."; String ii33 = "Go on. Practice makes perfect."; Intervention i3 = new Intervention(); List <String> i3List = new List <String>(); i3List.Add(ii31); i3List.Add(ii32); i3List.Add(ii33); i3.interventionInstances = new InterventionInstance(); i3.interventionInstances.instance = i3List; i3.name = "encouraging intervention"; i3.rule = "confidence < 0.4"; MotivationInterventionList mil = new MotivationInterventionList(); List <Intervention> iList = new List <Intervention>(); iList.Add(i1); iList.Add(i2); iList.Add(i3); mil.motivationInterventionList = iList; MotivationModel mm = new MotivationModel(); mm.motivationAspects = mal; mm.motivationInterventions = mil; return(mm); }
/// <summary> /// Method returning a least often used instance of an intervnention. /// </summary> /// /// <param name="intervention"> Intervention id for which the instance is requested. </param> /// /// <returns> Intervention instance for the player. </returns> public String getInstance(String intervention) { MotivationModel mm = loadMotivationModel(); List <String> instances = null; foreach (Intervention iv in mm.motivationInterventions.motivationInterventionList) { if (intervention.Equals(iv.name)) { instances = iv.interventionInstances.instance; } } if (instances == null) { loggingMAd("ERROR: requested instance is not part of the motivation model!"); return("ERROR"); } //create intervention history if needed if (interventionsHistory == null) { interventionsHistory = new Dictionary <string, Dictionary <string, int> >(); } Dictionary <string, Dictionary <string, int> > playerHistory = interventionsHistory; //create interventionCount if needed Dictionary <string, int> interventionCount; if (!playerHistory.ContainsKey(intervention)) { interventionCount = new Dictionary <string, int>(); foreach (String ii in instances) { interventionCount[ii] = 0; } } else { interventionCount = playerHistory[intervention]; } //get the least often used intervention instances int minUsedInstanceNr = -1; List <string> minUsedInstances = new List <string>(); foreach (KeyValuePair <String, int> pair in interventionCount) { if (minUsedInstanceNr == -1 || minUsedInstanceNr > pair.Value) { minUsedInstanceNr = pair.Value; minUsedInstances = new List <string>(); minUsedInstances.Add(pair.Key); } else if (minUsedInstanceNr == pair.Value) { minUsedInstances.Add(pair.Key); } } //choose an random instance Random rnd = new Random(); int pos = rnd.Next(1, minUsedInstances.Count + 1) - 1; String usedInstance = minUsedInstances.ElementAt(pos); interventionCount[usedInstance]++; interventionsHistory[intervention] = interventionCount; return(usedInstance); }