Skip to main content

McKay's canonical augmentation method explained for simple graphs

The previous post talked about generating one type of combinatorial object (chessboards) using a method similar to that outlined by Brendan McKay in a paper called "Isomorph-free exhaustive generation" (J Algorithms, 26 (1998) 306-324.). This one will focus instead on simple graphs, which requires both parts of the method.

The canonical construction (or canonical augmentation) method has two components. Firstly, only one 'expansion' of a graph is tried at each step from the set of equivalent expansions. Secondly, the expansions are checked to see if they are the inverse of a 'canonical deletion' for that graph.

For an example of the first rule, consider this set of expansions of a 4-vertex graph on the left:

Each of the 5-vertex graphs on the right are shown with the newly added vertex and edges in red; the arrows are labelled by the added edge set - so {1:4, 3:4} means edges added from 1 to 4 and 3 to 4. The sets of vertices to add to - {{0}, {1}, {1,3}} - are representatives of the orbit of these vertices. For example, the orbit of {1} in G(4) is {1, 2} as these two vertices are equivalent in G(4) on the left.

This is now quite similar to the situation with chessboards : trying only minimal orbit representatives for extending an object. In McKay's paper, the process of generating child objects is split into 'upper' and 'lower' objects. An upper object is a pair where X is (say) a graph, and W is a set of vertices to connect to a new vertex. A lower object is a pair where v is a vertex to delete. This is illustrated here:


Click for bigger, as usual. There is a function shown between a lower object for X' and an upper object for X. This is the 'deletion' function, and its inverse is the important one : f-1, the function that adds a new vertex by connecting it to all the vertices in W.

This process will generate isomorphic graphs, so there has to be a way to reject children that are not canonical. This is where the second part comes in ... unfortunately it is harder to describe.

Roughly, we need to check that the newly added vertex is the one that should have been added if it was canonical. To verify this, the child graph is canonically labelled (eg : see this post, or possibly this one) and then the code checks if the added vertex (under the canonical labelling) is in the same orbit as the last one. Kind of.

The upshot is that this code now produces results very similar to nauty (geng) for graphs up to 8-12 vertices. For the larger numbers, I started to restrict the maximum degree, to shorten the runtime. It's definitely not as fast as nauty, but not too bad. I still have the lingering suspicion that I might start missing graphs for larger spaces, but it's not bad, not bad at all...

Comments

Asad said…
Check out this reply..

Greg Kuperberg (mathoverflow.net/users/1450), Complete graph invariants?, http://mathoverflow.net/questions/11715 (version: 2010-01-14)
gilleain said…
I sort of understand what he's saying there. Actually, the code in the repository uses a certificate (which is a graph invariant) to do things like searching for a graph in a file or diff-ing two sets of graphs.
Anonymous said…
Hey there

Popular posts from this blog

Adamantane, Diamantane, Twistane

After cubane, the thought occurred to look at other regular hydrocarbons. If only there was some sort of classification of chemicals that I could use look up similar structures. Oh wate, there is . Anyway, adamantane is not as regular as cubane, but it is highly symmetrical, looking like three cyclohexanes fused together. The vertices fall into two different types when colored by signature: The carbons with three carbon neighbours (degree-3, in the simple graph) have signature (a) and the degree-2 carbons have signature (b). Atoms of one type are only connected to atoms of another - the graph is bipartite . Adamantane connects together to form diamondoids (or, rather, this class have adamantane as a repeating subunit). One such is diamantane , which is no longer bipartite when colored by signature: It has three classes of vertex in the simple graph (a and b), as the set with degree-3 has been split in two. The tree for signature (c) is not shown. The graph is still bipartite accordin

Király's Method for Generating All Graphs from a Degree Sequence

After posting about the Hakimi-Havel  theorem, I received a nice email suggesting various relevant papers. One of these was by Zoltán Király  called " Recognizing Graphic Degree Sequences and Generating All Realizations ". I have now implemented a sketch of the main idea of the paper, which seems to work reasonably well, so I thought I would describe it. See the paper for details, of course. One focus of Király's method is to generate graphs efficiently , by which I mean that it has polynomial delay. In turn, an algorithm with 'polynomial delay' takes a polynomial amount of time between outputs (and to produce the first output). So - roughly - it doesn't take 1s to produce the first graph, 10s for the second, 2s for the third, 300s for the fourth, and so on. Central to the method is the tree that is traversed during the search for graphs that satisfy the input degree sequence. It's a little tricky to draw, but looks something like this: At the top

General Graph Layout : Putting the Parts Together

An essential tool for graph generation is surely the ability to draw graphs. There are, of course, many methods for doing so along with many implementations of them. This post describes one more (or perhaps an existing method - I haven't checked). Firstly, lets divide a graph up into two parts; a) the blocks, also known as ' biconnected components ', and b) trees connecting those blocks. This is illustrated in the following set of examples on 6 vertices: Trees are circled in green, and blocks in red; the vertices in the overlap between two circles are articulation points. Since all trees are planar, a graph need only have planar blocks to be planar overall. The layout then just needs to do a tree layout  on the tree bits and some other layout on the embedding of the blocks. One slight wrinkle is shown by the last example in the image above. There are three parts - two blocks and a tree - just like the one to its left, but sharing a single articulation point. I had