Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

The acyclic orientations function behaves unexpectedly

I need all of the acyclic orientations of an input graph.

There is a handy function

acyclic_orientations()

which is meant to return an iterator for the acyclic orientations which, when asked, will return a digraph representing the "next" acyclic orientation.

But I am not sure what it is actually doing because it seems to be producing the same acyclic orientation multiple times.

g = Graph([(0,1),(1,2),(2,3),(3,0),(0,2)])
for d in g.acyclic_orientations():
    print(d.edges(labels=false))

[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
...
...
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]

It produces 18 identical lines. There are actually 18 acyclic orientations of this graph, and so the number is at least correct, but I would like to it actually return the correct orientations.

For very small graphs, I can avoid this problem by using the function

orientations()

which produces every orientation and then extract the acyclic ones.

g = Graph([(0,1),(1,2),(2,3),(3,0),(0,2)])
for d in g.orientations():
    if d.all_simple_cycles() == []:
        print(d.edges(labels=false))

[(0, 1), (0, 2), (0, 3), (1, 2), (2, 3)]
[(0, 1), (0, 2), (0, 3), (1, 2), (3, 2)]
[(0, 1), (0, 2), (0, 3), (2, 1), (2, 3)]
...
...
[(1, 0), (2, 0), (2, 1), (3, 0), (3, 2)]

The acyclic orientations function behaves unexpectedly

I need all of the acyclic orientations of an input graph.

There is a handy function

acyclic_orientations()

which is meant to return an iterator for the acyclic orientations which, when asked, will return a digraph representing the "next" acyclic orientation.

But I am not sure what it is actually doing because it seems to be producing the same acyclic orientation multiple times.

g = Graph([(0,1),(1,2),(2,3),(3,0),(0,2)])
for d in g.acyclic_orientations():
    print(d.edges(labels=false))

[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]
...
...
[(1, 0), (1, 2), (2, 0), (3, 0), (3, 2)]

It produces 18 identical lines. There are actually 18 acyclic orientations of this graph, and so the number is at least correct, but I would like to it actually return the correct orientations.

For very small graphs, I can avoid this problem by using the function

orientations()

which produces every orientation and then extract the acyclic ones.

g = Graph([(0,1),(1,2),(2,3),(3,0),(0,2)])
for d in g.orientations():
    if d.all_simple_cycles() == []:
        print(d.edges(labels=false))

[(0, 1), (0, 2), (0, 3), (1, 2), (2, 3)]
[(0, 1), (0, 2), (0, 3), (1, 2), (3, 2)]
[(0, 1), (0, 2), (0, 3), (2, 1), (2, 3)]
...
...
[(1, 0), (2, 0), (2, 1), (3, 0), (3, 2)]