[Nauty] Nauty and Traces version 2.9.1 is available

Brendan McKay Brendan.McKay at anu.edu.au
Mon Sep 8 21:50:40 AEST 2025


Dear nauty people,

Version 2.9.1 of nauty&Traces is available at
https://users.cecs.anu.edu.au/~bdm/nauty/ and
https://pallini.di.uniroma1.it/ .

It is especially important that you upgrade if you installed any of 
these versions:
2.9.0, 2.9.1rc1, 2.9.1rc2, as they had a nasty bug in dreadnaut (mea culpa).

A list of changes since version 2.8.9 is below.

Cheers, Brendan and Adolfo.

-----------------------------------------------------------------

* Many changes to configure.ac, makefile.in and runalltests.  Major
   changes to the header files to account for the foibles of different
   operating systems and compiler standards.  Successful installation is
   now confirmed on 20 different OSes (but there is always #21...).
   Some programs (dreadnaut.c, shortg.c, dretog.c) now declare
   _POSIX_C_SOURCE=200809L and _XOPEN_SOURCE=500, but none
   of the *.h files touch those variables.

* Fixed bugs in pickg/countg for chromatic number (-G) and connectivity (-N).
   These were related bugs in testg.c and not in the procedures in
   nauchromatic.c and nauconnect.c.

* pickg/countg --HH counts hexagons (6-cycles) in undirected graphs.
   Fixed pickg/countg documentation for colouring parameters.
   pickg/countg -Y works faster if an low upper limit is given.

* Added "c" option to genposetg to select only connected posets.

* countneg -n (but not -e) can now handle incremental sparse format.

* The space efficiency of uniqg has improved to 48 bytes per isomorphism
   class, a bit more than 22 million per gigabyte. It got a little faster too.
- uniqg -H was good in 2.8.8 but broken in 2.8.9. Hopefully it's good again.
- uniqg -y writes a 256-bit hash of the input equivalence classes.
   It is independent of the word size and endianness, but depends on -S, -t
   and the parameters for colouring and invariants.
- The SHA256 procedures have been migrated to a separate file nausha.c
   so they can be used in other programs. See that file for documentation.
   That code is freeware by Brad Conte.

* listg -T writes a one-line format like 0--1,2--3,... as required by the
   program 'tutte'.

* Changes to dreadnaut:
   - The options related to invariants have been separated into options for
     digraphs and options for undirected graphs. To set the options
     (commands *, k and K) you need set the digraph option (+d or -d) first.
     This change was implemented so that the default invariant for digraphs
     could be changed to "adjacencies". The default for undirected graphs
     remains to not use an invariant.  Now dreadnaut should obtain the same
     canonical forms as the interfaces densenauty() and sparsenauty().

   - The command (...) can construct a graph from its graph6, sparse6, or
     digraph6 code, either given explicitly or read from a file.  Examples:
       (IheA at GUAo)  - get the Petersen graph from its graph6 code
       (:I`ES at obGkqegW~)  - similarly for its sparse6 code
       (<file) - read the first graph from file "file"
       (<file#12) - read the 12th graph from file "file" (the first is #1).
       (<cmd:genspecialg -XTutte12Cage) - read the Tutte 12-cage as made
          by the utility genspecialg (assuming your operating system supports
          the popen() function)
     White space is ignored except for spaces in file or command names.

   - The commands t (write the graph) and b (write the canonical graph) have
     new variants t6 and b6 that write the respective graphs in graph6,
     sparse6 or digraph6 format, instead of the default human-readable format.

   - If your computer has the facility, you will get a suggestion to increase
     the stack size if dreadnaut crashes due to running out of stack. The
     command to do that on Unix-like systems is ulimit -s. Probably this will
     be futile, as it means nauty recursed to a very deep level and is unlikely
     to finish any time soon. An invariant might help.

* It has always been the case that options.digraph needs to be set to TRUE
   for undirected graphs with loops. This is now enforced by dreadnaut, and
   the interfaces densenauty() and sparsenauty(), by temporarily changing the
   option before nauty is called, if necessary.  You are still responsible
   for this if you use the direct nauty() interface. Traces is not certified
   for loops at all.

* The default for hamheuristic -L was increased. It also has a new option -c
   to perform an independent check of hamiltonian cycles after they are found.

* Functions setsize() and setinter() in naututil.c became type long long,
   as the previous type int is too small and maybe size_t is also too small.

* genspecialg has 29 new named graphs. Use genspecialg -Xhelp for a list.

* delptg -A deletes all the vertices specified by -d and/or -v.
   delptg -k# makes the #-core of the input graphs, formed by recursively
     removing vertices of degree less than #.
   Loops are now supported by delptg and contribute 2 to the degree for
     undirected graphs.

* "extern" has been removed from external function declarations. While it has
   not strictly been needed since the age of the dinosaurs, decades ago there
   were compilers that failed without it. Hopefully that is no longer true.

* Add parameter -D to nbrhoodg to select subgraphs in an interval of distances
   from a vertex. See nbrhoodg --help .

* addptg -D# restricts the maximum (out-)degree of the outputs.

* In the help text for countg/pickg, --A# should be --NN#. Also fixed a bug
   in reading the parameters that could cause a crash sometimes.

* New utility distgraphg makes output graphs according to the distances
   between vertices in the input graphs.

* An uninitialised variable with unknown consequences was fixed in Traces.

* uniqg was modified to give the same hash codes on little-endian and
   big-endian computers. Thanks to Jerry James for helping with this.

* A buffer overrun in dreadnaut found by Jerry James was fixed.

* Add note to uniqg: the hash codes written by uniqg -H and read by uniqg -h
   depend on the endianness of the computer, so when you are using uniq -h to
   read hash codes you have to do it on a computer of the same endianness as
   was used to write them. Note that all but a handful of modern CPUs are
   little-endian, including Intel x86-64 and Apple silicon.

* A buffer overrun in dreadnaut introduced in version 2.9.0 was fixed. Thanks
   to Jerry James for identifying it. This did not impact any programs other
   than dreadnaut. The bug was also present in 2.9.1rc1 and 2.9.1rc2 but was
   fixed in 2.9.1rc3.


More information about the Nauty mailing list