diff --git a/cmd/internal/markov/absorbing.go b/cmd/internal/markov/absorbing.go index 29c2e49..f975abe 100644 --- a/cmd/internal/markov/absorbing.go +++ b/cmd/internal/markov/absorbing.go @@ -60,6 +60,25 @@ func (g *AbsorbingMarkovChain) outWeightSum(u graph.Node) float64 { return sum } +func (g *AbsorbingMarkovChain) AbsorbingNodes() []graph.Node { + absorbingNodes := make([]graph.Node, 0) + for nodes := g.Nodes(); nodes.Next(); { + u := nodes.Node() + successors := g.From(u.ID()) + if successors.Len() != 1 { + continue + } + + successors.Next() + v := successors.Node() + if u == v { + absorbingNodes = append(absorbingNodes, u) + } + } + + return absorbingNodes +} + func (g *AbsorbingMarkovChain) AdjacencyMatrix() mat.Matrix { adj := simple.NewDirectedMatrix(g.Nodes().Len(), 0, 0, 0) for edges := g.WeightedEdges(); edges.Next(); {