NAME
Graph::Graph6 - read and write graph6 or sparse6 format graphs
SYNOPSIS
use Graph::Graph6;
my ($num_vertices, @edges);
Graph::Graph6::read_graph(filename => 'foo.g6',
num_vertices_ref => \$num_vertices,
edge_aref => \@edges);
Graph::Graph6::write_graph(filename => 'bar.s6',
format => 'sparse6',
num_vertices => $num_vertices,
edge_aref => \@edges);
DESCRIPTION
This module reads and writes graph6 or sparse6 files. These file formats are per
Both represent an undirected graph with vertices numbered 0 to n-1 encoded into printable ascii characters in the range ? to ~.
The maximum number of vertices is 2^36-1. sparse6 lists edges as pairs of vertices i,j and is good for large graphs with relatively few edges. graph6 is an upper triangle adjacency matrix of bits. The encoding is 6 bits per character so N vertices is a file size roughly N^2/12 bytes. sparse6 can have multi-edges and self loops. graph6 does not.
This module reads and writes graph6 and sparse6 in a "native" way just as integer vertex numbers. See "SEE ALSO" below for Graph.pm and Graph::Easy interfaces reading and writing those graph objects.
FUNCTIONS
Reading
$success = Graph::Graph6::read_graph(key => value, ...)-
Read graph6 or sparse6. The key/value options are
filename filename (string) fh filehandle (glob ref) str string num_vertices_ref scalar ref num_vertices_func coderef edge_aref array ref edge_func coderef error_func coderefThe return value is
1 if graph successfully read 0 if end of file (no graph) croak if invalid content or file error undef if error_func returns instead of dyingThe input is one of
filename,fhorstr. The output is the number of vertices and a list of edges.The number of vertices n is stored to
num_vertices_refor callback tonum_vertices_func, or both.$$num_vertices_ref = $n; $num_vertices_func->($n);Each edge is pushed onto
edge_arefor callback toedge_func, or both.$fromand$toare integers in the range 0 to n-1 with$from <= $to(or$from < $tofor graph6). For sparse6, multi-edges result in multiple elements stored and calls made.push @$edge_aref, [ $from, $to ]; $edge_func->($from, $to);error_funcis called for any file error or invalid content.$error_func->($str, $str, ...);The default
error_funciscroak(). Iferror_funcreturns then the return fromread_graph()isundef.An immediate end of file (or an empty input string) gives the end of file return 0. It's common to have multiple graph6 or sparse6 in a file, one per line. They can be read successively with
read_graph()until at end of fileread_graph()returns 0.The file formats have edges ordered by increasing
$toand within that increasing$from, although for sparse6$fromcan potentially jump around. But the suggestion is not to rely on edge order.
Writing
$ret = Graph::Graph6::write_graph(key => value, ...)-
Write graph6 or sparse6. The key/value options are
filename filename (string) fh filehandle (glob ref) str_ref output string (string ref) format "graph6" or "sparse6" (string, default "graph6") header boolean (default false) num_vertices integer edge_aref array ref edge_predicate coderefThe return value is
1 if graph successfully written 0 if some write error, error in $!filename,fhorstr_refis the output destination.str_refis a scalar ref to store to, so for examplemy $str; write_graph(str_ref => \$str, ...) # or write_graph(str_ref => \my $str, ...)formatdefaults to the dense"graph6", or choose"sparse6"write_graph(format => "sparse6", ...)headerflag writes an initial">>graph6<<"or">>sparse6<<". This is optional for the nauty programs and forread_graph()above, but may help a human reader distinguish a graph from tty line noise.num_verticesis mandatory, or ifedge_arefis given then the default is from the maximum vertex number there (convenient as long as the maximum vertex has at least one edge).edge_arefis an arrayref of edges which are arrayref pairs of integers[$from,$to]. The edges and the$from,$tocan be in any order but all must integers be in the range 0 to <$num_vertices-1> inclusive. sparse6 can have self-loops and repeated entries for multi-edges. graph6 ignores self-loops and writes duplicates just once each.edge_aref => [ [0,1], [5,6], [5,4] ] # any orderedge_predicateis another way to specify edges. It is called with integers$from,$toto test whether such an edge exists. Each call has$from < $tofor graph6, or$from <= $tofor sparse6. sparse6 self-loops can be written this way, but not multi-edges.$bool = $edge_predicate->($from, $to); # $from <= $toedge_predicateis best for writing graph6 andedge_arefis best for writing sparse6, but whichever you have is used for either output.The output includes a final newline
"\n"so graphs can be written to a file handle one after the other.
EXPORTS
Nothing is exported by default, but the functions can be requested in usual Exporter style,
use Graph::Graph6 'read_graph','write_graph';
SEE ALSO
Graph::Reader::Graph6, Graph::Writer::Graph6, Graph::Writer::Sparse6
Graph::Easy::Parser::Graph6, Graph::Easy::As_graph6, Graph::Easy::As_sparse6
nauty-showg(1), nauty-copyg(1)
HOME PAGE
http://user42.tuxfamily.org/graph-graph6/index.html
LICENSE
Copyright 2015 Kevin Ryde
Graph-Graph6 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.
Graph-Graph6 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Graph-Graph6. If not, see http://www.gnu.org/licenses/.