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()); }