add argument for setting weight attribute

This commit is contained in:
filifa 2025-05-06 23:56:20 -04:00
parent 39dd8d901e
commit fd26e49734
3 changed files with 11 additions and 5 deletions

View File

@ -28,17 +28,18 @@ import (
// DOTDirectedGraph is a graph to unmarshal DOT graphs. // DOTDirectedGraph is a graph to unmarshal DOT graphs.
type DOTDirectedGraph struct { type DOTDirectedGraph struct {
*igraph.DirectedGraph *igraph.DirectedGraph
WeightAttribute string
} }
// NewDOTDirectedGraph returns a graph with no nodes or edges. // NewDOTDirectedGraph returns a graph with no nodes or edges.
func NewDOTDirectedGraph() *DOTDirectedGraph { func NewDOTDirectedGraph(weightAttr string) *DOTDirectedGraph {
return &DOTDirectedGraph{DirectedGraph: igraph.NewDirectedGraph()} return &DOTDirectedGraph{DirectedGraph: igraph.NewDirectedGraph(), WeightAttribute: weightAttr}
} }
// NewLine returns a DOT-aware weighted line. // NewLine returns a DOT-aware weighted line.
func (g *DOTDirectedGraph) NewLine(from, to graph.Node) graph.Line { func (g *DOTDirectedGraph) NewLine(from, to graph.Node) graph.Line {
e := g.DirectedGraph.NewWeightedLine(from, to, math.NaN()).(multi.WeightedLine) e := g.DirectedGraph.NewWeightedLine(from, to, math.NaN()).(multi.WeightedLine)
return &weightedLine{WeightedLine: e} return &weightedLine{WeightedLine: e, weightAttribute: g.WeightAttribute}
} }
// NewNode returns a DOT-aware Node. // NewNode returns a DOT-aware Node.

View File

@ -46,6 +46,7 @@ func (n *Node) DOTID() string {
// multi.WeightedLine, it allows for self-loops. // multi.WeightedLine, it allows for self-loops.
type weightedLine struct { type weightedLine struct {
multi.WeightedLine multi.WeightedLine
weightAttribute string
} }
// SetAttribute enables storing the weight read from a DOT file. It errors if // SetAttribute enables storing the weight read from a DOT file. It errors if
@ -54,7 +55,7 @@ func (e *weightedLine) SetAttribute(attr encoding.Attribute) error {
var err error var err error
switch attr.Key { switch attr.Key {
case "len": case e.weightAttribute:
e.W, err = strconv.ParseFloat(attr.Value, 64) e.W, err = strconv.ParseFloat(attr.Value, 64)
default: default:
err = errors.New("unknown key:" + attr.Key) err = errors.New("unknown key:" + attr.Key)

View File

@ -35,6 +35,8 @@ var pythonFmt bool
var oneline bool var oneline bool
var weightAttr string
var nodeOrder []string var nodeOrder []string
// rootCmd represents the base command when called without any subcommands // rootCmd represents the base command when called without any subcommands
@ -58,7 +60,7 @@ func parse(cmd *cobra.Command, args []string) {
panic(err) panic(err)
} }
graph := idot.NewDOTDirectedGraph() graph := idot.NewDOTDirectedGraph(weightAttr)
err = dot.UnmarshalMulti(data, graph) err = dot.UnmarshalMulti(data, graph)
if err != nil { if err != nil {
panic(err) panic(err)
@ -148,5 +150,7 @@ func init() {
rootCmd.Flags().BoolVar(&oneline, "oneline", false, "output on one line") rootCmd.Flags().BoolVar(&oneline, "oneline", false, "output on one line")
rootCmd.Flags().StringVar(&weightAttr, "weight-attr", "len", "edge attribute to use as weight")
rootCmd.Flags().StringSliceVarP(&nodeOrder, "order", "o", nil, "order of nodes in rows/columns of output") rootCmd.Flags().StringSliceVarP(&nodeOrder, "order", "o", nil, "order of nodes in rows/columns of output")
} }