private bool LoadUserModel(int problemIndex) { _problemIndex = problemIndex; var behaviorGraph = BehaviorUserModelLoader.Instance.LoadProblem(problemIndex); if (behaviorGraph != null) { UserGraph = behaviorGraph; CurrentStateNode = UserGraph.RetrieveInitInnerNode(); HasBehaviorModel = true; return(true); } Debug.Assert(UserGraph == null); HasBehaviorModel = false; //Capture User Input of the pre-programmed problems. return(false); }
private QueryFeedbackState QueryBehaviorGraph(object obj, out string msg, out object output) { msg = null; output = null; if (UserGraph == null) { return(QueryFeedbackState.QueryFailed); } if (UserGraph.Nodes.Count == 0 || UserGraph.Nodes.Count == 1) { msg = "TODO"; return(QueryFeedbackState.QueryFailed); } /* if (!_queryProcessed) * { * _queryProcessed = true; * output = UserGraph.SearchAllOuterEdgeInfos(); * msg = AGTutorMessage.InputQuery; * return QueryFeedbackState.TutorQueryStarted; * }*/ if (obj != null) { return(VerifyBehaviorGraph(obj, out msg, out output)); } Debug.Assert(obj == null); Debug.Assert(_currentStateNode != null); object edgeInfo = null; BehaviorGraphNode nextNode = null; var nextTuple1 = UserGraph.SearchNextInnerLoopNode(_currentStateNode); if (nextTuple1 == null) // query-end { //partial checking BehaviorGraph.SolvingStatus ss = UserGraph.CheckSolvingStatus(); if (ss == BehaviorGraph.SolvingStatus.Complete) { msg = AGDemonstrationMessage.QueryEnd; return(QueryFeedbackState.TutorQueryEnded); } else if (ss == BehaviorGraph.SolvingStatus.Partial) { int nextGoalIndex = UserGraph.FindGoalIndex(); _currentStateNode = UserGraph.RetrieveInitInnerNode(nextGoalIndex); nextTuple1 = UserGraph.SearchNextInnerLoopNode(_currentStateNode); if (nextTuple1 == null) { msg = AGDemonstrationMessage.QueryEnd; return(QueryFeedbackState.TutorQueryEnded); } CurrentStepHintRequired = true; } else { msg = AGDemonstrationMessage.QueryEnd; return(QueryFeedbackState.TutorQueryEnded); } } #region Path Selection var tuple11 = nextTuple1 as Tuple <object, object>; var tuple11Lst = nextTuple1 as List <Tuple <object, object> >; if (tuple11 != null) { edgeInfo = tuple11.Item1; nextNode = tuple11.Item2 as BehaviorGraphNode; //_currentStateNode = nextNode; } if (tuple11Lst != null) { var tupleTemp = tuple11Lst[0]; edgeInfo = tupleTemp.Item1; nextNode = tupleTemp.Item2 as BehaviorGraphNode; //_currentStateNode = nextNode; } #endregion if (_currentStepHintRequired) { if (edgeInfo != null) { var innerEdgeProp = edgeInfo as InnerLoopEdgeProperty; Debug.Assert(innerEdgeProp != null); msg = AGTutorMessage.QueryIntermediate; _currentStepHintRequired = false; //int parentIndex = UserGraph.SearchOuterLoopNodeIndex(_currentStateNode); int parentIndex = UserGraph.SearchOuterLoopNodeIndex(nextNode); var lst1 = UserGraph.SearchAllOuterEdgeInfos(); var tuple = new Tuple <object, object, object>(innerEdgeProp.MetaRule, lst1, parentIndex); output = tuple; } return(QueryFeedbackState.TutorQueryProcessedHint); } Debug.Assert(nextNode != null); _currentStepHintRequired = true; var nodeState = nextNode.State as InnerLoopBehaviorState; Debug.Assert(nodeState != null); var expr = IKnowledgeGenerator.Generate(nodeState.UserKnowledge); var innerEdgeProp1 = edgeInfo as InnerLoopEdgeProperty; Debug.Assert(innerEdgeProp1 != null); var appliedRule = innerEdgeProp1.AppliedRule; //int parentIndex1 = UserGraph.SearchOuterLoopNodeIndex(_currentStateNode); int parentIndex1 = UserGraph.SearchOuterLoopNodeIndex(nextNode); var lst2 = UserGraph.SearchAllOuterEdgeInfos(); output = new Tuple <object, object, object, object>(appliedRule, expr, lst2, parentIndex1); CurrentStateNode = nextNode; return(QueryFeedbackState.TutorQueryProcessedAnswer); }