add tests for if graph is absorbing markov chain

This commit is contained in:
filifa 2025-05-02 21:02:05 -04:00
parent d373253d76
commit 4ec04b6abf
2 changed files with 31 additions and 0 deletions

View File

@ -25,6 +25,7 @@ import (
"gonum.org/v1/gonum/graph/encoding" "gonum.org/v1/gonum/graph/encoding"
"gonum.org/v1/gonum/graph/multi" "gonum.org/v1/gonum/graph/multi"
"gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/simple"
"gonum.org/v1/gonum/graph/topo"
"gonum.org/v1/gonum/mat" "gonum.org/v1/gonum/mat"
) )
@ -79,6 +80,32 @@ func (g *AbsorbingMarkovChain) AbsorbingNodes() []graph.Node {
return absorbingNodes return absorbingNodes
} }
func (g *AbsorbingMarkovChain) IsAbsorbing() bool {
absorbingNodes := g.AbsorbingNodes()
if len(absorbingNodes) == 0 {
return false
}
for nodes := g.Nodes(); nodes.Next(); {
u := nodes.Node()
if !g.canBeAbsorbed(u, absorbingNodes) {
return false
}
}
return true
}
func (g *AbsorbingMarkovChain) canBeAbsorbed(u graph.Node, absorbingNodes []graph.Node) bool {
for _, v := range absorbingNodes {
if topo.PathExistsIn(g, u, v) {
return true
}
}
return false
}
func (g *AbsorbingMarkovChain) AdjacencyMatrix() mat.Matrix { func (g *AbsorbingMarkovChain) AdjacencyMatrix() mat.Matrix {
adj := simple.NewDirectedMatrix(g.Nodes().Len(), 0, 0, 0) adj := simple.NewDirectedMatrix(g.Nodes().Len(), 0, 0, 0)
for edges := g.WeightedEdges(); edges.Next(); { for edges := g.WeightedEdges(); edges.Next(); {

View File

@ -57,6 +57,10 @@ func parse(cmd *cobra.Command, args []string) {
} }
if !graph.IsValid() { if !graph.IsValid() {
panic("not a Markov chain!")
}
if !graph.IsAbsorbing() {
panic("not an absorbing Markov chain!") panic("not an absorbing Markov chain!")
} }