/// <summary> /// Generates all possible SAS+ relative states meeting conditions specified by the given conditions. Lazy generated via yield return. /// </summary> /// <param name="conditions">Reference conditions.</param> /// <param name="variables">Variables of the planning problem.</param> /// <returns>All possible SAS+ relative states meeting the conditions.</returns> public static IEnumerable <IRelativeState> EnumerateRelativeStates(IConditions conditions, Variables variables) { foreach (var simpleCondition in conditions.GetSimpleConditions()) { yield return(GetCorrespondingRelativeState(simpleCondition, variables)); } }
/// <summary> /// Gets a collection of all relevant predecessors (backwards transitions) from the specified conditions. Lazy generated via yield return. /// </summary> /// <param name="treeRoot">Root of the operator decision tree to be traversed.</param> /// <param name="conditions">Original conditions.</param> /// <returns>Lazy generated collection of relevant predecessors.</returns> public IEnumerable <IPredecessor> GetPredecessors(IOperatorDecisionTreeNode treeRoot, IConditions conditions) { foreach (var simpleConditions in conditions.GetSimpleConditions()) { foreach (var predecessor in treeRoot.Accept(this, conditions, simpleConditions)) { yield return(predecessor); } } }
/// <summary> /// Generates all possible SAS+ states meeting conditions specified by the given conditions. Lazy generated via yield return. /// </summary> /// <param name="conditions">Reference conditions.</param> /// <param name="variables">Variables of the planning problem.</param> /// <returns>All possible SAS+ states meeting the conditions.</returns> public static IEnumerable <IState> EnumerateStates(IConditions conditions, Variables variables) { foreach (var simpleCondition in conditions.GetSimpleConditions()) { foreach (var state in EnumerateStates(simpleCondition, variables)) { yield return(state); } } }
/// <summary> /// Computes the distances to the goals for the specified pattern. /// </summary> /// <param name="pattern">Pattern (i.e. variables of the pattern) to process.</param> private PatternValuesDistances ComputePatternDistances(int[] pattern) { IHeap <double, ISimpleConditions> fringe = new LeftistHeap <ISimpleConditions>(); InsertPatternConditions(fringe, (Conditions)Problem.GoalConditions, 0, pattern); PatternValuesDistances patternValuesDistances = new PatternValuesDistances(); while (fringe.GetSize() > 0) { double distance = fringe.GetMinKey(); ISimpleConditions conditions = fringe.RemoveMin(); int[] patternValues = conditions.GetAssignedValues(); Debug.Assert(pattern.Length == conditions.GetSize()); Debug.Assert(pattern.Length == patternValues.Length); if (patternValuesDistances.ContainsKey(patternValues)) { // already processed with a lower cost continue; } patternValuesDistances.Add(patternValues, distance); foreach (var predecessor in Problem.GetPredecessors(conditions)) { IConditions predecessorConditions = (IConditions)predecessor.GetPredecessorConditions(); IOperator predecessorOperator = (IOperator)predecessor.GetAppliedOperator(); foreach (var predecessorSimpleConditions in predecessorConditions.GetSimpleConditions()) { double cost = distance + predecessorOperator.GetCost(); InsertPatternConditions(fringe, predecessorSimpleConditions, cost, pattern); } } } return(patternValuesDistances); }