private WordPrediction CreatePrediction(Score score, bool isFirstWord) { WordPrediction prediction; var token = score.Token; var index = _source.GetTokenIndex(token); var rawText = _tokens[token]; string casedText; var isFollowOnFirstWord = false; if (isFirstWord) { casedText = _capitalizer(rawText); if (casedText == null) { casedText = rawText; } else { isFollowOnFirstWord = true; } } else { casedText = rawText; } Debug.Assert(string.Compare(rawText, casedText, StringComparison.OrdinalIgnoreCase) == 0); prediction = new WordPrediction(score, index, rawText, casedText, isFollowOnFirstWord); return(prediction); }
private void AddNextPrediction(WordPrediction prediction) { var added = _predictedTokens.Add(prediction.Token); Debug.Assert(added); var position = 0; while (position < _nascents.Count && _nascents[position]._first.Index < prediction.Index) { position++; } ScoredTokenPredictionMaker followOnMaker; WordPrediction followOn; if (_findFollowOnPredictions && prediction.Text[0] != '\0') { followOnMaker = _maker.CreateNextPredictionMaker(prediction.Token, null); followOn = GetTopPrediction(followOnMaker, prediction.IsFollowOnFirstWord); } else { followOnMaker = null; followOn = null; } var nascent = new NascentWordPredictionList(prediction, followOnMaker, followOn); _nascents.Insert(position, nascent); }
internal NascentWordPredictionList(WordPrediction prediction, ScoredTokenPredictionMaker followOnMaker, WordPrediction followOn) { _first = prediction; _list = new List <WordPrediction>(1) { prediction }; _last = prediction; _followOnMaker = followOnMaker; _followOn = followOn; }
private void InsertPrediction(List <WordPrediction> predictions, WordPrediction prediction) { _predictedTokens.Add(prediction.Token); var position = predictions.Count; while (0 < position && prediction.Index < predictions[position - 1].Index) { position--; } predictions.Insert(position, prediction); }
internal void MergeWithNext(NascentWordPredictionList next) { var targetPredictions = _list; var sourcePredictions = next._list; Debug.Assert(targetPredictions[0].Text.Length < sourcePredictions[0].Text.Length); Debug.Assert(sourcePredictions[0].Text.StartsWith(targetPredictions[0].Text)); var sourcePosition = 0; var targetPosition = 0; while (sourcePosition < sourcePredictions.Count && targetPosition < targetPredictions.Count) { if (sourcePredictions[sourcePosition].Index < targetPredictions[targetPosition].Index) { Debug.Assert(targetPredictions[targetPosition].Text.StartsWith(sourcePredictions[sourcePosition].Text)); targetPredictions.Insert(targetPosition, sourcePredictions[sourcePosition]); sourcePosition++; } else { Debug.Assert(targetPredictions[targetPosition].Index < sourcePredictions[sourcePosition].Index); Debug.Assert(sourcePredictions[sourcePosition].Text.StartsWith(targetPredictions[targetPosition].Text)); } targetPosition++; } if (sourcePosition < sourcePredictions.Count) { while (sourcePosition < sourcePredictions.Count) { targetPredictions.Add(sourcePredictions[sourcePosition]); sourcePosition++; } _followOnMaker = next._followOnMaker; _followOn = next._followOn; } else { Debug.WriteLine("TODO: Debug.Assert(ReferenceEquals(_followOn, next._followOn));"); } Debug.Assert(ReferenceEquals(_first, _list[0])); }
private void DisplayInitialCorePredictions(List <List <WordPrediction> > coreCompoundPredicitions, List <WordPrediction> followOnPredictions, WordPrediction wordPrediction) { Debug.WriteLine("Initial core position:"); Debug.Indent(); for (var i = 0; i < coreCompoundPredicitions.Count; i++) { var builder = new StringBuilder(); foreach (var group in coreCompoundPredicitions[i]) { if (builder.Length != 0) { builder.Append(" / "); } var groupText = string.Join(" ", group); builder.Append(groupText); } Debug.WriteLine($"{builder} {followOnPredictions[i]}"); } Debug.WriteLine($"--- {wordPrediction}"); Debug.Unindent(); }