diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 3205a3e3d..7bf4330a6 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -29,7 +29,6 @@ jobs: - stable-4.15 - v4.14 - v4.13 - - v4.12 mode: - onlyneeded - default @@ -41,11 +40,6 @@ jobs: pkgs-to-clone: https://github.com/digraphs/graphviz.git https://github.com/gap-packages/NautyTracesInterface.git pkgs-to-build: io orb datastructures profiling grape NautyTracesInterface - - gap-version: v4.11 # Note: NautyTracesInterface requires GAP 4.12 - mode: default # There wouldn't be much point testing GAP v4.11 with only needed packages. The only difference is whether Grape is loaded. - pkgs-to-clone: https://github.com/digraphs/graphviz.git - pkgs-to-build: io* orb* datastructures* profiling* grape* - steps: - uses: actions/checkout@v7 - name: Output g++ version . . . diff --git a/PackageInfo.g b/PackageInfo.g index 576909014..4d669264e 100644 --- a/PackageInfo.g +++ b/PackageInfo.g @@ -31,10 +31,6 @@ _STANDREWSMATHS := Concatenation(["Mathematical Institute, North Haugh, ", _STANDREWSCS := Concatenation(["Jack Cole Building, North Haugh, ", "St Andrews, Fife, KY16 9SX, Scotland"]); -if not CompareVersionNumbers(GAPInfo.Version, "4.12") then - IsKernelExtensionAvailable := fail; -fi; - SetPackageInfo(rec( PackageName := "Digraphs", Subtitle := "Graphs, digraphs, and multidigraphs in GAP", @@ -568,7 +564,7 @@ PackageDoc := rec( ), Dependencies := rec( - GAP := ">=4.11.0", + GAP := ">=4.13.0", NeededOtherPackages := [["IO", ">=4.5.1"], ["orb", ">=4.8.2"], ["datastructures", ">=0.2.5"]], @@ -607,26 +603,16 @@ BannerString := Concatenation( "-----------------------------------------------------------------------", "------\n"), +Extensions := [ + rec(needed := [["NautyTracesInterface", ">=0.2"]], + filename := "gap/nauty.g")], + AvailabilityTest := function() - local digraphs_so; - - if CompareVersionNumbers(GAPInfo.Version, "4.12") then - if not IsKernelExtensionAvailable("digraphs") then - LogPackageLoadingMessage(PACKAGE_WARNING, - ["the kernel module is not compiled, ", - "the package cannot be loaded."]); - return fail; - fi; - else - # TODO this clause can be removed once Digraphs requires GAP>=4.12.1 - digraphs_so := Filename(DirectoriesPackagePrograms("digraphs"), - "digraphs.so"); - if (not "digraphs" in SHOW_STAT()) and digraphs_so = fail then - LogPackageLoadingMessage(PACKAGE_WARNING, - ["the kernel module is not compiled, ", - "the package cannot be loaded."]); - return fail; - fi; + if not IsKernelExtensionAvailable("digraphs") then + LogPackageLoadingMessage(PACKAGE_WARNING, + ["the kernel module is not compiled, ", + "the package cannot be loaded."]); + return fail; fi; return true; end, @@ -665,10 +651,6 @@ AutoDoc := rec( "&Digraphs;", "Digraphs"), "&GAP;", "GAP"))); -if not CompareVersionNumbers(GAPInfo.Version, "4.12") then - Unbind(IsKernelExtensionAvailable); -fi; - MakeReadWriteGlobal("_RecogsFunnyWWWURLFunction"); MakeReadWriteGlobal("_RecogsFunnyNameFormatterFunction"); Unbind(_RecogsFunnyWWWURLFunction); diff --git a/README.md b/README.md index ac6707a7b..d7775e822 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ For questions, remarks, suggestions, and issues please use the ## Installation It is assumed that you have a working copy of [GAP][] with version number -4.11.0 or higher. The most up-to-date version of GAP, and instructions on how +4.13.0 or higher. The most up-to-date version of GAP, and instructions on how to install it, can be obtained from the [main GAP webpage](https://www.gap-system.org). diff --git a/gap/digraph.gi b/gap/digraph.gi index d7a2169f2..337bfef4a 100644 --- a/gap/digraph.gi +++ b/gap/digraph.gi @@ -236,12 +236,13 @@ end); InstallMethod(DigraphCons, "for IsMutableDigraph and a record", [IsMutableDigraph, IsRecord], function(_, record) - local D, cmp, labels, i; + local D, cmp, labels, i, adj; - if IsGraph(record) then + if DIGRAPHS_IsGrapeGraph(record) then # IsGraph is a function not a filter, so we cannot have a separate method + adj := ValueGlobal("Adjacency"); D := DigraphNC(IsMutableDigraph, - List(Vertices(record), x -> Adjacency(record, x))); + List(ValueGlobal("Vertices")(record), x -> adj(record, x))); if IsBound(record.names) then SetDigraphVertexLabels(D, StructuralCopy(record.names)); fi; @@ -382,7 +383,7 @@ InstallMethod(DigraphCons, "for IsImmutableDigraph and a record", function(_, record) local D; D := MakeImmutable(DigraphCons(IsMutableDigraph, record)); - if IsGraph(record) then + if DIGRAPHS_IsGrapeGraph(record) then # IsGraph is a function not a filter, so we cannot have a separate method # for this. if not IsTrivial(record.group) then diff --git a/gap/isomorph.gi b/gap/isomorph.gi index 2062cb819..8d3f35fcf 100644 --- a/gap/isomorph.gi +++ b/gap/isomorph.gi @@ -130,38 +130,9 @@ end); BindGlobal("BLISS_DATA_NO_COLORS", D -> BLISS_DATA(D, fail, fail)); -if DIGRAPHS_NautyAvailable then - BindGlobal("NAUTY_DATA", - function(D, colors) - local data; - if colors <> false then - colors := DIGRAPHS_ValidateVertexColouring(DigraphNrVertices(D), - colors); - colors := NautyColorData(colors); - fi; - if DigraphHasNoVertices(D) then - # This circumvents Issue #17 in NautyTracesInterface, whereby a graph - # with 0 vertices causes a seg fault. - return [Group(()), ()]; - fi; - data := NautyDense(DigraphSource(D), - DigraphRange(D), - DigraphNrVertices(D), - not IsSymmetricDigraph(D), - colors); - if IsEmpty(data[1]) then - data[1] := [()]; - fi; - data[1] := Group(data[1]); - data[2] := data[2] ^ -1; - return data; - end); - - BindGlobal("NAUTY_DATA_NO_COLORS", D -> NAUTY_DATA(D, false)); -else - BindGlobal("NAUTY_DATA", ReturnFail); - BindGlobal("NAUTY_DATA_NO_COLORS", ReturnFail); -fi; +# replaced by gap/nauty.g once NautyTracesInterface is loaded +BindGlobal("NAUTY_DATA", ReturnFail); +BindGlobal("NAUTY_DATA_NO_COLORS", D -> NAUTY_DATA(D, false)); # Canonical labellings diff --git a/gap/nauty.g b/gap/nauty.g new file mode 100644 index 000000000..45d6000ee --- /dev/null +++ b/gap/nauty.g @@ -0,0 +1,43 @@ +############################################################################# +## +## nauty.g +## Copyright (C) 2014-19 James D. Mitchell +## Wilf A. Wilson +## +## Licensing information can be found in the README file of this package. +## +############################################################################# +## + +# Package extension, read by GAP once NautyTracesInterface is loaded. + +MakeReadWriteGlobal("NAUTY_DATA"); +NAUTY_DATA := function(D, colors) + local data; + if colors <> false then + colors := DIGRAPHS_ValidateVertexColouring(DigraphNrVertices(D), + colors); + colors := NautyColorData(colors); + fi; + if DigraphHasNoVertices(D) then + # This circumvents Issue #17 in NautyTracesInterface, whereby a graph + # with 0 vertices causes a seg fault. + return [Group(()), ()]; + fi; + data := NautyDense(DigraphSource(D), + DigraphRange(D), + DigraphNrVertices(D), + not IsSymmetricDigraph(D), + colors); + if IsEmpty(data[1]) then + data[1] := [()]; + fi; + data[1] := Group(data[1]); + data[2] := data[2] ^ -1; + return data; +end; +MakeReadOnlyGlobal("NAUTY_DATA"); + +MakeReadWriteGlobal("DIGRAPHS_NautyAvailable"); +DIGRAPHS_NautyAvailable := true; +MakeReadOnlyGlobal("DIGRAPHS_NautyAvailable"); diff --git a/gap/oper.gi b/gap/oper.gi index bdc462bee..805cb5b9f 100644 --- a/gap/oper.gi +++ b/gap/oper.gi @@ -2548,7 +2548,7 @@ InstallMethod(DigraphCycleBasis, "for a digraph", [IsDigraph], function(G) local OutNbr, InNbr, n, partialSum, m, visited, unusedEdges, i, c, s, stack, - z, u, v, p, B; + u, v, p, B; # Check for loops if DigraphHasLoops(G) then @@ -2631,14 +2631,7 @@ function(G) # - unusedEdges : The list of unused edges to be converted to a basis vector # - visited : The result of the depth first search above - # TODO : In the case the Digraph package requires GAP 4.12 or over, - # remove the following if statement. - if CompareVersionNumbers(GAPInfo.Version, "4.12") then - B := List([1 .. c], i -> NewZeroVector(IsGF2VectorRep, GF(2), m)); - else - z := List([1 .. m], i -> Zero(GF(2))); - B := List([1 .. c], i -> Vector(GF(2), z)); - fi; + B := List([1 .. c], i -> NewZeroVector(IsGF2VectorRep, GF(2), m)); for i in [1 .. c] do u := unusedEdges[i][1]; diff --git a/init.g b/init.g index 20ed2f3dd..236ac5bd3 100644 --- a/init.g +++ b/init.g @@ -8,43 +8,16 @@ ############################################################################# ## -# load a method for UserHomeExpand if necessary -if not IsBound(UserHomeExpand) then - BindGlobal("UserHomeExpand", USER_HOME_EXPAND); -fi; - -if CompareVersionNumbers(GAPInfo.Version, "4.12") then - if not LoadKernelExtension("digraphs") then - Error("failed to load the Digraphs package kernel extension"); - fi; -else - # TODO this clause can be removed once Digraphs requires GAP>=4.12.1 - # load kernel function if it is installed: - if not IsBound(DIGRAPH_OUT_NBS) and "digraphs" in SHOW_STAT() then - # try static module - LoadStaticModule("digraphs"); - fi; - if not IsBound(DIGRAPH_OUT_NBS) and - Filename(DirectoriesPackagePrograms("digraphs"), - "digraphs.so") <> fail then - LoadDynamicModule(Filename(DirectoriesPackagePrograms("digraphs"), - "digraphs.so")); - fi; +if not LoadKernelExtension("digraphs") then + Error("failed to load the Digraphs package kernel extension"); fi; BindGlobal("DIGRAPHS_IsGrapeLoaded", {} -> IsPackageMarkedForLoading("grape", "4.8.1")); -# To avoid warnings when GRAPE is not loaded -if not IsBound(IsGraph) then - IsGraph := ReturnFalse; -fi; -if not IsBound(Vertices) then - DeclareOperation("Vertices", [IsRecord]); -fi; -if not IsBound(Adjacency) then - Adjacency := IdFunc; -fi; +# IsGraph belongs to GRAPE, which need not be loaded +BindGlobal("DIGRAPHS_IsGrapeGraph", + x -> DIGRAPHS_IsGrapeLoaded() and ValueGlobal("IsGraph")(x)); ReadPackage("digraphs", "gap/digraph.gd"); ReadPackage("digraphs", "gap/digraphs.g"); diff --git a/read.g b/read.g index 40ae189c5..9755db9fa 100644 --- a/read.g +++ b/read.g @@ -20,15 +20,8 @@ function() return omit; end); -_NautyTracesInterfaceVersion := - First(PackageInfo("digraphs")[1].Dependencies.SuggestedOtherPackages, - x -> x[1] = "NautyTracesInterface")[2]; - -BindGlobal("DIGRAPHS_NautyAvailable", - IsPackageMarkedForLoading("NautyTracesInterface", - _NautyTracesInterfaceVersion)); - -Unbind(_NautyTracesInterfaceVersion); +# set to true by gap/nauty.g once NautyTracesInterface is loaded +BindGlobal("DIGRAPHS_NautyAvailable", false); ReadPackage("digraphs", "gap/utils.gi"); ReadPackage("digraphs", "gap/digraph.gi");