diff --git a/.codecov.yml b/.codecov.yml index 44d50b8..658e7f0 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,6 +1,3 @@ codecov: disable_default_path_fixes: true -fixes: - - "/home/gap/.gap/pkg/NConvex/::" -ignore: - - "home/" + require_ci_to_pass: false diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index c5f6764..4a8ed7b 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -22,10 +22,11 @@ jobs: steps: # keep workflow active even if repository has no activity for 60 days (do not execute for pull requests) - run: '[ "$GITHUB_EVENT_NAME" = "pull_request" ] || curl --fail -X PUT -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/$GITHUB_REPOSITORY/actions/workflows/Tests.yml/enable' - - uses: actions/checkout@v1 - - run: mkdir -p /home/gap/.gap/pkg/ - - run: sudo cp -a $GITHUB_WORKSPACE /home/gap/.gap/pkg/ - - run: sudo chown -R gap:gap /home/gap/.gap/pkg/ + # checkout needs access to temporary directory + - run: sudo chmod 1777 $RUNNER_TEMP + - run: sudo chown gap:gap $GITHUB_WORKSPACE + - uses: actions/checkout@v3 + - run: cp -a $GITHUB_WORKSPACE /home/gap/.gap/pkg/ - run: | export HOME="/home/gap" cd /home/gap/.gap/pkg/ @@ -36,6 +37,16 @@ jobs: #git clone --depth 1 https://github.com/homalg-project/NormalizInterface.git # set SOURCE_DATE_EPOCH for reproducible PDFs export SOURCE_DATE_EPOCH=0 + # build documentation of packages which we might want to reference, keep this in sync with `release-gap-package` + [ -d "CAP_project/CAP" ] && make -C "CAP_project/CAP" doc + [ -d "CAP_project/CompilerForCAP" ] && make -C "CAP_project/CompilerForCAP" doc + [ -d "CAP_project/MonoidalCategories" ] && make -C "CAP_project/MonoidalCategories" doc + [ -d "CAP_project/CartesianCategories" ] && make -C "CAP_project/CartesianCategories" doc + [ -d "CAP_project/FreydCategoriesForCAP" ] && make -C "CAP_project/FreydCategoriesForCAP" doc + [ -d "HigherHomologicalAlgebra/ToolsForHigherHomologicalAlgebra" ] && make -C "HigherHomologicalAlgebra/ToolsForHigherHomologicalAlgebra" doc + [ -d "homalg_project/homalg" ] && make -C "homalg_project/homalg" doc + [ -d "homalg_project/Modules" ] && make -C "homalg_project/Modules" doc + [ -d "Toposes" ] && make -C "Toposes" doc TERM=dumb make -C NConvex -j $(nproc) --output-sync ci-test cp ./NConvex/.codecov.yml ./ (cd NConvex && LANG=C.UTF-8 python3 process_coverage.py) @@ -45,6 +56,7 @@ jobs: cd NConvex CUR_SHA=$(git rev-parse --verify HEAD) if [ "${{ matrix.image }}" = "ghcr.io/homalg-project/gap-docker:latest" ] && [ "$CUR_SHA" = "$(git rev-parse origin/master)" ] && [ $(dirname "$GITHUB_REPOSITORY") = "homalg-project" ]; then \ + git fetch origin gh-pages; \ git worktree add gh-pages/ gh-pages || (echo "There was an error. Make sure there is a branch named 'gh-pages'. See https://github.com/homalg-project/PackageJanitor#error-there-was-an-error-make-sure-there-is-a-branch-named-gh-pages"; exit 1); \ git checkout master; \ LANG=C.UTF-8 ./make_dist.sh --token "${{ secrets.GITHUB_TOKEN }}"; \ diff --git a/PackageInfo.g b/PackageInfo.g index c5b2c2c..d2aeff6 100644 --- a/PackageInfo.g +++ b/PackageInfo.g @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -# NConvex: Gap package for polyhedral computations +# NConvex: A Gap package to perform polyhedral computations # # This file contains package meta data. For additional information on # the meaning and correct usage of these fields, please consult the @@ -9,8 +9,8 @@ SetPackageInfo( rec( PackageName := "NConvex", -Subtitle := "Gap package for polyhedral computations", -Version := "2022.08-01", +Subtitle := "A Gap package to perform polyhedral computations", +Version := "2022.09-01", Date := ~.Version{[ 1 .. 10 ]}, Date := Concatenation( "01/", ~.Version{[ 6, 7 ]}, "/", ~.Version{[ 1 .. 4 ]} ), License := "GPL-2.0-or-later", @@ -86,7 +86,7 @@ PackageDoc := rec( HTMLStart := "doc/chap0.html", PDFFile := "doc/manual.pdf", SixFile := "doc/manual.six", - LongTitle := "Gap package for polyhedral computations", + LongTitle := "A Gap package to perform polyhedral computations", ), Dependencies := rec( diff --git a/README.md b/README.md index 243bef9..5b3d305 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # NConvex [![View code][code-img]][code-url] -### Gap package for polyhedral computations +### A Gap package to perform polyhedral computations | Documentation | Latest Release | Build Status | Code Coverage | | ------------- | -------------- | ------------ | ------------- | diff --git a/examples/polyhedrons.g b/examples/polyhedrons.g index 23a6eb2..b920afb 100644 --- a/examples/polyhedrons.g +++ b/examples/polyhedrons.g @@ -23,24 +23,14 @@ Q := Polyhedron( [ [ 5, 0 ], [ 0, 6 ] ], [ [ 1, 2 ] , [ -1, -2 ] ] ); #! VerticesOfMainRatPolytope( Q ); #! [ [ 0, 6 ], [ 5, 0 ] ] -V_using_4ti2 := [ [ -3, -16 ], [ -3, 0 ] ];; -V_using_normaliz := [ [ 0, 6 ], [ 5, 0 ] ];; -V := VerticesOfMainPolytope( Q );; -V = V_using_4ti2 or V = V_using_normaliz; -#! true +V := VerticesOfMainPolytope( Q ); +#! [ [ 0, 6 ], [ 5, 0 ] ] -L_using_4ti2 := [ [ [ -3, -16 ], [ -3, -15 ], [ -3, -14 ], -[ -3, -13 ], [ -3, -12 ], [ -3, -11 ], [ -3, -10 ], -[ -3, -9 ], [ -3, -8 ], [ -3, -7 ], [ -3, -6 ], -[ -3, -5 ], [ -3, -4 ], [ -3, -3 ], [ -3, -2 ], -[ -3, -1 ], [ -3, 0 ] ], [ ], [ [ 1, 2 ] ] ];; -L_using_normaliz := [ [ [ 0, -10 ], [ 0, -9 ], [ 0, -8 ], -[ 0, -7 ], [ 0, -6 ], [ 0, -5 ], [ 0, -4 ], [ 0, -3 ], -[ 0, -2 ], [ 0, -1 ], [ 0, 0 ], [ 0, 1 ], [ 0, 2 ], -[ 0, 3 ], [ 0, 4 ], [ 0, 5 ], [ 0, 6 ] ], [ ], [ [ -1, -2 ] ] ];; -L := LatticePointsGenerators( Q );; -L = L_using_4ti2 or L = L_using_normaliz; -#! true +L := LatticePointsGenerators( Q ); +#! [ [ [ 0, -10 ], [ 0, -9 ], [ 0, -8 ], [ 0, -7 ], [ 0, -6 ], +#! [ 0, -5 ], [ 0, -4 ], [ 0, -3 ], [ 0, -2 ], [ 0, -1 ], +#! [ 0, 0 ], [ 0, 1 ], [ 0, 2 ], [ 0, 3 ], [ 0, 4 ], +#! [ 0, 5 ], [ 0, 6 ] ], [ ], [ [ 1, 2 ] ] ] Dimension( Q ); #! 2 RayGeneratorsOfTailCone( Q ); @@ -58,13 +48,8 @@ Q; #! @Example P := PolyhedronByInequalities( [ [ -2, 3, 4, -7 ], -[ -2, 3, 4, -7 ] ] ); #! -L_using_normaliz := [ [ [ -4, 0, -2 ] ], [ ], -[ [ 1, 1, 1 ], [ 4, -3, 0 ] ] ];; -L_using_4ti2 := [ [ [ -2, 2, 0 ] ], [ ], -[ [ 1, 1, 1 ], [ 4, -3, 0 ] ] ];; -L := LatticePointsGenerators( P );; -L = L_using_4ti2 or L = L_using_normaliz; -#! true +L := LatticePointsGenerators( P ); +#! [ [ [ -4, 0, -2 ] ], [ ], [ [ 0, 7, 4 ], [ 1, 1, 1 ] ] ] #! @EndExample #! @BeginLatexOnly #! So the solutions set is $\{ [ -4, 0, -2 ]+ t_1*[ 1, 1, 1 ] + t_2*[ 0, 7, 4 ]; t_1,t_2\in\mathbb{Z}\}$. @@ -75,7 +60,7 @@ L = L_using_4ti2 or L = L_using_normaliz; Q := PolyhedronByInequalities( [ [-3, 4, 6 ], [ 3, -4, -6 ] ] ); #! LatticePointsGenerators( Q ); -#! [ [ ], [ ], [ [ -3, 2 ] ] ] +#! [ [ ], [ ], [ [ 3, -2 ] ] ] #! @EndExample #! @BeginLatexOnly #! Let us solve the folowing linear system @@ -86,14 +71,11 @@ LatticePointsGenerators( Q ); #! $$-3 + 7x + \phantom{3}y + 5v = 0$$ #! @EndLatexOnly #! @Example -P := PolyhedronByInequalities( [ [ -1, 2, 3, 2, 0 ], [ -3, 7, 1, 0, 5 ], -[ 1, -2, -3, -2, 0 ], [ 3, -7, -1, 0, -5 ] ] ); +P := PolyhedronByInequalities( [ [ -1, 2, 3, 2, 0 ], [ -3, 7, 1, 0, 5 ], + [ 1, -2, -3, -2, 0 ], [ 3, -7, -1, 0, -5 ] ] ); #! -L_using_4ti2 := [ [ [ 0, 3, -4, 0 ] ], [ ], [ [ 0, -10, 15, 2 ], [ 1, -2, 2, -1 ] ] ];; -L_using_normaliz := [ [ [ -19, 1, 18, 27 ] ], [ ], [ [ -1, 2, -2, 1 ], [ 5, 0, -5, -7 ] ] ];; -L := LatticePointsGenerators( P );; -L = L_using_4ti2 or L = L_using_normaliz; -#! true +L := LatticePointsGenerators( P ); +#! [ [ [ -19, 1, 18, 27 ] ], [ ], [ [ 0, 10, -15, -2 ], [ 1, -2, 2, -1 ] ] ] #! @EndExample #! @BeginLatexOnly #! I.e., the solutions set is diff --git a/gap/Cone.gd b/gap/Cone.gd index 5d4b1ee..ab2e68d 100644 --- a/gap/Cone.gd +++ b/gap/Cone.gd @@ -7,8 +7,8 @@ DeclareCategory( "IsCone", IsFan ); - - + + ############################## ## ## Constructors @@ -21,17 +21,17 @@ DeclareCategory( "IsCone", #! @Arguments L #! @Returns a Cone Object #! @Description -#! The function takes a list of lists $[L_1, L_2, ...]$ where each $L_j$ represents -#! an inequality and returns the cone defined by them. +#! The function takes a list of lists $[L_1, L_2, ...]$ where each $L_j$ represents +#! an inequality and returns the cone defined by them. #! For example the $j$'th entry $L_j = [a_{j1},a_{j2},...,a_{jn}]$ corresponds to the inequality #! $\sum_{i=1}^n a_{ji}x_i \geq 0$. DeclareOperation( "ConeByInequalities", [ IsList ] ); -#! @Arguments Eq, Ineq +#! @Arguments Eq, Ineq #! @Returns a Cone Object -#! @Description -#! The function takes two lists. The first list is the equalities and the second is +#! @Description +#! The function takes two lists. The first list is the equalities and the second is #! the inequalities and returns the cone defined by them. DeclareOperation( "ConeByEqualitiesAndInequalities", [ IsList, IsList ] ); @@ -40,51 +40,51 @@ DeclareOperation( "ConeByGenerators", [ IsList ] ); #! @Arguments L #! @Returns a Cone Object -#! @Description -#! The function takes a list in which every entry represents a ray in the ambient vector space -#! and returns the cone defined by them. +#! @Description +#! The function takes a list in which every entry represents a ray in the ambient vector space +#! and returns the cone defined by them. DeclareOperation( "Cone", [ IsList ] ); -#! @Arguments cdd_cone +#! @Arguments cdd_cone #! @Returns a Cone Object -#! @Description +#! @Description #! This function takes a cone defined in **CddInterface** and converts it to a cone in **NConvex** DeclareOperation( "Cone", [ IsCddPolyhedron ] ); ############################## ## -## Attributes +## Attributes ## ############################## #! @Section Attributes of Cones -# DeclareAttribute( "RayGenerators", +# DeclareAttribute( "RayGenerators", # IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description +#! @Description #! Returns the list of the defining inequalities of the cone C. -DeclareAttribute( "DefiningInequalities", +DeclareAttribute( "DefiningInequalities", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description +#! @Description #! Returns the list of the equalities in the defining inequalities of the cone C. -DeclareAttribute( "EqualitiesOfCone", +DeclareAttribute( "EqualitiesOfCone", IsCone ); - + DeclareAttribute( "FactorConeEmbedding", IsCone ); - -#! @Arguments C + +#! @Arguments C #! @Returns a cone -#! @Description +#! @Description #! Returns the dual cone of the cone C. DeclareAttribute( "DualCone", IsCone ); @@ -92,26 +92,26 @@ DeclareAttribute( "DualCone", DeclareAttribute( "RaysInFacets", IsCone ); - + DeclareAttribute( "RaysInFaces", IsCone ); -# @Arguments cone +# @Arguments cone # @Returns a point in the cone -# @Description +# @Description # Returns an interior point of the cone. #DeclareAttribute( "InteriorPoint", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list of cones -#! @Description -#! Returns the list of all faces of the cone C. +#! @Description +#! Returns the list of all faces of the cone C. DeclareAttribute( "FacesOfCone", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list of cones -#! @Description +#! @Description #! Returns the list of all facets of the cone C. DeclareAttribute( "Facets", IsCone ); @@ -124,44 +124,44 @@ if false then DeclareAttribute( "FVector", IsCone ); fi; -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description -#! Returns a relative interior point (or ray) in the cone C. -DeclareAttribute( "RelativeInteriorRay", +#! @Description +#! Returns a relative interior point (or ray) in the cone C. +DeclareAttribute( "RelativeInteriorRay", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description +#! @Description #! Returns the Hilbert basis of the cone C DeclareAttribute( "HilbertBasis", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description +#! @Description #! Returns the Hilbert basis of the dual cone of the cone C DeclareAttribute( "HilbertBasisOfDualCone", IsCone ); - + DeclareAttribute( "LinearSubspaceGenerators", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a list -#! @Description +#! @Description #! Returns a basis of the lineality space of the cone C. DeclareAttribute( "LinealitySpaceGenerators", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns a cdd object -#! @Description +#! @Description #! Converts the cone to a cdd object. The operations of CddInterface can then be applied #! on this convex object. DeclareAttribute( "ExternalCddCone", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns an normaliz object -#! @Description +#! @Description #! Converts the cone to a normaliz object. The operations of NormalizInterface can then be applied #! on this convex object. DeclareAttribute( "ExternalNmzCone", IsCone ); @@ -205,7 +205,7 @@ DeclareAttribute( "FactorGridMorphism", #! @Description #! Returns the homalg $\mathbb{Z}$-module that is by generated the ray generators of the orthogonal cone on C. DeclareAttribute( "GridGeneratedByOrthogonalCone", - IsCone ); + IsCone ); ############################## ## @@ -214,23 +214,23 @@ DeclareAttribute( "GridGeneratedByOrthogonalCone", ############################## #! @Section Properties of Cones -#! @Arguments C +#! @Arguments C #! @Returns true or false -#! @Description +#! @Description #! Returns if the cone C is regular or not. DeclareProperty( "IsRegularCone", IsCone ); DeclareProperty( "HasConvexSupport", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns true or false -#! @Description +#! @Description #! Returns if the cone C is ray or not. DeclareProperty( "IsRay", IsCone ); -#! @Arguments C +#! @Arguments C #! @Returns true or false -#! @Description +#! @Description #! Returns whether the cone is the zero cone or not. DeclareProperty( "IsZero", IsCone ); @@ -245,51 +245,51 @@ DeclareAttribute( "SuperFan", IsCone ); ############################## #! @Section Operations on cones -#! @Arguments C, m +#! @Arguments C, m #! @Returns a cone -#! @Description +#! @Description #! Returns the projection of the cone on the space (O, $x_1,...,x_{m-1}, x_{m+1},...,x_n$ ). DeclareOperation( "FourierProjection", [ IsCone, IsInt ] ); #! @Arguments C1, C2 #! @Returns a cone -#! @Description +#! @Description #! Returns the intersection. DeclareOperation( "IntersectionOfCones", [ IsCone, IsCone ] ); -#! @Arguments L +#! @Arguments L #! @Returns a cone -#! @Description +#! @Description #! The input is a list of cones and the output is their intersection. DeclareOperation( "IntersectionOfCones", [ IsList ] ); -#! @Arguments C1, C2 +#! @Arguments C1, C2 #! @Returns a true or false -#! @Description +#! @Description #! Returns if the cone C1 contains the cone C2. DeclareOperation( "Contains", [ IsCone, IsCone ] ); #! @Arguments L, C #! @Returns a true or false -#! @Description +#! @Description #! Checks whether the input point (or ray) L is in the relative interior of the cone C. DeclareOperation( "IsRelativeInteriorRay", [ IsList, IsCone ] ); - + DeclareOperation( "\*", [ IsInt, IsCone ] ); #! @InsertChunk example1 - + DeclareOperation( "\*", [ IsHomalgMatrix, IsCone ] ); #! @Arguments C #! @Returns a list -#! @Description +#! @Description #! It returns a list of inequalities that define the cone. DeclareOperation( "NonReducedInequalities", [ IsCone ] ); @@ -298,14 +298,14 @@ DeclareOperation( "StarSubdivisionOfIthMaximalCone", [ IsFan, IsInt ] ); -DeclareOperation( "StarFan", +DeclareOperation( "StarFan", [ IsCone ] ); -DeclareOperation( "StarFan", +DeclareOperation( "StarFan", [ IsCone, IsFan ] ); -DeclareGlobalFunction( "SolutionPostIntMat" ); -DeclareGlobalFunction( "AddIfPossible" ); +DeclareGlobalFunction( "SolutionPostIntMat" ); +DeclareGlobalFunction( "AddIfPossible" ); DeclareGlobalFunction( "IfNotReducedReduceOnce" ); DeclareGlobalFunction( "ReduceTheBase" ); diff --git a/gap/Cone.gi b/gap/Cone.gi index cbf71b7..664a8b8 100644 --- a/gap/Cone.gi +++ b/gap/Cone.gi @@ -82,7 +82,7 @@ InstallMethod( IsComplete, [ IsCone ], function( cone ) - local rays; + local rays; if IsPointed( cone ) or not IsFullDimensional( cone ) then @@ -96,11 +96,11 @@ InstallMethod( IsComplete, end ); -## Let N= Z^{1 \times n}. Then N is free Z-modue. Let r_1,...,r_k \in N be the generating rays of the +## Let N= Z^{1 \times n}. Then N is free Z-modue. Let r_1,...,r_k \in N be the generating rays of the ## cone. Let A= [ r_1,..., r_k ]^T \in Z^{ k \times n }. Let M= N/ Z^{1 \times k}A. Now let B the smith -## normal form of A. Then B \in Z^{ k \times n } and there exists l<=k, l<=n with B_{i,i} \neq 0 and B_{i-1,i}| B_{i-1,i} for -## all 1l. We have now M= Z/Zb_{1,1} \oplus ... \oplus Z/Zb_{l,l} \oplus Z^{1 \times max{n,k}-l }. -## If all B_{i,i}=1 for i<=l, then M= Z^{1 \times max{n,k}-l }. i.e. M is free. Thus there is H \subset N with N= H \oplus Z^{1 \times k}A. +## normal form of A. Then B \in Z^{ k \times n } and there exists l<=k, l<=n with B_{i,i} \neq 0 and B_{i-1,i}| B_{i-1,i} for +## all 1l. We have now M= Z/Zb_{1,1} \oplus ... \oplus Z/Zb_{l,l} \oplus Z^{1 \times max{n,k}-l }. +## If all B_{i,i}=1 for i<=l, thenM= Z^{1 \times max{n,k}-l }. i.e. M is free. Thus there is H \subset N with N= H \oplus Z^{1 \times k}A. ## ( Corollary 7.55, Advanced modern algebra, J.rotman ). ## InstallMethod( IsSmooth, @@ -159,7 +159,7 @@ end ); ## InstallMethod( IsFullDimensional, "for cones", - [ IsCone ], + [ IsCone ], function( cone ) return RankMat( RayGenerators( cone ) ) = AmbientSpaceDimension( cone ); @@ -213,7 +213,7 @@ InstallMethod( DualCone, local dual; if RayGenerators( cone ) = [ ] then - dual := ConeByInequalities( [ List( [ 1 .. AmbientSpaceDimension( cone ) ], i -> 0 ) ] ); + dual := ConeByInequalities( [ List( [ 1 .. AmbientSpaceDimension( cone ) ], i -> 0 ) ] ); else dual := ConeByInequalities( RayGenerators( cone ) ); fi; @@ -231,35 +231,34 @@ InstallMethod( DefiningInequalities, [ IsCone ], function( cone ) - local inequalities, new_inequalities, equalities, i, u; + local inequalities, new_inequalities, equalities, i, u; inequalities:= ShallowCopy( Cdd_Inequalities( ExternalCddCone( cone ) ) ); equalities:= ShallowCopy( Cdd_Equalities( ExternalCddCone( cone ) ) ); - for i in equalities do - - Append( inequalities, [ i,-i ] ); - + for i in equalities do + + Append( inequalities, [ i,-i ] ); + od; new_inequalities:= [ ]; - for i in inequalities do - - u:= ShallowCopy( i ); - - Remove( u , 1 ); - - Add(new_inequalities, u ); - + for i in inequalities do + + u:= ShallowCopy( i ); + + Remove( u , 1 ); + + Add(new_inequalities, u ); + od; - return new_inequalities; - + return new_inequalities; + end ); - ## InstallMethod( FactorConeEmbedding, "for cones", @@ -283,7 +282,7 @@ InstallMethod( EqualitiesOfCone, new_equalities:= [ ]; - for i in equalities do + for i in equalities do u:= ShallowCopy( i ); @@ -324,95 +323,9 @@ InstallMethod( HilbertBasisOfDualCone, function( cone ) - return HilbertBasis( DualCone( cone ) ); - -end ); - -## This method is commented since it returns a wrong answer for not-pinted cones -## C := Cone( [ e1 ] ); -## -# InstallMethod( HilbertBasisOfDualCone, -# "for cone", -# [ IsCone ], - -# function( cone ) -# local ray_generators, d, i, dim, V, D, max, v, I, b, DpD, d1, d2, Dgens, -# zero_element, entry; - -# ray_generators := RayGenerators( cone ); - -# dim := AmbientSpaceDimension( cone ); - -# max := Maximum( List( Concatenation( ray_generators ), AbsInt ) ); - -# D := [ ]; - -# ## This needs to be done smarter -# I:= Cartesian( List( [ 1 .. dim ], i -> [ -max .. max ] ) ); - -# for v in I do - -# if ForAll( ray_generators, i -> i * v >= 0 ) then - -# Add( D, v ); - -# fi; - -# od; - -# DpD := [ ]; + return HilbertBasis( DualCone( cone ) ); -# for d1 in D do - -# if d1 * d1 <> 0 then - -# for d2 in D do - -# if d2 * d2 <> 0 then - -# Add( DpD, d1 + d2 ); - -# fi; - -# od; - -# fi; - -# od; - -# Dgens := [ ]; - -# for d in D do - -# if not d in DpD then - -# Add( Dgens, d ); - -# fi; - -# od; - -# if not Dgens = [ ] then - -# zero_element := ListWithIdenticalEntries( Length( Dgens[ 1 ] ), 0 ); - -# i := Position( Dgens, zero_element ); - -# if i <> fail then - -# Remove( Dgens, i ); - -# fi; - -# fi; - -# entry := ToDoListEntry( [ [ cone, "DualCone" ] ], [ DualCone, cone ], "HilbertBasis", Dgens ); - -# AddToToDoList( entry ); - -# return Dgens; - -# end); +end ); ## InstallMethod( AmbientSpaceDimension, @@ -422,13 +335,13 @@ InstallMethod( AmbientSpaceDimension, function( cone ) if Length( RayGenerators( cone ) ) > 0 then - - return Length( RayGenerators( cone )[ 1 ] ); - - else - - return 1; - + + return Length( RayGenerators( cone )[ 1 ] ); + + else + + return 1; + fi; end ); @@ -442,12 +355,12 @@ InstallMethod( Dimension, if Length( RayGenerators( cone ) ) > 0 then - return RankMat( RayGenerators( cone ) ); + return RankMat( RayGenerators( cone ) ); + + else + + return 0; - else - - return 0; - fi; TryNextMethod(); @@ -455,13 +368,13 @@ InstallMethod( Dimension, end ); ## -InstallMethod( Dimension, +InstallMethod( Dimension, "for cones", [ IsCone ], function( cone ) - - return Cdd_Dimension( ExternalCddCone( cone ) ); - + + return Cdd_Dimension( ExternalCddCone( cone ) ); + end ); ## @@ -477,24 +390,23 @@ InstallMethod( HilbertBasis, Error( "Hilbert basis for not-pointed cones is not yet implemented, you can use the command 'LatticePointsGenerators' " ); fi; - - + if IsPackageMarkedForLoading( "NormalizInterface", ">=1.1.0" ) then - + return Set( ValueGlobal( "NmzHilbertBasis" )( ExternalNmzCone( cone ) ) ); - + elif IsPackageMarkedForLoading( "4ti2Interface", ">=2018.07.06" ) then ineq := DefiningInequalities( cone ); - + const := ListWithIdenticalEntries( Length( ineq ), 0 ); - + return Set( ValueGlobal( "4ti2Interface_zsolve_equalities_and_inequalities" )( [ ], [ ], ineq, const )[ 2 ]: precision := "gmp" ); - + else - + Error( "4ti2Interface or NormalizInterface should be loaded!" ); - + fi; end ); @@ -505,8 +417,8 @@ InstallMethod( RaysInFacets, [ IsCone ], function( cone ) - local external_cone, list_of_facets, generating_rays, list, current_cone, current_list, current_ray_generators, i; - + local external_cone, list_of_facets, generating_rays, list, current_cone, current_list, current_ray_generators, i; + external_cone := Cdd_H_Rep ( ExternalCddCone ( cone ) ); list_of_facets:= Cdd_Facets( external_cone ); @@ -521,18 +433,18 @@ InstallMethod( RaysInFacets, current_ray_generators := Cdd_GeneratingRays( current_cone ) ; - current_list:= List( [1..Length( generating_rays )], - - function(j) - - if generating_rays[j] in Cone( current_cone ) then - return 1; - else - return 0; - fi; - - end ); - + current_list:= List( [1..Length( generating_rays )], + + function(j) + + if generating_rays[j] in Cone( current_cone ) then + return 1; + else + return 0; + fi; + + end ); + Add( list, current_list ); od; @@ -547,7 +459,7 @@ InstallMethod( RaysInFaces, [ IsCone ], function( cone ) - local external_cone, list_of_faces, generating_rays, list, current_cone, current_list, current_ray_generators, i,j; + local external_cone, list_of_faces, generating_rays, list, current_cone, current_list, current_ray_generators, i,j; external_cone := Cdd_H_Rep( ExternalCddCone ( cone ) ); @@ -565,16 +477,16 @@ InstallMethod( RaysInFaces, current_ray_generators := Cdd_GeneratingRays( current_cone ) ; - current_list:= List( [ 1 .. Length( generating_rays ) ], + current_list:= List( [ 1 .. Length( generating_rays ) ], function(j) if generating_rays[j] in Cone( current_cone ) then - return 1; + return 1; else return 0; fi; - + end ); Add( list, current_list ); @@ -619,7 +531,7 @@ InstallMethod( Facets, od; - if conelist = [ [ ] ] then + if conelist = [ [ ] ] then return [ Cone( [ List( [ 1 .. AmbientSpaceDimension( cone ) ], i->0 ) ] ) ]; fi; @@ -673,10 +585,10 @@ InstallMethod( FVector, local external_cone, faces; external_cone := Cdd_H_Rep( ExternalCddCone( cone ) ); - + faces := Cdd_Faces( external_cone ); - return List( [ 1 .. Dimension( cone ) ], + return List( [ 1 .. Dimension( cone ) ], i -> Length( PositionsProperty( faces, face -> face[ 1 ] = i ) ) ); end ); @@ -797,8 +709,8 @@ InstallMethod( FactorGridMorphism, end ); -InstallMethod( LatticePointsGenerators, - [ IsCone ], +InstallMethod( LatticePointsGenerators, + [ IsCone ], function( cone ) local n; @@ -807,7 +719,7 @@ InstallMethod( LatticePointsGenerators, return LatticePointsGenerators( Polyhedron( [ List( [ 1 .. n ], i -> 0 ) ], cone ) ); -end ); +end ); ## InstallMethod( StarSubdivisionOfIthMaximalCone, @@ -818,7 +730,7 @@ InstallMethod( StarSubdivisionOfIthMaximalCone, local maxcones, cone, ray, cone2; maxcones := MaximalCones( fan ); - + if Length( maxcones ) < noofcone then Error( " not enough maximal cones" ); @@ -830,9 +742,9 @@ InstallMethod( StarSubdivisionOfIthMaximalCone, Error( " the specified cone is not smooth!" ); fi; - + maxcones := List( maxcones, RayGenerators ); - + cone := maxcones[ noofcone ]; ray := Sum( cone ); @@ -1130,27 +1042,27 @@ InstallMethod( Contains, function( ambcone, cone ) local ineq; - + if HasRayGenerators( ambcone ) and HasRayGenerators( cone ) then - + if IsSubset( Set( RayGenerators( ambcone ) ), Set( RayGenerators( cone ) ) ) then - + return true; - + fi; - + fi; - + if HasDefiningInequalities( ambcone ) and HasDefiningInequalities( cone ) then - + if IsSubset( Set( DefiningInequalities( cone ) ), Set( DefiningInequalities( ambcone ) ) ) then - + return true; - + fi; - + fi; - + ineq := NonReducedInequalities( ambcone ); cone := RayGenerators( cone ); @@ -1231,7 +1143,7 @@ InstallMethod( \in, ray_generators := RayGenerators( cone ); ##FIXME: One can use homalg for this, but at the moment - ## we do not want the overhead. + ## we donot want the overhead. matrix := SolutionMat( ray_generators, raygen ); return ForAll( matrix, i -> i >= 0 ); @@ -1285,11 +1197,11 @@ InstallMethod( ExternalCddCone, fi; - if IsBound( cone!.input_rays ) then + if IsBound( cone!.input_rays ) then list := cone!.input_rays; - for i in [1..Length( list ) ] do + for i in [1..Length( list ) ] do u:= ShallowCopy( list[ i ] ); @@ -1314,7 +1226,7 @@ InstallMethod( ExternalCddCone, Append( list, StructuralCopy( cone!.input_inequalities ) ); - for i in [1..Length( list ) ] do + for i in [1..Length( list ) ] do u:= ShallowCopy( list[ i ] ); @@ -1326,11 +1238,11 @@ InstallMethod( ExternalCddCone, return Cdd_PolyhedronByInequalities( new_list, linearity ); - else + else list:= StructuralCopy( cone!.input_inequalities ); - for i in [1..Length( list ) ] do + for i in [1..Length( list ) ] do u:= ShallowCopy( list[ i ] ); @@ -1354,7 +1266,7 @@ InstallMethod( ExternalNmzCone, list:= []; - if IsBound( cone!.input_rays ) then + if IsBound( cone!.input_rays ) then list := StructuralCopy( cone!.input_rays ); @@ -1513,7 +1425,7 @@ InstallMethod( ConeByGenerators, cone, TheTypeConvexCone ); - if Length( raylist ) =1 and IsZero( raylist[ 1 ] ) then + if Length( raylist ) =1 and IsZero( raylist[ 1 ] ) then SetIsZero( cone, true ); @@ -1546,21 +1458,21 @@ InstallMethod( Cone, ); -InstallMethod( Cone, +InstallMethod( Cone, "Construct cone from Cdd cone", [ IsCddPolyhedron ], function( cdd_cone ) - local inequalities, equalities, + local inequalities, equalities, new_inequalities, new_equalities, u, i; - if cdd_cone!.rep_type = "H-rep" then + if cdd_cone!.rep_type = "H-rep" then inequalities:= Cdd_Inequalities( cdd_cone ); new_inequalities:= [ ]; - for i in inequalities do + for i in inequalities do u:= ShallowCopy( i ); @@ -1576,7 +1488,7 @@ InstallMethod( Cone, new_equalities:= [ ]; - for i in equalities do + for i in equalities do u:= ShallowCopy( i ); @@ -1592,7 +1504,7 @@ InstallMethod( Cone, return ConeByInequalities( new_inequalities ); - else + else return ConeByGenerators( Cdd_GeneratingRays( cdd_cone ) ); @@ -1737,3 +1649,4 @@ InstallMethod( Display, Print( ".\n" ); end ); + diff --git a/gap/Convex.gd b/gap/Convex.gd index e69de29..139597f 100644 --- a/gap/Convex.gd +++ b/gap/Convex.gd @@ -0,0 +1,2 @@ + + diff --git a/gap/Convex.gi b/gap/Convex.gi index e69de29..139597f 100644 --- a/gap/Convex.gi +++ b/gap/Convex.gi @@ -0,0 +1,2 @@ + + diff --git a/makedoc.g b/makedoc.g index 0c47617..af4b728 100644 --- a/makedoc.g +++ b/makedoc.g @@ -14,12 +14,13 @@ AutoDoc( rec( files := [ "doc/Doc.autodoc" ], scan_dirs := [ "doc", "gap", "examples", "examples/doc" ], ), - #extract_examples := rec( - # units := "Single", - #), + extract_examples := rec( + units := "Single", + ), gapdoc := rec( LaTeXOptions := rec( LateExtraPreamble := """ + \usepackage{mathtools} """, ), ), diff --git a/makedoc_with_overfull_hbox_warnings.g b/makedoc_with_overfull_hbox_warnings.g index a7bd316..998534b 100644 --- a/makedoc_with_overfull_hbox_warnings.g +++ b/makedoc_with_overfull_hbox_warnings.g @@ -18,6 +18,7 @@ AutoDoc( rec( gapdoc := rec( LaTeXOptions := rec( LateExtraPreamble := """ + \usepackage{mathtools} % Many thanks to https://tex.stackexchange.com/questions/22466/how-to-convince-fancyvrb-to-give-overfull-warnings/534486#534486 \makeatletter \def\FV@ListProcessLine#1{% diff --git a/makefile b/makefile index 2ae3352..ff82bb7 100644 --- a/makefile +++ b/makefile @@ -29,17 +29,21 @@ test-doc: doc test-with-coverage: doc gap --quitonbreak --cover stats tst/testall.g - echo 'LoadPackage("profiling"); OutputJsonCoverage("stats", "coverage.json");' | gap --quitonbreak + gap --quitonbreak --norepl -c 'LoadPackage("profiling"); OutputJsonCoverage("stats", "coverage.json");' test-spacing: - grep -R "[^ [] " gap/*.gi && echo "Duplicate spaces found" && exit 1 || exit 0 + grep -R "[^ [\"] " gap/*.gi && echo "Duplicate spaces found" && exit 1 || exit 0 grep -RE '[^ ] +$$' gap/* && echo "Trailing whitespace found" && exit 1 || exit 0 for filename in gap/*; do \ echo $$filename; \ - echo "LoadPackage(\"NConvex\"); SizeScreen([4096]); func := ReadAsFunction(\"$$filename\"); FileString(\"gap_spacing\", PrintString(func));" | gap --quitonbreak --banner; \ + gap --quitonbreak --norepl --banner -c "LoadPackage(\"NConvex\"); SizeScreen([4096]); func := ReadAsFunction(\"$$filename\"); FileString(\"gap_spacing\", DisplayString(func));"; \ echo -e "\033[0m"; \ - cat "gap_spacing" | sed 's/^function ( ) //g' | sed 's/ return; end$$//g' | sed 's/;/;\n/g' > modified_gap_spacing; \ - cat "$$filename" | grep -v "^ *[#]" | sed 's/^ *//' | grep -v "^$$" | tr "\n" " " | sed "s/;/;\n/g" | head -c -1 > modified_custom_spacing; \ + # In a perfect world, the DisplayString of a function would exactly match our code. However, our line breaks and indentation might differ from the GAP ones, \ + # so we remove all indentation, line breaks, and empty lines, and afterwards insert line breaks at semicolons again for better readability. \ + cat "gap_spacing" | tail -n +2 | head -n -2 | sed 's/\[ \]/[ ]/g' | sed 's/( )/( )/g' | sed 's/( :/( :/g' | sed 's/ *$$//' | sed 's/^ *//' | grep -v "^$$" | tr "\n" " " | sed 's/;/;\n/g' > modified_gap_spacing; \ + cat "$$filename" | grep -v "^ *[#]" | sed 's/^ *//' | grep -v "^$$" | tr "\n" " " | sed "s/;/;\n/g" > modified_custom_spacing; \ + # Our code might still differ from the GAP code, for example because of additional brackets. \ + # Thus, we diff the code once as expected and once ignoring all space. Diffing the two diffs then shows lines which only differ by spacing. \ diff modified_gap_spacing modified_custom_spacing > spacing_diff; \ diff modified_gap_spacing modified_custom_spacing --ignore-all-space --ignore-space-change --ignore-trailing-space --ignore-blank-lines > spacing_diff_no_blanks; \ diff spacing_diff_no_blanks spacing_diff || exit; \ @@ -50,4 +54,4 @@ test-spacing: rm spacing_diff rm spacing_diff_no_blanks -ci-test: test-with-coverage +ci-test: test-basic-spacing test-with-coverage diff --git a/tst/000_LoadPackage.tst b/tst/100_LoadPackage.tst similarity index 83% rename from tst/000_LoadPackage.tst rename to tst/100_LoadPackage.tst index eb66857..55db1c0 100644 --- a/tst/000_LoadPackage.tst +++ b/tst/100_LoadPackage.tst @@ -3,6 +3,8 @@ # # This file tests if the package can be loaded without errors or warnings. # +# do not load suggested dependencies automatically +gap> PushOptions( rec( OnlyNeeded := true ) ); gap> package_loading_info_level := InfoLevel( InfoPackageLoading );; gap> SetInfoLevel( InfoPackageLoading, PACKAGE_ERROR );; gap> LoadPackage( "NConvex", false ); diff --git a/tst/nconvex01.tst b/tst/nconvex01.tst deleted file mode 100644 index 96ca7b2..0000000 --- a/tst/nconvex01.tst +++ /dev/null @@ -1,141 +0,0 @@ -# NConvex, single 1 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex01.tst"); - -# doc/_Chunks.xml:2-129 -gap> P:= Cone( [ [ 2, 7 ], [ 0, 12 ], [ -2, 5 ] ] ); - -gap> d:= DefiningInequalities( P ); -[ [ -7, 2 ], [ 5, 2 ] ] -gap> Q:= ConeByInequalities( d ); - -gap> P=Q; -true -gap> IsPointed( P ); -true -gap> RayGenerators( P ); -[ [ -2, 5 ], [ 2, 7 ] ] -gap> HilbertBasis( P ); -[ [ -2, 5 ], [ -1, 3 ], [ 0, 1 ], [ 1, 4 ], [ 2, 7 ] ] -gap> HilbertBasis( Q ); -[ [ -2, 5 ], [ -1, 3 ], [ 0, 1 ], [ 1, 4 ], [ 2, 7 ] ] -gap> P_dual:= DualCone( P ); - -gap> RayGenerators( P_dual ); -[ [ -7, 2 ], [ 5, 2 ] ] -gap> Dimension( P ); -2 -gap> List( Facets( P ), RayGenerators ); -[ [ [ -2, 5 ] ], [ [ 2, 7 ] ] ] -gap> faces := FacesOfCone( P ); -[ , , , - ] -gap> RelativeInteriorRay( P ); -[ -2, 41 ] -gap> IsRelativeInteriorRay( [ -2, 41 ], P ); -true -gap> IsRelativeInteriorRay( [ 2, 7 ], P ); -false -gap> LinealitySpaceGenerators( P ); -[ ] -gap> IsRegularCone( P ); -false -gap> IsRay( P ); -false -gap> proj_x1:= FourierProjection( P, 2 ); - -gap> RayGenerators( proj_x1 ); -[ [ -1 ], [ 1 ] ] -gap> DefiningInequalities( proj_x1 ); -[ [ 0 ] ] -gap> R:= Cone( [ [ 4, 5 ], [ -2, 1 ] ] ); - -gap> T:= IntersectionOfCones( P, R ); - -gap> RayGenerators( T ); -[ [ -2, 5 ], [ 2, 7 ] ] -gap> W:= Cone( [ [-3,-4 ] ] ); - -gap> I:= IntersectionOfCones( P, W ); - -gap> RayGenerators( I ); -[ ] -gap> Contains( P, I ); -true -gap> Contains( W, I ); -true -gap> Contains( P, R ); -false -gap> Contains( R, P ); -true -gap> cdd_cone:= ExternalCddCone( P ); -< Polyhedron given by its V-representation > -gap> Display( cdd_cone ); -V-representation -begin -3 X 3 rational - - 0 2 7 - 0 0 12 - 0 -2 5 -end -gap> Cdd_Dimension( cdd_cone ); -2 -gap> H:= Cdd_H_Rep( cdd_cone ); -< Polyhedron given by its H-representation > -gap> Display( H ); -H-representation -begin - 2 X 3 rational - - 0 5 2 - 0 -7 2 -end -gap> P:= Cone( [ [ 1, 1, -3 ], [ -1, -1, 3 ], [ 1, 2, 1 ], [ 2, 1, 2 ] ] ); -< A cone in |R^3> -gap> IsPointed( P ); -false -gap> Dimension( P ); -3 -gap> IsRegularCone( P ); -false -gap> P; -< A cone in |R^3 of dimension 3 with 4 ray generators> -gap> RayGenerators( P ); -[ [ -1, -1, 3 ], [ 1, 1, -3 ], [ 1, 2, 1 ], [ 2, 1, 2 ] ] -gap> d:= DefiningInequalities( P ); -[ [ -5, 8, 1 ], [ 7, -4, 1 ] ] -gap> facets:= Facets( P ); -[ , ] -gap> faces := FacesOfCone( P ); -[ , , , - , ] -gap> FVector( P ); -[ 1, 2, 1 ] -gap> List( faces, Dimension ); -[ 0, 3, 2, 1, 2 ] -gap> L_using_4ti2 := [ [ [ 0, 0, 0 ] ], [ [ -2, -1, 10 ], -> [ 0, 0, 1 ], [ 2, 1, 2 ] ], [ [ 1, 1, -3 ] ] ];; -gap> L_using_Normaliz := [ [ [ 0, 0, 0 ] ], [ [ -1, 0, 7 ], -> [ 0, 0, 1 ], [ 1, 0, 5 ] ], [ [ 1, 1, -3 ] ] ];; -gap> L := LatticePointsGenerators( P );; -gap> #L = L_using_4ti2 or L = L_using_Normaliz; -gap> DualCone( P ); -< A cone in |R^3> -gap> RayGenerators( DualCone( P ) ); -[ [ -5, 8, 1 ], [ 7, -4, 1 ] ] -gap> Q_x1x3:= FourierProjection(P, 2 ); - -gap> RayGenerators( Q_x1x3 ); -[ [ -1, 3 ], [ 1, -3 ], [ 1, 1 ] ] - -# -gap> STOP_TEST("nconvex01.tst", 1 ); diff --git a/tst/nconvex02.tst b/tst/nconvex02.tst deleted file mode 100644 index dfd08e5..0000000 --- a/tst/nconvex02.tst +++ /dev/null @@ -1,75 +0,0 @@ -# NConvex, single 2 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex02.tst"); - -# doc/_Chunks.xml:138-198 -gap> F1 := Fan( [ [ [ 2, 1 ], [ 1, 2 ] ], [ [ 2, 1 ], [ 1, -1 ] ], -> [ [ -3, 1 ], [ -1, -3 ] ] ] ); - -gap> F2 := Fan( [ [ 2, 1 ], [ 1, 2 ], [ -3, 1 ], [ -1, -3 ], [ 1, -1 ] ], -> [ [ 1, 2 ], [ 1, 5 ], [ 3, 4 ] ] ); - -gap> rays1 := RayGenerators( F1 ); -[ [ -3, 1 ], [ -1, -3 ], [ 1, -1 ], [ 1, 2 ], [ 2, 1 ] ] -gap> rays2 := RayGenerators( F2 ); -[ [ -3, 1 ], [ -1, -3 ], [ 1, -1 ], [ 1, 2 ], [ 2, 1 ] ] -gap> RaysInMaximalCones( F1 ); -[ [ 0, 0, 0, 1, 1 ], [ 0, 0, 1, 0, 1 ], [ 1, 1, 0, 0, 0 ] ] -gap> RaysInMaximalCones( F2 ); -[ [ 0, 0, 0, 1, 1 ], [ 0, 0, 1, 0, 1 ], [ 1, 1, 0, 0, 0 ] ] -gap> RaysInAllCones( F1 ); -[ [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 1 ], [ 0, 0, 0, 0, 1 ], - [ 0, 0, 0, 1, 0 ], [ 0, 0, 1, 0, 1 ], [ 0, 0, 1, 0, 0 ], - [ 1, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ] -gap> FVector( F1 ); -[ 5, 3 ] -gap> IsComplete( F1 ); -false -gap> IsSimplicial( F1 ); -true -gap> IsNormalFan( F1 ); -false -gap> IsRegularFan( F1 ); -false -gap> P1 := Polytope( [ [ 1 ], [ -1 ] ] ); - -gap> P1 := NormalFan( P1 ); - -gap> RayGenerators( P1 ); -[ [ -1 ], [ 1 ] ] -gap> P3 := P1 * P1 * P1; - -gap> RayGenerators( P3 ); -[ [ -1, 0, 0 ], [ 0, -1, 0 ], [ 0, 0, -1 ], [ 0, 0, 1 ], [ 0, 1, 0 ], - [ 1, 0, 0 ] ] -gap> RaysInMaximalCones( P3 ); -[ [ 0, 0, 0, 1, 1, 1 ], [ 0, 0, 1, 0, 1, 1 ], [ 0, 1, 0, 1, 0, 1 ], - [ 0, 1, 1, 0, 0, 1 ], [ 1, 0, 0, 1, 1, 0 ], [ 1, 0, 1, 0, 1, 0 ], - [ 1, 1, 0, 1, 0, 0 ], [ 1, 1, 1, 0, 0, 0 ] ] -gap> RaysInAllCones( P3 ); -[ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 1, 1 ], [ 0, 0, 0, 1, 1, 0 ], - [ 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 1, 0, 1 ], - [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 0, 1, 1 ], [ 0, 0, 1, 0, 1, 1 ], - [ 0, 0, 1, 0, 1, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 1 ], - [ 0, 1, 0, 1, 0, 1 ], [ 0, 1, 0, 1, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], - [ 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 0, 0, 1 ], [ 0, 1, 1, 0, 0, 0 ], - [ 1, 0, 0, 1, 1, 0 ], [ 1, 0, 0, 1, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ], - [ 1, 0, 0, 0, 1, 0 ], [ 1, 0, 1, 0, 1, 0 ], [ 1, 0, 1, 0, 0, 0 ], - [ 1, 1, 0, 1, 0, 0 ], [ 1, 1, 0, 0, 0, 0 ], [ 1, 1, 1, 0, 0, 0 ] ] -gap> IsNormalFan( P3 ); -true -gap> Dimension( P3 ); -3 -gap> PrimitiveCollections( P3 ); -[ [ 4, 3 ], [ 5, 2 ], [ 6, 1 ] ] - -# -gap> STOP_TEST("nconvex02.tst", 1 ); diff --git a/tst/nconvex03.tst b/tst/nconvex03.tst deleted file mode 100644 index 4dcc6e5..0000000 --- a/tst/nconvex03.tst +++ /dev/null @@ -1,34 +0,0 @@ -# NConvex, single 3 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex03.tst"); - -# doc/_Chunks.xml:205-224 -gap> rays := [ [ 1, 0, 0 ], [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, -1, 0 ], -> [ 0, 0, 1 ], [ 0, 0, -1 ], [ 2, 1, 1 ], [ 1, 2, 1 ], [ 1, 1, 2 ], -> [ 1, 1, 1 ] ];; -gap> cones := [ [ 1, 3, 6 ], [ 1, 4, 6 ], [ 1, 4, 5 ], [ 2, 3, 6 ], -> [ 2, 4, 6 ], [ 2, 3, 5 ], [ 2, 4, 5 ], [ 1, 5, 9 ], [ 3, 5, 8 ], -> [ 1, 3, 7 ], [ 1, 7, 9 ], [ 5, 8, 9 ], [ 3, 7, 8 ], [ 7, 9, 10 ], -> [ 8, 9, 10 ], [ 7, 8, 10 ] ];; -gap> F := Fan( rays, cones ); - -gap> IsComplete( F ); -true -gap> IsNormalFan( F ); -false -gap> PrimitiveCollections( F ); -[ [ 7, 1 ], [ 7, 2 ], [ 7, 3 ], [ 7, 4 ], [ 7, 5 ], [ 7, 6 ], - [ 9, 1 ], [ 9, 2 ], [ 9, 3 ], [ 9, 6 ], [ 10, 1 ], [ 10, 2 ], - [ 10, 3 ], [ 10, 4 ], [ 8, 1 ], [ 8, 2 ], [ 8, 3 ], [ 8, 5 ], - [ 6, 1 ], [ 5, 2 ], [ 4, 3 ], [ 9, 10, 8 ], [ 5, 6, 4 ] ] - -# -gap> STOP_TEST("nconvex03.tst", 1 ); diff --git a/tst/nconvex04.tst b/tst/nconvex04.tst deleted file mode 100644 index b27f3df..0000000 --- a/tst/nconvex04.tst +++ /dev/null @@ -1,30 +0,0 @@ -# NConvex, single 4 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex04.tst"); - -# doc/_Chunks.xml:254-269 -gap> rays := [ [ 1,0 ], [ 0,1 ] ];; -gap> max_cones := [ [1,2] ];; -gap> fan_affine2 := Fan( rays, max_cones );; -gap> fan_blowup_affine2 := StarSubdivisionOfIthMaximalCone( fan_affine2, 1 ); - -gap> Length( RaysInMaximalCones( fan_blowup_affine2 ) ); -2 -gap> rays := [ [ 1,0,0 ], [ 0,1,0 ], [0,0,1] ];; -gap> max_cones := [ [1,2,3] ];; -gap> fan_affine3 := Fan( rays, max_cones );; -gap> fan_blowup_affine3 := StarSubdivisionOfIthMaximalCone( fan_affine3, 1 ); - -gap> Length( RaysInMaximalCones( fan_blowup_affine3 ) ); -3 - -# -gap> STOP_TEST("nconvex04.tst", 1 ); diff --git a/tst/nconvex05.tst b/tst/nconvex05.tst deleted file mode 100644 index 796d627..0000000 --- a/tst/nconvex05.tst +++ /dev/null @@ -1,61 +0,0 @@ -# NConvex, single 5 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex05.tst"); - -# doc/_Chunks.xml:275-323 -gap> P := Polyhedron( [ [ 1, 1 ], [ 4, 7 ] ], [ [ 1, -1 ], [ 1, 1 ] ] ); - -gap> VerticesOfMainRatPolytope( P ); -[ [ 1, 1 ], [ 4, 7 ] ] -gap> VerticesOfMainPolytope( P ); -[ [ 1, 1 ], [ 4, 7 ] ] -gap> P := Polyhedron( [ [ 1/2, 1/2 ] ], [ [ 1, 1 ] ] ); - -gap> VerticesOfMainRatPolytope( P ); -[ [ 1/2, 1/2 ] ] -gap> VerticesOfMainPolytope( P ); -[ [ 1, 1 ] ] -gap> LatticePointsGenerators( P ); -[ [ [ 1, 1 ] ], [ [ 1, 1 ] ], [ ] ] -gap> Dimension( P ); -1 -gap> Q := Polyhedron( [ [ 5, 0 ], [ 0, 6 ] ], [ [ 1, 2 ] , [ -1, -2 ] ] ); - -gap> VerticesOfMainRatPolytope( Q ); -[ [ 0, 6 ], [ 5, 0 ] ] -gap> V_using_4ti2 := [ [ -3, -16 ], [ -3, 0 ] ];; -gap> V_using_normaliz := [ [ 0, 6 ], [ 5, 0 ] ];; -gap> V := VerticesOfMainPolytope( Q );; -gap> #V = V_using_4ti2 or V = V_using_normaliz; true -gap> L_using_4ti2 := [ [ [ -3, -16 ], [ -3, -15 ], [ -3, -14 ], -> [ -3, -13 ], [ -3, -12 ], [ -3, -11 ], [ -3, -10 ], -> [ -3, -9 ], [ -3, -8 ], [ -3, -7 ], [ -3, -6 ], -> [ -3, -5 ], [ -3, -4 ], [ -3, -3 ], [ -3, -2 ], -> [ -3, -1 ], [ -3, 0 ] ], [ ], [ [ 1, 2 ] ] ];; -gap> L_using_normaliz := [ [ [ 0, -10 ], [ 0, -9 ], [ 0, -8 ], -> [ 0, -7 ], [ 0, -6 ], [ 0, -5 ], [ 0, -4 ], [ 0, -3 ], -> [ 0, -2 ], [ 0, -1 ], [ 0, 0 ], [ 0, 1 ], [ 0, 2 ], -> [ 0, 3 ], [ 0, 4 ], [ 0, 5 ], [ 0, 6 ] ], [ ], [ [ -1, -2 ] ] ];; -gap> L := LatticePointsGenerators( Q );; -gap> #L = L_using_4ti2 or L = L_using_normaliz; true -gap> Dimension( Q ); -2 -gap> RayGeneratorsOfTailCone( Q ); -[ [ -1, -2 ], [ 1, 2 ] ] -gap> BasisOfLinealitySpace( Q ); -[ [ 1, 2 ] ] -gap> DefiningInequalities( Q ); -[ [ 6, 2, -1 ], [ 10, -2, 1 ] ] -gap> Q; - - -# -gap> STOP_TEST("nconvex05.tst", 1 ); diff --git a/tst/nconvex06.tst b/tst/nconvex06.tst deleted file mode 100644 index 44014b7..0000000 --- a/tst/nconvex06.tst +++ /dev/null @@ -1,24 +0,0 @@ -# NConvex, single 6 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex06.tst"); - -# doc/_Chunks.xml:329-339 -gap> P := PolyhedronByInequalities( [ [ -2, 3, 4, -7 ], -[ -2, 3, 4, -7 ] ] ); - -gap> L_using_normaliz := [ [ [ -4, 0, -2 ] ], [ ], -> [ [ 1, 1, 1 ], [ 4, -3, 0 ] ] ];; -gap> L_using_4ti2 := [ [ [ -2, 2, 0 ] ], [ ], -> [ [ 1, 1, 1 ], [ 4, -3, 0 ] ] ];; -gap> L := LatticePointsGenerators( P );; -gap> #L = L_using_4ti2 or L = L_using_normaliz; true - -# -gap> STOP_TEST("nconvex06.tst", 1 ); diff --git a/tst/nconvex07.tst b/tst/nconvex07.tst deleted file mode 100644 index 7a8a22b..0000000 --- a/tst/nconvex07.tst +++ /dev/null @@ -1,19 +0,0 @@ -# NConvex, single 7 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex07.tst"); - -# doc/_Chunks.xml:347-352 -gap> Q := PolyhedronByInequalities( [ [-3, 4, 6 ], [ 3, -4, -6 ] ] ); - -gap> #LatticePointsGenerators( Q ); [ [ ], [ ], [ [ -3, 2 ] ] ] - -# -gap> STOP_TEST("nconvex07.tst", 1 ); diff --git a/tst/nconvex08.tst b/tst/nconvex08.tst deleted file mode 100644 index 16d21d6..0000000 --- a/tst/nconvex08.tst +++ /dev/null @@ -1,23 +0,0 @@ -# NConvex, single 8 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex08.tst"); - -# doc/_Chunks.xml:363-372 -gap> P := PolyhedronByInequalities( [ [ -1, 2, 3, 2, 0 ], [ -3, 7, 1, 0, 5 ], -> [ 1, -2, -3, -2, 0 ], [ 3, -7, -1, 0, -5 ] ] ); - -gap> L_using_4ti2 := [ [ [ 0, 3, -4, 0 ] ], [ ], [ [ 0, -10, 15, 2 ], [ 1, -2, 2, -1 ] ] ];; -gap> L_using_normaliz := [ [ [ -19, 1, 18, 27 ] ], [ ], [ [ -1, 2, -2, 1 ], [ 5, 0, -5, -7 ] ] ];; -gap> L := LatticePointsGenerators( P );; -gap> #L = L_using_4ti2 or L = L_using_normaliz; true - -# -gap> STOP_TEST("nconvex08.tst", 1 ); diff --git a/tst/nconvex09.tst b/tst/nconvex09.tst deleted file mode 100644 index 7741849..0000000 --- a/tst/nconvex09.tst +++ /dev/null @@ -1,24 +0,0 @@ -# NConvex, single 9 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex09.tst"); - -# doc/_Chunks.xml:394-403 -gap> P := PolyhedronByInequalities( [ [ -100, 1, 0 ], [ 200, -1, 0 ], -> [ -80, 0, 1 ], [ 170, 0, -1 ], [ -200, 1, 1 ] ] );; -gap> max := SolveLinearProgram( P, "max", [ 1, -2, 5 ] ); -[ [ 100, 170 ], 651 ] -gap> min := SolveLinearProgram( P, "min", [ 1, -2, 5 ] ); -[ [ 200, 80 ], 1 ] -gap> VerticesOfMainRatPolytope( P ); -[ [ 100, 100 ], [ 100, 170 ], [ 120, 80 ], [ 200, 80 ], [ 200, 170 ] ] - -# -gap> STOP_TEST("nconvex09.tst", 1 ); diff --git a/tst/nconvex10.tst b/tst/nconvex10.tst deleted file mode 100644 index 8968693..0000000 --- a/tst/nconvex10.tst +++ /dev/null @@ -1,96 +0,0 @@ -# NConvex, single 10 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex10.tst"); - -# doc/_Chunks.xml:411-492 -gap> P:= Polytope( [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 2 ] ] ); - -gap> IsNormalPolytope( P ); -false -gap> IsVeryAmple( P ); -false -gap> Q:= Polytope( [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 1 ] ] ); - -gap> IsNormalPolytope( Q ); -true -gap> IsVeryAmple( Q ); -true -gap> Q; - -gap> T:= Polytope( [ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 4 ] ] ); - -gap> I:= Polytope( [ [ 0, 0, 0 ], [ 0, 0, 1 ] ] ); - -gap> J:= T + I; - -gap> IsVeryAmple( J ); -true -gap> IsNormalPolytope( J ); -false -gap> J; - -gap> # Example 2.2.20 Cox, Toric Varieties -> A:= [ [1,1,1,0,0,0], [1,1,0,1,0,0], [1,0,1,0,1,0], [ 1,0,0,1,0,1], -> [ 1,0,0,0,1,1], [ 0,1,1,0,0,1], [0,1,0,1,1,0], [0,1,0,0,1,1], -> [0,0,1,1,1,0], [0,0,1,1,0,1] ]; -[ [ 1, 1, 1, 0, 0, 0 ], [ 1, 1, 0, 1, 0, 0 ], [ 1, 0, 1, 0, 1, 0 ], -[ 1, 0, 0, 1, 0, 1 ], [ 1, 0, 0, 0, 1, 1 ], [ 0, 1, 1, 0, 0, 1 ], - [ 0, 1, 0, 1, 1, 0 ], [ 0, 1, 0, 0, 1, 1 ], [ 0, 0, 1, 1, 1, 0 ], -[ 0, 0, 1, 1, 0, 1 ] ] -gap> H:= Polytope( A ); - -gap> IsVeryAmple( H ); -true -gap> IsNormalPolytope( H ); -false -gap> H; - -gap> l:= [ [ 0, 0, 1 ], [ 0, 0, 0 ], [ 1, 0, 0 ], [ 1, 0, 1 ], [ 0, 1, 0 ], -> [ 0, 1, 1 ], [ 1, 1, 4 ], [ 1, 1, 5 ] ];; -gap> P:= Polytope( l ); - -gap> IsNormalPolytope( P ); -false -gap> lattic_points:= LatticePoints( P ); -[ [ 0, 0, 0 ], [ 0, 0, 1 ], [ 0, 1, 0 ], [ 0, 1, 1 ], [ 1, 0, 0 ], [ 1, 0, 1 ], -[ 1, 1, 4 ], [ 1, 1, 5 ] ] -gap> u:= Cartesian( lattic_points, lattic_points );; -gap> k:= Set( List( u, u-> u[1]+u[2] ) ); -[ [ 0, 0, 0 ], [ 0, 0, 1 ], [ 0, 0, 2 ], [ 0, 1, 0 ], [ 0, 1, 1 ], [ 0, 1, 2 ], -[ 0, 2, 0 ], [ 0, 2, 1 ], [ 0, 2, 2 ], [ 1, 0, 0 ], [ 1, 0, 1 ], [ 1, 0, 2 ], -[ 1, 1, 0 ], [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 1, 4 ], [ 1, 1, 5 ], [ 1, 1, 6 ], -[ 1, 2, 4 ], [ 1, 2, 5 ], [ 1, 2, 6 ], [ 2, 0, 0 ], [ 2, 0, 1 ], [ 2, 0, 2 ], -[ 2, 1, 4 ], [ 2, 1, 5 ], [ 2, 1, 6 ], [ 2, 2, 8 ], [ 2, 2, 9 ], [ 2, 2, 10 ] ] -gap> Q:= 2*P; - -gap> LatticePoints( Q ); -[ [ 0, 0, 0 ], [ 0, 0, 1 ], [ 0, 0, 2 ], [ 0, 1, 0 ], [ 0, 1, 1 ], [ 0, 1, 2 ], -[ 0, 2, 0 ], [ 0, 2, 1 ], [ 0, 2, 2 ], [ 1, 0, 0 ], - [ 1, 0, 1 ], [ 1, 0, 2 ], [ 1, 1, 0 ], [ 1, 1, 1 ], [ 1, 1, 2 ], [ 1, 1, 3 ], -[ 1, 1, 4 ], [ 1, 1, 5 ], [ 1, 1, 6 ], [ 1, 2, 4 ], [ 1, 2, 5 ], [ 1, 2, 6 ], -[ 2, 0, 0 ], [ 2, 0, 1 ], [ 2, 0, 2 ], [ 2, 1, 4 ], - [ 2, 1, 5 ], [ 2, 1, 6 ], [ 2, 2, 8 ], [ 2, 2, 9 ], [ 2, 2, 10 ] ] -gap> P:= Polytope( [ [ 1, 1 ], [ 1, -1 ], [ -1, 1 ], [ -1, -1 ] ] ); - -gap> Q:= PolarPolytope( P ); - -gap> Vertices( Q ); -[ [ -1, 0 ], [ 0, -1 ], [ 0, 1 ], [ 1, 0 ] ] -gap> T := PolarPolytope( Q ); - -gap> Vertices( T ); -[ [ -1, -1 ], [ -1, 1 ], [ 1, -1 ], [ 1, 1 ] ] -gap> P:= Polytope( [ [ 0, 0 ], [ 1, -1], [ -1, 1 ], [ -1, -1 ] ] ); - -gap> # PolarPolytope( P );; - -# -gap> STOP_TEST("nconvex10.tst", 1 ); diff --git a/tst/nconvex11.tst b/tst/nconvex11.tst deleted file mode 100644 index a46ea63..0000000 --- a/tst/nconvex11.tst +++ /dev/null @@ -1,20 +0,0 @@ -# NConvex, single 11 -# -# DO NOT EDIT THIS FILE - EDIT EXAMPLES IN THE SOURCE INSTEAD! -# -# This file has been generated by AutoDoc. It contains examples extracted from -# the package documentation. Each example is preceded by a comment which gives -# the name of a GAPDoc XML file and a line range from which the example were -# taken. Note that the XML file in turn may have been generated by AutoDoc -# from some other input. -# -gap> START_TEST( "nconvex11.tst"); - -# doc/_Chunks.xml:499-504 -gap> P := PolytopeByInequalities( [ [ 0, 0, 1 ], [ 1, -1, -1 ], [ 1, 1, -1 ] ] ); - -gap> Vertices( P ); -[ [ -1, 0 ], [ 0, 1 ], [ 1, 0 ] ] - -# -gap> STOP_TEST("nconvex11.tst", 1 ); diff --git a/tst/testall.g b/tst/testall.g index 08a8e01..a9ce3d1 100644 --- a/tst/testall.g +++ b/tst/testall.g @@ -4,14 +4,40 @@ # This file runs package tests. It is also referenced in the package # metadata in PackageInfo.g. # -LoadPackage( "NConvex" ); -dirs := DirectoriesPackageLibrary( "NConvex", "tst" ); # Until the issue https://github.com/homalg-project/NConvex/issues/5 has been solved -ex := []; +exclude := []; if IsBound( IsPackageLoaded ) and IsPackageLoaded( "majoranaalgebras" ) then - ex := [ "nconvex02.tst" ]; + exclude := [ "nconvex02.tst" ]; fi; -TestDirectory( dirs, rec( exitGAP := true, testOptions:= rec(compareFunction:="uptowhitespace" ), exclude := ex ) ); -FORCE_QUIT_GAP(1); +options := rec( + exitGAP := true, + exclude := exclude, + testOptions := rec( + compareFunction := "uptowhitespace", + ), +); + +# reverse RecNames 50% of the time to detect code relying on the order of RecNames +if Random( RandomSource( IsMersenneTwister, NanosecondsSinceEpoch( ) ), [ false, true ] ) then + + Display( "Executing with reversed RecNames" ); + + MakeReadWriteGlobal( "RecNames" ); + + old_RecNames := RecNames; + + RecNames := record -> Reversed( old_RecNames( record ) ); + + MakeReadOnlyGlobal( "RecNames" ); + +else + + Display( "Executing with non-reversed RecNames" ); + +fi; + +TestDirectory( DirectoriesPackageLibrary( "NConvex", "tst" ), options ); + +FORCE_QUIT_GAP( 1 ); # if we ever get here, there was an error