This week's LFE Friday was translated with permission from the Erlang Thursday series by Steven Proctor. This week's translator: Robert Virding.

Today's LFE Friday is on digraph:add_edge/4.

digraph:add_edge/4 takes a graph as its first argument, the originating (emanating) vertex as its second argument, the destination (incident) vertex as its third argument, and a label.

> (set graph (digraph:new))
#(digraph 8207 12304 16401 true)
> (set vertex-1 (digraph:add_vertex graph 'foo))
foo
> (set vertex-2 (digraph:add_vertex graph 'bar))
bar
> (set edge-1 (digraph:add_edge graph vertex-1 vertex-2 #(foo bar)))
($e . 0)
> (digraph:edges graph)
(($e . 0))
> (set edge-2 (digraph:add_edge graph vertex-2 vertex-1 #(bar foo)))
($e . 1)
> (digraph:edges graph)                                             
(($e . 1) ($e . 0))

The digraph module also contains digraph:add_edge/3 which allows you to not specify a label.

> (digraph:add_edge graph vertex-2 vertex-1)
($e . 2)
> (digraph:add_edge graph vertex-1 vertex-2)
($e . 3)
> (digraph:edges graph)                     
(($e . 1) ($e . 3) ($e . 0) ($e . 2))

The digraph module also contains digraph:add_edge/5 which allows you to specify the edge identifier, in this case we want the edge to be my-edge, as well as the label.

> (digraph:add_edge graph 'my-edge vertex-1 vertex-2 'my-label)
my-edge
> (digraph:edges graph)                                        
(($e . 1) ($e . 3) my-edge ($e . 0) ($e . 2))

And if you note in the examples for digraph:add_edge/3 and digraph:add_edge/5 we added a number of edges with the same emanate and incident vertices, and it was happy to create those edges for us.

We can also create acyclic digraphs by using digraph:new/1, and specifying that we want the digraph() to be acyclic.

> (set graph-2 (digraph:new '(acyclic)))
#(digraph 20498 24595 28692 false)
> (set vertex-a (digraph:add_vertex graph-2 'foo))
foo
> (set vertex-b (digraph:add_vertex graph-2 'bar))
bar
> (set edge-ab (digraph:add_edge graph-2 vertex-a vertex-b #(foo bar)))
($e . 0)
> (set edge-ba (digraph:add_edge graph-2 vertex-b vertex-a #(bar foo)))
#(error #(bad_edge (foo bar)))

When we try to add an edge that will create a cycle in an acyclic directed graph, we get a return of a bad_edge error with the two edges specified.

- Proctor, Robert



Author

Published

23 October 2015

Category

tutorials

Tags