private NGram <T> GetNextState(NGram <T> curState, NextStateType searchType)
        {
            var edges = this.graph.Edges(curState);

            if (null == edges || edges.Count == 0)
            {
                switch (searchType)
                {
                case NextStateType.PossibleHeterogenous:
                    var pos = this.graph.GetLowerConstruct(curState);
                    if (pos.HasValue)
                    {
                        curState = pos.Value;
                    }
                    else
                    {
                        return(NGram <T> .Empty);
                    }
                    break;

                case NextStateType.Homogenous:
                    return(NGram <T> .Empty);
                }
            }
            while (true)
            {
                foreach (var item in edges)
                {
                    if (this.Random.NextDouble() < item.Probability)
                    {
                        return(item.Edge);
                    }
                }
            }
        }
        public NGram <T>[] WalkMarkovChain(int depth, NextStateType searchType = NextStateType.PossibleHeterogenous)
        {
            List <NGram <T> > path = new List <NGram <T> >(depth);

            (depth > 0).AssertTrue();

            NGram <T> curState = this.startingNode;

            path.Add(curState);
            for (int i = 1; i < depth; i++)
            {
                curState = this.GetNextState(curState, searchType);
                if (curState == NGram <T> .Empty)
                {
                    return(path.ToArray());
                }
                path.Add(curState);
            }
            return(path.ToArray());
        }