output the adjacency matrix

This commit is contained in:
filifa 2025-05-02 01:04:00 -04:00
parent 1f589633b7
commit 2e48c11582
2 changed files with 26 additions and 6 deletions

View File

@ -24,6 +24,7 @@ import (
"gonum.org/v1/gonum/graph" "gonum.org/v1/gonum/graph"
"gonum.org/v1/gonum/graph/encoding" "gonum.org/v1/gonum/graph/encoding"
"gonum.org/v1/gonum/graph/simple" "gonum.org/v1/gonum/graph/simple"
"gonum.org/v1/gonum/mat"
) )
type AbsorbingMarkovChain struct { type AbsorbingMarkovChain struct {
@ -37,12 +38,7 @@ func NewAbsorbingMarkovChain() *AbsorbingMarkovChain {
func (g *AbsorbingMarkovChain) IsValid() bool { func (g *AbsorbingMarkovChain) IsValid() bool {
for nodes := g.Nodes(); nodes.Next(); { for nodes := g.Nodes(); nodes.Next(); {
u := nodes.Node().(*node) u := nodes.Node().(*node)
if g.outWeightSum(u) > 1 {
if g.From(u.ID()).Len() == 0 {
continue
}
if g.outWeightSum(u) != 1 {
return false return false
} }
} }
@ -63,6 +59,24 @@ func (g *AbsorbingMarkovChain) outWeightSum(u *node) float64 {
return sum return sum
} }
func (g *AbsorbingMarkovChain) AdjacencyMatrix() mat.Matrix {
adj := simple.NewDirectedMatrix(g.Nodes().Len(), 0, math.NaN(), 0)
for edges := g.WeightedEdges(); edges.Next(); {
adj.SetWeightedEdge(edges.WeightedEdge())
}
a := mat.DenseCopyOf(adj.Matrix())
nodes := adj.Nodes()
for i := 0; nodes.Next(); i++ {
id := nodes.Node().ID()
u := g.Node(id).(*node)
a.Set(i, i, 1 - g.outWeightSum(u))
}
return a
}
func (g *AbsorbingMarkovChain) NewEdge(from, to graph.Node) graph.Edge { func (g *AbsorbingMarkovChain) NewEdge(from, to graph.Node) graph.Edge {
e := g.WeightedDirectedGraph.NewWeightedEdge(from, to, math.NaN()).(simple.WeightedEdge) e := g.WeightedDirectedGraph.NewWeightedEdge(from, to, math.NaN()).(simple.WeightedEdge)
return &weightedEdge{WeightedEdge: e} return &weightedEdge{WeightedEdge: e}

View File

@ -17,12 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package cmd package cmd
import ( import (
"fmt"
"os" "os"
"scm.dairydemon.net/filifa/dptdist/cmd/internal/markov" "scm.dairydemon.net/filifa/dptdist/cmd/internal/markov"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"gonum.org/v1/gonum/graph/encoding/dot" "gonum.org/v1/gonum/graph/encoding/dot"
"gonum.org/v1/gonum/mat"
) )
var file string var file string
@ -57,6 +59,10 @@ func parse(cmd *cobra.Command, args []string) {
if !graph.IsValid() { if !graph.IsValid() {
panic("not an absorbing Markov chain!") panic("not an absorbing Markov chain!")
} }
a := graph.AdjacencyMatrix()
out := mat.Formatted(a)
fmt.Printf("%v\n", out)
} }
// Execute adds all child commands to the root command and sets flags appropriately. // Execute adds all child commands to the root command and sets flags appropriately.