Function Repository Resource:

BidirectedGraph

Source Notebook

Modify Graph to include extraverted double edges

Contributed by: Bradley Klee

ResourceFunction["BidirectedGraph"][g]

returns graph g, styled as a bidirectional graph, by default collapsing 2-cycles into extraverted edges.

ResourceFunction["BidirectedGraph"][{e1,e2,}]

returns the graph with edges ej, styled as a bidirectional graph, by default collapsing 2-cycles into extraverted edges.

Details

The following options can be given:
FilterTruedecides whether or not to collapse 2-cycles

Examples

Basic Examples (4) 

Force two-cycles from DirectedGraph to overlap:

In[1]:=
Row[{#, Style["\[LongRightArrow]", Gray, Bold, 40], ResourceFunction["BidirectedGraph"][#, Options[#]]}] &@
 DirectedGraph[
  UndirectedEdge @@ # & /@ Partition[Range[3], 2, 1, 1], ImageSize -> 200]
Out[1]=

Do not collapse edges:

In[2]:=
Row[{#, Style["\[LongRightArrow]", Gray, Bold, 40], ResourceFunction["BidirectedGraph"][#, Options[#], "Filter" -> False]}] &@DirectedGraph[
  UndirectedEdge @@ # & /@ Partition[Range[3], 2, 1, 1], ImageSize -> 200]
Out[2]=

Instead of converting graphs, specify edges directly:

In[3]:=
With[{edges = DirectedEdge @@ # & /@ Tuples[Range[4], 2]},
 Row[{Graph[edges, ImageSize -> 200],
   Style["\[LongRightArrow]", Gray, Bold, 40],
   ResourceFunction["BidirectedGraph"][edges, ImageSize -> 200]}]]
Out[3]=

BidirectedGraph supports four different edge specifications:

In[4]:=
With[{edges = {
    UndirectedEdge[1, 4],
    DirectedEdge[1, 2],
    DirectedEdge[2, 1],
    LeftRightArrow[2, 3],
    3 -> 4,
    DirectedEdge[4, 3]}},
 ResourceFunction["BidirectedGraph"][edges, "Filter" -> #] & /@ {False, True}
 ]
Out[4]=

Possible Issues (2) 

Due to hacking of Graph, edge colorings may work out incorrectly:

In[5]:=
ResourceFunction["BidirectedGraph"][{
  UndirectedEdge[1, 4],
  DirectedEdge[1, 2],
  DirectedEdge[2, 1],
  LeftRightArrow[2, 3],
  3 -> 4,
  DirectedEdge[4, 3]},
 "Filter" -> False,
 {VertexStyle -> Red,
  EdgeStyle -> {
    LeftRightArrow[_, _] -> Red,
    DirectedEdge[_, _] -> Green}}]
Out[5]=

However, with more care, it is possible to get correct colorings:

In[6]:=
With[{edges = {UndirectedEdge[1, 4],
    DirectedEdge[1, 2],
    DirectedEdge[2, 1],
    LeftRightArrow[2, 3],
    3 -> 4,
    DirectedEdge[4, 3]}},
 ResourceFunction["BidirectedGraph"][edges, "Filter" -> False, EdgeStyle -> MapThread[
    Alternatives @@ (Cases[edges, #1[_, _]]) -> #2 &,
    {{DirectedEdge, LeftRightArrow, UndirectedEdge}, {Red, Green, Blue}}
    ]]]
Out[6]=

Neat Examples (1) 

Reduce clutter on multiway graphs:

In[7]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/59704a88-48cf-4dc4-b267-0b7a25557a8c"]
In[8]:=
ResourceFunction["BidirectedGraph"]@multiwayGraph
Out[8]=

Publisher

Brad Klee

Version History

  • 1.0.0 – 07 March 2022

Related Resources

License Information