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]));
        }
Example #6
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();
        }