diff --git a/Makefile.am b/Makefile.am index 5bc7bcf..2d40e85 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,7 +14,7 @@ lib_LTLIBRARIES = NautyTracesInterface.la NautyTracesInterface_la_SOURCES = src/NautyTracesInterface.c NautyTracesInterface_la_CPPFLAGS = $(GAP_CPPFLAGS) $(NAUTY_CPPFLAGS) -DCONFIG_H # Note that the latter is only for GAP 4.4.12 -NautyTracesInterface_la_LDFLAGS = $(NAUTY_PATH)/nauty.o $(NAUTY_PATH)/nautil.o $(NAUTY_PATH)/naugraph.o $(NAUTY_PATH)/schreier.o $(NAUTY_PATH)/naurng.o $(NAUTY_PATH)/naugroup.o $(NAUTY_PATH)/nautinv.o -module -avoid-version +NautyTracesInterface_la_LDFLAGS = $(NAUTY_PATH)/nauty.o $(NAUTY_PATH)/nautil.o $(NAUTY_PATH)/naugraph.o $(NAUTY_PATH)/schreier.o $(NAUTY_PATH)/naurng.o $(NAUTY_PATH)/naugroup.o $(NAUTY_PATH)/nautinv.o -module -avoid-version $(NAUTY_PATH)/nauty.a if SYS_IS_CYGWIN NautyTracesInterface_la_LDFLAGS += -no-undefined -version-info 0:0:0 -Wl,$(GAPROOT)/bin/$(GAPARCH)/gap.dll endif diff --git a/src/NautyTracesInterface.c b/src/NautyTracesInterface.c index 5f605e4..bfa129a 100644 --- a/src/NautyTracesInterface.c +++ b/src/NautyTracesInterface.c @@ -6,6 +6,9 @@ #include #include #include +#include "nausparse.h" +#include + static Obj automorphism_list; Obj TheTypeNautyInternalGraphObject; @@ -33,6 +36,7 @@ Obj NautyObjTypeFunc(Obj o) #define IS_NAUTY_GRAPH_OBJ(o) (TNUM_OBJ(o) == T_NAUTY_OBJ) #define NAUTY_GRAPH_PTR(o) (graph*)ADDR_OBJ(o)[0] +#define NAUTY_GRAPH_PTR_SPARSE(o) (sparsegraph*)ADDR_OBJ(o)[0] #define NAUTY_GRAPH_SIZE(o) (size_t)ADDR_OBJ(o)[1] #define NAUTY_GRAPH_ROWS(o) (size_t)ADDR_OBJ(o)[2] #define NAUTY_GRAPH_COLS(o) (size_t)ADDR_OBJ(o)[3] @@ -48,6 +52,17 @@ Obj NEW_NAUTY_GRAPH_OBJ(graph* graph_pointer, size_t size, size_t rows, size_t c return o; } +Obj NEW_NAUTY_SPARSEGRAPH_OBJ(sparsegraph* graph_pointer, size_t size, size_t rows, size_t cols ) +{ + Obj o; + o = NewBag(T_NAUTY_OBJ, 4 * sizeof(Obj)); + ADDR_OBJ(o)[0] = (Obj)(graph_pointer); + ADDR_OBJ(o)[1] = (Obj)(size); + ADDR_OBJ(o)[2] = (Obj)(rows); + ADDR_OBJ(o)[3] = (Obj)(cols); + return o; +} + void NautyObjFreeFunc( Obj o ) { DYNFREE(ADDR_OBJ(o)[0],ADDR_OBJ(o)[1]); @@ -102,6 +117,29 @@ Obj NAUTY_GRAPH(Obj self, Obj source_list, Obj range_list, Obj nr_vertices_gap, return NEW_NAUTY_GRAPH_OBJ( g, g_sz, n, m ); } + +Obj NAUTY_DENSE_TO_SPARSE(Obj self, Obj nauty_graph ) +{ + + int n,m,v; + + graph* g = NAUTY_GRAPH_PTR( nauty_graph ); + size_t g_sz = NAUTY_GRAPH_SIZE( nauty_graph ); + n = NAUTY_GRAPH_ROWS( nauty_graph ); + m = NAUTY_GRAPH_COLS( nauty_graph ); + + + DYNALLSTAT(sparsegraph,sg,sg_sz); + DYNALLOC2(sparsegraph,sg,sg_sz,m,n,"malloc"); + EMPTYGRAPH(sg,m,n); + + nauty_to_sg(g,sg,m,n); + + return NEW_NAUTY_SPARSEGRAPH_OBJ( sg, sg_sz, n, m ); +} + + + Obj NAUTY_DENSE(Obj self, Obj nauty_graph, Obj is_directed, Obj color_data ) { DYNALLSTAT(graph,cg,cg_sz); @@ -201,6 +239,136 @@ Obj NAUTY_DENSE(Obj self, Obj nauty_graph, Obj is_directed, Obj color_data ) return return_list; } + + + + +Obj NAUTY_SPARSE(Obj self, Obj nauty_graph, Obj is_directed, Obj color_data ) +{ + DYNALLSTAT(sparsegraph,csg,csg_sz); + DYNALLSTAT(int,lab,lab_sz); + DYNALLSTAT(int,ptn,ptn_sz); + DYNALLSTAT(int,orbits,orbits_sz); + static optionblk options; + if( is_directed == True ){ + static DEFAULTOPTIONS_DIGRAPH(temp_options); + options=temp_options; + }else{ + static DEFAULTOPTIONS_SPARSEGRAPH(temp_options2); + options=temp_options2; + } + + statsblk stats; + + int n,m,v; + set *gv; + + int nr_edges; + + int len_source; + int len_range; + + int current_source; + int current_range; + + Obj p; + UInt4 *ptr; + + UInt global_list; + + sparsegraph* sg = NAUTY_GRAPH_PTR_SPARSE( nauty_graph ); + size_t sg_sz = NAUTY_GRAPH_SIZE( nauty_graph ); + n = NAUTY_GRAPH_ROWS( nauty_graph ); + m = NAUTY_GRAPH_COLS( nauty_graph ); + + // Write automorphisms + global_list = GVarName( "__NAUTYTRACESINTERFACE_GLOBAL_AUTOMORPHISM_GROUP_LIST" ); + automorphism_list = NEW_PLIST(T_PLIST, 0); + SET_LEN_PLIST( automorphism_list, 0 ); + AssGVar( global_list, automorphism_list ); + options.userautomproc = userautomproc; + + options.getcanon = TRUE; + + nauty_check(WORDSIZE,m,n,NAUTYVERSIONID); + + // Allocate graph + DYNALLOC2(sparsegraph,csg,csg_sz,m,n,"malloc"); + DYNALLOC1(int,lab,lab_sz,n,"malloc"); + DYNALLOC1(int,ptn,ptn_sz,n,"malloc"); + DYNALLOC1(int,orbits,orbits_sz,n,"malloc"); + + EMPTYGRAPH(csg,m,n); + + if( color_data != False ){ + + options.defaultptn = FALSE; + + Obj obj_lab = ELM_PLIST( color_data, 1 ); + Obj obj_ptn = ELM_PLIST( color_data, 2 ); + + for(int i=0;i