private TaskNodeList RetrieveAllGoalNodes() { TaskNodeTraversalCallback nodeAction; TaskNodeList goalList; nodeAction = null; goalList = new TaskNodeList(); // Define lambda callback nodeAction = new TaskNodeTraversalCallback((taskNode) => { // Found a goal if (taskNode.Type == NODE_TYPE.GOAL) { goalList.Add(taskNode); } // Continue traversing return(true); }); _tModel.TraverseTaskNodes(ref nodeAction); return(goalList); }
private TaskNodeList RetrieveAllGoalNodes() { TaskNodeTraversalCallback nodeAction; TaskNodeList goalList; nodeAction = null; goalList = new TaskNodeList(); // Define lambda callback nodeAction = new TaskNodeTraversalCallback((taskNode) => { // Found a goal if (taskNode.Type == NODE_TYPE.GOAL) { goalList.Add(taskNode); } // Continue traversing return true; }); _tModel.TraverseTaskNodes(ref nodeAction); return goalList; }
// Analyze single-level tasks in a specific goal (after found goal) private COMPARISON_INFO recCompareOutputInternal(MessageUnitList actualOutput, TaskNodeList taskOracleNodes, COMPARISON_INFO comparisonInfo) { bool bSubResult; int iSubResultCount; bool bBreakLoop; //bool bCompareResult; MessageUnit msgOracle; COMPARISON_INFO tempInfo; //int currentIndex; bSubResult = false; bBreakLoop = false; tempInfo = new COMPARISON_INFO(); //currentIndex = 0; // Traverse child nodes foreach (TaskNode node in taskOracleNodes) { // Convert task to message msgOracle = _tAgentMapper.GetMessageUnitFromTask(node); iSubResultCount = 0; // if there is a nested goal in the sequence //bFoundEntry = CompareOutputFromMessage(actualOutput, msgOracle, iPointer); // Compare output with oracle for (int i = comparisonInfo.CurrentIndex; i < actualOutput.Count; i++) { bSubResult = false; // Undefined node type exception if (node.Type == NODE_TYPE.NONE) { throw new ApplicationException("Undefined node type detected."); } // If oracle matches with a task name if (actualOutput[i] == msgOracle) { switch (ComparisonLevel) { case COMPARISON_LEVEL.LEVEL1: bSubResult = true; break; case COMPARISON_LEVEL.LEVEL2: if (node.RecursionCount != -1) { iSubResultCount++; } else { bSubResult = true; } break; case COMPARISON_LEVEL.LEVEL3: if (node.RecursionCount != -1) { iSubResultCount = actualOutput.OccurrenceOf(msgOracle); } else { bSubResult = true; } break; default: break; } if (!bSubResult && iSubResultCount == node.RecursionCount) { bSubResult = true; } } else if (node.Type == NODE_TYPE.GOAL) // abstract task { tempInfo = CompareOutputInternal(node.Name, actualOutput, comparisonInfo); bSubResult = tempInfo.Result; // comparisonInfo.Result &= tempInfo.Result; // comparisonInfo.CurrentIndex = tempInfo.CurrentIndex; } // Setup next task if (bSubResult) { // Define next index by checking the operator switch (node.Operator) { case TASK_OPERATOR.INTERLEAVING: // ORDER INDEPENDENT + CHOICE + CONCURRENCY comparisonInfo.CurrentIndex = 0; comparisonInfo.CurrentIndex = actualOutput.Count; // Exit for if (comparisonInfo.Result) { return comparisonInfo; } else { // reset for the next optional comparison comparisonInfo.Result = true; } break; case TASK_OPERATOR.CHOICE: comparisonInfo.CurrentIndex = actualOutput.Count; // Exit for if (comparisonInfo.Result) { return comparisonInfo; } else { // reset for the next optional comparison comparisonInfo.Result = true; } break; case TASK_OPERATOR.SYNCHRONIZATION: // CONCURRENCY with Information Passing if (actualOutput[i].Parameter.Length > 0 && actualOutput[i].Cycle == actualOutput[i + 1].Cycle) { bSubResult = true; } break; case TASK_OPERATOR.CONCURRENCY: // CONCURRENCY if (actualOutput[i].Cycle == actualOutput[i + 1].Cycle) { bSubResult = true; } break; case TASK_OPERATOR.ENABLE: comparisonInfo.CurrentIndex = i; break; case TASK_OPERATOR.ENABLEINFO: if (actualOutput[i].Parameter.Length > 0) { comparisonInfo.CurrentIndex = i; } break; case TASK_OPERATOR.ORDER_INDEPENDENT: comparisonInfo.CurrentIndex = 0; break; case TASK_OPERATOR.NONE: bBreakLoop = true; break; default: throw new ApplicationException("Undefined operator detected."); } // exit for-loop break; } } comparisonInfo.Result &= bSubResult; if (bBreakLoop) { break; } } comparisonInfo.Result &= bSubResult; return comparisonInfo; }
// Analyze single-level tasks in a specific goal (after found goal) private COMPARISON_INFO recCompareOutputInternal(MessageUnitList actualOutput, TaskNodeList taskOracleNodes, COMPARISON_INFO comparisonInfo) { bool bSubResult; int iSubResultCount; bool bBreakLoop; //bool bCompareResult; MessageUnit msgOracle; COMPARISON_INFO tempInfo; //int currentIndex; bSubResult = false; bBreakLoop = false; tempInfo = new COMPARISON_INFO(); //currentIndex = 0; // Traverse child nodes foreach (TaskNode node in taskOracleNodes) { // Convert task to message msgOracle = _tAgentMapper.GetMessageUnitFromTask(node); iSubResultCount = 0; // if there is a nested goal in the sequence //bFoundEntry = CompareOutputFromMessage(actualOutput, msgOracle, iPointer); // Compare output with oracle for (int i = comparisonInfo.CurrentIndex; i < actualOutput.Count; i++) { bSubResult = false; // Undefined node type exception if (node.Type == NODE_TYPE.NONE) { throw new ApplicationException("Undefined node type detected."); } // If oracle matches with a task name if (actualOutput[i] == msgOracle) { switch (ComparisonLevel) { case COMPARISON_LEVEL.LEVEL1: bSubResult = true; break; case COMPARISON_LEVEL.LEVEL2: if (node.RecursionCount != -1) { iSubResultCount++; } else { bSubResult = true; } break; case COMPARISON_LEVEL.LEVEL3: if (node.RecursionCount != -1) { iSubResultCount = actualOutput.OccurrenceOf(msgOracle); } else { bSubResult = true; } break; default: break; } if (!bSubResult && iSubResultCount == node.RecursionCount) { bSubResult = true; } } else if (node.Type == NODE_TYPE.GOAL) // abstract task { tempInfo = CompareOutputInternal(node.Name, actualOutput, comparisonInfo); bSubResult = tempInfo.Result; // comparisonInfo.Result &= tempInfo.Result; // comparisonInfo.CurrentIndex = tempInfo.CurrentIndex; } // Setup next task if (bSubResult) { // Define next index by checking the operator switch (node.Operator) { case TASK_OPERATOR.INTERLEAVING: // ORDER INDEPENDENT + CHOICE + CONCURRENCY comparisonInfo.CurrentIndex = 0; comparisonInfo.CurrentIndex = actualOutput.Count; // Exit for if (comparisonInfo.Result) { return(comparisonInfo); } else { // reset for the next optional comparison comparisonInfo.Result = true; } break; case TASK_OPERATOR.CHOICE: comparisonInfo.CurrentIndex = actualOutput.Count; // Exit for if (comparisonInfo.Result) { return(comparisonInfo); } else { // reset for the next optional comparison comparisonInfo.Result = true; } break; case TASK_OPERATOR.SYNCHRONIZATION: // CONCURRENCY with Information Passing if (actualOutput[i].Parameter.Length > 0 && actualOutput[i].Cycle == actualOutput[i + 1].Cycle) { bSubResult = true; } break; case TASK_OPERATOR.CONCURRENCY: // CONCURRENCY if (actualOutput[i].Cycle == actualOutput[i + 1].Cycle) { bSubResult = true; } break; case TASK_OPERATOR.ENABLE: comparisonInfo.CurrentIndex = i; break; case TASK_OPERATOR.ENABLEINFO: if (actualOutput[i].Parameter.Length > 0) { comparisonInfo.CurrentIndex = i; } break; case TASK_OPERATOR.ORDER_INDEPENDENT: comparisonInfo.CurrentIndex = 0; break; case TASK_OPERATOR.NONE: bBreakLoop = true; break; default: throw new ApplicationException("Undefined operator detected."); } // exit for-loop break; } } comparisonInfo.Result &= bSubResult; if (bBreakLoop) { break; } } comparisonInfo.Result &= bSubResult; return(comparisonInfo); }