add tests for if graph is absorbing markov chain
This commit is contained in:
parent
d373253d76
commit
4ec04b6abf
|
@ -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(); {
|
||||||
|
|
|
@ -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!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue