public IEnumerable <string> GenerateSequence()
        {
            IMarkovNode <string> start = GetNode(Constants.SentenceStart);
            IMarkovNode <string> end   = GetNode(Constants.SentenceBreak);

            return(GetSequenceInternal(start, end));
        }
        public string GenerateSentence()
        {
            IMarkovNode <string> start    = GetNode(Constants.SentenceStart);
            IMarkovNode <string> end      = GetNode(Constants.SentenceBreak);
            IEnumerable <string> sequence = GetSequenceInternal(start, end);

            return(string.Join(" ", sequence));
        }
 private IEnumerable <string> GetSequenceInternal(IMarkovNode <string> start, IMarkovNode <string> end)
 {
     for (int i = 0; i < MaxGenerateAttempts; i++)
     {
         List <string> s = GenerateSequenceInternalFrom(start, end).ToList();
         if (s.Count < 3)
         {
             continue;
         }
         return(s);
     }
     return(Enumerable.Empty <string>());
 }
        private IEnumerable <string> GenerateSequenceInternalFrom(IMarkovNode <string> start, IMarkovNode <string> end)
        {
            IMarkovNode <string> current = start;

            while (true)
            {
                // TODO: If the character is a quote, comma or semi-colon, the previous word should
                // be used instead
                string nextKey = current.GetRandomNext();
                if (nextKey == end.Value)
                {
                    break;
                }

                string word = nextKey.Split('|').First();

                yield return(word);

                current = GetNode(word);
            }
        }
        public void Train(IEnumerable <string> sequence)
        {
            IEnumerator <string> enumerator = sequence.GetEnumerator();

            enumerator.MoveNext();
            string token = enumerator.Current;

            IMarkovNode <string> currentNode = GetNode(token);

            while (enumerator.MoveNext())
            {
                // Get the next node.
                token = enumerator.Current;
                IMarkovNode <string> node = GetNode(token);

                // Point the current node to the next node
                currentNode.AddNext(token);

                // Update the current node
                currentNode = node;
            }
        }