/// <summary> /// Visits the leaf node of the SAS+ operator decision tree. /// </summary> /// <param name="treeNode">Leaf node of the tree.</param> /// <param name="state">Reference state.</param> /// <returns>List of successors.</returns> public IEnumerable <ISuccessor> Visit(OperatorDecisionTreeLeafNode treeNode, IState state) { foreach (var oper in treeNode.Operators) { if (MutexChecker.Value.CheckSuccessorCompatibility(state, oper)) { yield return(new Successor(state, oper)); } } }
/// <summary> /// Visits the leaf node of the SAS+ operator decision tree. /// </summary> /// <param name="treeNode">Leaf node of the tree.</param> /// <param name="sourceConditions">Source conditions being evaluated.</param> /// <param name="currentSubConditions">Currently evaluated sub-conditions.</param> /// <returns>List of predecessors.</returns> public IEnumerable <IPredecessor> Visit(OperatorDecisionTreeLeafNode treeNode, IConditions sourceConditions, ISimpleConditions currentSubConditions) { foreach (var oper in treeNode.Operators) { // relevant operator candidates need to be double-checked for the relevance with the original conditions, because there can be additional // conflicts with the operator preconditions, conditional effects constraints, and/or incompatibility with the mutex constraints if (oper.IsRelevant(sourceConditions)) { yield return(new Predecessor(sourceConditions, oper)); } } }