private LinkedList <ViterbiNode> GeneratePath(ViterbiNode eos, SidetrackEdge sidetrackEdge) { LinkedList <ViterbiNode> result = new LinkedList <ViterbiNode>(); ViterbiNode node = eos; result.AddLast(node); while (node.LeftNode != null) { ViterbiNode leftNode = node.LeftNode; if (sidetrackEdge != null && sidetrackEdge.Head == node) { leftNode = sidetrackEdge.Tail; sidetrackEdge = sidetrackEdge.Parent; } node = leftNode; result.AddFirst(node); } return(result); }
List <SidetrackEdge> GetPaths(ViterbiNode eos, int maxCount, int costSlack) { var result = new List <SidetrackEdge>(); result.Add(null); PathCosts.Add(BaseCost); var sidetrackHeap = new PriorityQueue <SidetrackEdge>(); var sideTrackEdge = Sidetracks[eos]; while (sideTrackEdge != null) { sidetrackHeap.Add(sideTrackEdge); sideTrackEdge = sideTrackEdge.NextOption; } for (var i = 1; i < maxCount; i++) { if (sidetrackHeap.Count == 0) { break; } sideTrackEdge = sidetrackHeap.Dequeue(); if (sideTrackEdge.Cost > costSlack) { break; } result.Add(sideTrackEdge); PathCosts.Add(BaseCost + sideTrackEdge.Cost); var nextSidetrack = Sidetracks[sideTrackEdge.Tail]; while (nextSidetrack != null) { var next = new SidetrackEdge(nextSidetrack.Cost, nextSidetrack.Tail, nextSidetrack.Head); next.Parent = sideTrackEdge; sidetrackHeap.Add(next); nextSidetrack = nextSidetrack.NextOption; } } return(result); }
private List <SidetrackEdge> GetPaths(ViterbiNode eos, int maxCount, int costSlack) { List <SidetrackEdge> result = new List <MultiSearcher.SidetrackEdge>(); result.Add(null); pathCosts.Add(baseCost); PriorityQueue <SidetrackEdge> sidetrackHeap = new PriorityQueue <SidetrackEdge>(); SidetrackEdge sideTrackEdge = sidetracks[eos]; while (sideTrackEdge != null) { sidetrackHeap.Add(sideTrackEdge); sideTrackEdge = sideTrackEdge.NextOption; } for (int i = 1; i < maxCount; i++) { if (sidetrackHeap.IsEmpty()) { break; } sideTrackEdge = sidetrackHeap.Poll(); if (sideTrackEdge.Cost > costSlack) { break; } result.Add(sideTrackEdge); pathCosts.Add(baseCost + sideTrackEdge.Cost); SidetrackEdge nextSidetrack = sidetracks[sideTrackEdge.Tail]; while (nextSidetrack != null) { SidetrackEdge next = new SidetrackEdge(nextSidetrack.Cost, nextSidetrack.Tail, nextSidetrack.Head); next.Parent = sideTrackEdge; sidetrackHeap.Add(next); nextSidetrack = nextSidetrack.NextOption; } } return(result); }
List <ViterbiNode> GeneratePath(ViterbiNode eos, SidetrackEdge sidetrackEdge) { var result = new LinkedList <ViterbiNode>(); var node = eos; result.AddFirst(eos); while (node.LeftNode != null) { var leftNode = node.LeftNode; if (sidetrackEdge != null && sidetrackEdge.Head == node) { leftNode = sidetrackEdge.Tail; sidetrackEdge = sidetrackEdge.Parent; } node = leftNode; result.AddFirst(node); } return(result.ToList()); }