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/multi"
|
||||
"gonum.org/v1/gonum/graph/simple"
|
||||
"gonum.org/v1/gonum/graph/topo"
|
||||
"gonum.org/v1/gonum/mat"
|
||||
)
|
||||
|
||||
|
@ -79,6 +80,32 @@ func (g *AbsorbingMarkovChain) AbsorbingNodes() []graph.Node {
|
|||
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 {
|
||||
adj := simple.NewDirectedMatrix(g.Nodes().Len(), 0, 0, 0)
|
||||
for edges := g.WeightedEdges(); edges.Next(); {
|
||||
|
|
|
@ -57,6 +57,10 @@ func parse(cmd *cobra.Command, args []string) {
|
|||
}
|
||||
|
||||
if !graph.IsValid() {
|
||||
panic("not a Markov chain!")
|
||||
}
|
||||
|
||||
if !graph.IsAbsorbing() {
|
||||
panic("not an absorbing Markov chain!")
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue