// Records which arcs make up the best bath: private void SetBestPathMap(WrappedPositionArray positions, int startPos, Position endPosData, int fromIDX) { bestPathMap.Clear(); int pos = endPosData.pos; int bestIDX = fromIDX; while (pos > startPos) { Position posData = positions.Get(pos); int backPos = posData.backPos[bestIDX]; int backIDX = posData.backIndex[bestIDX]; string toNodeID = GetNodeID(pos, bestIDX); string fromNodeID = GetNodeID(backPos, backIDX); if (Debugging.AssertsEnabled) { Debugging.Assert(!bestPathMap.ContainsKey(fromNodeID)); Debugging.Assert(!bestPathMap.Values.Contains(toNodeID)); } bestPathMap[fromNodeID] = toNodeID; pos = backPos; bestIDX = backIDX; } }
// Backtraces another incremental fragment: internal void OnBacktrace(JapaneseTokenizer tok, WrappedPositionArray positions, int lastBackTracePos, Position endPosData, int fromIDX, char[] fragment, bool isEnd) { SetBestPathMap(positions, lastBackTracePos, endPosData, fromIDX); sb.Append(FormatNodes(tok, positions, lastBackTracePos, endPosData, fragment)); if (isEnd) { sb.Append(" fini [style=invis]\n"); sb.Append(" "); sb.Append(GetNodeID(endPosData.pos, fromIDX)); sb.Append(" -> fini [label=\"" + EOS_LABEL + "\"]"); } }
private string FormatNodes(JapaneseTokenizer tok, WrappedPositionArray positions, int startPos, Position endPosData, char[] fragment) { StringBuilder sb = new StringBuilder(); // Output nodes for (int pos = startPos + 1; pos <= endPosData.pos; pos++) { Position posData = positions.Get(pos); for (int idx = 0; idx < posData.count; idx++) { sb.Append(" "); sb.Append(GetNodeID(pos, idx)); sb.Append(" [label=\""); sb.Append(pos); sb.Append(": "); sb.Append(posData.lastRightID[idx]); sb.Append("\"]\n"); } } // Output arcs for (int pos = endPosData.pos; pos > startPos; pos--) { Position posData = positions.Get(pos); for (int idx = 0; idx < posData.count; idx++) { Position backPosData = positions.Get(posData.backPos[idx]); string toNodeID = GetNodeID(pos, idx); string fromNodeID = GetNodeID(posData.backPos[idx], posData.backIndex[idx]); sb.Append(" "); sb.Append(fromNodeID); sb.Append(" -> "); sb.Append(toNodeID); string attrs; bestPathMap.TryGetValue(fromNodeID, out string path); if (toNodeID.Equals(path, StringComparison.Ordinal)) { // This arc is on best path attrs = " color=\"#40e050\" fontcolor=\"#40a050\" penwidth=3 fontsize=20"; } else { attrs = ""; } IDictionary dict = tok.GetDict(posData.backType[idx]); int wordCost = dict.GetWordCost(posData.backID[idx]); int bgCost = costs.Get(backPosData.lastRightID[posData.backIndex[idx]], dict.GetLeftId(posData.backID[idx])); string surfaceForm = new string(fragment, posData.backPos[idx] - startPos, pos - posData.backPos[idx]); sb.Append(" [label=\""); sb.Append(surfaceForm); sb.Append(' '); sb.Append(wordCost); if (bgCost >= 0) { sb.Append('+'); } sb.Append(bgCost); sb.Append("\""); sb.Append(attrs); sb.Append("]\n"); } } return(sb.ToString()); }