/* Copyright (c) 2003-2015 Tommi Junttila Released under the GNU Lesser General Public License version 3.
This file is part of bliss.
bliss is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License.
bliss 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with bliss. If not, see <http://www.gnu.org/licenses/>.
*/
/** * \file * \brief The bliss C API. * * This is the C language API to * <A href="http://www.tcs.hut.fi/Software/bliss/">bliss</A>. * Note that this C API is only a subset of the C++ API; * please consider using the C++ API whenever possible.
*/
#include <stdlib.h> #include <stdio.h>
/** * \brief The true bliss graph is hiding behind this typedef.
*/ typedefstruct bliss_digraphs_graph_struct BlissGraph;
/** * \brief The C API version of the statistics returned by * the bliss search algorithm.
*/ typedefstruct bliss_digraphs_stats_struct
{
/* The true size of the group */ /* This is a list of integers of length group_size_len */ /* This is only used when BLISS_IN_GAP is defined */ int* group_size; int group_size_len;
/** * An approximation (due to possible rounding errors) of * the size of the automorphism group.
*/ longdouble group_size_approx; /** The number of nodes in the search tree. */ longunsignedint nof_nodes; /** The number of leaf nodes in the search tree. */ longunsignedint nof_leaf_nodes; /** The number of bad nodes in the search tree. */ longunsignedint nof_bad_nodes; /** The number of canonical representative updates. */ longunsignedint nof_canupdates; /** The number of generator permutations. */ longunsignedint nof_generators; /** The maximal depth of the search tree. */ unsignedlongint max_level;
} BlissStats;
/** * Create a new graph instance with \a N vertices and no edges. * \a N can be zero and bliss_digraphs_add_vertex() called afterwards * to add new vertices on-the-fly.
*/
BlissGraph *bliss_digraphs_new(constunsignedint N);
/** * Read an undirected graph from a file in the DIMACS format into a new bliss * instance. * Returns 0 if an error occurred. * Note that in the DIMACS file the vertices are numbered from 1 to N while * in the bliss C API they are from 0 to N-1. * Thus the vertex n in the file corresponds to the vertex n-1 in the API.
*/
BlissGraph *bliss_digraphs_read_dimacs(FILE *fp);
/** * Output the graph in the file stream \a fp in the DIMACS format. * See the User's Guide for the file format details. * Note that in the DIMACS file the vertices are numbered from 1 to N while * in bliss they are from 0 to N-1.
*/ void bliss_digraphs_write_dimacs(BlissGraph *graph, FILE *fp);
/** * Release the graph. * Note that the memory pointed by the arguments of hook functions for * bliss_digraphs_find_automorphisms() and bliss_digraphs_find_canonical_labeling() * is deallocated and thus should not be accessed after calling this function.
*/ void bliss_digraphs_release(BlissGraph *graph);
/** * Print the graph in graphviz dot format.
*/ void bliss_digraphs_write_dot(BlissGraph *graph, FILE *fp);
/** * Return the number of vertices in the graph.
*/ unsignedint bliss_digraphs_get_nof_vertices(BlissGraph *graph);
/** * Add a new vertex with color \a c in the graph \a graph and return its index. * The vertex indices are always in the range * [0,bliss::bliss_digraphs_get_nof_vertices(\a bliss)-1].
*/ unsignedint bliss_digraphs_add_vertex(BlissGraph *graph, unsignedint c);
/** * Add a new undirected edge in the graph. * \a v1 and \a v2 are vertex indices returned by bliss_digraphs_add_vertex(). * If duplicate edges are added, they will be ignored (however, they are not * necessarily physically ignored immediately but may consume memory for * a while so please try to avoid adding duplicate edges whenever possible).
*/ void bliss_digraphs_add_edge(BlissGraph *graph, unsignedint v1, unsignedint v2);
/** * Compare two graphs according to a total order. * Return -1, 0, or 1 if the first graph was smaller than, equal to, * or greater than, resp., the other graph. * If 0 is returned, then the graphs have the same number vertices, * the vertices in them are colored in the same way, and they contain * the same edges; that is, the graphs are equal.
*/ int bliss_digraphs_cmp(BlissGraph *graph1, BlissGraph *graph2);
/** * Get a hash value for the graph.
*/ unsignedint bliss_digraphs_hash(BlissGraph *graph);
/** * Permute the graph with the given permutation \a perm. * Returns the permuted graph, the original graph is not modified. * The argument \a perm should be an array of * N=bliss::bliss_digraphs_get_nof_vertices(\a graph) elements describing * a bijection on {0,...,N-1}.
*/
BlissGraph *bliss_digraphs_permute(BlissGraph *graph, constunsignedint *perm);
/** * Find a set of generators for the automorphism group of the graph. * The hook function \a hook (if non-null) is called each time a new generator * for the automorphism group is found. * The first argument \a user_param for the hook function is * the \a hook_user_param argument, * the second argument \a N is the length of the automorphism (equal to * bliss::bliss_digraphs_get_nof_vertices(\a graph)) and * the third argument \a aut is the automorphism (a bijection on {0,...,N-1}). * The memory for the automorphism \a aut will be invalidated immediately * after the return from the hook; * if you want to use the automorphism later, you have to take a copy of it. * Do not call bliss_digraphs_* functions in the hook. * If \a stats is non-null, then some search statistics are copied there.
*/ void
bliss_digraphs_find_automorphisms(BlissGraph *graph, void (*hook)(void *user_param, unsignedint N, constunsignedint *aut), void *hook_user_param,
BlissStats *stats);
/** * Otherwise the same as bliss_digraphs_find_automorphisms() except that * a canonical labeling for the graph (a bijection on {0,...,N-1}) is returned. * The returned canonical labeling will remain valid only until * the next call to a bliss_digraphs_* function with the exception that * bliss_digraphs_permute() can be called without invalidating the labeling. * To compute the canonical version of a graph, call this function and * then bliss_digraphs_permute() with the returned canonical labeling. * Note that the computed canonical version may depend on the applied version * of bliss.
*/ constunsignedint *
bliss_digraphs_find_canonical_labeling(BlissGraph *graph, void (*hook)(void *user_param, unsignedint N, constunsignedint *aut), void *hook_user_param,
BlissStats *stats);
// Clean up memory allocated by a used BlissStats void bliss_digraphs_free_blissstats(BlissStats *stats);
#endif
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.