protected override DecompositionStatus OnDecomposeSlot(IContext ctx, Slot task, int taskIndex, int[] oldStackDepth, out Queue <ITask> result) { var status = task.Decompose(ctx, 0, out var subPlan); // If result is null, that means the entire planning procedure should cancel. if (status == DecompositionStatus.Rejected) { Plan.Clear(); ctx.TrimToStackDepth(oldStackDepth); result = null; return(DecompositionStatus.Rejected); } // If the decomposition failed if (status == DecompositionStatus.Failed) { Plan.Clear(); ctx.TrimToStackDepth(oldStackDepth); result = Plan; return(DecompositionStatus.Failed); } while (subPlan.Count > 0) { Plan.Enqueue(subPlan.Dequeue()); } if (ctx.HasPausedPartialPlan) { if (taskIndex < Subtasks.Count - 1) { ctx.PartialPlanQueue.Enqueue(new PartialPlanEntry() { Task = this, TaskIndex = taskIndex + 1, }); } result = Plan; return(DecompositionStatus.Partial); } result = Plan; return(DecompositionStatus.Succeeded); }
protected override DecompositionStatus OnDecomposeSlot(IContext ctx, Slot task, int taskIndex, int[] oldStackDepth, out Queue <ITask> result) { // We need to record the task index before we decompose the task, // so that the traversal record is set up in the right order. ctx.MethodTraversalRecord.Add(taskIndex); if (ctx.DebugMTR) { ctx.MTRDebug.Add(task.Name); } var status = task.Decompose(ctx, 0, out var subPlan); // If status is rejected, that means the entire planning procedure should cancel. if (status == DecompositionStatus.Rejected) { result = null; return(DecompositionStatus.Rejected); } // If the decomposition failed if (status == DecompositionStatus.Failed) { // Remove the taskIndex if it failed to decompose. ctx.MethodTraversalRecord.RemoveAt(ctx.MethodTraversalRecord.Count - 1); if (ctx.DebugMTR) { ctx.MTRDebug.RemoveAt(ctx.MTRDebug.Count - 1); } result = Plan; return(DecompositionStatus.Failed); } while (subPlan.Count > 0) { Plan.Enqueue(subPlan.Dequeue()); } if (ctx.HasPausedPartialPlan) { result = Plan; return(DecompositionStatus.Partial); } result = Plan; return(result.Count == 0 ? DecompositionStatus.Failed : DecompositionStatus.Succeeded); }
protected override DecompositionStatus OnDecomposeSlot(IContext ctx, Slot task, int taskIndex, int[] oldStackDepth, out Queue <ITask> result) { // We need to record the task index before we decompose the task, // so that the traversal record is set up in the right order. ctx.MethodTraversalRecord.Add(taskIndex); if (ctx.DebugMTR) { ctx.MTRDebug.Add(task.Name); } var status = task.Decompose(ctx, 0, out var subPlan); // If status is rejected, that means the entire planning procedure should cancel. if (status == DecompositionStatus.Rejected) { if (ctx.LogDecomposition) { Log(ctx, $"Selector.OnDecomposeSlot:{status}: Decomposing {task.Name} was rejected.", ConsoleColor.Red); } result = null; return(DecompositionStatus.Rejected); } // If the decomposition failed if (status == DecompositionStatus.Failed) { // Remove the taskIndex if it failed to decompose. ctx.MethodTraversalRecord.RemoveAt(ctx.MethodTraversalRecord.Count - 1); if (ctx.DebugMTR) { ctx.MTRDebug.RemoveAt(ctx.MTRDebug.Count - 1); } if (ctx.LogDecomposition) { Log(ctx, $"Selector.OnDecomposeSlot:{status}: Decomposing {task.Name} failed.", ConsoleColor.Red); } result = Plan; return(DecompositionStatus.Failed); } while (subPlan.Count > 0) { var p = subPlan.Dequeue(); if (ctx.LogDecomposition) { Log(ctx, $"Selector.OnDecomposeSlot:Decomposing {task.Name}:Pushed {p.Name} to plan!", ConsoleColor.Blue); } Plan.Enqueue(p); } if (ctx.HasPausedPartialPlan) { if (ctx.LogDecomposition) { Log(ctx, $"Selector.OnDecomposeSlot:Return partial plan!", ConsoleColor.DarkBlue); } result = Plan; return(DecompositionStatus.Partial); } result = Plan; var s = result.Count == 0 ? DecompositionStatus.Failed : DecompositionStatus.Succeeded; if (ctx.LogDecomposition) { Log(ctx, $"Selector.OnDecomposeSlot:{s}!", s == DecompositionStatus.Succeeded ? ConsoleColor.Green : ConsoleColor.Red); } return(s); }
protected override DecompositionStatus OnDecomposeSlot(IContext ctx, Slot task, int taskIndex, int[] oldStackDepth, out Queue <ITask> result) { var status = task.Decompose(ctx, 0, out var subPlan); // If result is null, that means the entire planning procedure should cancel. if (status == DecompositionStatus.Rejected) { if (ctx.LogDecomposition) { Log(ctx, $"Sequence.OnDecomposeSlot:{status}: Decomposing {task.Name} was rejected.", ConsoleColor.Red); } Plan.Clear(); ctx.TrimToStackDepth(oldStackDepth); result = null; return(DecompositionStatus.Rejected); } // If the decomposition failed if (status == DecompositionStatus.Failed) { if (ctx.LogDecomposition) { Log(ctx, $"Sequence.OnDecomposeSlot:{status}: Decomposing {task.Name} failed.", ConsoleColor.Red); } Plan.Clear(); ctx.TrimToStackDepth(oldStackDepth); result = Plan; return(DecompositionStatus.Failed); } while (subPlan.Count > 0) { var p = subPlan.Dequeue(); if (ctx.LogDecomposition) { Log(ctx, $"Sequence.OnDecomposeSlot:Decomposing {task.Name}:Pushed {p.Name} to plan!", ConsoleColor.Blue); } Plan.Enqueue(p); } if (ctx.HasPausedPartialPlan) { if (ctx.LogDecomposition) { Log(ctx, $"Sequence.OnDecomposeSlot:Return partial plan at index {taskIndex}!", ConsoleColor.DarkBlue); } if (taskIndex < Subtasks.Count - 1) { ctx.PartialPlanQueue.Enqueue(new PartialPlanEntry() { Task = this, TaskIndex = taskIndex + 1, }); } result = Plan; return(DecompositionStatus.Partial); } result = Plan; if (ctx.LogDecomposition) { Log(ctx, $"Sequence.OnDecomposeSlot:Succeeded!", ConsoleColor.Green); } return(DecompositionStatus.Succeeded); }