--- Begin Message ---
Package: release.debian.org
Control: affects -1 + src:normaliz
X-Debbugs-Cc: normaliz@packages.debian.org
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: dtorrance@piedmont.edu
Severity: normal
Please unblock package normaliz
[ Reason ]
Currently, normaliz is not entering testing due to failed autopkgtests from the package for its Python interface, pynormaliz. These tests are failing since the version of pynormaliz in testing (2.21) does not support the latest version of normaliz (3.10.5). However, the version of pynormaliz in sid (2.22) does support normaliz 3.10, but it's blocked from entering testing by normaliz. We're stuck in a circular dependency.
[ Impact ]
In addition to pynormaliz, macaulay2 is also blocked from entering testing since it depends on normaliz.
[ Tests ]
Both normaliz and pynormaliz include a test suite during build and for continuous integration via autopkgtest. These tests have been successful in sid:
https://ci.debian.net/packages/n/normaliz/
https://ci.debian.net/packages/p/pynormaliz/
(Note there are some pynormaliz failures involving experimental, but they appear to be related to the Python 3.14 transition and not normaliz.)
[ Risks ]
None known
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
[ Other info ]
Thank you!
unblock normaliz/3.10.5+ds-3
diff -Nru normaliz-3.10.4+ds/CHANGELOG normaliz-3.10.5+ds/CHANGELOG
--- normaliz-3.10.4+ds/CHANGELOG 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/CHANGELOG 2025-06-03 11:09:57.000000000 -0400
@@ -1,5 +1,12 @@
# ChangeLog
+## 3.10.5] 2025-06-05
+
+-- bugfix in minimization of Markov bases with degree bound
+-- ExploitAutomsVectors activated
+-- NoQuasiPolynomial and OnlyCyclotomicHilbSer introduced
+-- better options for Hilbert series of monoids and symmetrization
+-- induction matrices for noncommutative fusion rings of rank <= 8
## [3.10.4] 2024-10-13
diff -Nru normaliz-3.10.4+ds/configure.ac normaliz-3.10.5+ds/configure.ac
--- normaliz-3.10.4+ds/configure.ac 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/configure.ac 2025-06-03 11:09:57.000000000 -0400
@@ -8,7 +8,7 @@
dnl
m4_define([normaliz_major_version], [3])
m4_define([normaliz_minor_version], [10])
-m4_define([normaliz_patch_version], [4])
+m4_define([normaliz_patch_version], [5])
m4_define([normaliz_version],
[normaliz_major_version.normaliz_minor_version.normaliz_patch_version])
diff -Nru normaliz-3.10.4+ds/debian/changelog normaliz-3.10.5+ds/debian/changelog
--- normaliz-3.10.4+ds/debian/changelog 2024-10-07 14:20:13.000000000 -0400
+++ normaliz-3.10.5+ds/debian/changelog 2025-08-15 11:09:25.000000000 -0400
@@ -1,3 +1,34 @@
+normaliz (3.10.5+ds-3) unstable; urgency=medium
+
+ * Upload to unstable now that trixie has been released (no changes).
+
+ -- Doug Torrance <dtorrance@debian.org> Fri, 15 Aug 2025 11:09:25 -0400
+
+normaliz (3.10.5+ds-2) experimental; urgency=medium
+
+ * Upload to experimental due to trixie freeze.
+ * debian/copyright
+ - Update upstream copyright dates and holders.
+ * debian/patches/lll-markov-bases.patch
+ - New patch; add proper fix for failing test on i386.
+ * debian/patches/skip-failing-tests.patch
+ - Remove patch; no longer necessary
+
+ -- Doug Torrance <dtorrance@debian.org> Thu, 05 Jun 2025 14:46:46 -0400
+
+normaliz (3.10.5+ds-1) experimental; urgency=medium
+
+ * New upstream release.
+ * Upload to experimental due to trixie freeze.
+ * debian/control
+ - Bump Standards-Version to 4.7.2.
+ * debian/copyright
+ - Update my copyright years.
+ * debian/patches/skip-failing-tests.patch
+ - Stop skipping most tests; issues fixed.
+
+ -- Doug Torrance <dtorrance@debian.org> Wed, 04 Jun 2025 10:28:43 -0400
+
normaliz (3.10.4+ds-1) unstable; urgency=medium
* New upstream release.
diff -Nru normaliz-3.10.4+ds/debian/control normaliz-3.10.5+ds/debian/control
--- normaliz-3.10.4+ds/debian/control 2024-10-07 14:19:36.000000000 -0400
+++ normaliz-3.10.5+ds/debian/control 2025-06-04 07:30:42.000000000 -0400
@@ -16,7 +16,7 @@
Build-Depends-Indep:
texlive-latex-base, texlive-latex-recommended, texlive-latex-extra, texlive-pictures,
texlive-fonts-recommended, texlive-fonts-extra
-Standards-Version: 4.7.0
+Standards-Version: 4.7.2
Homepage: https://www.normaliz.uni-osnabrueck.de/
Vcs-Git: https://salsa.debian.org/math-team/normaliz.git
Vcs-Browser: https://salsa.debian.org/math-team/normaliz
diff -Nru normaliz-3.10.4+ds/debian/copyright normaliz-3.10.5+ds/debian/copyright
--- normaliz-3.10.4+ds/debian/copyright 2024-10-07 14:19:36.000000000 -0400
+++ normaliz-3.10.5+ds/debian/copyright 2025-06-05 11:23:03.000000000 -0400
@@ -27,17 +27,16 @@
Files: *
Copyright:
- 1997-2022 the normaliz team <normaliz@uos.de>
- Winfried Bruns
- Bogdan Ichim
- Tim Romer
- Christof Soeger
+ 2007-2025 Winfried Bruns
+ 2007-2025 Bogdan Ichim
+ 2007-2025 Christof Soeger
+ 2007-2025 Ulrich von der Ohe
License: GPL-3+
Files: debian/*
Copyright:
2015-2022 Jerome Benoit <calculus@rezozer.net>
- 2023-2024 Doug Torrance <dtorrance@debian.org>
+ 2023-2025 Doug Torrance <dtorrance@debian.org>
License: GPL-3+
License: GPL-3+
diff -Nru normaliz-3.10.4+ds/debian/patches/lll-markov-bases.patch normaliz-3.10.5+ds/debian/patches/lll-markov-bases.patch
--- normaliz-3.10.4+ds/debian/patches/lll-markov-bases.patch 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/debian/patches/lll-markov-bases.patch 2025-06-05 11:13:30.000000000 -0400
@@ -0,0 +1,221 @@
+Description: Less LLL in Markov bases if asked for
+Author: Winfried Bruns <wbruns@uos.de>
+Origin: https://github.com/Normaliz/Normaliz/commit/4610415
+Bug: https://github.com/Normaliz/Normaliz/issues/407
+Last-Update: 2025-06-05
+
+--- a/source/libnormaliz/cone.cpp
++++ b/source/libnormaliz/cone.cpp
+@@ -4928,7 +4928,7 @@
+ throw BadInputException("Binomial relations for cones only allowed if cone is pointed");
+ Matrix<long long> HB_LL;
+ convert(HB_LL, HilbertBasis);
+- Matrix<long long> LatticeId = HB_LL.transpose().kernel();
++ Matrix<long long> LatticeId = HB_LL.transpose().kernel(!ToCompute.test(ConeProperty::NoLLL));
+ vector<long long> ValuesGrading;
+ if(isComputed(ConeProperty::Grading) && Grading.size() > 0){
+ ValuesGrading.resize(HB_LL.nr_of_rows());
+--- a/test/test-mrk/latt_ideal.mrk.ref
++++ b/test/test-mrk/latt_ideal.mrk.ref
+@@ -1,5 +1,5 @@
+ 3
+ 5
+--1 0 1 1 -1
++1 0 -1 -1 1
+ -1 1 1 -1 0
+ 0 1 0 -2 1
+--- a/test/test-mrk/polytope.mrk.ref
++++ b/test/test-mrk/polytope.mrk.ref
+@@ -1,109 +1,109 @@
+ -107
+ 19
+-3 5 -1 16 2 18 -1
+ 3 6 -1 10 2 12 -1
+-4 6 -1 10 1 16 1 17 -1
+-4 9 -1 16 1 17 1 18 -1
++4 6 1 10 -1 16 -1 17 1
++3 5 1 16 -2 18 1
+ 4 5 -1 10 1 12 1 13 -1
+-4 10 -1 12 1 16 1 17 -1
+-3 11 -1 17 2 18 -1
+-5 6 -1 12 -1 16 1 18 -1 19 1
+-3 9 -1 12 2 13 -1
+-4 12 1 13 -1 15 -1 17 1
++4 10 1 12 -1 16 -1 17 1
++4 9 1 16 -1 17 -1 18 1
+ 5 6 -1 10 1 13 -1 16 -1 19 1
+-5 5 -1 13 -1 17 1 18 -1 19 1
+-5 6 -1 12 1 13 -1 17 -1 19 1
++3 9 -1 12 2 13 -1
++3 11 1 17 -2 18 1
++5 6 1 12 1 16 -1 18 1 19 -1
++4 12 -1 13 1 15 1 17 -1
++4 13 -1 16 -2 17 1 19 1
++5 10 -1 12 1 13 -1 16 -1 19 1
+ 5 6 -1 10 -1 13 -1 18 -1 19 2
+ 4 5 -1 6 1 9 1 10 -1
+-4 5 1 6 -1 15 -1 16 1
+-4 5 -1 6 1 11 1 12 -1
++4 5 -1 6 1 15 1 16 -1
+ 4 5 -1 9 1 10 1 12 -1
+-4 5 1 10 -1 15 -1 17 1
+-4 9 1 10 -1 15 -1 16 1
++4 5 -1 6 1 11 1 12 -1
++4 5 1 9 -1 16 -1 17 1
+ 4 4 1 15 -1 16 -1 18 1
+-5 5 -1 6 1 10 1 17 1 19 -1
+-4 9 1 10 -1 11 -1 12 1
+-4 9 1 12 -1 15 -1 17 1
+-4 4 1 10 -1 11 -1 13 1
+-4 11 1 12 -1 15 -1 16 1
++4 9 -1 10 1 15 1 16 -1
++4 4 -1 10 1 11 1 13 -1
++4 4 -1 9 1 12 1 13 -1
++5 5 1 6 -1 12 -1 16 -1 19 1
++4 9 1 11 -1 16 -1 17 1
+ 4 8 1 15 -1 17 -1 18 1
++4 11 -1 12 1 15 1 16 -1
++5 5 -1 9 1 13 -1 16 -1 19 1
+ 4 8 -1 11 1 12 1 13 -1
+-5 6 -1 9 1 13 -1 15 -1 19 1
+-5 5 1 12 1 15 -1 18 1 19 -1
++4 12 -1 15 1 16 -2 19 1
+ 4 11 -1 13 1 14 1 17 -1
+-3 4 1 5 -2 6 1
+-5 10 -1 11 1 13 -1 15 -1 19 1
+-4 5 1 6 -1 8 -1 9 1
+-4 4 1 6 -1 8 -1 10 1
+-4 4 1 5 -1 15 -1 16 1
+-4 5 -1 6 1 14 1 15 -1
+-4 5 1 8 -1 10 -1 11 1
+-3 8 -1 9 2 10 -1
+-4 4 1 8 -1 10 -1 12 1
+-4 4 1 9 -1 15 -1 17 1
+-4 8 1 9 -1 15 -1 16 1
+-3 3 1 15 -2 18 1
+-4 9 -1 10 1 14 1 15 -1
+-3 14 1 15 -2 16 1
+-4 8 -1 9 1 11 1 12 -1
+-4 8 1 11 -1 15 -1 17 1
+-4 3 1 8 -1 12 -1 13 1
+-5 4 1 6 -1 12 -1 15 -1 19 1
+-4 7 -1 14 1 17 1 18 -1
+-4 11 -1 12 1 14 1 15 -1
+-3 7 1 11 -2 13 1
+-5 5 -1 8 1 13 -1 15 -1 19 1
+-5 10 -1 14 1 15 -1 17 -1 19 1
+-4 3 1 4 -1 5 -1 6 1
+-4 5 -1 6 1 7 1 8 -1
+-4 4 1 5 -1 8 -1 9 1
+-4 3 1 5 -1 8 -1 10 1
+-4 3 1 4 -1 15 -1 16 1
+-4 4 -1 5 1 14 1 15 -1
+-4 4 1 8 -1 9 -1 11 1
+-4 7 1 8 -1 9 -1 10 1
+-4 3 1 8 -1 9 -1 12 1
+-4 3 1 8 -1 15 -1 17 1
+-4 7 1 8 -1 15 -1 16 1
++5 9 -1 11 1 13 -1 16 -1 19 1
++3 4 -1 5 2 6 -1
++4 4 -1 6 1 8 1 10 -1
++4 4 -1 5 1 9 1 10 -1
++4 4 -1 5 1 15 1 16 -1
++4 4 -1 6 1 14 1 16 -1
++3 14 -1 15 2 16 -1
++4 3 1 14 -1 16 -1 18 1
++3 4 -1 9 2 12 -1
++4 4 -1 8 1 10 1 12 -1
++4 4 -1 5 1 11 1 12 -1
++4 4 1 8 -1 16 -1 17 1
++4 8 -1 9 1 15 1 16 -1
++4 8 -1 10 1 14 1 16 -1
++4 7 1 14 -1 17 -1 18 1
++4 3 -1 9 1 11 1 13 -1
++4 3 -1 8 1 12 1 13 -1
++5 4 1 5 -1 12 -1 16 -1 19 1
++4 8 -1 11 1 15 1 17 -1
++4 8 -1 12 1 14 1 17 -1
++5 4 -1 8 1 13 -1 16 -1 19 1
++3 7 -1 11 2 13 -1
++4 11 -1 14 1 16 -2 19 1
++4 3 -1 4 1 5 1 6 -1
++4 3 -1 6 1 7 1 10 -1
++4 3 -1 5 1 8 1 10 -1
++4 3 -1 4 1 9 1 10 -1
++4 3 -1 4 1 15 1 16 -1
++4 3 -1 5 1 14 1 16 -1
++4 3 -1 8 1 9 1 12 -1
++4 3 -1 7 1 10 1 12 -1
++4 3 -1 4 1 11 1 12 -1
++4 3 1 7 -1 16 -1 17 1
++4 7 -1 8 1 15 1 16 -1
+ 4 2 -1 14 1 15 1 18 -1
+-4 8 -1 9 1 14 1 15 -1
+-4 7 1 11 -1 14 -1 17 1
++4 7 -1 9 1 14 1 16 -1
+ 4 2 -1 8 1 11 1 13 -1
+ 4 2 -1 7 1 12 1 13 -1
+-5 3 1 5 -1 12 -1 15 -1 19 1
+-5 7 1 10 -1 11 -1 15 -1 19 1
+-4 2 -1 3 1 5 1 6 -1
++5 3 1 4 -1 12 -1 16 -1 19 1
++4 7 -1 11 1 14 1 17 -1
++5 3 -1 7 1 13 -1 16 -1 19 1
+ 3 2 -1 4 2 6 -1
+-4 2 -1 3 1 15 1 16 -1
++4 2 -1 3 1 5 1 6 -1
+ 4 2 -1 5 1 7 1 10 -1
+-4 2 -1 3 1 9 1 10 -1
+ 4 2 -1 4 1 8 1 10 -1
++4 2 -1 3 1 9 1 10 -1
++4 2 -1 3 1 15 1 16 -1
+ 4 2 -1 4 1 14 1 16 -1
+-4 2 -1 7 1 15 1 17 -1
+ 3 2 -1 8 2 12 -1
+-4 2 -1 3 1 11 1 12 -1
+ 4 2 -1 7 1 9 1 12 -1
++4 2 -1 3 1 11 1 12 -1
++4 2 -1 7 1 15 1 17 -1
+ 4 2 -1 8 1 14 1 17 -1
+ 3 1 -1 14 2 18 -1
+-5 2 -1 8 1 10 1 15 1 19 -1
+ 4 1 -1 7 1 11 1 13 -1
+-4 1 1 2 -1 5 -1 6 1
+-4 2 -1 3 1 4 1 5 -1
+-4 2 -1 3 1 8 1 9 -1
+-4 2 -1 4 1 7 1 9 -1
+-4 1 1 2 -1 9 -1 10 1
+-4 1 1 2 -1 15 -1 16 1
+-4 2 -1 3 1 14 1 15 -1
+-4 2 -1 7 1 8 1 11 -1
+-4 1 1 2 -1 11 -1 12 1
++5 2 1 3 -1 12 -1 16 -1 19 1
++4 1 -1 3 1 4 1 6 -1
++4 1 -1 2 1 5 1 6 -1
++4 1 -1 4 1 7 1 10 -1
++4 1 -1 3 1 8 1 10 -1
++4 1 -1 2 1 9 1 10 -1
++4 1 -1 2 1 15 1 16 -1
++4 1 -1 3 1 14 1 16 -1
++4 1 -1 7 1 8 1 12 -1
++4 1 -1 2 1 11 1 12 -1
+ 4 1 -1 7 1 14 1 17 -1
+-5 1 1 2 -1 10 -1 17 -1 19 1
+-4 1 1 2 -1 4 -1 5 1
+-3 2 -1 3 2 4 -1
+-4 1 1 2 -1 14 -1 15 1
+-4 2 -1 3 1 7 1 8 -1
+-4 1 1 2 -1 8 -1 9 1
++5 1 1 2 -1 12 -1 16 -1 19 1
++3 1 -1 3 2 5 -1
++4 1 -1 2 1 4 1 5 -1
++4 1 -1 3 1 7 1 9 -1
++4 1 -1 2 1 8 1 9 -1
++4 1 -1 2 1 14 1 15 -1
+ 3 1 -1 7 2 11 -1
+-4 1 1 2 -1 3 -1 4 1
+-4 1 1 2 -1 7 -1 8 1
+-3 1 1 2 -2 3 1
++4 1 -1 2 1 3 1 4 -1
++4 1 -1 2 1 7 1 8 -1
++3 1 -1 2 2 3 -1
diff -Nru normaliz-3.10.4+ds/debian/patches/series normaliz-3.10.5+ds/debian/patches/series
--- normaliz-3.10.4+ds/debian/patches/series 2024-10-07 14:19:36.000000000 -0400
+++ normaliz-3.10.5+ds/debian/patches/series 2025-06-05 11:11:14.000000000 -0400
@@ -1,3 +1,3 @@
debianization.patch
-skip-failing-tests.patch
ax-check-library.patch
+lll-markov-bases.patch
diff -Nru normaliz-3.10.4+ds/debian/patches/skip-failing-tests.patch normaliz-3.10.5+ds/debian/patches/skip-failing-tests.patch
--- normaliz-3.10.4+ds/debian/patches/skip-failing-tests.patch 2024-10-07 14:19:36.000000000 -0400
+++ normaliz-3.10.5+ds/debian/patches/skip-failing-tests.patch 1969-12-31 19:00:00.000000000 -0500
@@ -1,35 +0,0 @@
-Description: Skip tests that fail on some architectures.
-Author: Doug Torrance <dtorrance@debian.org>
-Bug: https://github.com/Normaliz/Normaliz/issues/407
-Forwarded: not-needed
-Last-Update: 2024-10-07
-
---- a/test/Makefile.classic
-+++ b/test/Makefile.classic
-@@ -94,7 +94,7 @@
- testp: $(TEST_FILES_P)
- testq: $(TEST_FILES_Q)
- test1: $(TEST_FILES_1)
--testdefault: $(TEST_FILES_DEFAULT)
-+testdefault: $(filter-out test-/ChF_8_1024.diff test-/ChF_8_1024Nr.diff test-/lowrankPF.diff test-/smallPF.diff test-/ThierryPF.diff, $(TEST_FILES_DEFAULT))
- testd: $(TEST_FILES_D)
- testd1: $(TEST_FILES_D1)
- testdnn: $(TEST_FILES_DN)
-@@ -103,7 +103,7 @@
- testInt: $(TEST_FILES_INT)
- testnf: $(TEST_FILES_NF)
- testdegQ: $(TEST_FILES_DEGQ)
--testSpecial: $(TEST_FILES_SPECIAL)
-+testSpecial: $(filter-out test-Special/5x5PF.diff, $(TEST_FILES_SPECIAL))
- testLARGE: $(TEST_FILES_LARGE)
- testfus: $(TEST_FILES_FUS)
-
-@@ -121,7 +121,7 @@
- testInc: $(TEST_FILES_INC) $(TEST_FILES_INC_INC)
- testgen: $(TEST_FILES_GEN) $(TEST_FILES_GEN_GEN)
- testcst: $(TEST_FILES_CST) $(TEST_FILES_CST_CST)
--testmrk: $(TEST_FILES_MRK) $(TEST_FILES_MRK_MRK)
-+testmrk: $(filter-out test-mrk/Kwak10-mrk.mrk.diff test-mrk/polytope.mrk.diff, $(TEST_FILES_MRK) $(TEST_FILES_MRK_MRK))
- testgrb: $(TEST_FILES_GRB) $(TEST_FILES_GRB_GRB)
- testind: $(TEST_FILES_IND) $(TEST_FILES_IND_IND)
-
diff -Nru normaliz-3.10.4+ds/doc/Advanced.tex normaliz-3.10.5+ds/doc/Advanced.tex
--- normaliz-3.10.4+ds/doc/Advanced.tex 2024-05-29 11:04:11.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Advanced.tex 2025-06-03 11:09:57.000000000 -0400
@@ -99,7 +99,7 @@
The files \verb|ChF*.in| and \verb|VdM*.in| are taken from the paper ``On the orthogonality of the Chebyshev-Frolov lattice and applications'' by Ch.~Kacwin, J.~Oettershagen and T.~Ullrich (Monatsh.\ Math.\ 184 (2017), 425--441). The file \verb|VdM_16_1048576.in| is based on the linear map given directly by the Vandermonde matrix. A major point of the paper is a coordinate transformation that simplifies computations significantly, and the files \verb|ChF*.in| are based on it.
-The files \verb|pet.in| and \verb|baby.in| have been created in connection with the work on fusion rings. See \cite{ABPP}.
+The files \verb|pet.in| and \verb|baby.in| have been created in connection with the work on fusion rings. See Appendix \ref{fusion_rings} and \cite{ABPP}.
\subsubsection{Project-and-lift}\label{project}
@@ -256,11 +256,17 @@
\end{itemize}
It contains a sequence of numbers: the first is the number \verb|<n>| of patches that follow, and then the first \verb|<n>| patches are inserted in this order. The remaining ones are inserted linearly.
-In very rare cases it could be useful to use
+The system of polynomial equations or inequalities can be highly overdetermined. For example, this true for the associativity conditions of fusion rings (see Appendix \ref{fusion_rings}). In very rare cases it could be useful to use
\begin{itemize}
\itemtt[MinimizePolyEquations]
+\end{itemize}
+A run oof \verb*|pet_new.in| generates $240$ equations, but \verb*|MinimizePolyEquations| reduces them to $50$. Nevertheless, Using \verb*|MinimizePolyEquations| is usually not a good idea since the formal minimization takes much more time than a run without it. The minimization can take very long. It is only applicable if the polynomials have degree $\le 2$.
+
+ Normaliz uses \emph{heuristic minimization} by counting how often a vector that has passed all preceding equations (or inequalities) is not a solution of the equation (or inequality). If an equation has ``never'' failed after a certain number $n$ of vectors passing it, it is declared ineffective and skipped latter on. However, a vector is only declared a final solution after checking all equations on it. So there is no danger of false results. But if an equation gets discarded prematurely, the computation time can explode. As a prevention, Normaliz offers the option
+\begin{itemize}
+ \itemtt[NoHeuristicMinimization, -{-NHM}]
\end{itemize}
-The minimization can take very long. It is only applicable if the polynomials have degree $\le 2$.
+Unfortunately, this option often doubles the computation time.
These options must be used with care and may require experimentation. For a first encounter you can try them on the three examples mentioned above.
@@ -1121,7 +1127,7 @@
Note: integrals can be computed by signed decomposition, and Normaliz chooses this variant if it seems better. Nevertheless you can control it by \ttt{SignedDec} and \ttt{NoSignedDec}. Fixed precision set by \verb|decimal_digits| is used for integrals as well.
-\subsection{Expansion of the Hilbert or weighted Ehrhart series}\label{expansion}
+\subsection{Various options for Hilbert or weighted Ehrhart series and quasipolyn0omials}\label{expansion}
Normaliz can compute the expansion of the Hilbert function or the weighted Ehrhart function up to a given degree. To this end its expands the series. For the Hilbert function there is a second possibility by lattice point computation.
@@ -1228,7 +1234,21 @@
NoPeriodBound
\end{Verbatim}
+\subsubsection{Suppressing the quasi polynomial}
+
+In Section \ref{highest_coeff} we have already described an option that can be used to tame the potentially very large output of the Hilbert or Ehrhart quasipolynomial. Amore radical choice is the variant
+\begin{itemize}
+ \itemtt[NoQuasiPolynomial]
+\end{itemize}
+It does what it says. This option may be especially useful for file based interface since it avoids potentially very large inv files (see Section \ref{opt_hom_case} )whose reading can take long.
+\subsubsection{The series only with the cyclotomic denominator}
+
+Even the numerator polynomial of the Hilbert or Ehrhart series can be very long in a non-standard graded situation. The most economic presentation of the series with coprime numerator and denominator is the choice of the denominator by cyclotomic polynomials. By
+\begin{itemize}
+ \itemtt[OnlyCyclotomicHilbSer]
+\end{itemize}
+one restricts the output in the out and the inv file to this presentation. It includes \ttt{NoQuasiPolynomial} and excludes expansion.
\subsection{Explicit dehomogenization}\label{dehom_ex}
Inhomogeneous input for data in $\RR^{d}$ is homogenized by an extra $(d+1)$-th coordinate. The dehomogenization sets the last coordinate equal to $1$. Other systems may prefer the first coordinate. By choosing an explicit dehomogenization Normaliz can be adapted to such input. The file \verb|dehomogenization.in|
@@ -3010,6 +3030,31 @@
Try \verb|InputAutomorphism| and \verb|AmbientAutomorphism| for the same input.
+\subsubsection{Exploiting automorphisms for Hilbert bases and lattice points}
+
+Let $C$ be a cone and suppose $p\in C$ is a fixed point under the action of the integral automorphism group of $C$ (with respect to the underlying lattice). Then $C$ decomposes into pyramids $P$ with apex in $p$ and bases given by the facets of $C$. For the Hilbert basis it is enough to compute the Hilbert basis of only one pyramid $P$ in the orbit of $P$ under $\Aut C$, and then extend the result by the action of $\Aut C$ on the Hilbert basis elements of $P$. Since the intersections of the pyramids contain not only the origin, we cannot expect to get disjoints sets of Hilbert basis candidates, and moreover, the candidates need not be irreducible in $C$. Nevertheless this approach can save much computation time. It is asked for by the combined options
+\begin{itemize}
+ \itemtt[HilbertBasis ExploitAutomsVectors]
+\end{itemize}
+To see the effect, run \ttt{B4.in} in \ttt{example} (provided by Lukas Katthän) as given and without \ttt{ExploitAutomsVectors}.
+
+It is clear that the same approach can be used for degree $1$ points, and one reaches it by
+\begin{itemize}
+ \itemtt[Deg1Elements ExploitAutomsVectors]
+\end{itemize}
+
+It is of course possible to apply the strategy recursively to the pyramids $P$. The recursion depth is set to $1$ by default, but can be extended by
+\begin{itemize}
+ \itemtt[autom\_codim\_bound\_vectors <c>]
+\end{itemize}
+where \verb*|<c>| is the desired recursion depth.
+
+If you want to see the automorphism group in the file \verb|<project>.aut|, you must add the option \verb|Automorphisms|.
+
+It is also clear that the strategy can be applied for volume computation: the intersections of the parymids (with the grading hyperplane) have volume $0$. However, \verb|Descent ExploitIsosMult| uses this idea already. At present we do not offer a variant for the primal algorithm.
+
+Unfortunately there is a catch: a potentially position of the fixed point $p$ over the base of the pyramid. If it has height $> 1$, we cannot get unimodular simplices in the triangulation, and the simplices may indeed have large determinants. \verb|A553.in| is a case for which the use of \verb|ExploitAutomsVectors| is tempting, but not a good idea.
+
\subsection{Precomputed data}\label{precomputed_data}
The input of precomputed data can be useful if their computation takes long and they can be used again in subsequent computations. Normaliz takes their correctness for granted since there is no way of checking it without recomputation. Nevertheless some consistency checks are done.
diff -Nru normaliz-3.10.4+ds/doc/Appendix.tex normaliz-3.10.5+ds/doc/Appendix.tex
--- normaliz-3.10.4+ds/doc/Appendix.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Appendix.tex 2025-06-03 11:09:57.000000000 -0400
@@ -830,7 +830,7 @@
void Cone<Integer>::setExpansionDegree(long degree)
void Cone<Integer>::setNrCoeffQuasiPol(long nr_coeff)
void Cone<Integer>::setFaceCodimBound(long bound)
-void Cone<Integer>::setAutomCodimBoundVectors(long bound) // not yet used
+void Cone<Integer>::setAutomCodimBoundVectors(long bound)
void Cone<Integer>::setDecimalDigits(long digits)
void Cone<Integer>::setBlocksizeHollowTri(long block_size)
void Cone<Integer>::setGBDegreeBound(const long degree_bound)
@@ -838,8 +838,8 @@
void Cone<Integer>::setModularGraing(long mod_gr)
void Cone<Integer>::setChosenFusionRing(long fus_r)
\end{Verbatim}
-There common default value of \verb|degree| is $-1$, signaling no expansion, all coefficients or no codimension bound etc. One can reset the values after a computation. Then they will delete the computation results that depend on them. Modular Gradings are counted from $1$ (as in the input file).
-%However, there is no point in changing the codimension bounds for the exploitation of the automorphism group after the computations to that they refer have been finished.
+There common default value of \verb|degree| is $-1$, signaling no expansion, all coefficients or no codimension bound etc. One can reset the values after a computation. Then they will delete the computation results that depend on them. Modular Gradings are counted from $1$ (as in the input file), as well as chosen fusion rings.
+% However, there is no point in changing the codimension bounds for the exploitation of the automorphism group after the computations to that they refer have been finished.
To set them en bloc you can use
\begin{Verbatim}
@@ -926,9 +926,7 @@
Representations,
SimpleFusionRings,
NonsimpleFusionRings,
-FusionRings,
-FusionData,
-InductionMatrices,
+FusionRings,
END_ENUM_RANGE(LAST_MATRIX),
START_ENUM_RANGE(FIRST_MATRIX_FLOAT),
@@ -946,7 +944,7 @@
CoveringFace,
AxesScaling,
SingleLatticePoint,
-SingeleFusionRing,
+SingleFusionRing,
END_ENUM_RANGE(LAST_VECTOR),
// integer valued
@@ -1045,10 +1043,10 @@
DualFaceLattice,
FVector,
DualFVector,
-FaceLatticeOrbits, // experimental, may change
-DualFaceLatticeOrbits, // experimental, may change
-FVectorOrbits, // experimental, may change
-DualFVectorOrbits, // experimental, may change
+FaceLatticeOrbits,
+DualFaceLatticeOrbits,
+FVectorOrbits,
+DualFVectorOrbits,
Incidence,
DualIncidence,
SingularLocus,
@@ -1059,6 +1057,7 @@
//
ModularGradings,
FusionData,
+InductionMatrices,
END_ENUM_RANGE(LAST_COMPLEX_STRUCTURE),
//
@@ -1084,6 +1083,8 @@
NoNestedTri, // synonym for NoSubdivision
KeepOrder,
HSOP,
+OnlyCyclotomicHilbSer,
+NoQuasiPolynomial,
NoPeriodBound,
NoLLL,
NoRelax,
@@ -1106,6 +1107,7 @@
LinearOrderPatches,
CongOrderPatches,
MinimizePolyEquations,
+UseModularGrading,
//
Dynamic,
Static,
@@ -1116,6 +1118,9 @@
RevLex,
DegLex,
//
+ShortInt,
+NoHeuristicMinimization,
+//
END_ENUM_RANGE(LAST_PROPERTY),
//
// ONLY FOR INTERNAL CONTROL
@@ -2931,7 +2936,7 @@
NoDescent,\\
NoGradingDenom,
GradingIsPositive,
-ExploitAutomsVectors (not yet implemented),\\
+ExploitAutomsVectors,
ExploitIsosMult,
StrictIsoTypeCheck,
SignedDec,
@@ -3614,11 +3619,7 @@
Note that the single lattice point is not uniquely determined.
There are $300$ lattice points in the polytope.
-The system of degree $2$ polynomial equations resulting from the associativity condition is highly overdetermined. For example, \verb*|pet_new.in| generates $240$ equations, but a run with \verb*|MinimizePolyEquations| reduces them to $50$. Using \verb*|MinimizePolyEquations| is usually not a good idea since the formal minimization takes much more time than a run without it. Normaliz uses \emph{heuristic minimization} by counting how often a vector that has passed all preceding equations is not a solution. If an equation has ``never'' failed after a certain number $n$ of vectors passing it, it is declared ineffective and skipped latter on. The number $n$ depends on the FPdim of the fusion ring. However, a vector is only declared a final solution after checking all equations on it. So there is no danger of false results. But if an equation gets discarded prematurely, the computation time can explode. As a prevention, Normaliz offers the option
-\begin{itemize}
-\itemtt[NoHeuristicMinimization, -{-NHM}]
-\end{itemize}
-Unfortunately, this option often doubles the computation time.
+The user should study Section \ref{patch_order}. It explains several options that control the insertion order of the patches and the heuristic minimization of polynomial equations and inequalities.
\subsection{Standard names and virtual input files}\label{virtual_input}
@@ -3823,7 +3824,7 @@
\subsubsection{Induction to the center}
-Let $R$ be a fusion ring with fusion data $(N_{i,j}^k)$ and basis $\{a_1, \ldots, a_r\}$, where $a_1$ is the unit. For simplicity, we restrict ourselves to integral and commutative $R$. Both these properties are essential for the discussion below.
+Let $R$ be a fusion ring with fusion data $(N_{i,j}^k)$ and basis $\{a_1, \ldots, a_r\}$, where $a_1$ is the unit. For simplicity, we restrict ourselves to integral and commutative $R$. Both these properties are essential for the discussion below. \emph{However, in version 3.10.5 Normaliz can also deal with noncommutative fusion rings of rank $\le 8$.}
Assume that $R$ admits a categorification into a fusion category $\mathcal{C}$ over the complex field. ($\mathcal{C}$ is not necessarily uniquely determined.) Then the Drinfeld center $Z(\mathcal{C})$ of $\mathcal{C}$ is an integral modular fusion category see \cite[Section 9.2]{EGNO} for the mathematics). Let $ZR$ be the Grothendieck ring of $Z(\mathcal{C})$ Let $\{b_1, \ldots, b_n\}$ be the basis of $ZR$, where $n \geq r$. By the properties of the Drinfeld center, $ZR$ is an integral commutative $1/2$-Frobenius fusion ring: this means that $\FPdim(b_i)^2$ divides $\FPdim(ZR)$ in $\ZZ$ ($\FPdim$ was introduced on p.~\pageref{FPdim}).
diff -Nru normaliz-3.10.4+ds/doc/Discrete.tex normaliz-3.10.5+ds/doc/Discrete.tex
--- normaliz-3.10.4+ds/doc/Discrete.tex 2023-03-01 08:21:00.000000000 -0500
+++ normaliz-3.10.5+ds/doc/Discrete.tex 2025-06-03 11:09:57.000000000 -0400
@@ -609,7 +609,11 @@
coefficients $p_{r-i},\dots,p_{r-1}$. The user should prove
this fact or at least verify it by several examples.
-Especially in the case of a simplex the representation of the Hilbert series shown so far may not be the expected one. In fact, there is a representation in which the exponents of $t$ in the denominator are the degrees of the integral extreme generators. So one would expect the denominator to be $(1-t^2)(1-t^3)(1-t^4)$ in our case. The generalization to the nonsimplicial case uses the degrees of a homogeneous system of parameters (see~\cite[p.~200]{BG}). Normaliz can compute such a denominator if the computation goal \verb|HSOP| is set (\verb|rationalHSOP.in|):
+Especially in the case of a simplex the representation of the Hilbert series shown so far may not be the expected one. In fact, there is a representation in which the exponents of $t$ in the denominator are the degrees of the integral extreme generators. So one would expect the denominator to be $(1-t^2)(1-t^3)(1-t^4)$ in our case. The generalization to the nonsimplicial case uses the degrees of a homogeneous system of parameters (see~\cite[p.~200]{BG}). Normaliz can compute such a denominator if the computation goal
+\begin{itemize}
+ \itemtt[HSOP]
+\end{itemize}
+is set (\verb|rationalHSOP.in|):
\begin{Verbatim}
Hilbert series (HSOP):
1 1 1 3 4 3 2
diff -Nru normaliz-3.10.4+ds/doc/Intro.tex normaliz-3.10.5+ds/doc/Intro.tex
--- normaliz-3.10.4+ds/doc/Intro.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Intro.tex 2025-06-03 11:09:57.000000000 -0400
@@ -181,7 +181,17 @@
\item Directive \verb*|no_coord_transf|.
\end{arab}
-Computation goal InductionMatrices for fuasion rings
+In 3.10.5:
+
+\begin{arab}
+
+ \item bugfix in minimization of Markov bases with degree bound.
+ \item \verb*|ExploitAutomsVectors| activated.
+ \item \verb*|NoQuasiPolynomial| and \verb*|OnlyCyclotomicHilbSer| introduced.
+ \item Better transfer of options for Hilbert series of monoids and symmetrization.
+ \item Induction matrices for noncommutative fusion rings of rank $\l 8$.
+
+\end{arab}
See the file \verb|CHANGELOG| in the Normaliz directory for more information on the history of Normaliz.
diff -Nru normaliz-3.10.4+ds/doc/Monoid.tex normaliz-3.10.5+ds/doc/Monoid.tex
--- normaliz-3.10.4+ds/doc/Monoid.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Monoid.tex 2025-06-03 11:09:57.000000000 -0400
@@ -136,7 +136,7 @@
\begin{itemize}
\itemtt[grb] containing the Gröbner basis.
\end{itemize}
-For the Gröbner basis one has to choose a monomial order. The default choice is degree reverse lexicographic'' In our case it yields
+For the Gröbner basis one has to choose a monomial order. The default choice is ``degree reverse lexicographic'' In our case it yields
\begin{Verbatim}
8
6
diff -Nru normaliz-3.10.4+ds/doc/NmzShortRef.tex normaliz-3.10.5+ds/doc/NmzShortRef.tex
--- normaliz-3.10.4+ds/doc/NmzShortRef.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/NmzShortRef.tex 2025-06-03 11:09:57.000000000 -0400
@@ -85,6 +85,8 @@
\DeclareMathOperator{\Cl}{Cl}
\DeclareMathOperator{\para}{par}
+\makeindex
+
\DeclareMathOperator{\totdeg}{totdeg}
@@ -126,7 +128,7 @@
\def\ttt{\texttt}
-\def\version{3.10.3}
+\def\version{3.10.5}
\def\NmzDir{normaliz-\version}
\def\ContLine#1{\hyperref[#1]{\large #1}\\[6pt]}
@@ -135,8 +137,6 @@
\def\SectStart#1{\section{#1}\label{#1}\def\SectHead{#1}}
-\renewcommand{\indexname}{Index\label{Index}}
-
%\def\EndOfPage#1{\bigskip\bigskip\par \hyperref[#1]{#1}\qquad\qquad\hyperref[Top]{Top}\qquad\qquad\hyperref[Index]{Index}\newpage}
\def\TopIndex{\bigskip\bigskip\par \hspace{120pt}\hyperref[Top]{\large Top}\hspace{120pt}\hyperref[Index]{\large Index}\newpage}
@@ -149,11 +149,12 @@
\hyphenation{semi-open}
-\makeindex
\begin{document}
\vspace*{2cm}
+\renewcommand{\indexname}{Index\label{Index}}
+
\label{Top}
\begin{center}
@@ -985,10 +986,12 @@
\itemtt[MinimizePolyEquations] aks for the minimization of the polynomial equations (may take very long).
\bigskip
- \itemtt[BottomDecomposition, -b] tells Normaliz to use bottom decomposition in the primal algorithm.
+ \itemtt[BottomDecomposition, -b] forces the bottom decomposition in the primal algorithm.
\itemtt[NoBottomDec, -o] forbids Normaliz to use it.
+ \itemtt[ExploitAutomsVectors] exploits the automorphism group for computing Hilbert bases or degree 1 points by the primal algorithm.
+
\itemtt[NoSubdivision] forbids the subdivision of large simplices in the primal algorithm.\bigskip
\itemtt[Descent ExploitIsosMult] chooses exploitation of isomorphism types in the descent algorithm for volumes.
@@ -1001,7 +1004,11 @@
\itemtt[HSOP] lets Normaliz compute the degrees in a homogeneous system of parameters and the induced representation of the Hilbert or Ehrhart series series.
- \itemtt[NoPeriodBound] This option removes the period bound that Normaliz sets for the computation of the Hilbert quasipolynomial (presently $10^6$).\bigskip
+ \itemtt[NoPeriodBound] This option removes the period bound that Normaliz sets for the computation of the Hilbert quasipolynomial (presently $10^6$).
+
+ \itemtt[NoQuasiPolynomial] suppresses the computation of the Hilbert or Ehrhart quasipolynimial.
+
+ \itemtt[OnlyCyclotomicHilbSer] restricts the output of the Hilbert or Ehrhart series to the representation with the cyclotomic denominator. \bigskip
\itemtt[NoGradingDenom] forces Normaliz to keep the original grading if it would otherwise divide it by the grading denominator. It is implied by several computation goals for polytopes.
diff -Nru normaliz-3.10.4+ds/doc/Normaliz.tex normaliz-3.10.5+ds/doc/Normaliz.tex
--- normaliz-3.10.4+ds/doc/Normaliz.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Normaliz.tex 2025-06-03 11:09:57.000000000 -0400
@@ -128,7 +128,7 @@
\makeindex
-\def\version{3.10.4}
+\def\version{3.10.5}
\def\NmzDir{normaliz-\version}
\hyphenation{semi-open}
diff -Nru normaliz-3.10.4+ds/doc/OptFiles.tex normaliz-3.10.5+ds/doc/OptFiles.tex
--- normaliz-3.10.4+ds/doc/OptFiles.tex 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/doc/OptFiles.tex 2025-06-03 11:09:57.000000000 -0400
@@ -1,4 +1,4 @@
-\section{Optional output files}\label{optionaloutput}
+\section{Optional output files: the file interface}\label{optionaloutput}
In addition nto the output file with suffix \verb|out| several computation goals write their results into extra files. But these are \emph{not} optional. They are explained together with the pertaining computationn goals, and Section \ref{forced_out} gives an overview.
@@ -20,7 +20,7 @@
As pointed out in Section~\ref{outcontrol}, the optional output files for the integer hull are the same as for the original computation, as far as their content has been computed.
-\subsection{The homogeneous case}
+\subsection{The homogeneous case}\label{opt_hom_case}
The option \ttt{-f} makes Normaliz write the following files:
diff -Nru normaliz-3.10.4+ds/doc/Options.tex normaliz-3.10.5+ds/doc/Options.tex
--- normaliz-3.10.4+ds/doc/Options.tex 2024-04-02 07:57:38.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Options.tex 2025-06-03 11:09:57.000000000 -0400
@@ -94,6 +94,12 @@
The boolean valued computation goal \verb|IsIntegrallyClosed| is also related to the Hilbert basis; see Section~\ref{bool}.
+\begin{itemize}
+ \itemtt[HilbertBasis ExploitAutomsVectors] and
+
+ \itemtt[Deg1Elements ExploitAutomsVectors] exploit the automorphism group of the cone.
+\end{itemize}
+
\subsubsection{Enumerative data}
The computation goals in this section require a grading. They include \verb|SupportHyperplanes|.
@@ -111,7 +117,11 @@
\itemtt[NoPeriodBound] This option removes the period bound that Normaliz sets for the computation of the Hilbert quasipolynomial (presently $10^6$).
+ \itemtt[NoQuasiPolynomial] suppresses the out put of the quasipolynomial.
+
\itemtt[NumberLatticePoints] finds the number of lattice points. They are not stored.
+
+ \itemtt[OnlyCyclotomicHilbSer] restricts the output to the series representation with the cyclotomic denominator. Includes \ttt{NoQuasiPolynomial}.
\end{itemize}
\subsubsection{Combined computation goals}
@@ -275,7 +285,7 @@
\begin{itemize}
\itemtt[IsIntegrallyClosed]: is the original monoid integrally closed? Normaliz stops the Hilbert basis computation as soon as it can decide whether the original monoid contains the Hilbert basis (see Section~\ref{IsIC}). Normaliz tries to find the answer as quickly as possible. This may include the computation of a witness, but not necessarily. If you need a witness, use \verb|WitnessNotIntegrallyClosed, -w|.
- \itemtt[IdsSerreR1] checks the Serre property $(R_1)$ for ffine monoids (automatically satisfied by normal monoids).
+ \itemtt[IsSerreR1] checks the Serre property $(R_1)$ for ffine monoids (automatically satisfied by normal monoids).
\itemtt[IsPointed]: is the efficient cone $\CC$ pointed? This computation goal is sometimes useful to give Normaliz a hint that a nonpointed cone is to be expected. See Section~\ref{IsPointed}.
\end{itemize}
@@ -667,11 +677,11 @@
\subsection{Interruption}\label{interrupt}
-During a computation \verb|normaliz| can be interrupted by pressing Ctrl-C on the keyboard. If this happens, Normaliz will stop the current computation and write the already computed data to the output file(s). By
+During a computation \verb|normaliz| can be interrupted by pressing Ctrl-C on the keyboard. If this happens, Normaliz will stop the current computation. If you want to see the results already computed, ask for
\begin{itemize}
- \itemtt[NoOutputOnInterrupt]
+ \itemtt[OutputOnInterrupt, -{}-OOU]
\end{itemize}
-the output of data can be blocked. Can be set in the input file or on the command line as a long option.
+Can be set in the input file or on the command line as a long option.
If Ctrl-C is pressed during the output phase, Normaliz is stopped immediately.
diff -Nru normaliz-3.10.4+ds/doc/Technical.tex normaliz-3.10.5+ds/doc/Technical.tex
--- normaliz-3.10.4+ds/doc/Technical.tex 2024-05-29 11:04:11.000000000 -0400
+++ normaliz-3.10.5+ds/doc/Technical.tex 2025-06-03 11:09:57.000000000 -0400
@@ -47,9 +47,9 @@
Note:
\begin{enumerate}
- \item The Linux binary \verb|normaliz| and the MS Windows binary \verb|normaliz.exe| are fully static executables.
+\item The Linux binary \verb|normaliz| is a fully static executable.
-\item The Mac~OS and the MS Windows binaries cannot be statically linked in the absolute sense. The MS Windows binary depends only on system DLLs. The Mac OS binary depends only on Mac~OS system libraries and \verb|libomp.dylib| (contained in the zip file) which makes parallelization possible. \emph{This dynamic library must be kept in the same directory as the binary.}
+\item The Mac~OS and the MS Windows binaries cannot be statically linked in the absolute sense. But the MS Windows binary depends only on system DLLs, and he Mac OS binary depends only on Mac~OS system libraries.
\end{enumerate}
@@ -76,19 +76,6 @@
jNormaliz.
\end{itemize}
-\subsection{Source package}
-In order to build Normaliz yourself, navigate to our GitHub repository
-\begin{center}
- \url{https://github.com/Normaliz/Normaliz/releases}.
-\end{center}
-and download the
-source package \ttt{\NmzDir.zip} (also available as \ttt{.tar.gz}) contains the source files, installation scripts, examples, documentation, the test suite and PyNormaliz.
-
-Then unzip the downloaded file in a directory of your choice and expand it. (If you have installed a binary package, choose the same directory.)
-This process will create a directory \ttt{\NmzDir} and several subdirectories in it.
-
-If you build Normaliz yourself, the build process will create further subdirectories \verb|build|, \verb|nmz_opt_lib| and \verb|local| (with the default settings).
-
\subsection{Conda}
The platform independent package manager Conda provides executables for all three operating systems. See
@@ -97,23 +84,7 @@
\end{center}
In addition to the binaries you get the files that are usually installed: header files and libraries.
-\subsection{Cloning the GitHub repository}
-
-Another way to download the Normaliz source is cloning the repository from GitHub by
-\begin{Verbatim}
-git clone https://github.com/Normaliz/Normaliz.git
-\end{Verbatim}
-The Normaliz directory is then called \verb|Normaliz|. You may need
-\begin{Verbatim}
-sudo apt-get install autoconf libtool
-\end{Verbatim}
-if you want to build Normaliz by autotools. To this end change to the Normaliz directory and run
-\begin{Verbatim}
-./bootstrap.sh
-\end{Verbatim}
-After this step you can follow the instruction in the next section.
-Note that he GitHub repository Normaliz/Normaliz does not contain PyNormaliz. You can clone them from the repository Normaliz/PyNormaliz.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COMPILATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Building Normaliz yourself}\label{Compile}
@@ -122,17 +93,9 @@
If you don't want to use the Normaliz install scripts, you can of course take the usual configure-make-make install path. The dependencies of Normaliz on external packages are listed in \verb|INSTALL|.
-\subsection{Prerequisites}
+\subsection{General Prerequisites}
-We require a compiler supporting C++14:
-\begin{itemize}
- \item GNU~g++~5,
- \item clang++~3.4,
- \item Intel~icpc~16.0
-\end{itemize}
-The mentioned compilers are also able to handle OpenMP~3.0, with the exception of clang++, there the first OpenMP support was introduced in~3.7.
-
-For compiling Normaliz the following libraries are needed:
+All up-to-date C++ compilers satisfy the requirements of Normaliz. Independently of any auxiliary package, the following libraries are needed:
\begin{itemize}
\item GMP including the C++ wrapper (libgmpxx and libgmp)
\end{itemize}
@@ -141,6 +104,28 @@
Any optional package that you want to use, must be installed before the compilation of Normaliz, independently of the method used for building Normaliz. The installation scripts mentioned below make and use directories within the Normaliz directory.
+\subsection{Source package}
+In order to build Normaliz yourself, navigate to our GitHub repository
+\begin{center}
+ \url{https://github.com/Normaliz/Normaliz/releases}.
+\end{center}
+and download the
+source package \ttt{\NmzDir.zip} (also available as \ttt{.tar.gz}) contains the source files, installation scripts, examples, documentation, the test suite and PyNormaliz.
+
+Then unzip the downloaded file in a directory of your choice and expand it. (If you have installed a binary package, choose the same directory.)
+This process will create a directory \ttt{\NmzDir} and several subdirectories in it.
+
+If you build Normaliz yourself, the build process will create further subdirectories \verb|build|, \verb|nmz_opt_lib| and \verb|local| (with the default settings).
+
+Another way to download the Normaliz source is cloning the repository from GitHub by
+\begin{Verbatim}
+ git clone https://github.com/Normaliz/Normaliz.git
+\end{Verbatim}
+The Normaliz directory is then called \verb|Normaliz|.
+After this step you can follow the instruction in the next sections. The last release is in the branch \verb*|release|.
+
+Note that he GitHub repository Normaliz/Normaliz does not contain PyNormaliz. You can clone it from the repository Normaliz/PyNormaliz.
+
\subsubsection{Linux}
The standard compiler choice on Linux is \verb|g++|. We do no not recommend \verb|clang++| since its support for OpenMP is not as comprehensive as that of \verb|g++|.
@@ -157,7 +142,7 @@
\url{https://brew.sh/} from where you can also download GMP:
\begin{Verbatim}
-brew install gmp llvm wget boost automake
+brew install autoconf automake libtool gmp llvm libomp boost diffutils
\end{Verbatim}
It may be necessary to replace \verb|install| by \verb|reinstall| since the Xcode compiler may be newer that the one from Homebrew.
@@ -217,7 +202,7 @@
\end{Verbatim}
\verb|NMZ_SHARED| is set automatically on Linux if a compiler from the clang family is used since a statically linked binary cannot be built by them (\verb|libomp.a| is missing).
-On MacOS there is no choice---the binary is dynamically linked. If you want a binary that is as static as possible, download the MacOS binary distribution from GitHub (see Section \ref{binary}). Its production is a bit tricky.
+On MacOS there is no choice---the binary is dynamically linked. If you want a binary that is as static as possible, download the MacOS binary distribution from GitHub (see Section \ref{binary}).
\item The install scripts can be further customized. Have a look at them or at \verb|INSTALL|.
@@ -246,7 +231,7 @@
\begin{Verbatim}
./configure --threadsafe-hack --only-cocoalib
\end{Verbatim}
-\textbf{Make sure that your CoCoALib has been compiled with the option \text{-fPIC}}. If not iz cannot be used in the compilation of a shared library.
+\textbf{Make sure that your CoCoALib has been compiled with the option \text{-fPIC}}. If not it cannot be used in the compilation of a shared library.
\subsubsection{nauty}
diff -Nru normaliz-3.10.4+ds/example/B4.in normaliz-3.10.5+ds/example/B4.in
--- normaliz-3.10.4+ds/example/B4.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/example/B4.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,388 @@
+amb_space 17
+cone_and_lattice 384
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
+0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
+0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
+1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
+0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1
+1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1
+0 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1
+0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1
+0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1
+0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1
+1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1
+1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
+1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1
+0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1
+1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1
+1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1
+0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1
+0 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1
+0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1
+1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1
+1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1
+1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1
+0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1
+1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1
+0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1
+1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1
+1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1
+0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1
+0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1
+0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
+1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1
+1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1
+1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1
+0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1
+1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1
+1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1
+0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
+0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1
+0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1
+1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1
+0 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1
+0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1
+0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1
+1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1
+1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1
+0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1
+0 1 1 0 0 0 1 1 1 1 1 1 1 0 1 1 1
+1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1
+1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1
+0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1
+1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1
+1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1
+1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1
+0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1
+1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1
+0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1
+1 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1
+1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1
+0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1
+1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 1
+1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1
+0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1
+1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1
+0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1
+1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1
+0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1
+1 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1
+1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1
+0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1
+0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1
+0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 1
+0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1
+1 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1
+1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1
+0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1
+1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1
+1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1
+0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1
+0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1
+0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1
+0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1
+1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1
+0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 1 1
+0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1
+0 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1
+1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1
+1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1
+0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1
+0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1
+1 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1
+0 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1
+1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1
+0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1
+1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 1 1
+0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1
+1 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1
+1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1
+1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1
+0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1
+1 0 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1
+1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1
+0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1
+0 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1
+1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1
+0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1
+0 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1
+1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1
+0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1
+1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1
+0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1
+1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1
+0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1
+1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1
+0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 1
+0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1
+1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1
+0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1
+0 0 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1
+0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1
+1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1
+0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1
+1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1
+1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1
+0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1
+0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1
+0 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1
+0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 0 1
+1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1
+0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1
+0 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1
+1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 1
+1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1
+0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1
+1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1
+1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1
+1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1
+1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1
+0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 1 1
+1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1
+1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1
+1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 1
+0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1
+0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1
+1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1
+1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1
+0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1
+0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 1
+0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 1
+0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1
+1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1
+0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1
+0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1
+1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1
+1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1
+0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1
+1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1
+0 1 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1
+1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1
+1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 1
+0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1
+0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 1
+1 0 0 1 0 0 0 1 0 0 1 1 0 1 1 1 1
+1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1
+0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1
+1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1
+0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1
+1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1
+0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 1 1
+0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1
+1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1
+0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1
+0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1
+0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1
+1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1
+1 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 1
+0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1
+1 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1
+1 1 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1
+1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1
+0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1
+0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 1 1
+1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 0 1
+1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1
+0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 1 1
+0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1
+0 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1
+1 0 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1
+0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1
+0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1
+0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1
+0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1
+1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1
+0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1
+0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1
+0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1
+1 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 1
+1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 0 1
+0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1
+1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1
+1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1
+1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 1
+0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1
+0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1
+1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1
+0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1
+1 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1
+0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1
+1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1
+1 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1
+0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1
+1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1
+0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1
+1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1
+0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1
+0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1
+1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1
+0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1
+0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1
+1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1
+1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1
+0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1
+1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1
+0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1
+1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1
+0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1
+0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1
+0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1
+0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1
+0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1
+0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1
+1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1
+0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1
+1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1
+0 1 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1
+0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1
+1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1
+0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 1
+0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1
+1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1
+1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1
+0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1
+0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1
+0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1
+1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1
+1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1
+1 0 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1
+0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1
+1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1
+1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1
+1 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1
+0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1
+0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1
+1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1
+0 1 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1
+0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1
+1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1
+0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 0 1
+1 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1
+1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1
+0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1
+0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1
+1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 1
+0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1
+1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1
+0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1
+0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1
+0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 1
+0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1
+1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1
+0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1
+0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1
+1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1
+0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1
+1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1
+0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1
+0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1
+0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1
+1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1
+0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1
+0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1
+1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1
+1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1
+0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1
+0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1
+0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1
+1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1
+1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1
+0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1
+1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1
+1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1
+1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1
+0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1
+0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1
+1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1
+0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1
+0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1
+0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1
+0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1
+1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1
+1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1
+0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1
+0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1
+0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1
+0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1
+1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1
+0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1
+1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1
+0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1
+0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1
+0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1
+1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1
+1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1
+0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1
+0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1
+1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1
+0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1
+0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1
+0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1
+0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
+0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1
+1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
+0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+HilbertBasis
+ExploitAutomsVectors
diff -Nru normaliz-3.10.4+ds/example/Makefile.am normaliz-3.10.5+ds/example/Makefile.am
--- normaliz-3.10.4+ds/example/Makefile.am 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/example/Makefile.am 2025-06-03 11:09:57.000000000 -0400
@@ -18,6 +18,7 @@
A543.in \
A553.in \
A643.in \
+ B4.in \
baby.in \
both_precomputed.in \
ChineseRemainder.in \
diff -Nru normaliz-3.10.4+ds/INSTALL normaliz-3.10.5+ds/INSTALL
--- normaliz-3.10.4+ds/INSTALL 2024-04-02 07:57:38.000000000 -0400
+++ normaliz-3.10.5+ds/INSTALL 2025-06-03 11:09:57.000000000 -0400
@@ -99,8 +99,8 @@
Basic tests
-----------
-The default goal is all. It runs the tests that do not depend on an optional package. The goal
-total runs the tests in total, including those depending on the optional packages (except testLARGE).
+The default goal is "all". It runs the tests that do not depend on an optional package. The goal
+"total" runs the tests in total, including those depending on the optional packages (except large tests).
The tests depending on the existence of CoCoALib are covered by the goal testInt. Those requiring
nauty are called by testAut and the tests for algebraic polyhedra depend on several goals:
@@ -111,8 +111,6 @@
If diff finds differences, these are recorded in a file with suffix diff and printed to the terminal.
-Thwe goal msys asks for all and testAut.
-
Extended tests
--------------
@@ -206,62 +204,54 @@
**** Compilation for MS Windows ****
************************************
---- The auxiliary packages have not yet been updated ---
-
-UNDER CONSTRUCTION
-
Normaliz can be compiled for MS Windows under MSYS2/MinGW64 with all optional libraries.
-Important restriction: only static build of normaliz.exe and libnormaliz.a possible at this time.
+Important restriction: only static builds of normaliz.exe and libnormaliz.a possible at this time.
+More precisely: normaliz.exe does ponly depend on Windows system DLLs that have fixed
+locations in the Windows system.
To this end you must install MSYS2 including the MinGW64 toolchain. Additionally the
cross-compiler package must be installed if you want to compile the packages written in C.
Add GMP and Boost (for e-antic). Make sure to choose the packages for MinGW64 when
-running pacman
+running pacman.
-Log in under MYS2 MinGW64.
+Always log in under MYS2 MinGW64.
+
+We got the impression that the tools make.exe, diff.exe and cmp.exe of the MSYS version in
+November 2025 do not work as expected. Therefore download MSYS_tools.zip from the Normaliz 3.4.10
+release on GitHub and unzip it in /usr/bin of MSYS2. Chcek that the tools from the zip file are
+called by running "wchich make" etc.
We recommend a separate directory for MSYS builds. Do not use Linux or MacOS
-directories of Normaliz.
+directories of Normaliz. Download the Normaliz source as a tar.gz from GitHub
+and extract it as usual or get in an equivalent way.
+
+Install MPFR by pacman -S after finding the MinGW64 version by pacman -Ss MPFR.
+(The install scrtipt for MPFR doiesn't find libgmp.a -- no idea why.)
+
+Also install Flint by pacman.
+
+Then run
+
+install_scripts/install_nmz_xxx.sh
+
+ with xxx = nauty, cocoa, flint and e-antic
+
+in the Normaliz directory. Finally run
-Download the Normaliz source as a tar.gz from GitHub and extract it as usual or get in an
-equivalent way. (Later on, tinstall_normaliz.sh will copy version.h and nmz_config.h
-into source/libnormaliz.)
-
-WARNING: The installation is extremely delicate in its use of static and shared
-libraries. Therefore do not tamper with PREFIX.
-
-Optional packeges that must be preinstalled:
-1) Download MPFR_for_msys.zip from https://github.com/Normaliz/Normaliz/releases/tag/v3.9.2.
-Unzip and run pacman -U on the zst files.
-2) Install Flint from the MSYS repository via pacman -Ss (for finding the best version) and
-install via pacman -S.
-The next step will additionally install static libraries of MPFR and Flint. They are
-necessary for a normaliz.exe that depends only on system DLLs.
-
-IMPORTANT: Make sure that install_scripts/opt/header_files_for_Makefile.classic contains
-the right version of version.h.
-
-Then we navigate to the Normaliz directory and run ./install_normaliz_with_eantic.sh.
-This will install CoCoA, nauty, hash-library, arb, antic and e-antic, as well as
-static versions of MPFR and Flint. During the installation of e-antic, the files
-libflint.a and libmpfr.la are hidden in the subdirectory hide of local/lib. Should
-the installation of e-antic crash, copy them back manually.
-
-Moreover, the script runs Makefile.classic for making and installing static libnormaliz.a
-and normaliz.exe. (Unfortunately, autotools builds of normaliz.exe do not produce
-a working normaliz.exe.)
-
-Except for CoCoA we use the official releases. For CoCoA we download a pre-release version
-of CoCoALib-0.99710 rom https://github.com/Normaliz/Normaliz/releases/tag/v3.9.2
-that is then patched by the files in install_scripts/cocoa_patches.
-(configure has been modified by adding -fpermissive and -Wconversion to CXXFLAGS.)
-
-Note: if you don't have (or want) all optional packages, edit source/Makefile.configuration
-to disable the missing/unwanted ones, and edit nmz_config.h accordingly.
+ ./install_normaliz.sh.
-After successful compilation you will find normaliz.exe in source and the Normaliz
-directory. libnormaliz is installed in local.
+Remarks:
-If ecerything has worked out, normaliz.exe depends on Windows system DLLs.
+(1) We install Flint a second time to have a static libflint.a.
+(2) The install script for e-antic hides libflint.a in local/lib by moving it
+to a subdirectory hide. The installation of e-antic uses the preinstalled flint.
+Should it crash, copy libflint.a manually back to local/lib.
+(3) CoCioA usaes a version that has been preserved in the GitHub release 3.9.2 of
+Normaliz. Some of its files will be replaced by modified copies in the subdirectory
+cocoa_patches of install_scripts.
+(4) Similarly we use patches in e-antic_patches.
+(5) Take care that version.h in install_scripts/header_files_for_Makefile.classic is
+up-to-date.
-Tests: do not use STRICT=yes since the 32bit arithmetic creates problems for floating point.
+Tests can be run as usual. Don't mind the errors "devce ... busy". It is best to add -j4 if
+your machine is strong enough. Moreover it makes sense to use the option -k of make.
diff -Nru normaliz-3.10.4+ds/Makefile.am normaliz-3.10.5+ds/Makefile.am
--- normaliz-3.10.4+ds/Makefile.am 2024-10-07 06:02:16.000000000 -0400
+++ normaliz-3.10.5+ds/Makefile.am 2025-06-03 11:09:57.000000000 -0400
@@ -38,7 +38,6 @@
EXTRA_DIST += install_scripts_opt/common.sh
EXTRA_DIST += install_scripts_opt/install_nmz_cocoa.sh
-# EXTRA_DIST += install_scripts_opt/install_nmz_cocoa_old.sh
EXTRA_DIST += install_scripts_opt/install_nmz_flint.sh
EXTRA_DIST += install_scripts_opt/install_nmz_mpfr.sh
EXTRA_DIST += install_scripts_opt/install_nmz_hash-library.sh
@@ -49,11 +48,14 @@
EXTRA_DIST += install_scripts_opt/cocoa_patches/eterms.h
EXTRA_DIST += install_scripts_opt/cocoa_patches/SignalWatcher.C
EXTRA_DIST += install_scripts_opt/cocoa_patches/SignalWatcher.H
+EXTRA_DIST += install_scripts_opt/cocoa_patches/configure
-EXTRA_DIST += install_scripts_opt/e-antic_pataches/nf_elem.h
-EXTRA_DIST += install_scripts_opt/e-antic_pataches/nf_elem_add_fmpq.c
+# EXTRA_DIST += install_scripts_opt/e-antic_patches/nf_elem.h
+EXTRA_DIST += install_scripts_opt/e-antic_patches/nf_elem_add_fmpq.c
+# EXTRA_DIST += install_scripts_opt/e-antic_patches/randtest_irreducible.c
EXTRA_DIST += install_scripts_opt/header_files_for_Makefile.classic/nmz_config.h
+EXTRA_DIST += install_scripts_opt/header_files_for_Makefile.classic/version.h
EXTRA_DIST += source/chunk/run_single.sh
diff -Nru normaliz-3.10.4+ds/Singular/normaliz.lib normaliz-3.10.5+ds/Singular/normaliz.lib
--- normaliz-3.10.4+ds/Singular/normaliz.lib 2023-06-26 04:17:27.000000000 -0400
+++ normaliz-3.10.5+ds/Singular/normaliz.lib 2025-06-03 11:22:09.000000000 -0400
@@ -464,6 +464,41 @@
return(i,p);
}
+static proc getBigInt(string s, int p)
+{
+ string nst;
+ int j,en,sn;
+ bigint i;
+
+ for(;p<=size(s);p++)
+ {
+
+ if(digit(s[p]))
+ {
+ sn=p; break;
+ }
+ }
+ if(not(sn))
+ {
+ return(0,-1); // -1 indicates: no number found
+ }
+ p++;
+ for(;p<=size(s);p++)
+ {
+ if(!digit(s[p]))
+ {
+ en=p-1; break;
+ }
+ }
+ if(p>size(s))
+ {
+ en=size(s);
+ }
+ nst="i="+s[sn,en-sn+1];
+ execute(nst);
+ return(i,p);
+}
+
static proc getRational(string s, int p)
{
@@ -982,6 +1017,7 @@
}
Num_Invs=getNuminvs();
+
int gens_computed = 0;
for( int i = 1; i <= size(Num_Invs); i = i+1){
if(Num_Invs[i][1] == "hilbert_basis_elements"){
@@ -1018,6 +1054,12 @@
The function returns the intmat defined by the file ith suffix gen, provided it has been computed. Otherwise it returns the input_mat.
NOTE: You will find procedures for many applications of Normaliz in this
library, so the explicit call of this procedure may not be necessary.
+
+ The function reads the numerical invariants computed by normaliz. The integers among
+ them are converted to the Singular type int. It may to bee too small for
+ the Hilbert function or the multiplicity, especially if computed for a non-standard grading.
+ To prevent a disaster set the predefined global variable BigNumInvs = 1. Returnung to
+ BigNumInvs = 0 switches this feature off.
SEE ALSO: intclToricRing, normalToricRing, ehrhartRing, intclMonIdeal,
torusInvariants, diagInvariants, finiteDiagInvariants, intersectionValRings,
intersectionValRingIdeals
@@ -1048,8 +1090,10 @@
string s;
list num_invs;
int p,sw,v_length,i,dummy_int;
+ bigint DummyInt;
intvec dummy_vec;
string type_inv,name_inv,dummy_bool;
+ int make_big_int;
link in_f=":r "+ getNmzFile() + "."+"inv";
s=read(in_f);
@@ -1072,23 +1116,46 @@
{
name_inv="h_vector";
}
+ make_big_int = 0;
+ if(name_inv == "hilbert_series_num" || name_inv == "hilbert_series_cyclo_num"){
+ if(BigNumInvs){
+ make_big_int = 1;
+ }
+ }
+ if(defined(DummyMat)==voice){
+ kill(DummyMat);
+ }
+ bigintmat DummyMat[1][v_length];
if(name_inv!="hilbert_polynomial"
&& name_inv!="hilbert_quasipolynomial")
{
for(i=1;i<=v_length;i++)
{
- if(i==1)
+ if(i==1 && !make_big_int)
{
- (dummy_int,p)=getInt(s,p);
- dummy_vec=dummy_int;
+ if(!make_big_int){
+ (dummy_int,p)=getInt(s,p);
+ dummy_vec=dummy_int;
+ }
}
else
{
- (dummy_int,p)=getInt(s,p);
- dummy_vec=dummy_vec,dummy_int;
+ if(!make_big_int){
+ (dummy_int,p)=getInt(s,p);
+ dummy_vec=dummy_vec,dummy_int;
+ }
+ else{
+ (DummyInt,p) = getBigInt(s,p);
+ DummyMat[1,i] = DummyInt;
+ }
}
}
- num_invs=num_invs+list(list(name_inv,dummy_vec,"intvec"));
+ if(!make_big_int){
+ num_invs=num_invs+list(list(name_inv,dummy_vec,"intvec"));
+ }
+ else{
+ num_invs=num_invs+list(list(name_inv,DummyMat,"bigintvec", v_length));
+ }
}
else
{
@@ -1100,8 +1167,14 @@
(sw,p)=nextWord(s,p);
name_inv=s[sw..p-1];
if (name_inv!="hilbert_quasipolynomial_denom") {
- (dummy_int,p)=getInt(s,p);
- num_invs=num_invs+list(list(name_inv,dummy_int,"int"));
+ if(!BigNumInvs || (name_inv != "multiplicity" && name_inv != "multiplicity_num" && name_inv != "multiplicity_denom")){
+ (dummy_int,p)=getInt(s,p);
+ num_invs=num_invs+list(list(name_inv,dummy_int,"int"));
+ }
+ else {
+ (DummyInt,p)=getBigInt(s,p);
+ num_invs=num_invs+list(list(name_inv,dummy_int,"bigint"));
+ }
}
}
if(type_inv=="boolean")
@@ -1122,6 +1195,7 @@
return(num_invs);
}
+
proc showNuminvs()
"USAGE: showNuminvs();
PURPOSE: prints the numerical invariants
@@ -1168,7 +1242,15 @@
for(i=1;i<=size(Num_Invs);i++)
{
dummy=Num_Invs[i];
- s=dummy[3]+" nmz_" + dummy[1] + "=dummy[2]; exportto(Top," + "nmz_" + dummy[1] + ");";
+ if(dummy[3] != "bigintvec"){
+ s=dummy[3]+" nmz_" + dummy[1] + "=dummy[2]; exportto(Top," + "nmz_" + dummy[1] + ");";
+ }
+ else{
+ s = "bigintmat " + "nmz_" + dummy[1] + "[1][";
+ s = s + string(dummy[4]) + "]";
+ s = s + " = dummy[2]; exportto(Top," + "nmz_" + dummy[1] + ");";
+ }
+
execute(s);
}
Exported_Num_Invs = Num_Invs;
@@ -2092,13 +2174,13 @@
// int GenGen=1; export GenGen; // indicates whether "gen" is generated // no longer used
list Num_Invs; export Num_Invs;
list Exported_Num_Invs; export Exported_Num_Invs;
-// running normaliz (with options)
+// options for running normaliz
+//
// component 1 is name of option
// 2 is default value
// 3 is command line option to be passed to Normaliz
-// 4 indicates whether file "gen" is generated
-// value 2 of 4 indicates "no influence"
+// 4 is a potential comment pointing to better use
list nmz_options=
list("supp",0,"-s"),
@@ -2137,4 +2219,7 @@
export nmz_options;
list default_options = nmz_options;
export default_options;
+
+ int BigNumInvs = 0;
+ exportto(Top, BigNumInvs);
}
diff -Nru normaliz-3.10.4+ds/Singular/sagbiNormaliz.lib normaliz-3.10.5+ds/Singular/sagbiNormaliz.lib
--- normaliz-3.10.4+ds/Singular/sagbiNormaliz.lib 2023-06-26 04:17:27.000000000 -0400
+++ normaliz-3.10.5+ds/Singular/sagbiNormaliz.lib 2025-06-03 11:22:45.000000000 -0400
@@ -1,5 +1,5 @@
//// Singular library normaliz.lib
-version="version sagbiNormaliz.lib 4.3.2.0 June 2023 "; // $Id$
+version="version sagbiNormaliz.lib 4.4.0.6 Okt_2024 "; // $Id$
category="Commutative Algebra";
info="
LIBRARY: sagbiNormaliz.lib Provides an interface for the computation of Sagbi bases.
@@ -9,37 +9,145 @@
OVERVIEW:
-The library sagbiNormaliz.lib provides functions for the computations of Sagbi bases. It
-is based on normaliz.lib. Its functions compute Sagbi bases with or without the control by
-Hilbert functions and/orv degrees. Hilbert functions and degrees require that bthe ambient
-polynomial ring is standard gtraded. (An extension to general positive gradinmgs would
-not be difficult.)
+The library sagbiNormaliz.lib provides functions for the computations of Sagbi bases of
+subalgebras A of polynomial rings over a field. It is based on normaliz.lib. Its
+functions compute Sagbi bases with or without the control by Hilbert functions and/or
+degrees. Hilbert functions and degrees require that bthe ambient polynomial ring is
+standard graded. (An extension to general positive gradings would not be difficult.)
-Use of this library requires the program Normaliz to be installed and the
-availability of normaliz.lib. You can download both from
+In addition to the Sagbi bases it can compute a defining ideal for the algebra A with
+respect to the given system of generators. (The computation of defining ideals cannot be
+controlled by Hilbert series.)
+
+See the papers
+
+(1) W.Bruns and A. Conca, Sagbi combinatorics of maximal minors and a Sagbi algorithm.
+J. Symb. Comput. 120 (2024), Article ID 102237, 14 p. (arXiv:2302.14345)
+
+(2) W. Bruns, A. Conca and F.Lembo, Sagbi bases, defining ideals and algebras of minors.
+
+Use of this library requires the program Normaliz, version n 3.10.5 or newer, to be
+installed and the availability of normaliz.lib. You can download both from
@uref{https://github.com/Normaliz/Normaliz/releases}.
Please make sure that the executable is in the search path or use setNmzExecPath (defined
in normaliz.lib).
The computations of this library require reading Normaliz output files and therefore a file name
must be set. The standard file name chosen by the library is NmzSagbiExchange in the current
-directory. The user can overwrite it by setting another name.
+directory. The user can change the name.
-KEYWORDS: Sagbi basis, initial algebra
+KEYWORDS: Sagbi basis, initial algebra, defining ideal.
PROCEDURES:
sagbiGeneral(ideal Q [, int sagbiMaxRounds, int sorting, int verb]) computes the Sagbi basis of the subalgebra of
- the current polynomial ring that is generated by the elements of Q. The computation is stopped after at most sagbiMaxRounds rounds if trhe parameter is set. If sorting is set, the compouted elements are degrevlex sorted before a round of the algorithm.
- The optional parameter verb sets the terminal output. Fefault is 1 = on..
+ the current polynomial ring that is generated by the elements of Q. The computation is stopped after at most sagbiMaxRounds rounds if trhe parameter is set. If sorting is set, the computed elements are degrevlex sorted before a round of the algorithm.
+ The optional parameter verb sets the terminal output. Default is 1 = on..
-sagbiByDegree(ideal Q, int Sagbi_degree_bound,[,int sorting, int verb]) computes the Sagbi basis degree by degree until thwe degree bound is reached or the Sagbi basis has been computed compltely.
+sagbiByDegree(ideal Q, int Sagbi_degree_bound,[,int sorting, int verb]) computes the Sagbi basis degree by degree
+ until thwe degree bound is reached or the Sagbi basis has been computed compltely.
-sagbiHilbControlled(ideal Q, intvec HS_num_algebra, intvec HS_denom_algebra, int Sagbi_degree_bound[, int finalCheck, int sorting, int verb]) computes the Sagbi basis up to the degree bound. The Hilbert series of the subalgebra
+sagbiHilbControlled(ideal Q, intvec HS_num_algebra, intvec HS_denom_algebra, int Sagbi_degree_bound[, int finalCheck, int sorting, int verb])
+ computes the Sagbi basis up to the degree bound. The Hilbert series of the subalgebra
generated by the elements of Q is given by its numerator and denominator as a rational
function. HS_denom_algebra lists the exponents g_i in the factors 1 -t^g_i of the denominator.
- If tehe degree bound is reached and the optional argument inalCheck is set, the Hilbert series
+ If the degree bound is reached and the optional argument inalCheck is set, the Hilbert series
is checked again for completion.
+
+sagbiDefIdealGeneral(ideal Q [, int sagbiMaxRounds, int sorting, int verb]) does the same as sagbiGeneral, but additionally
+ computes as much of a system of generators of the defining idael as it can get before being stopped. Addutionally it returns the list of expressions of the Sagbi elements in terms of the original generators of the aubalgebra, calles the retract.
+
+sagbiDefIdealByDegree(ideal Q, int Sagbi_degree_bound,[,int sorting, int verb]) does the same as sagbiByDegree,
+ but additionally computes the defining ideal up to the degree set by Sagbi_degree_bound.
+ Addutionally it returns the list of expressions of the Sagbi elements in terms of the original generators of the aubalgebra, calles the retract.
+
+
";
+// LIB "general.lib";
+
+
+// ------------------------------------------------
+// Helpers for ideal management
+// -----------------------------------------------
+
+static proc leadcoafIdeal(ideal Q){
+ ideal LC;
+ for(int i = 1; i <= ncols(Q); i++){
+ if(i == 1){
+ LC[1] = leadcoef(Q[1]);
+ }
+ else{
+ LC = LC, leadcoef(Q[i]);
+ }
+ }
+ return(LC);
+}
+
+static proc degIdeal(ideal Q){
+ int p = ncols(Q);
+ intvec D = 1..p; // to give it size p
+ for(int i = 1; i <= p; i++){
+ D[i] = deg(Q[i]); // no GradingDenom: only interested in <0, 0 , >0
+ }
+ return(D);
+}
+
+static proc checkPposDegree(ideal Q){
+ for(int i = 1; i <= ncols(Q); i++){
+ if(deg(Q[i]) <= 0){
+ ERROR("Polynomials in input must have positive degree");
+ }
+ }
+}
+
+
+static proc aapplyLaedIdeal(ideal LC){
+
+ for(int i = 1; i <= ncols(LC); i++){
+ if(LC[i] == 0){
+ @DefIdeal = @DefIdeal, @Retract[i];
+ @Retract[i] = 0;
+ }
+ else{
+ @Retract[i] = @Retract[i]/LC[i];
+ }
+ }
+ @DefIdeal = simplify(@DefIdeal, 3);
+ @Retract = simplify(@Retract, 2);
+}
+
+
+ static proc checkDefIdeal(ideal Q){
+ map h = @S, Q;
+ ideal test_def_Id = h(@DefIdeal);
+ test_def_Id = simplify(test_def_Id,2);
+ if(size(test_def_Id) != 0){
+ ERROR("Defining ideal doesn't map to 0. Inform the authors!");
+ }
+ }
+
+ static proc removeConstants(ideal Q){
+ for(int i = 1; i<=ncols(Q); i++){
+ if(deg(Q[i]) == 0){
+ Q[i] = 0;
+ }
+ }
+ Q = simplify(Q, 2);
+ return(Q);
+ }
+
+ static proc preparePreIm(intvec D, ideal LC){
+
+ for(int i = 1; i <= size(D); i++){
+ if(D[i] <= 0){ // constant
+ @DefIdeal = @DefIdeal, @Retract[i] - LC[i];
+ @Retract[i] = 0;
+ }
+ else{
+ @Retract[i] = @Retract[i]/LC[i];
+ }
+ }
+ @Retract = simplify(@Retract, 2);
+ }
// ------------------------------------------------
// Helpers related to grading
@@ -89,7 +197,7 @@
int endTete_atete = nrows(saveTete_a_tete);
if(startTete_tete > nrows(saveTete_a_tete))
-{
+ {
intmat empty[0][ncols(saveTete_a_tete)];
return (empty, startTete_tete);
}
@@ -153,22 +261,24 @@
return(Prod);
}
-static proc cycloRatFunctionExpansion(intvec num_vec, intvec den_vec, int exp_degree){
-// Computes the expansion of a rational function with numerator represented by num_vec
+static proc cycloRatFunctionExpansion(EnumData HS, int exp_degree){
+// Computes the expansion of a rational function with numerator represented by HS.HilbertSeriesNum
// and denominator a product of terms 1 - t^g_i where zjhe g_i are the entries of den_vec
+
bigintmat E[1][exp_degree + 1];
- int to_copy = size(num_vec);
+ int to_copy = ncols(HS.HilbertSeriesNum);
if(to_copy > exp_degree + 1){
to_copy = exp_degree + 1;
}
int i, j, k;
for(i = 1; i <= to_copy; i++){
- E[1, i] = num_vec[i];
+ E[1, i] = HS.HilbertSeriesNum[1,i];
}
intvec fac;
for(i = 1; i <= exp_degree; i++){
fac = fac, 0;
}
+ intvec den_vec = HS.HilbertSeriesDenom;
for( k = 1; k<= size(den_vec); k++){
for(i = 1; i <= size(fac); i++){
fac[i] = 0;
@@ -181,11 +291,12 @@
return(E);
}
-static proc intvec2poly(intvec vec){
+
+static proc intvec2poly(bigintmat vec){
poly f = 0;
poly t = var(1);
- for(int i = 1; i <= size(vec); i++){
- f = f + vec[i]*t^(i-1);
+ for(int i = 1; i <= ncols(vec); i++){
+ f = f + vec[1,i]*t^(i-1);
}
return(f);
}
@@ -194,44 +305,67 @@
poly g = 1;
poly t = var(1);
for(int i = 1; i <= size(den); i++){
- g = g*(1-t^den[i]);
+ g = g*(1-t^den[i]);
}
- return(g);
+ return(g);
}
-static proc unifiedRepresentations(intvec num_vec_1, intvec den_vec_1, intvec num_vec_2, intvec den_vec_2){
+static proc unifiedRepresentations(EnumData HS_1, EnumData HS_2){
ring T = 0,t,dp;
poly num_1, den_1, num_2, den_2;
- num_1 = intvec2poly(num_vec_1);
- num_2 = intvec2poly(num_vec_2);
- den_1 = expandDenom(den_vec_1);
- den_2 = expandDenom(den_vec_2);
+ num_1 = intvec2poly(HS_1.HilbertSeriesNum);
+ num_2 = intvec2poly(HS_2.HilbertSeriesNum);
+ den_1 = expandDenom(HS_1.HilbertSeriesDenom);
+ den_2 = expandDenom(HS_2.HilbertSeriesDenom);
if(num_1*den_2 == num_2*den_1){
return(1);
}
return(0);
}
-static proc compareCCycloRatFunctions(intvec num_vec_1, intvec den_vec_1, num_vec_2, den_vec_2){
+static proc fullDenomCCycloRatFunction(EnumData HS){
+// transfer HS from denominator of cyclotomic polynomials p(e)
+// to denominator with denominator of factors (1-t^e)
+
+ ring T = 0,t,dp;
+ poly factor;
+ int expo;
+ poly num_poly = intvec2poly(HS.HilbertSeriesNum);
+ for(int i = 1; i <= size(HS.HilbertSeriesDenom); i++){
+ expo = HS.HilbertSeriesDenom[i];
+ factor = (1 -t^expo)/cyclotomic(expo);
+ num_poly = num_poly * factor;
+ }
+ matrix C = coeffs(num_poly,t);
+ bigintmat D[1][nrows(C)];
+ for(i = 1; i<= nrows(C); i++){
+ D[1,i] = bigint(C[i,1]);
+ }
+ HS.HilbertSeriesNum = D;
+ return(HS);
+}
+
+static proc compareCCycloRatFunctions(EnumData HS_1, EnumData HS_2){
// Compares the expansions of rational functions as in cycloRatFunctionExpansion
// It must be made sure that the rational functions agree if and only they agree in
// numerator and denominator
- if(num_vec_1 == num_vec_2 && den_vec_1 == den_vec_2){
- return(-1,0);
- }
- if(unifiedRepresentations(num_vec_1, den_vec_1, num_vec_2, den_vec_2) ){
+ // if(HS_1.HilbertSeriesNum == HS_2.HilbertSeriesNum && HS_1.HilbertSeriesDenom == HS_2.HilbertSeriesDenom){
+ // return(-1,0);
+ // }
+
+ if(unifiedRepresentations(HS_1, HS_2) ){
return(-1,0);
}
- int expansion_deg = size(num_vec_1);
+ int expansion_deg = ncols(HS_1.HilbertSeriesNum);
bigintmat expansion_1, expansion_2;
int u;
while(1)
-{
- expansion_1 = cycloRatFunctionExpansion(num_vec_1, den_vec_1, expansion_deg);
- expansion_2 = cycloRatFunctionExpansion(num_vec_2, den_vec_2, expansion_deg);
+ {
+ expansion_1 = cycloRatFunctionExpansion(HS_1, expansion_deg);
+ expansion_2 = cycloRatFunctionExpansion(HS_2, expansion_deg);
if(expansion_1 == expansion_2){
expansion_deg = 2*expansion_deg;
continue;
@@ -264,12 +398,44 @@
dbprint(our_printlevel,"Not normal");
swallow = setNmzOption("MRK",1);
}
+ int saveBigNumInvs = BigNumInvs;
+ BigNumInvs = 1;
swallow = setNmzOption("only_hvect",1);
+ if(Cyclotomic){
+ swallow = setNmzOption("cyclo", 1);
+ }
+ else{
+ swallow = setNmzOption("noquasi", 1);
+ }
+ // swallow = setNmzOption("verbose", 1);
V = normaliz(U, "monoid", min_degree, "gb_min_degree");
swallow = setNmzOption("only_hvect",0);
swallow = setNmzOption("MRK",0);
+ if(Cyclotomic){
+ swallow = setNmzOption("cyclo", 0);
+ }
+ else{
+ swallow = setNmzOption("noquasi", 0);
+ }
+ // swallow = setNmzOption("verbose", 0);
exportNuminvs();
- return(nmz_hilbert_series_num, nmz_hilbert_series_denom, is_normal);
+ BigNumInvs = saveBigNumInvs;
+ EnumData HSeries;
+ bigintmat Transfer;
+ if(Cyclotomic){
+ HSeries.HilbertSeriesDenom = nmz_hilbert_series_cyclo_denom;
+ Transfer = nmz_hilbert_series_cyclo_num;
+ }
+ else{
+ HSeries.HilbertSeriesDenom = nmz_hilbert_series_denom;
+ Transfer = nmz_hilbert_series_num;
+ }
+ HSeries.HilbertSeriesNum = Transfer;
+ if(Cyclotomic){
+ HSeries = fullDenomCCycloRatFunction(HSeries);
+ }
+
+ return(HSeries, is_normal);
}
static proc HilbertSeriesMonAlgebra(ideal P, int min_degree)
@@ -299,13 +465,13 @@
// Subduction
// -----------------------------------------------
-static proc Subduction(ideal Pgiven, bigint nr_generators_needed){
+static proc Subduction(ideal P, bigint nr_generators_needed){
// nr_generators = -1: complete subduction
// szbduction in the sense of Robbiano-Sweedler.
// It is applied once to every polynomial whose
// initial is not in the minimal system of generators of the algebra
// generated by the initial monomials
- ideal P = Pgiven;
+ // ideal P = Pgiven;
intvec test_num, test_den;
int i,j;
int swallow = setNmzOption("REP",1);
@@ -326,7 +492,7 @@
return(P, 0, nmz_hilbert_basis_key);
}
if(nr_generators_needed != -1 && size(P) == nmz_hilbert_basis_elements){
- ERROR("Error in Subduction. Inform thge authors");
+ ERROR("Error in Subduction. Inform the authors!");
}
// relative to Pgiven
def our_ring = basering;
@@ -345,7 +511,42 @@
}
P[j] = P_modify[i];
}
- P = simplify(P,3);
+ ideal LC = leadcoafIdeal(P);
+ intvec D = degIdeal(P);
+ our_ring = basering;
+ setring our_ring;
+ P = removeConstants(P);
+ P = simplify(P,1); // nakes monic
+ int check = ncols(P);
+
+ if(@do_def_ideal){
+ setring @S;
+ map g = S,@Retract;
+ ideal Pre_modify = g(Bl);
+ ideal LCC = fetch(our_ring, LC);
+ for(i = 1; i <= nrows(V); i++){
+ for(j= 1; j <= ncols(V); j++){
+ if(V[i,j] == 1){
+ break;
+ }
+ }
+ @Retract[j] = Pre_modify[i];
+ if(D[j] <= 0){
+ @DefIdeal = @DefIdeal, @Retract[j] - LCC[j];
+ @Retract[j] = 0;
+ }
+ else{
+ @Retract[j] = @Retract[j]/LCC[j];
+ }
+ }
+ @Retract = simplify(@Retract, 2); // removes 0, DON'T MAKE MONIC
+ if(check != ncols(@Retract)){
+ "P ncols", check, " PreIm ncols ", ncols(@Retract);
+ ERROR("Preimage doesn' fit. Inform the authors!");
+ }
+ }
+
+ setring our_ring;
return(P,1, nmz_hilbert_basis_key);
}
@@ -381,6 +582,13 @@
if(change == 0){
output = "subduced size " + string(size(Q));
dbprint(our_printlevel,output);
+ def our_ring = basering;
+ if(@do_def_ideal){
+ setring @S;
+ output = "Size defining ideal so far (not minimized) " + string(size(@DefIdeal));
+ dbprint(our_printlevel,output);
+ setring our_ring;
+ }
return(Q);
}
}
@@ -390,10 +598,10 @@
// Tete-a-tete
// -----------------------------------------------
-static proc Tete_A_TeteHilbControlled(ideal P, int crit_degree, int is_normal)
-// Computes the terte-a-ztete of a system of polynomials (termonology of
+static proc Tete_A_TeteHilbControlled(ideal Q, int crit_degree, int is_normal)
+// Computes the terte-a-tete of a system of polynomials (termonology of
// Robbiano-Sweedler). Control by Hilbert series: only the crit degree is
-// evaluated and normalioty is exploited. Genereal version below.
+// evaluated and normalioty is exploited. General version below.
{
dbprint(our_printlevel,"Start Tete-a-tete ");
string output;
@@ -403,7 +611,7 @@
// int t = timer;
int i;
- ideal Q = P;
+ // ideal Q = P;
Q = simplify(Q,3);
// First we reconstruct the grading of the binomials
@@ -412,6 +620,10 @@
intvec SGrad = gradVector(Q, GradingDenom);
intmat U = mons2intmat(Q);
+ // ideal Bla = lead(Q);
+ // Bla;
+ // mons2intmat(Bla);
+
def our_ring = basering;
int p = size(Q);
list baseringlist = ringlist(basering);
@@ -421,9 +633,11 @@
ideal B, Bfull;
if(is_normal){ // in the normal case we don't have the Markov basis yet
int swallow = setNmzOption("MRK",1);
+ // swallow = setNmzOption("verbose",1);
intmat Bl = normaliz(U, "monoid", crit_degree, "gb_min_degree", crit_degree, "gb_degree_bound");
exportNuminvs();
swallow = setNmzOption("MRK",0);
+ // swallow = setNmzOption("verbose",0);
V = readNmzData("mrk");
dbprint(our_printlevel,"Evaluating tete-a-tete");
output = "Computing " + string(nrows(V)) + " binomials";
@@ -439,6 +653,7 @@
int our_deg, u;
V = readNmzData("mrk");
dbprint(our_printlevel,"Evaluating tete-a-tete");
+ // V;
output = "Selecting from " + string(nrows(V)) + " binomials";
dbprint(our_printlevel,output);
Bfull = intmat2binomials(V);
@@ -450,7 +665,7 @@
dbprint(our_printlevel,"Binomials computed");
setring our_ring;
- map f =S, P;
+ map f =S, Q;
Q = Q, f(B);
dbprint(our_printlevel,"Generators extended");
Q =simplify(Q,3);
@@ -458,23 +673,18 @@
return(Q);
}
-static proc Tete_A_TeteGeneral(ideal P, int current_degree, int Sagbi_degree_bound, int degreeByDegree, int makeNewTete_a_tete)
+static proc Tete_A_TeteGeneral(ideal Q, int current_degree, int Sagbi_degree_bound, int degreeByDegree, int makeNewTete_a_tete)
{
+
int degree_tete_a_tete = -1;
string output;
- // "Start Tete-a-tete ";
- // "current_degree ", current_degree;
- // "Sagbi_degree_bound ", Sagbi_degree_bound;
- // "degreeByDegree ", degreeByDegree;
- // "makeNewTete_a_tete ", makeNewTete_a_tete;
- // "startTete_tete", startTete_tete;
if(makeNewTete_a_tete){
dbprint(our_printlevel,"Making new tete-a-tete");
}
else{
dbprint(our_printlevel,"Exploiting existing tete-a-tete");
}
- ideal Q = P;
+ // ideal Q = P;
intvec SGrad;
if(degreeByDegree){
int GradingDenom = gradingDenominator(Q);
@@ -483,6 +693,9 @@
intmat U = mons2intmat(Q);
+ // ideal Bla = lead(Q);
+ // Bla;
+
def our_ring = basering;
int p = size(Q);
list baseringlist = ringlist(basering);
@@ -499,9 +712,6 @@
}
else{
if(makeNewTete_a_tete){
- // U;
- // "---------------";
- // transpose(U);
Dummy = normaliz(U, "monoid", current_degree, "gb_min_degree");
// exportNuminvs();
// showNuminvs();
@@ -561,7 +771,25 @@
map f =S, Q;
Q = Q, f(B);
dbprint(our_printlevel,"Generators extended");
- Q =simplify(Q,3);
+ ideal LC = leadcoafIdeal(Q); // data needed for PreIm
+ intvec D = degIdeal(Q);
+ Q = removeConstants(Q);
+ Q =simplify(Q,1);// makes monic
+ int check = ncols(Q);
+
+ if(@do_def_ideal){
+ setring @S;
+ map g = S,@Retract;
+ @Retract = @Retract, g(B);
+ ideal LCC = fetch(our_ring, LC);
+ // aapplyLaedIdeal(LCC);
+ preparePreIm(D, LCC);
+ if(check != ncols(@Retract)){
+ "Q ncols", check, " PreIm ncols ", ncols(@Retract);
+ ERROR("Preimage doesn'tfit. Inform the authors!");
+ }
+ }
+ setring our_ring;
return(Q, degree_tete_a_tete);
}
@@ -573,9 +801,34 @@
int Sagbi_degree_bound, int finalCheck, int sorting){
// The code would allow Sagbi_degree_bound = -, meaning no bound
+ if(HS_denom_algebra[1] < 0){
+ Cyclotomic = 1;
+ HS_denom_algebra[1] = -HS_denom_algebra[1];
+ }
+ EnumData AlgebraHilbData;
+ AlgebraHilbData.HilbertSeriesDenom = HS_denom_algebra;
+ bigintmat Transfer[1][size(HS_num_algebra)];
+ for(int i = 1; i <= size(HS_num_algebra); i++){
+ Transfer[1,i] = HS_num_algebra[i];
+ }
+ AlgebraHilbData.HilbertSeriesNum = Transfer;
+ if(Cyclotomic){
+ AlgebraHilbData = fullDenomCCycloRatFunction(AlgebraHilbData);
+ }
+
+ int has_positive_degree = 0;
+ for( i = 1; i <= ncols(Q); i++){
+ if(deg(Q[i]) >= 1){
+ has_positive_degree = 1;
+ break;
+ }
+ }
+ if(!has_positive_degree){
+ ERROR("At least one generator must have positive degree");
+ }
string output;
- int crit_degree, nr_hilbbas_1, nr_hilbbas_2, i;
+ int crit_degree, nr_hilbbas_1, nr_hilbbas_2;
bigint HF_difference;
ideal Plow, Phigh, K, Dummy;
intvec HS_denom_cand, HS_num_cand;
@@ -597,6 +850,8 @@
crit_degree = 0;
+ EnumData CandData;
+
while(1){
if(round > 0){
@@ -608,11 +863,17 @@
L = sort(P,"dp");
P = L[1];
}
+ (CandData, is_normal) = HilbertSeriesMonAlgebra(P, crit_degree+1);
+
+ // (HS_num_cand, HS_denom_cand, is_normal) = HilbertSeriesMonAlgebra(P, crit_degree+1);
+
+ (crit_degree, HF_difference) = compareCCycloRatFunctions(AlgebraHilbData, CandData);
- (HS_num_cand, HS_denom_cand, is_normal) = HilbertSeriesMonAlgebra(P, crit_degree+1);
- (crit_degree, HF_difference) = compareCCycloRatFunctions(HS_num_algebra, HS_denom_algebra,
- HS_num_cand, HS_denom_cand);
+ //(crit_degree, HF_difference) = compareCCycloRatFunctions(HS_num_algebra, HS_denom_algebra,
+ // HS_num_cand, HS_denom_cand);
+
+ // quit;
if(crit_degree > Sagbi_degree_bound && Sagbi_degree_bound != -1){
output = "critical degree = " + string(crit_degree) + " > Sagbi_degree_bound = " + string(Sagbi_degree_bound);
@@ -679,11 +940,26 @@
P = P + Phigh;
P = completeSubduction(P);
}
+
+ // lead(P);
}
}
+// ---------------------------------------------------------------
-static proc doSagbiGeneral(ideal Q, int Sagbi_degree_bound, int Sagbi_max_rounds, int sorting)
+static proc doSagbiGeneral(ideal Q, int defining_ideal, int Sagbi_degree_bound, int Sagbi_max_rounds, int sorting)
{
+ int i;
+ int has_positive_degree = 0;
+ for(i = 1; i <= ncols(Q); i++){
+ if(deg(Q[i]) >= 1){
+ has_positive_degree = 1;
+ break;
+ }
+ }
+ if(!has_positive_degree){
+ ERROR("At least one generator must have positive degree");
+ }
+
string output;
@@ -691,16 +967,64 @@
if(Sagbi_degree_bound != -1){
degreeByDegree = 1;
}
- ideal P = simplify(Q,15); // make inititial coeff 1, erase 0, duplicates and scalar multiples
- P = simplify(P,3);
+ // if(degreeByDegree == 0 && defining_ideal == 1){
+ // ERROR("Defining ideal only computed gegree by degree");
+ // }
+
+ @do_def_ideal = defining_ideal;
+
+ ideal P;
+ int GradingDenom;
+ intvec D;
+
+ def our_ring = basering;
+
+ if(!@do_def_ideal){
+ Q = removeConstants(Q); // erases constants including 0
+ P = simplify(Q,13); // make inititial coeff 1, remove duplicates and scalar multiples
+ }
+ else{
+ // setup preimages of generators, take care of constants in the generators (not forbidden)
+ // constants give elements in the defining ideal
+ P = Q;
+ ideal LC = leadcoafIdeal(P); // must be done before any change of P
+ D = degIdeal(P); // ditto. We need hese data for PreIm
+ for(i = 1; i <=size(D); i++){
+ if(D[i] <= 0){
+ ERROR("constants not allowed in algebra generators");
+ }
+ }
+ // "Degrees ", D, " LC ", LC;
+ list baseringlist = ringlist(basering);
+ int p = ncols(P);
+ P = removeConstants(P); // PreIm will be gtaken care below
+ P = simplify(P,1); // make monic
+ ring @S = (baseringlist[1]),(y(1.. p)),wp(D);
+ ideal @Retract =(y(1..p));
+ ideal @DefIdeal;
+ ideal @Retract_low;
+ ideal @Retract_high;
+ export(@S);
+ export(@Retract);
+ export(@DefIdeal);
+ export(@Retract_low);
+ export(@Retract_high);
+ ideal LCC = fetch(our_ring, LC);
+ preparePreIm(D, LCC); // takes care of constants in P, makes moic
+ // for(i = 1; i <= ncols(LCC); i++){
+ // @Retract[i] = @Retract[i]/LCC[i];
+ // }
+ setring our_ring;
+ }
+
+ GradingDenom = gradingDenominator(P);
+
P = completeSubduction(P);
dbprint(our_printlevel,"Initial subduction dione");
- int GradingDenom = gradingDenominator(P);
int maxDegreeGens = deg(P[1]);
int minDegreeGens = maxDegreeGens;
- int i;
for(i = 2; i <= size(P); i++){
if(deg(P[i]) > maxDegreeGens){
maxDegreeGens = deg(P[i]);
@@ -717,6 +1041,7 @@
int done;
int checked;
int makeNewTete_a_tete = 1;
+ int first_after_maxDegGens = 1;
int uu = minDegreeGens;
int degreeBoundReached;
@@ -726,6 +1051,7 @@
ideal Plow, Phigh;
int round = 1;
+ int check_high,check_low;
while(1){
P = simplify(P,3);
@@ -736,6 +1062,15 @@
Plow = 0;
Phigh = 0;
+ our_ring = basering;
+
+ if(@do_def_ideal){
+ setring @S;
+ @Retract_high = 0;
+ @Retract_low = 0;
+ }
+
+ setring our_ring;
if(!degreeByDegree){
(P_1, degree_tete_a_tete) = Tete_A_TeteGeneral(P, -1, -1, 0,1);
@@ -743,14 +1078,34 @@
}
else{
if(uu < maxDegreeGens){
+ our_ring = basering;
+ D = degIdeal(P);
for(i = 1; i <=size(P); i++){
- if(deg(P[i]) <= uu * GradingDenom){
+ if(D[i] <= uu * GradingDenom){
Plow = Plow + P[i];
}
else{
Phigh = Phigh + P[i];
}
}
+ check_low = size(Plow);
+ check_high = size(Phigh);
+ if(@do_def_ideal){
+ setring @S;
+ for(i = 1; i <=size(D); i++){
+ if(D[i] <= uu * GradingDenom){
+ @Retract_low = @Retract_low + @Retract[i];
+ }
+ else{
+ @Retract_high = @Retract_high + @Retract[i];
+ }
+ }
+ if(size(@Retract_low) != check_low || size(@Retract_high) != check_high){
+ "Problem ", size(@Retract_low), check_low, size(@Retract_high), check_high;
+ }
+ @Retract = @Retract_low;
+ }
+ setring our_ring;
// 2 = strictly degree by degree
(P_1, degree_tete_a_tete) = Tete_A_TeteGeneral(Plow,uu, Sagbi_degree_bound, 2, 1);
}
@@ -758,16 +1113,33 @@
(P_1, degree_tete_a_tete) = Tete_A_TeteGeneral(P,uu, Sagbi_degree_bound, 1, makeNewTete_a_tete);
}
if(degree_tete_a_tete == -1){
+ our_ring = basering;
dbprint(our_printlevel,"Sagbi basis computed");
+ if(@do_def_ideal){
+ setring @S;
+ @DefIdeal = simplify(@DefIdeal, 3);
+ }
+ setring our_ring;
+ if(@do_def_ideal){
+ checkDefIdeal(Q);
+ }
return(P_1,2);
}
if(uu != degree_tete_a_tete){
if(uu > degree_tete_a_tete){
- ERROR("Degree in tete-a-tete too small. Inform the authors");
+ ERROR("Degree in tete-a-tete too small. Inform the authors!");
}
uu = degree_tete_a_tete;
if(uu > Sagbi_degree_bound){
dbprint(our_printlevel,"Degree bound reached");
+ if(@do_def_ideal){
+ setring @S;
+ @DefIdeal = simplify(@DefIdeal, 3);
+ }
+ setring our_ring;
+ if(@do_def_ideal){
+ checkDefIdeal(Q);
+ }
return(P_1, 1);
}
output = "Degree increased to " + string( uu);
@@ -783,6 +1155,14 @@
if(degreeBoundReached){
dbprint(our_printlevel,"Degree bound reached");
+ if(@do_def_ideal){
+ setring @S;
+ @DefIdeal = simplify(@DefIdeal, 3);
+ }
+ setring our_ring;
+ if(@do_def_ideal){
+ checkDefIdeal(Q);
+ }
return(P_1,1);
}
@@ -800,7 +1180,14 @@
}
if(done){
- dbprint(our_printlevel,"Sagbi basis compouted");
+ dbprint(our_printlevel,"Sagbi basis computed");
+ if(@do_def_ideal){
+ our_ring = basering;
+ setring @S;
+ @DefIdeal = simplify(@DefIdeal, 3);
+ setring our_ring;
+ checkDefIdeal(Q);
+ }
return(P_1, 2);
}
@@ -818,17 +1205,35 @@
output = "Degree >= " + string(uu);
dbprint(our_printlevel, output);
}
+
if(degreeByDegree){
- if(size(P_1) > size(P) && size(Phigh) == 0 || uu == maxDegreeGens){ // we have git new generators
+ makeNewTete_a_tete = 0;
+ if(size(P) != size(P_1)){
makeNewTete_a_tete = 1;
}
else{
- makeNewTete_a_tete = 0;
+ if(minDegreeGens < maxDegreeGens){ // in this case we may have P != P_1 despite of equal size
+ for(i = size(P); i >= 1; i--){
+ if(P[i] != P_1[i]){
+ makeNewTete_a_tete = 1;
+ break;
+ }
+ }
+ }
}
}
+
P = P_1 + Phigh;
+ our_ring = basering;
+ if(@do_def_ideal){
+ setring @S;
+ @Retract = @Retract + @Retract_high;
+ }
+
+ setring our_ring;
+
+ } // main while loop
- }
}
// ------------------------------------------------
@@ -838,15 +1243,21 @@
proc sagbiHilbControlled(ideal Q, intvec HS_num_algebra, intvec HS_denom_algebra, int Sagbi_degree_bound, list #)
"USAGE: agbiHilbControlled(ideal Q, intvec HS_num_algebra, intvec HS_denom_algebra, int Sagbi_degree_bound [,int finalChweck, int sorting, int verb]);
RETURN: An ideal whose generators form the Sagbi basis of the algebra generated
- by the polynomials inin degrwees <= Sagbi_degree_bound. The computatiojn is controlled by the Hilbert series
+ by the polynomials inin degrwees <= Sagbi_degree_bound. The computation is controlled by the Hilbert series
given by the numerator and the denominator.
- If sorting is set, the compouted elements are degrevlex sorted before a round of the algorithm.
- The optional parameter verb sets the terminal output. Fefault is 1 = on.
+ If sorting is set, the computed elements are degrevlex sorted before a round of the algorithm.
+ The optional parameter verb sets the terminal output. Default is 1 = on.
- The component has a second integer component. Its possible values are: 0, if the full Sagbi basis has
+ The return value has a second integer component. Its possible values are: 0, if the full Sagbi basis has
not been reached, 1 if this is unknown, and 2 if the full Sagbi basis has been computed.
-EXAMPLE: sagbiHilbControlled; shows an example
+
+ In the non-standard graded situation it may be useful to restrict the exchange of data between Singular
+ and normaliz to the Hilbert series as a rational function with cyclotomic polynomials in the
+ denominator. Of course, HS_num_algebra and HS_denom_algebra must have been computed for this
+ representation of the Hilbert series. This choice is communicated to the function by replacing the first
+ component of HS_denom_algebra by its negative.
+EXAMPLE: example sagbiHilbControlled; shows an example
"
{
@@ -904,10 +1315,10 @@
RETURN: RETURN: An ideal whose generators form the Sagbi basis of the algebra generated
by the polynomials inin degrwees <= Sagbi_degree_bound.
- If sorting is set, the compouted elements are degrevlex sorted before a round of the algorithm.
- The optional parameter verb sets the terminal output. Fefault is 1 = on.
+ If sorting is set, the computed elements are degrevlex sorted before a round of the algorithm.
+ The optional parameter verb sets the terminal output. Default is 1 = on.
- The component has a second integer component. Its possible values are: 0, if the full Sagbi basis has
+ The return value has a second integer component. Its possible values are: 0, if the full Sagbi basis has
not been reached, 1 if this is unknown, and 2 if the full Sagbi basis has been computed.
EXAMPLE: example sagbiByDegree; shows an example
@@ -940,7 +1351,7 @@
ideal P;
int success;
- (P, success) = doSagbiGeneral(Q, Sagbi_degree_bound, -1, sorting);
+ (P, success) = doSagbiGeneral(Q, 0, Sagbi_degree_bound, -1, sorting);
int NrTerms = 0;
for(int k = 1; k <= size(P); k++){
@@ -970,10 +1381,10 @@
RETURN: An ideal whose generators form the Sagbi basis of the algebra generated
by the polynomials in Q as far as computwed in at most sagbiMaxRounds.
- If sorting is set, the compouted elements are degrevlex sorted before a round of the algorithm.
- The optional parameter verb sets the terminal output. Fefault is 1 = on.
+ If sorting is set, the computed elements are degrevlex sorted before a round of the algorithm.
+ The optional parameter verb sets the terminal output. Default is 1 = on.
- The component has a second integer component. Its possible values are: 0, if the full Sagbi basis has
+ The return value has a second integer component. Its possible values are: 0, if the full Sagbi basis has
not been reached, 1 if this is unknown, and 2 if the full Sagbi basis has been computed.
EXAMPLE: example agbiGeneral; shows an example
@@ -992,7 +1403,7 @@
}
ideal P;
int success;
- (P, success) = doSagbiGeneral(Q, -1, Sagbi_max_rounds, sorting);
+ (P, success) = doSagbiGeneral(Q, 0, -1, Sagbi_max_rounds, sorting);
return(P,success);
}
example
@@ -1004,24 +1415,184 @@
// at most 3 rounds, no sorting, no terminal output
(Q,success) = sagbiGeneral(P,3,0,0);
Q;
- "Note: success = 2 <==> Sagbi basi complete";
+ "Note: success = 2 <==> Sagbi basis complete";
"success",success;
}
+
+proc sagbiDefIdealByDegree(ideal Q, int Sagbi_degree_bound, list #)
+"USAGE: defIdealByDegree(ideal Q, int sagbiDegreeBound [,int sorting, int verb]);
+RETURN: An instance of
+
+ newstruct("sagbiResult","int success, ideal sagbiBasis, ideal defIdeal,, ideal retract");
+
+ success has the value 0, if the full Sagbi basis has not been reached,
+ 1 if this is unknown, and 2 if the full Sagbi basis has been computed.
+
+ sagbiBasis is the Sagbi basis encodeed as an ideal in the polynomial ring that was
+ active when sagbiDefIdealByDegree was called.
+
+ defIdeal contains the defining ideal and the retract (as far as computed). They live in the ring
+ (name of the result).r_defIdeal; See example for the activation of this ring.
+ The defining ideal has been minimized.
+
+ Note: sorting, if set at all, must be 0.
+
+EXAMPLE: example sagbiDefIdealByDegree; shows an example
+"
+{
+ // checkPposDegree(Q);
+
+ int sorting = 0;
+ if(size(#) > 1){
+ sorting = #[2];
+ }
+ if(sorting){
+ "Sorting not allowed for defining ideal and swiched off";
+ sorting = 0;
+ }
+
+ if(size(#) > 1){
+ our_printlevel = #[2];
+ }
+
+ if(Sagbi_degree_bound <= 0){
+ ERROR("Degree bound must be positive");
+ }
+ if(!homog(Q)){
+ ERROR("defIdealByDegree expects homogeneous input");
+ }
+
+ list baseringlist = ringlist(basering);
+ intvec w = baseringlist[3][1][2];
+ for(int i = 1; i <=size(w); i++){
+ if(w[i] != 1){
+ ERROR("Basering not standard graded");
+ }
+ }
+
+ ideal P;
+ int success;
+ (P, success) = doSagbiGeneral(Q, 1, Sagbi_degree_bound, -1, sorting); // 1 = defining ideal
+
+ // int NrTerms = 0;
+ // for(int k = 1; k <= size(P); k++){
+ // NrTerms = NrTerms + size(P[k]);
+ // }
+ // "Number Terms", NrTerms;
+
+ sagbiResult res;
+ res.success = success;
+ res.sagbiBasis = P;
+ def our_ring = basering;
+ setring @S;
+ res.defIdeal = minbase(@DefIdeal);
+ res.retract = @Retract;
+ setring our_ring;
+ return(res);
+}
+example
+{ "EXAMPLE:"; echo=2;
+ ring R = 0,(x(1..2)(1..5)), dp;
+ matrix M[2][5] = x(1..2)(1..5);
+ ideal P = minor(M,2);
+ int degree_bound = 15;
+ def Result = sagbiDefIdealByDegree(P, degree_bound, 0, 1);
+ "Note: success = 2 <==> Sagbi basis and defining ideal completee";
+ "success", Result.success;
+ "Sagbi basis";
+ Result.sagbiBasis;
+ def motherRing = Result.r_defIdeal;
+ setring motherRing;
+ "defining ideal";
+ Result.defIdeal;
+ "retract";
+ Result.retract;
+}
+
+proc sagbiDefIdealGeneral(ideal Q, list #)
+"USAGE: defIdealGeneral(ideal Q [, int sagbiMaxRounds, int sorting, int verb]));
+RETURN: An instance of
+
+ newstruct("sagbiResult","int success, ideal sagbiBasis, ideal defIdeal, ideal retract");
+
+ success has the value 0, if the full Sagbi basis has not been reached,
+ 1 if this is unknown, and 2 if the full Sagbi basis has been computed.
+
+ sagbiBasis is the Sagbi basis encodeed as an ideal in the polynomial ring that was
+ active when sagbiDefIdealByDegree was called.
+
+ defIdeal contains the defining ideal and the retract (as far as computed). They live in the ring
+ (name of the result).r_defIdeal; See example for the activation of this ring.
+ The defining ideal has been minimized.
+
+ Note: sorting, if set at all, must be 0.
+
+EXAMPLE: example sagbiDefIdealGeneral; shows an example
+"
+{
+ int sorting = 0;
+ int Sagbi_max_rounds = -1;
+ if(size(#) > 0){
+ Sagbi_max_rounds = #[1];
+ }
+ if(size(#) > 1){
+ sorting = #[2];
+ }
+ if(sorting){
+ "Sorting not allowed for defining ideal and swiched off";
+ sorting = 0;
+ }
+ if(size(#) > 2){
+ our_printlevel = #[3];
+ }
+ ideal P;
+ int success;
+ (P, success) = doSagbiGeneral(Q, 1, -1, Sagbi_max_rounds, sorting); // 1 = defining ideal, -1 = no degrees.
+
+ sagbiResult res;
+ res.success = success;
+ res.sagbiBasis = P;
+ def our_ring = basering;
+ setring @S;
+ res.defIdeal = @DefIdeal;
+ res.retract = @Retract;
+ setring our_ring;
+ return(res);
+}
+example
+{ "EXAMPLE:";echo=2;
+ ring R = 0,(x,w),dp;
+ ideal A = x^2-w+1, x + w^3, x -w;
+ def Result = sagbiDefIdealGeneral(A,-1); "Note: success = 2 <==> Sagbi basis and defining ideal completee";
+ "success", Result.success;
+ "Sagbi basis";
+ Result.sagbiBasis;
+ def motherRing = Result.r_defIdeal;
+ setring motherRing;
+ "defining ideal";
+ Result.defIdeal;
+ "retract";
+ Result.retract;
+}
// ------------------------------------------------
// Initialization
// -----------------------------------------------
static proc mod_init()
{
- LIB "general.lib";
LIB "normaliz.lib";
+ LIB "finvar.lib";
int swallow;
addNmzOption("MRK","MarkovBasis");
addNmzOption("REP","Representations");
addNmzOption("BPK","BinomialsPacked");
+ addNmzOption("cyclo","OnlyCyclotomicHilbSer");
+ swallow =addNmzOption("noquasi","NoQuasiPolynomial");
swallow = setNmzOption("BPK", 1);
swallow = setNmzOption("MRK",0);
swallow =setNmzOption("REP",0);
+ swallow =setNmzOption("cyclo",0);
+ swallow =setNmzOption("noquasi",0);
setNmzFilename("NmzSagbiExchange");
intmat saveTete_a_tete;
int startTete_tete;
@@ -1029,4 +1600,12 @@
export(startTete_tete);
int our_printlevel = 1;
export(our_printlevel);
+ int @do_def_ideal = 0;
+ export(@do_def_ideal);
+ newstruct("EnumData", "bigintmat HilbertSeriesNum, intvec HilbertSeriesDenom, bigint MultiplicityNum, bigint NultiplicityDenom");
+ newstruct("GradingData", "int GradingDenom, intvec GradingVec");
+ newstruct("sagbiResult","int success, ideal sagbiBasis, ideal defIdeal, ideal retract");
+ int Cyclotomic = 0;
+ export(Cyclotomic);
}
+
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/automorph.cpp normaliz-3.10.5+ds/source/libnormaliz/automorph.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/automorph.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/automorph.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -819,7 +819,6 @@
LinFormOrbits = orbits(LinFormPerms, LinFormsRef.nr_of_rows());
}
-/*
// the next two functions create the orbit of a vector from the action of linear maps
template <typename Integer>
void AutomorphismGroup<Integer>::add_images_to_orbit(const vector<Integer>& v, set<vector<Integer> >& orbit) const {
@@ -844,7 +843,6 @@
orbit_list.push_back(c);
return orbit_list;
}
-*/
//-------------------------------------------------------------------------------
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/automorph.h normaliz-3.10.5+ds/source/libnormaliz/automorph.h
--- normaliz-3.10.4+ds/source/libnormaliz/automorph.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/automorph.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/binomial_containers.cpp normaliz-3.10.5+ds/source/libnormaliz/binomial_containers.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/binomial_containers.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/binomial_containers.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -1137,6 +1137,12 @@
}
}
+// The two minimization routines work without degree bound presently.
+// The reson is that the grading in PandL is not handled correctly.:
+// its coordinates are not permuted correctly.
+// Therefore we always compute the full minimal Markov basis.
+// The grading used in the minimization is the lifted weight.
+
// minimizatiom by trying to connect lead and tail in tghe graph whose edges are defined by
// previous minimal geneartors
binomial_list binomial_list::graph_minimize(bool& success){
@@ -1266,8 +1272,13 @@
G.sat_support = sat_support;
G.grading = grading;
G.degree_bound = degree_bound;
- if(degree_bound >= 0)
+ G.degree_bound_set = false;
+ // The following is not used at present
+ //see comment preceding graph_minimize
+ if(degree_bound >= 0){
G.degree_bound_set = true;
+ // cout << "RRRRRRRR " << grading;
+ }
binomial_tree G_red_tree(mon_ord, sat_support);
@@ -1339,7 +1350,7 @@
binomial_list_by_degrees::binomial_list_by_degrees(const binomial_list& BL){
- grading = BL.mon_ord.get_weight(); // we want bto keep the order in BL as much as possible
+ grading = BL.mon_ord.get_weight(); // we want to keep the order in BL as much as possible
vector<long long> bounding_grad = BL.grading;
long long degree_bound = BL.degree_bound;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/binomial_containers.h normaliz-3.10.5+ds/source/libnormaliz/binomial_containers.h
--- normaliz-3.10.4+ds/source/libnormaliz/binomial_containers.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/binomial_containers.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/binomial.cpp normaliz-3.10.5+ds/source/libnormaliz/binomial.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/binomial.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/binomial.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/binomial.h normaliz-3.10.5+ds/source/libnormaliz/binomial.h
--- normaliz-3.10.4+ds/source/libnormaliz/binomial.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/binomial.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/chunk.cpp normaliz-3.10.5+ds/source/libnormaliz/chunk.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/chunk.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/chunk.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/chunk.h normaliz-3.10.5+ds/source/libnormaliz/chunk.h
--- normaliz-3.10.4+ds/source/libnormaliz/chunk.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/chunk.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/collection.cpp normaliz-3.10.5+ds/source/libnormaliz/collection.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/collection.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/collection.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/collection.h normaliz-3.10.5+ds/source/libnormaliz/collection.h
--- normaliz-3.10.4+ds/source/libnormaliz/collection.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/collection.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/collect_lat.cpp normaliz-3.10.5+ds/source/libnormaliz/collect_lat.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/collect_lat.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/collect_lat.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -544,10 +544,10 @@
if(verbose)
verboseOutput() << "Computation of " + global_project + " NOT complete" << endl;
SplitData new_split_data = our_split;
- size_t nr_sub_splits = 2; // the minimum
+ size_t nr_sub_splits = 2; // the default minimum
if(given_nr_subsplits != -1){
- if(given_nr_subsplits < 2)
- throw BadInputException("Number of subsplits must be >= 2");
+ if(given_nr_subsplits < 1)
+ throw BadInputException("Number of subsplits must be >= 1");
nr_sub_splits = given_nr_subsplits;
}
else{
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/collect_lat.h normaliz-3.10.5+ds/source/libnormaliz/collect_lat.h
--- normaliz-3.10.4+ds/source/libnormaliz/collect_lat.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/collect_lat.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone.cpp normaliz-3.10.5+ds/source/libnormaliz/cone.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/cone.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -461,7 +461,7 @@
// special treatment of polytope. We convert it o cone
// and define the grading
if (contains(multi_input_data, Type::polytope)) {
- size_t dim;
+ size_t dim = 0; // value to mke g++ happy
if (multi_input_data[Type::polytope].nr_of_rows() > 0) {
dim = multi_input_data[Type::polytope][0].size() + 1;
Matrix<Integer> grading(0,dim);
@@ -3557,7 +3557,7 @@
if (ToCompute.test(ConeProperty::HilbertSeries)) {
FC.do_h_vector = true;
- FC.Hilbert_Series.set_period_bounded(HSeries.get_period_bounded());
+ FC.Hilbert_Series.get_variants(HSeries);
}
if (ToCompute.test(ConeProperty::HilbertBasis)) {
FC.do_Hilbert_basis = true;
@@ -3679,16 +3679,15 @@
FC.quality_of_automorphisms = AutomParam::rational;
}
- /*
- // if (ToCompute.test(ConeProperty::ExploitIsosMult)) { DONE VIA DESCENT
- // FC.exploit_automs_mult = true;
- // }
- if (ToCompute.test(ConeProperty::ExploitAutomsVectors)) {
- FC.exploit_automs_vectors = true;
- }
+
+ // if (ToCompute.test(ConeProperty::ExploitIsosMult)) { DONE VIA DESCENT
+ // FC.exploit_automs_mult = true;
+ // FC.autom_codim_mult = autom_codim_mult;
+ // }
+ if (ToCompute.test(ConeProperty::ExploitAutomsVectors)) {
+ FC.exploit_automs_vectors = true;
FC.autom_codim_vectors = autom_codim_vectors;
- FC.autom_codim_mult = autom_codim_mult;
- }*/
+ }
if (Inequalities.nr_of_rows() != 0 && !isComputed(ConeProperty::SupportHyperplanes)) {
BasisChangePointed.convert_to_sublattice_dual(FC.Support_Hyperplanes, Inequalities);
@@ -4172,6 +4171,12 @@
}
ToCompute.check_monoid_goals();
+ ToCompute.preconditions_and_check_series_goals();
+
+ if(ToCompute.test(ConeProperty::NoQuasiPolynomial)){ // necessary because of monoid
+ HSeries.forbid_quasipol(true);
+ }
+
size_t nr_autos = 0;
if(ToCompute.test(ConeProperty::InputAutomorphisms))
nr_autos++;
@@ -4183,9 +4188,6 @@
if(nr_autos > 1)
throw BadInputException("Oly one type of automorphism group can be computed in one run");
- if(ToCompute.test(ConeProperty::HilbertQuasiPolynomial))
- ToCompute.set(ConeProperty::HilbertSeries);
-
Matrix<long long> InputGensLL;
convert(InputGensLL,InputGenerators);
compute_monoid_basic_data(InputGensLL, ToCompute);
@@ -4204,10 +4206,20 @@
Cone<Integer> HSCompute(Type::cone_and_lattice, HilbertBasis);
// HSCompute.setVerbose(false);
HSCompute.setGrading(Grading);
+ HSCompute.HSeries.get_variants(HSeries);
+ ConeProperties HSProp;
+ HSProp.set(ConeProperty::HilbertSeries);
if(ToCompute.test(ConeProperty::NoGradingDenom))
- HSCompute.compute(ConeProperty::HilbertSeries, ConeProperty::NoGradingDenom);
- else
- HSCompute.compute(ConeProperty::HilbertSeries);
+ HSProp.set(ConeProperty::NoGradingDenom);
+ if(ToCompute.test(ConeProperty::OnlyCyclotomicHilbSer))
+ HSProp.set(ConeProperty::OnlyCyclotomicHilbSer);
+ if(ToCompute.test(ConeProperty::NoQuasiPolynomial))
+ HSProp.set(ConeProperty::NoQuasiPolynomial);
+ if(ToCompute.test(ConeProperty::HSOP))
+ HSProp.set(ConeProperty::HSOP);
+ //*****************************************
+ HSCompute.compute(HSProp);
+ //*****************************************
HSeries = HSCompute.getHilbertSeries();
multiplicity = HSCompute.getMultiplicity();
setComputed(ConeProperty::Multiplicity);
@@ -4215,6 +4227,9 @@
HSeries.computeHilbertQuasiPolynomial();
setComputed(ConeProperty::HilbertQuasiPolynomial);
}
+ if(ToCompute.test(ConeProperty::HSOP)){
+ setComputed(ConeProperty::HSOP);
+ }
setComputed(ConeProperty::HilbertSeries);
}
@@ -4226,7 +4241,7 @@
// the condition HilbertBasis.nr_of_rows() < InputGenerators.nr_of_rows()
// prevents us from running into an infinite loop!
// TODO work directly with lattice ideal here or implement variant below.
- // TODO Take care of degree bound if Hilbert series musr be computed.
+ // TODO Take care of degree bound if Hilbert series must be computed.
if(ToCompute.test(ConeProperty::HilbertSeries) && HilbertBasis.nr_of_rows() < InputGenerators.nr_of_rows()
&& !ToCompute.test(ConeProperty::MarkovBasis) && !ToCompute.test(ConeProperty::GroebnerBasis) ){
@@ -4373,7 +4388,12 @@
}
}
+ // We use HilbSer to forward the values
+ LattId.HilbSer.get_variants(HSeries);
+
+ //**********************************************
LattId.compute(ToCompute);
+ //**********************************************
if(LattId.isComputed(ConeProperty::GroebnerBasis)){
convert(GroebnerBasis,LattId.getGroebnerBasis());
setComputed(ConeProperty::GroebnerBasis);
@@ -4387,18 +4407,18 @@
}
if(LattId.isComputed(ConeProperty::HilbertSeries)){
HSeries = LattId.getHilbertSeries();
- setComputed(ConeProperty::HilbertSeries);
+; setComputed(ConeProperty::HilbertSeries);
}
+ // complete_HilbertSeries_comp(ToCompute);
+
ToCompute.reset(is_Computed);
return ToCompute;
}
-
template <typename Integer>
ConeProperties Cone<Integer>::compute(ConeProperties ToCompute) {
-
#ifdef NMZ_DEBUG
if(verbose){
cout << "+++++++++++++++++++++++++++++++++++++++++++++" << endl;
@@ -4417,7 +4437,6 @@
possibly_interrupted = true;
}
-
handle_dynamic(ToCompute);
set_parallelization();
@@ -4451,6 +4470,16 @@
LEAVE_CONE return monoid_compute(ToCompute);
}
+ // For monoid input done in monoid_compute
+ if(ToCompute.test(ConeProperty::NoQuasiPolynomial)){ // necessary because of monoid
+ HSeries.forbid_quasipol(true);
+ }
+ // ditto
+ if(ToCompute.test(ConeProperty::OnlyCyclotomicHilbSer)){
+ HSeries.forbid_quasipol(true);
+ HSeries.set_only_cyclotomic(true);
+ }
+
// We want to make sure that the exckuded faces are shown in the output/can be returned
if (!isComputed(ConeProperty::ExcludedFaces) && ExcludedFaces.nr_of_rows() > 0)
ToCompute.set(ConeProperty::ExcludedFaces);
@@ -4944,7 +4973,7 @@
if (Dehomogenization.size() > 0) {
vector<Integer> test = BasisMaxSubspace.MxV(Dehomogenization);
if (test != vector<Integer>(test.size())) {
- assert(false);
+ // assert(false);
throw BadInputException("Dehomogenization does not vanish on maximal subspace.");
}
}
@@ -6486,7 +6515,7 @@
setComputed(ConeProperty::NumberLatticePoints);
}
- // we want to be able to convert HS ohr EhrS to hsop denom if
+ // we want to be able to convert HS or EhrS to HSOP denom if
// they have been computed without
if (!(ToCompute.test(ConeProperty::HSOP) && !isComputed(ConeProperty::HSOP) &&
@@ -6911,8 +6940,7 @@
SymmCone = new Cone<Integer>(SymmInput);
SymmCone->setPolynomial(polynomial);
SymmCone->setDecimalDigits(decimal_digits);
- SymmCone->setNrCoeffQuasiPol(HSeries.get_nr_coeff_quasipol());
- SymmCone->HSeries.set_period_bounded(HSeries.get_period_bounded());
+ SymmCone->HSeries.get_variants(HSeries);
SymmCone->setVerbose(verbose);
ConeProperties SymmToCompute;
SymmToCompute.set(ConeProperty::SupportHyperplanes);
@@ -6924,10 +6952,16 @@
SymmToCompute.set(ConeProperty::NoSignedDec, ToCompute.test(ConeProperty::NoSignedDec));
SymmToCompute.set(ConeProperty::GradingIsPositive, ToCompute.test(ConeProperty::GradingIsPositive));
SymmToCompute.set(ConeProperty::FixedPrecision, ToCompute.test(ConeProperty::FixedPrecision));
+ SymmToCompute.set(ConeProperty::OnlyCyclotomicHilbSer, ToCompute.test(ConeProperty::OnlyCyclotomicHilbSer));
+ SymmToCompute.set(ConeProperty::NoQuasiPolynomial, ToCompute.test(ConeProperty::NoQuasiPolynomial));
+ //***************************************
SymmCone->compute(SymmToCompute);
+ //***************************************
if (SymmCone->isComputed(ConeProperty::WeightedEhrhartSeries)) {
long save_expansion_degree = HSeries.get_expansion_degree(); // not given to the symmetrization
HSeries = SymmCone->getWeightedEhrhartSeries().first;
+ // cout << "Wau wau " << HSeries.getHilbertQuasiPolynomialDenom() << endl;
+ // cout << "Miau " << HSeries.getHilbertQuasiPolynomial();
HSeries.set_expansion_degree(save_expansion_degree);
setComputed(ConeProperty::HilbertSeries);
// setComputed(ConeProperty::ExplicitHilbertSeries);
@@ -7001,6 +7035,7 @@
throw BadInputException("Polynomial weight missing");
/* if(get_rank_internal()==0)
throw NotComputableException("WeightedEhrhartSeries not computed in dimension 0");*/
+ IntData.weighted_Ehrhart_series.first.get_variants(HSeries);
#ifdef NMZ_COCOA
generalizedEhrhartSeries(*this);
setComputed(ConeProperty::WeightedEhrhartSeries);
@@ -7711,6 +7746,15 @@
// single first
if(ToCompute.test(ConeProperty::SingleLatticePoint)){
+
+ if(ToCompute.test(ConeProperty::NoEmptyOutput)){
+ if(ModuleGenerators.nr_of_rows() >0){
+ ofstream Lop(global_project + ".out");
+ Lop << "1 lat point" << endl;
+ Lop.close();
+ }
+ throw NoComputationException("No empty output");
+ }
if(inhomogeneous && ModuleGenerators.nr_of_rows() >0){
SingleLatticePoint = ModuleGenerators[0];
ModuleGenerators.resize(0,dim);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone_dual_mode.cpp normaliz-3.10.5+ds/source/libnormaliz/cone_dual_mode.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/cone_dual_mode.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone_dual_mode.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone_dual_mode.h normaliz-3.10.5+ds/source/libnormaliz/cone_dual_mode.h
--- normaliz-3.10.4+ds/source/libnormaliz/cone_dual_mode.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone_dual_mode.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone.h normaliz-3.10.5+ds/source/libnormaliz/cone.h
--- normaliz-3.10.4+ds/source/libnormaliz/cone.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,7 +1,7 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone_property.cpp normaliz-3.10.5+ds/source/libnormaliz/cone_property.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/cone_property.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone_property.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -137,6 +137,8 @@
ret.set(ConeProperty::PrimalMode);
ret.set(ConeProperty::KeepOrder);
ret.set(ConeProperty::HSOP);
+ ret.set(ConeProperty::OnlyCyclotomicHilbSer);
+ ret.set(ConeProperty::NoQuasiPolynomial);
ret.set(ConeProperty::Symmetrize);
ret.set(ConeProperty::NoSymmetrization);
ret.set(ConeProperty::BigInt);
@@ -156,6 +158,7 @@
ret.set(ConeProperty::TestLinearAlgebraGMP);
ret.set(ConeProperty::TestSimplexParallel);
ret.set(ConeProperty::TestLibNormaliz);
+ ret.set(ConeProperty::NoEmptyOutput);
ret.set(ConeProperty::NoDescent);
ret.set(ConeProperty::Descent);
ret.set(ConeProperty::NoGradingDenom);
@@ -185,6 +188,7 @@
ret.set(ConeProperty::MinimizePolyEquations);
ret.set(ConeProperty::DistributedComp);
ret.set(ConeProperty::UseModularGrading);
+ ret.set(ConeProperty::ExploitAutomsVectors);
return ret;
}
@@ -283,6 +287,7 @@
ConeProperties copy(*this);
copy = copy.goals();
copy.reset(ConeProperty::HilbertBasis);
+ // copy.reset(ConeProperty::ExtremeRays);
copy.reset(ConeProperty::IsIntegrallyClosed);
copy.reset(ConeProperty::IsSerreR1);
copy.reset(ConeProperty::Multiplicity);
@@ -321,6 +326,39 @@
}
}
+void ConeProperties::preconditions_and_check_series_goals(){
+
+ // OnlyCyclotomicHilbSer ==> NoQuasiPolynomial
+ if(CPs.test(ConeProperty::OnlyCyclotomicHilbSer))
+ CPs.set(ConeProperty::NoQuasiPolynomial);
+
+ // HilbertQuasiPolynomial ==> HilbertSeries
+ if (CPs.test(ConeProperty::HilbertQuasiPolynomial))
+ CPs.set(ConeProperty::HilbertSeries);
+
+ // EhrhartQuasiPolynomial ==> EhrhartSeries
+ if (CPs.test(ConeProperty::EhrhartQuasiPolynomial))
+ CPs.set(ConeProperty::EhrhartSeries);
+
+ // WeightedEhrhartQuasiPolynomial ==> WeightedEhrhartSeries
+ if (CPs.test(ConeProperty::WeightedEhrhartQuasiPolynomial))
+ CPs.set(ConeProperty::WeightedEhrhartSeries);
+
+ if (CPs.test(ConeProperty::WeightedEhrhartSeries)) {
+ CPs.set(ConeProperty::BasicStanleyDec);
+ }
+
+ if(CPs.test(ConeProperty::OnlyCyclotomicHilbSer) && CPs.test(ConeProperty::HSOP))
+ throw BadInputException("HSOP not allowed with OnlyCyclotomicHilbSer");
+
+ if( CPs.test(ConeProperty::NoQuasiPolynomial) && (
+ CPs.test(ConeProperty::HilbertQuasiPolynomial) ||
+ CPs.test(ConeProperty::EhrhartQuasiPolynomial) ||
+ CPs.test(ConeProperty::WeightedEhrhartQuasiPolynomial) )
+ )
+ throw BadInputException("Computation of quasipoloynomial excluded by other required variant.");
+}
+
void ConeProperties::check_fusion_ring_props() const{
ConeProperties copy(*this);
copy.reset(ConeProperty::BigInt);
@@ -344,6 +382,7 @@
copy.reset(ConeProperty::MinimizePolyEquations);
copy.reset(ConeProperty::ModularGradings);
copy.reset(ConeProperty::UseModularGrading);
+ copy.reset(ConeProperty::NoEmptyOutput);
if (copy.any()) {
@@ -446,6 +485,20 @@
/* add preconditions */
void ConeProperties::set_preconditions(bool inhomogeneous, bool numberfield) {
+ preconditions_and_check_series_goals();
+
+ // homogeneous && EhrhartSeies ==> HilbertSeries
+ if (CPs.test(ConeProperty::EhrhartSeries) && !inhomogeneous) {
+ CPs.set(ConeProperty::HilbertSeries);
+ CPs.set(ConeProperty::NoGradingDenom);
+ CPs.reset(ConeProperty::EhrhartSeries);
+ }
+
+ if(CPs.test(ConeProperty::NoEmptyOutput) && CPs.test(ConeProperty::FusionRings)){
+ CPs.reset(ConeProperty::FusionRings);
+ CPs.set(ConeProperty::SingleLatticePoint);
+ }
+
if(CPs.test(ConeProperty::NonsimpleFusionRings)){
CPs.set(ConeProperty::FusionRings);
CPs.reset(ConeProperty::NonsimpleFusionRings);
@@ -475,11 +528,6 @@
if(CPs.test(ConeProperty::MaxDegRepresentations))
CPs.set(ConeProperty::Representations);
- if (CPs.test(ConeProperty::ExploitAutomsVectors)) {
- errorOutput() << *this << endl;
- throw BadInputException("At least one of the listed computation goals not yet implemernted");
- }
-
if(CPs.test(ConeProperty::SingleLatticePoint))
CPs.set(ConeProperty::NoGradingDenom);
@@ -509,21 +557,6 @@
CPs.reset(ConeProperty::RenfVolume);
}
- // HilbertQuasipolynomial ==> HilbertSeries
- if (CPs.test(ConeProperty::HilbertQuasiPolynomial))
- CPs.set(ConeProperty::HilbertSeries);
-
- // EhrhartQuasiPolynomial ==> EhrhartSeries
- if (CPs.test(ConeProperty::EhrhartQuasiPolynomial))
- CPs.set(ConeProperty::EhrhartSeries);
-
- // homogeneous && EhrhartSeies ==> HilbertSeries
- if (CPs.test(ConeProperty::EhrhartSeries) && !inhomogeneous) {
- CPs.set(ConeProperty::HilbertSeries);
- CPs.set(ConeProperty::NoGradingDenom);
- CPs.reset(ConeProperty::EhrhartSeries);
- }
-
// EuclideanVolume ==> Volume
if (CPs.test(ConeProperty::EuclideanVolume))
CPs.set(ConeProperty::Volume);
@@ -641,11 +674,6 @@
if (CPs.test(ConeProperty::ExtremeRays))
CPs.set(ConeProperty::SupportHyperplanes);
- /*if (CPs.test(ConeProperty::HSOP) && !inhomogeneous){
- CPs.set(ConeProperty::SupportHyperplanes);
- CPs.set(ConeProperty::HilbertSeries);
- }*/
-
// ModuleGeneratorsOverOriginalMonoid ==> HilbertBasis
if (CPs.test(ConeProperty::ModuleGeneratorsOverOriginalMonoid))
CPs.set(ConeProperty::HilbertBasis);
@@ -690,24 +718,10 @@
if (CPs.test(ConeProperty::Rank))
CPs.set(ConeProperty::Sublattice);
- /* if(CPs.test(ConeProperty::Multiplicity) || CPs.test(ConeProperty::HilbertSeries))
- CPs.set(ConeProperty::SupportHyperplanes); // to meke them computed if Symmetrize is used
- */
-
// we want an ordinary triangulation if one is asked for
if (CPs.test(ConeProperty::BasicTriangulation) && !numberfield)
CPs.set(ConeProperty::NoSubdivision);
- // WeightedEhrhartQuasiPolynomial ==> WeightedEhrhartSeries
- if (CPs.test(ConeProperty::WeightedEhrhartQuasiPolynomial))
- CPs.set(ConeProperty::WeightedEhrhartSeries);
-
- // WeightedEhrhart ==> StanleyDec
- if (CPs.test(ConeProperty::WeightedEhrhartSeries)) {
- // CPs.set(ConeProperty::Multiplicity);
- CPs.set(ConeProperty::BasicStanleyDec);
- }
-
// Volume + Integral ==> NoGradingDenom
if (CPs.test(ConeProperty::Volume) || CPs.test(ConeProperty::Integral)) {
CPs.set(ConeProperty::NoGradingDenom);
@@ -1116,6 +1130,8 @@
CPN.at(ConeProperty::ExploitIsosMult) = "ExploitIsosMult";
CPN.at(ConeProperty::StrictIsoTypeCheck) = "StrictIsoTypeCheck";
CPN.at(ConeProperty::HSOP) = "HSOP";
+ CPN.at(ConeProperty::OnlyCyclotomicHilbSer) = "OnlyCyclotomicHilbSer";
+ CPN.at(ConeProperty::NoQuasiPolynomial) = "NoQuasiPolynomial";
CPN.at(ConeProperty::NoBottomDec) = "NoBottomDec";
CPN.at(ConeProperty::PrimalMode) = "PrimalMode";
CPN.at(ConeProperty::Symmetrize) = "Symmetrize";
@@ -1163,6 +1179,7 @@
CPN.at(ConeProperty::TestLinearAlgebraGMP) = "TestLinearAlgebraGMP";
CPN.at(ConeProperty::TestSimplexParallel) = "TestSimplexParallel";
CPN.at(ConeProperty::TestLibNormaliz) = "TestLibNormaliz";
+ CPN.at(ConeProperty::NoEmptyOutput) = "NoEmptyOutput";
CPN.at(ConeProperty::Descent) = "Descent";
CPN.at(ConeProperty::NoDescent) = "NoDescent";
CPN.at(ConeProperty::NoGradingDenom) = "NoGradingDenom";
@@ -1215,7 +1232,7 @@
CPN.at(ConeProperty::UseModularGrading) = "UseModularGrading";
// detect changes in size of Enum, to remember to update CPN!
- static_assert(ConeProperty::EnumSize == 166,"ConeProperties Enum size does not fit! Update cone_property.cpp!");
+ static_assert(ConeProperty::EnumSize == 169,"ConeProperties Enum size does not fit! Update cone_property.cpp!");
// assert all fields contain an non-empty string
for (size_t i = 0; i < ConeProperty::EnumSize; i++) {
// bstd::cout << "iii " << i << " " << CPN.at(i) << endl;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/cone_property.h normaliz-3.10.5+ds/source/libnormaliz/cone_property.h
--- normaliz-3.10.4+ds/source/libnormaliz/cone_property.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/cone_property.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -239,6 +239,8 @@
NoNestedTri, // synonym for NoSubdivision
KeepOrder,
HSOP,
+ OnlyCyclotomicHilbSer,
+ NoQuasiPolynomial,
NoPeriodBound,
NoLLL,
NoRelax,
@@ -300,6 +302,8 @@
TestLinearAlgebraGMP,
TestSimplexParallel,
TestLibNormaliz,
+ //
+ NoEmptyOutput,
END_ENUM_RANGE(LAST_INTERNAL),
EnumSize // this has to be the last entry, to get the number of entries in the enum
@@ -356,6 +360,8 @@
void set_fusion_default(const bool has_candidate);
void set_fusion_partition_default();
+ void preconditions_and_check_series_goals();
+
void check_conflicting_variants();
void check_conflicting_fusion_variants();
void check_Q_permissible(bool after_implications);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/descent.cpp normaliz-3.10.5+ds/source/libnormaliz/descent.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/descent.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/descent.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -692,7 +692,7 @@
Aut.compute(AutomParam::integral);
vector<vector<key_t> > GenOrbits = Aut.getGensOrbits();
- size_t min_at, min_size;
+ size_t min_at = 0, min_size = 0; //values to make gcc happy
for (size_t i = 0; i < GenOrbits.size(); ++i) {
if (i == 0 || GenOrbits[i].size() < min_size) {
min_size = GenOrbits[i].size();
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/descent.h normaliz-3.10.5+ds/source/libnormaliz/descent.h
--- normaliz-3.10.4+ds/source/libnormaliz/descent.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/descent.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/dynamic_bitset.h normaliz-3.10.5+ds/source/libnormaliz/dynamic_bitset.h
--- normaliz-3.10.4+ds/source/libnormaliz/dynamic_bitset.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/dynamic_bitset.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/face_lattice.cpp normaliz-3.10.5+ds/source/libnormaliz/face_lattice.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/face_lattice.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/face_lattice.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/face_lattice.h normaliz-3.10.5+ds/source/libnormaliz/face_lattice.h
--- normaliz-3.10.4+ds/source/libnormaliz/face_lattice.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/face_lattice.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/full_cone.cpp normaliz-3.10.5+ds/source/libnormaliz/full_cone.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/full_cone.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/full_cone.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -560,7 +560,6 @@
}
//---------------------------------------------------------------------------
-/* not used, but kept
// produces the linear combination needed for a Fourier-Motzkin step
template <typename Integer>
vector<Integer> Full_Cone<Integer>::FM_comb(
@@ -596,7 +595,6 @@
return NewFacet;
}
-*/
//---------------------------------------------------------------------------
@@ -4766,6 +4764,7 @@
template <typename Integer>
void Full_Cone<Integer>::finish_Hilbert_series() {
if (do_h_vector) {
+
Hilbert_Series.setShift(convertToLong(shift));
Hilbert_Series.adjustShift();
// now the shift in the HilbertSeries may change and we would have to adjust
@@ -4821,7 +4820,8 @@
setComputed(ConeProperty::HilbertBasis, true);
}
- if (isComputed(ConeProperty::Grading) && isComputed(ConeProperty::HilbertBasis)) {
+ if (isComputed(ConeProperty::Grading) && isComputed(ConeProperty::HilbertBasis)
+ && !isComputed(ConeProperty::Deg1Elements)) {
select_deg1_elements();
check_deg1_hilbert_basis();
}
@@ -5031,9 +5031,9 @@
//---------------------------------------------------------------------------
-/* deactivated at present
// do computations using automorphisms
+// Niote: exploit_automs_mult is ALWAYS false at present. Done via descent and ExploitIsosMult
template <typename Integer>
void Full_Cone<Integer>::compute_by_automorphisms() {
if ((!exploit_automs_mult && !exploit_automs_vectors) || no_descent_to_facets)
@@ -5047,10 +5047,10 @@
if (autom_codim_vectors < 0) // set default values if not set by Cone
autom_codim_vectors = 1;
- if (autom_codim_mult < 0)
- autom_codim_mult = min((int)dim / 4, 6);
+ /* if (autom_codim_mult < 0)
+ autom_codim_mult = min((int)dim / 4, 6);*/
}
-
+ /*
if (exploit_automs_mult && do_multiplicity) {
if (descent_level < autom_codim_mult && nr_gen >= dim + 4) { // otherwise direct computation
if (inhomogeneous)
@@ -5061,9 +5061,10 @@
setComputed(ConeProperty::ExploitIsosMult);
}
deactivate_completed_tasks();
+ */
if (exploit_automs_vectors && do_Hilbert_basis) {
- if (descent_level < autom_codim_vectors && nr_gen >= dim + 4) { // otherwise direct computation
+ if (descent_level < autom_codim_vectors){ // && nr_gen >= dim + 4) { // otherwise direct computation
compute_HB_via_automs();
}
setComputed(ConeProperty::ExploitAutomsVectors);
@@ -5071,7 +5072,7 @@
deactivate_completed_tasks();
if (exploit_automs_vectors && do_deg1_elements) {
- if (descent_level < God_Father->autom_codim_mult && nr_gen >= dim + 4) { // otherwise direct computation
+ if (descent_level < God_Father->autom_codim_vectors){ // && nr_gen >= dim + 4) { // otherwise direct computation
compute_Deg1_via_automs();
}
setComputed(ConeProperty::ExploitAutomsVectors);
@@ -5079,11 +5080,12 @@
deactivate_completed_tasks();
}
-size_t nr_revlex_simpl = 0;
-*/
/* deactivated at present
+ *
+
+ size_t nr_revlex_simpl = 0;
//---------------------------------------------------------------------------
template <typename Integer>
@@ -5318,7 +5320,7 @@
deactivate_completed_tasks();
}
- // compute_by_automorphisms();
+ compute_by_automorphisms();
deactivate_completed_tasks();
primal_algorithm(); // here plays the music
@@ -5388,7 +5390,7 @@
}
*/
-/* deactivated at present
+
//---------------------------------------------------------------------------
template <typename Integer>
Matrix<Integer> Full_Cone<Integer>::push_supphyps_to_cone_over_facet(const vector<Integer>& fixed_point, const key_t facet_nr) {
@@ -5520,6 +5522,8 @@
//---------------------------------------------------------------------------
template <typename Integer>
void Full_Cone<Integer>::compute_Deg1_via_automs() {
+ do_automorphisms = true;
+ quality_of_automorphisms = AutomParam::integral;
compute_automorphisms(descent_level);
if (!do_deg1_elements || isComputed(ConeProperty::Deg1Elements) || !isComputed(ConeProperty::Automorphisms) ||
@@ -5559,6 +5563,8 @@
//---------------------------------------------------------------------------
template <typename Integer>
void Full_Cone<Integer>::compute_HB_via_automs() {
+ do_automorphisms = true;
+ quality_of_automorphisms = AutomParam::integral;
compute_automorphisms(descent_level);
if (!do_Hilbert_basis || isComputed(ConeProperty::HilbertBasis) || !isComputed(ConeProperty::Automorphisms) ||
@@ -5597,7 +5603,8 @@
union_of_facets.insert(cc);
}
}
- cout << "Union unique size " << union_of_facets.size() << endl;
+ if(verbose)
+ verboseOutput() << "Union unique size " << union_of_facets.size() << endl;
for (const auto& v : union_of_facets)
NewCandidates.push_back(Candidate<Integer>(v, *this));
update_reducers(true); // we always want reduction
@@ -5662,6 +5669,8 @@
}
return facet_keys;
}
+
+/*
//---------------------------------------------------------------------------
template <typename Integer>
void Full_Cone<Integer>::compute_multiplicity_via_automs() {
@@ -5710,18 +5719,17 @@
RecCone.do_multiplicity = true;
RecCone.verbose = verbose;
RecCone.copy_autom_params(*this);
- if (quality_of_automorphisms == AutomParam::ambient) {
+ if (quality_of_automorphisms == AutomParam::ambient_gen) {
RecCone.Embedding = Level0Sub.getEmbeddingMatrix().multiplication(Embedding);
}
RecCone.compute();
multiplicity = RecCone.multiplicity;
setComputed(ConeProperty::Multiplicity);
}
-*/
//---------------------------------------------------------------------------
-/* deactivated at present
+
template <typename Integer>
mpq_class Full_Cone<Integer>::facet_multiplicity(const vector<key_t>& facet_key) {
Matrix<Integer> Facet_Gens = Generators.submatrix(facet_key);
@@ -5746,7 +5754,7 @@
Facet.Mother = &(*this);
Facet.God_Father = God_Father;
Facet.copy_autom_params(*this);
- if (quality_of_automorphisms == AutomParam::ambient) {
+ if (quality_of_automorphisms == AutomParam::ambient_gen) {
Facet.Embedding = Facet_Sub.getEmbeddingMatrix().multiplication(Embedding);
}
Facet.inhomogeneous = inhomogeneous;
@@ -7508,7 +7516,7 @@
pyr_level = -1;
descent_level = 0;
Top_Cone = this;
- // God_Father = this;
+ God_Father = this;
Top_Key.resize(nr_gen);
for (size_t i = 0; i < nr_gen; i++)
Top_Key[i] = static_cast<key_t>(i);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/full_cone.h normaliz-3.10.5+ds/source/libnormaliz/full_cone.h
--- normaliz-3.10.4+ds/source/libnormaliz/full_cone.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/full_cone.h 2025-06-03 11:09:57.000000000 -0400
@@ -270,7 +270,7 @@
Matrix<Integer> Embedding; // temporary solution -- at present used for integration with signed dec
// the absolute top cone in recursive algorithms where faces are evaluated themselves
- // Full_Cone<Integer>* God_Father; // not used at present
+ Full_Cone<Integer>* God_Father; // not used at present
// data relating a pyramid to its ancestors
Full_Cone<Integer>* Top_Cone; // reference to cone on top level relative to pyramid formation
@@ -366,11 +366,11 @@
*/
void number_hyperplane(FACETDATA<Integer>& hyp, const size_t born_at, const size_t mother);
bool is_hyperplane_included(FACETDATA<Integer>& hyp);
- /* vector<Integer> FM_comb(const vector<Integer>& Pos,
+ vector<Integer> FM_comb(const vector<Integer>& Pos,
const Integer& PosVal,
const vector<Integer>& Neg,
const Integer& NegVal,
- bool extract_gcd = true); */
+ bool extract_gcd = true);
void add_hyperplane(const size_t& new_generator,
const FACETDATA<Integer>& positive,
const FACETDATA<Integer>& negative,
@@ -516,8 +516,8 @@
void compute_automorphisms(size_t nr_special_gens = 0);
void compute_by_automorphisms();
- mpq_class facet_multiplicity(const vector<key_t>& facet_key);
- void compute_multiplicity_via_automs();
+ // mpq_class facet_multiplicity(const vector<key_t>& facet_key);
+ // void compute_multiplicity_via_automs();
vector<vector<key_t>> get_facet_keys_for_orbits(const vector<Integer>& fixed_point, bool with_orbit_sizes);
vector<Integer> get_fixed_point(size_t nr_cone_points);
void compute_HB_via_automs();
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/fusion.cpp normaliz-3.10.5+ds/source/libnormaliz/fusion.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/fusion.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/fusion.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -1707,7 +1707,7 @@
set<map<vector<key_t>, Integer> > FusionComp<Integer>::make_associativity_constraints(){
if(libnormaliz::verbose)
- verboseOutput() << "Making accociativity constraints for fusion rings" << endl;
+ verboseOutput() << "Making associativity constraints for fusion rings" << endl;
make_CoordMap();
@@ -1763,7 +1763,7 @@
exit(0); */
if(libnormaliz::verbose)
- verboseOutput() << "Made " << Polys.size() << " accociativity constraints for fusion rings" << endl;
+ verboseOutput() << "Made " << Polys.size() << " associativity constraints for fusion rings" << endl;
return Polys;
}
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/fusion.h normaliz-3.10.5+ds/source/libnormaliz/fusion.h
--- normaliz-3.10.4+ds/source/libnormaliz/fusion.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/fusion.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/general.cpp normaliz-3.10.5+ds/source/libnormaliz/general.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/general.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/general.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -61,10 +61,11 @@
const int default_thread_limit = 8;
int thread_limit = default_thread_limit;
bool parallelization_set = false;
-bool no_output_on_interrupt = false;
+bool output_on_interrupt = false;
bool no_coord_transf = false;
bool write_lp_file = false;
bool save_local_solutions = false;
+bool no_empty_output= false;
// bool test_arithmetic_overflow = false;
// long overflow_test_modulus = 15401;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/general.h normaliz-3.10.5+ds/source/libnormaliz/general.h
--- normaliz-3.10.4+ds/source/libnormaliz/general.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/general.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -118,9 +118,10 @@
NORMALIZ_DLL_EXPORT extern bool int_max_value_dual_long_long_computed;
NORMALIZ_DLL_EXPORT extern bool int_max_value_primary_long_computed;
NORMALIZ_DLL_EXPORT extern bool int_max_value_primary_long_long_computed;
-NORMALIZ_DLL_EXPORT extern bool no_output_on_interrupt;
+NORMALIZ_DLL_EXPORT extern bool output_on_interrupt;
NORMALIZ_DLL_EXPORT extern bool no_coord_transf;
NORMALIZ_DLL_EXPORT extern bool write_lp_file;
+NORMALIZ_DLL_EXPORT extern bool no_empty_output;
#ifdef NMZ_EXTENDED_TESTS
NORMALIZ_DLL_EXPORT extern bool test_arith_overflow_full_cone, test_arith_overflow_dual_mode;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/HilbertSeries.cpp normaliz-3.10.5+ds/source/libnormaliz/HilbertSeries.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/HilbertSeries.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/HilbertSeries.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -301,6 +301,8 @@
nr_coeff_quasipol = -1; // all coefficients
expansion_degree = -1;
period_bounded = true;
+ only_cyclotomic = false;
+ allow_quasipoly = true;
}
// Constructor, creates 0/1
@@ -374,6 +376,32 @@
bool HilbertSeries::get_period_bounded() const {
return period_bounded;
}
+
+void HilbertSeries::set_only_cyclotomic(bool on_off) const{
+ only_cyclotomic = on_off;
+}
+
+bool HilbertSeries::get_only_cyclotomic() const{
+ return only_cyclotomic;
+}
+
+void HilbertSeries::forbid_quasipol(bool on_off) const{
+ allow_quasipoly = !on_off;
+}
+
+bool HilbertSeries::get_quasipol_allowed() const{
+ return allow_quasipoly;
+}
+
+void HilbertSeries::get_variants(const HilbertSeries& mother){
+ set_expansion_degree(mother.get_expansion_degree());
+ set_nr_coeff_quasipol(mother.get_nr_coeff_quasipol());
+ forbid_quasipol(!mother.get_quasipol_allowed());
+ set_only_cyclotomic(mother.get_only_cyclotomic());
+ set_period_bounded(mother.get_period_bounded());
+ //HSOP is extra
+}
+
// add another HilbertSeries to this
void HilbertSeries::add(const vector<num_t>& num, const vector<denom_t>& gen_degrees) {
vector<denom_t> sorted_gd(gen_degrees);
@@ -457,12 +485,31 @@
// simplify, see class description
void HilbertSeries::simplify() const {
+
if (is_simplified)
return;
collectData();
- /* if (verbose) {
+
+ size_t highest_comp = num.size();
+ bool non_zero = false;
+ // First we remove "leading" 0 from the numerator
+ for(size_t i = 0; i < num.size(); ++i){
+ if(num[i] != 0){
+ highest_comp = i;
+ non_zero = true;
+ }
+ }
+ if(non_zero)
+ num.resize(highest_comp + 1);
+ else
+ num.clear();
+
+ computeDegreeAsRationalFunction();
+
+ /*if (verbose) {
verboseOutput() << "Hilbert series before simplification: "<< endl << *this;
- }*/
+ }
+ */
vector<mpz_class> q, r, poly; // polynomials
// In denom_cyclo we collect cyclotomic polynomials in the denominator.
// During this method the Hilbert series is given by num/(denom*cdenom)
@@ -490,7 +537,6 @@
}
if (denom_i == 0)
continue;
-
// decompose (1-t^i) into cyclotomic polynomial
for (long d = 1; d <= i / 2; ++d) {
if (i % d == 0)
@@ -501,6 +547,7 @@
if (denom_i % 2 == 1)
v_scalar_multiplication(num, mpz_class(-1));
} // end for
+
denom.clear();
auto it = cdenom.begin();
@@ -535,13 +582,23 @@
cyclo_num = num;
cyclo_denom = cdenom;
+ period = lcm_of_keys(cdenom);
+
+ if(only_cyclotomic){
+ expansion_degree = -1;
+ nr_coeff_quasipol = 0;
+ num.clear();
+ denom.clear();
+ is_simplified = true;
+ return;
+ }
+
// now collect the cyclotomic polynomials in (1-t^i) factors
it = cdenom.find(1);
if (it != cdenom.end())
- dim = it->second;
+ dim = it->second; // dim = number of occurrences of 1
else
dim = 0;
- period = lcm_of_keys(cdenom);
if (period_bounded && period > 10 * PERIOD_BOUND) {
if (verbose) {
errorOutput() << "WARNING: Period is too big, the representation of the Hilbert series may have more than dimension "
@@ -591,12 +648,11 @@
}
}
is_simplified = true;
- computeDegreeAsRationalFunction();
quasi_poly.clear();
}
void HilbertSeries::computeDegreeAsRationalFunction() const {
- simplify();
+ // simplify();
long num_deg = num.size() - 1 + shift;
long denom_deg = 0;
for (auto& it : denom) {
@@ -638,7 +694,7 @@
}
void HilbertSeries::computeHilbertQuasiPolynomial() const {
- if (isHilbertQuasiPolynomialComputed() || nr_coeff_quasipol == 0)
+ if (isHilbertQuasiPolynomialComputed() || !allow_quasipoly)
return;
simplify();
@@ -889,7 +945,6 @@
denom[d] = 1;
}
-/*
// methods for textual transfer of a Hilbert Series
string HilbertSeries::to_string_rep() const {
collectData();
@@ -954,7 +1009,7 @@
out << " )" << std::endl;
return out;
}
-*/
+
//---------------------------------------------------------------------------
// polynomial operations, for polynomials repr. as vector of coefficients
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/HilbertSeries.h normaliz-3.10.5+ds/source/libnormaliz/HilbertSeries.h
--- normaliz-3.10.4+ds/source/libnormaliz/HilbertSeries.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/HilbertSeries.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -158,10 +158,18 @@
void set_period_bounded(bool on_off) const;
bool get_period_bounded() const;
+ void set_only_cyclotomic(bool on_off) const;
+ bool get_only_cyclotomic() const;
+
+ void forbid_quasipol(bool on_off) const;
+ bool get_quasipol_allowed() const;
+
vector<mpz_class> getExpansion() const;
long get_expansion_degree() const;
void set_expansion_degree(long degree);
+ void get_variants(const HilbertSeries& mother);
+
private:
void initialize();
@@ -189,7 +197,7 @@
// contains the expansion up to the given degree
mutable vector<mpz_class> expansion;
- long expansion_degree;
+ mutable long expansion_degree;
mutable bool is_simplified;
mutable long dim;
@@ -203,6 +211,9 @@
mutable long nr_coeff_quasipol; // limits the computation of coefficients of the computeHilbertQuasiPolynomial
// <0: all coeff, =0: no coeff
+ mutable bool only_cyclotomic;
+ mutable bool allow_quasipoly;
+
bool verbose;
// these are only const when used properly!!
@@ -299,10 +310,10 @@
bool polynomial_is_homogeneous;
mpq_class integral, virtual_multiplicity;
nmz_float euclidean_integral;
+ public:
mutable pair<HilbertSeries, mpz_class> weighted_Ehrhart_series; // the second component holds the common
// denominator of the coefficients in the numerator
- public:
- void setIntegral(const mpq_class I);
+ void setIntegral(const mpq_class I);
void setEuclideanIntegral(const nmz_float I);
void setVirtualMultiplicity(const mpq_class I);
void setWeightedEhrhartSeries(const pair<HilbertSeries, mpz_class>& E);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/induction.cpp normaliz-3.10.5+ds/source/libnormaliz/induction.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/induction.cpp 2024-10-07 06:02:16.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/induction.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -26,6 +26,7 @@
#include "libnormaliz/cone.h"
#include "libnormaliz/induction.h"
+#include "libnormaliz/normaliz_exception.h"
namespace libnormaliz{
using std::vector;
@@ -70,6 +71,8 @@
/* for(auto& T: Tables)
T.debug_print();*/
+ test_commutativity();
+
FPdim = 0;
for(auto& f: fus_type)
FPdim += f*f;
@@ -86,6 +89,7 @@
/* for(auto& T: Tables)
T.debug_print('$'); */
+ // For the computation of eigenvalues and multiplicities
EVMat.resize(fusion_rank, fusion_rank);
for(size_t s =0; s < fusion_rank; ++s){
for(size_t l = 0; l < fusion_rank; ++l){
@@ -101,26 +105,20 @@
}
// EVMat.debug_print();
- MultEV.resize(divisors.size());
-
- size_t sum_mult = 0;
- if(verbose)
- verboseOutput() << "eigenvalues and their multiplicities" << endl;
- for(size_t i = 0; i< divisors.size(); ++i){
- MultEV[i] = EVMat.mult_of_eigenvalue(divisors[i]);
- if(MultEV[i] > 0 && verbose)
- verboseOutput() << divisors[i] << " mult " << MultEV[i] << endl;
- sum_mult += MultEV[i];
+ if(commutative){
+ eigenvalues_and_mult_commutative();
}
-
- if(sum_mult < fusion_rank){
- if(verbose)
- verboseOutput() << "Sum of multiplicities of eigenvalues dividing FPdim < fusion_rank" << endl;
- mult_of_ev_ok = false;
- return;
+ else{
+ eigenvalues_and_mult_noncommutative();
}
- Bounds.resize(fusion_rank, fusion_rank);
+ Bounds.resize(fusion_rank, fusion_rank);
+
+ /* for(size_t s = 0; s < fusion_rank; ++s){
+ for(size_t t = 0; t < fusion_rank; ++t)
+ cout << s << " " << t << " " << N(t,0,s) << " " << endl;
+
+ } */
for(size_t j = 0; j< fusion_rank; ++j){
for(size_t k = 0; k < fusion_rank; ++k){
@@ -145,7 +143,6 @@
if(t == FPdim)
continue;
- LowRepresentations[t].resize(0, fusion_rank);
Matrix<Integer> InhomEqu(1,fusion_rank +1);
for(size_t i = 0; i < fusion_rank; ++i)
InhomEqu[0][i] = fus_type[i];
@@ -158,7 +155,7 @@
Type::inhom_inequalities, NeutralInEqu);
RepCone.setVerbose(false);
Matrix<Integer> Reps = RepCone.getLatticePointsMatrix();
- size_t count_low = 0, count_high = 0;
+ size_t count_high = 0;
for(size_t i = 0; i < Reps.nr_of_rows(); ++i){
bool too_large = false;
for(size_t j = 0; j < fusion_rank; ++j){
@@ -176,10 +173,6 @@
vector<Integer> new_rep = Reps[i];
new_rep.resize(new_rep.size() - 1);
- if(Reps[i][0] == 1){
- LowRepresentations[t].append(new_rep);
- count_low++;
- }
if(Reps[i][0] == 0){
HighRepresentations.append(new_rep);
count_high++;
@@ -187,7 +180,7 @@
}
if(verbose)
- verboseOutput() << "divisor " << t << " has " << count_low <<" low reps and " << count_high << " high" << endl;
+ verboseOutput() << "divisor " << t << " has " << count_high << " high" << " representations" << endl;
// LowRepresentations[t].debug_print('$');
}
@@ -203,6 +196,121 @@
}
+template<typename Integer>
+void Induction<Integer>::test_commutativity(){
+
+ for(size_t i = 0; i < Tables.size(); ++i){
+ for(size_t j = i + 1; j < Tables.size(); ++j){
+ Matrix<Integer> Prod_1 = Tables[i].multiplication(Tables[j]);
+ Matrix<Integer> Prod_2 = Tables[j].multiplication(Tables[i]);
+ if(!Prod_1.equal(Prod_2)){
+ commutative = false;
+ return;
+ }
+ }
+ }
+ commutative = true;
+}
+
+template<typename Integer>
+void Induction<Integer>::eigenvalues_and_mult_commutative(){
+
+ nr_rows_low_part = fusion_rank;
+
+ size_t sum_mult = 0;
+ if(verbose)
+ verboseOutput() << "eigenvalues and their multiplicities in the commutative case" << endl;
+ for(size_t i = 0; i< divisors.size(); ++i){
+ size_t mult_ev = EVMat.mult_of_eigenvalue(divisors[i]);
+ sum_mult += mult_ev;
+ if(mult_ev > 0){
+ EV_mult_n_i[divisors[i]] = make_pair(mult_ev,1);
+ if(verbose){
+ verboseOutput() << divisors[i] << " mult " << EV_mult_n_i[divisors[i]].first << endl;
+ }
+ }
+ }
+ if(sum_mult < fusion_rank){
+ if(verbose)
+ verboseOutput() << "Sum of multiplicities of eigenvalues dividing FPdim < fusion_rank" << endl;
+ mult_of_ev_ok = false;
+ }
+}
+
+
+template<typename Integer>
+void Induction<Integer>::eigenvalues_and_mult_noncommutative(){
+
+ if(fusion_rank > 8){
+ throw BadInputException("Fusion rank must be <= 8 for induction matrices in the noncommutative case!");
+ }
+
+ nr_rows_low_part = fusion_rank -3;
+
+ // First we must compute the eigenvalues and multiplicities .
+ // Later on they can be distributed in pairs (d_i, n_i)
+ // where the eigenvalue is n_id_i and the problem that we may havre
+ // n_id_i = n_jd_j for i != j.
+ map<Integer,size_t> MultEV_raw;
+ set<Integer> already_tested;
+ size_t sum_mult = 0;
+
+ for(int i = 1; i <= fusion_rank; ++i){
+ for(size_t j = 0; j < divisors.size(); ++j){
+ Integer ev_cand = i*divisors[j];
+ if(already_tested.find(ev_cand) != already_tested.end())
+ continue;
+ size_t mult_ev = EVMat.mult_of_eigenvalue(ev_cand);
+ if(mult_ev > 0)
+ sum_mult+= mult_ev;
+ if(mult_ev > 0){
+ MultEV_raw[ev_cand] = mult_ev;
+ }
+ already_tested.insert(ev_cand);
+ }
+ }
+
+ if(verbose){
+ verboseOutput() << "Eigenvalues and their multiplicities" << endl;
+ for(auto& mult_this: MultEV_raw){
+ verboseOutput() << mult_this.first << " multiplicity " << mult_this.second << endl;
+ }
+ }
+
+ if(sum_mult < fusion_rank){
+ if(verbose)
+ verboseOutput() << "Sum of multiplicities of eigenvalues dividing FPdim < fusion_rank" << endl;
+ mult_of_ev_ok = false;
+ return;
+ }
+
+ // now we want to identify the pairs (n_i, d_i) from their products n_id=i = n_jd_j
+ // we do it only in case rank <= 8 where there is a unique solution: n_i = 2 for exactly
+ // one i:
+ // identify n_id_i of multiplicity >= 4
+ for(auto& ev_x_mult: MultEV_raw){
+ if(ev_x_mult.second < 4){
+ EV_mult_n_i[ev_x_mult.first] = make_pair(ev_x_mult.second,1);
+ }
+ if(ev_x_mult.second >= 4){
+ Integer codeg = ev_x_mult.first/2;
+ EV_mult_n_i[codeg] =make_pair(1, 2);
+
+ size_t k = ev_x_mult.second - 4;
+ if(k > 0)
+ EV_mult_n_i[ev_x_mult.first] = make_pair(k,1);
+ }
+ }
+
+ if(verbose){
+ verboseOutput() << "codegrees with dim of iorreducibles and multiplicities" << endl;
+ for(auto& codeg_mult: EV_mult_n_i){
+ verboseOutput() << codeg_mult.first << " mult " << codeg_mult.second.first << " dim irred " << codeg_mult.second.second << endl;
+ }
+ }
+
+}
+
template<>
Induction<renf_elem_class>::Induction(const vector<renf_elem_class>& fus_type, const vector<key_t>& fus_duality , const vector<renf_elem_class>& FusRing, bool verbose){
@@ -215,35 +323,94 @@
}
template<typename Integer>
-void Induction<Integer>::start_low_parts(){
+void Induction<Integer>::solve_system_low_parts(){
+
+ // foirst row and first column are fixed
+ Matrix<Integer> our_equs(0,(nr_rows_low_part -1)*(fusion_rank-1) + 1); // +1 for rhs
+
+ // make row equations
+ for(size_t i = 0; i < nr_rows_low_part -1; ++i){
+ vector<Integer> this_equ((nr_rows_low_part -1)*(fusion_rank-1));
+ for(size_t j = 0; j < fusion_rank -1; ++j){
+ this_equ[i*(fusion_rank -1) +j] = fusion_type[j+1];
+ }
+ // note: entry in first column is n_i
+ this_equ.push_back(-low_m[i+1].first +low_m[i+1].second);
+ our_equs.append(this_equ);
+ }
+
+ // make column equations
+ for(size_t j = 0; j < fusion_rank - 1; ++j){
+ vector<Integer> this_equ((nr_rows_low_part -1)*(fusion_rank-1));
+ for(size_t i = 0; i < nr_rows_low_part - 1; ++i){
+ this_equ[j + i*(fusion_rank -1)] = low_m[i+1].second; // ?????????
+ }
+ this_equ.push_back(- Bounds[0][j + 1]); // right hand side
+ our_equs.append(this_equ);
+ }
+
+ // cout << "RRR " << our_equs.nr_of_rows() << endl;
+ // cout << "CCC " << our_equs.nr_of_columns() << endl;
+
+ // our_equs.debug_print('E');
+
+ Cone<Integer> LP(Type::inhom_equations, our_equs);
+ LP.setVerbose(false);
+ Matrix<Integer> LowPartsRaw = LP.getLatticePointsMatrix();
+ // LowPartsRaw.debug_print('#');
+
+ for(size_t iii = 0; iii < LowPartsRaw.nr_of_rows(); iii++){
+ Matrix<Integer> our_low_part(nr_rows_low_part, fusion_rank);
+ for(size_t i = 0; i < our_low_part.nr_of_rows(); ++i){
+ our_low_part[i][0] = low_m[i].second;
+ }
+ for(size_t i = 1; i < our_low_part.nr_of_rows(); ++i){
+ for(size_t j = 1; j < our_low_part.nr_of_columns(); ++j){
+ our_low_part[i][j] = LowPartsRaw[iii][(i-1)*(fusion_rank - 1)+ j-1];
+ }
+ }
+ // our_low_part.debug_print('L');
+ LowParts.push_back(our_low_part);
+ }
+}
+
+template<typename Integer>
+void Induction<Integer>::build_low_parts(){
if(!mult_of_ev_ok)
return;
if(verbose)
- verboseOutput() << "Computing low parts (rows 1,...,r before sorting)" << endl;
+ verboseOutput() << "Computing low parts (rows 1,...,s before sorting)" << endl;
- vector<Integer> EV;
- for(size_t i = 0; i < divisors.size(); ++i){
- for(size_t j = 0; j < MultEV[i]; ++j)
- EV.push_back(divisors[i]);
- }
- for(auto& t: EV)
- low_m.push_back(FPdim / t);
- sort(low_m.begin(), low_m.end());
+ // Very first we repeat the data accirding to their multiplicities
+ // in second.first and don't need the multiplicities anymore
- if(verbose){
- size_t upperbound = 1;
- for(size_t i = 0; i < fusion_rank; ++i)
- upperbound *= LowRepresentations[low_m[i]].nr_of_rows();
- verboseOutput() << "Number of low parts <= " << upperbound << endl;
+ vector<pair<Integer, size_t> > EV_n_i;
+
+ for(auto& EV_mult: EV_mult_n_i){
+ for(size_t j = 0; j < EV_mult.second.first; ++j){
+ EV_n_i.push_back(make_pair(EV_mult.first, EV_mult.second.second));
+ // cout << EV_mult.first << " " << EV_mult.second.second << endl;
+ }
}
+ // First we want to replace eigenvalues by codegrees
+ // Note: eigenvalue n_if_i by f_i si9nce we want m_i = FPdim/f_i
- Matrix<Integer> matrix_so_far(0, fusion_rank);
- Matrix<Integer> bounds_so_far(fusion_rank, fusion_rank);
- build_low_matrices(matrix_so_far, bounds_so_far);
+ // convert the n_i to Integer because they are used as such in the following
+ for(auto& t: EV_n_i){
+ Integer dummy = convertTo<Integer>(static_cast<long long>(t.second));
+ low_m.push_back(make_pair(FPdim / t.first, dummy));
+ // cout << "m " << FPdim / t.first << " mult " << dummy << endl;
+ }
+ sort(low_m.begin(), low_m.end());
+
+ solve_system_low_parts();
+
+ // Low parts may come with permuted rows. We select those with
+ // ordered rows
vector<Matrix<Integer> > OrderedLowParts;
for(auto& M: LowParts){
/* for(size_t i = 0; i < fusion_rank; ++i)
@@ -252,7 +419,7 @@
// M.debug_print('C');
bool ordered = true;
for(size_t i = 0; i < M.nr_of_rows() - 1; ++i){
- if(low_m[i] == low_m[i+1]){
+ if(low_m[i].first == low_m[i+1].first){
if(M[i] > M[i+1]){
// cout << "ord " << i << " " << low_m[i] << " " << low_m[i+1] << endl;
ordered = false;
@@ -268,64 +435,18 @@
// cout << "Old " << LowParts.size() << " New " << OrderedLowParts.size() << endl;
swap(LowParts, OrderedLowParts);
- /* if(verbose)
- verboseOutput() << "Found " << LowParts.size() << " low parts" << endl;*/
+ if(verbose)
+ verboseOutput() << "Found " << LowParts.size() << " low parts" << endl;
- /* for(auto& M: LowParts)
- M.debug_print('P'); */
+ if(verbose){
+ for(auto& M: LowParts)
+ M.debug_print('P');
+ }
/* for(auto& M: LowPartsBounds)
M.debug_print('&'); */
}
-
-template<typename Integer>
-void Induction<Integer>::build_low_matrices(Matrix<Integer> matrix_so_far, Matrix<Integer> bounds_so_far){
-
- key_t step = matrix_so_far.nr_of_rows();
-
- Integer m_step = low_m[step];
- for(size_t i = 0; i < LowRepresentations[m_step].nr_of_rows(); ++i){
-
- INTERRUPT_COMPUTATION_BY_EXCEPTION
-
- Matrix<Integer> NewMatrix = matrix_so_far;
-
- vector<Integer> cand_extension = LowRepresentations[m_step][i];
- bool potential_low_part = true;
-
- Matrix<Integer> check_bounds = bounds_so_far;
-
- for(size_t j = 0; j < fusion_rank; ++j){
- for(size_t k = j; k < fusion_rank; ++k){
- check_bounds[j][k] += cand_extension[j] * cand_extension[k];
- if(check_bounds[j][k] > Bounds[j][k]){
- potential_low_part = false;
- break;
- }
- if(!potential_low_part)
- break;
- }
- }
-
- if(!potential_low_part)
- continue;
- NewMatrix.append(cand_extension);
-
- if(NewMatrix.nr_of_rows() == fusion_rank){
- /* if(verbose && LowParts.size() % 10000 == 0 && LowParts.size() > 0)
- verboseOutput() << LowParts.size() << " low parts" << endl;
- LowParts.push_back(NewMatrix);*/
-
- from_low_to_full(NewMatrix);
- continue;
- }
-
- build_low_matrices(NewMatrix, check_bounds);
- }
-}
-
-
template<typename Integer>
Matrix<Integer> Induction<Integer>::make_allowed_transpositions(Matrix<Integer> FusionMap){
@@ -358,21 +479,24 @@
}
template<typename Integer>
-void Induction<Integer>::from_low_to_full(const Matrix<Integer>& ThisLowPart){
+void Induction<Integer>::from_low_to_full(){
if(!mult_of_ev_ok)
return;
if(verbose)
- verboseOutput() << "Extending low part to full induction matrices" << endl;
+ verboseOutput() << "Extending low parts to full induction matrices" << endl;
+
+ //First we compute the contribution of the low part to the conditions for induction matrices
+ for(auto& ThisLowPart: LowParts){
- Integer FPdim_so_far =0;
- for(size_t j = 0; j < fusion_rank; ++j)
- FPdim_so_far += low_m[j] * low_m[j];
+ Integer FPdim_so_far =0;
+ for(size_t j = 0; j < nr_rows_low_part; ++j)
+ FPdim_so_far += low_m[j].first * low_m[j].first;
- Integer MinusOne = -1;
+ Integer MinusOne = -1;
INTERRUPT_COMPUTATION_BY_EXCEPTION
@@ -380,9 +504,11 @@
// LowPartsBounds[iii].debug_print('B');
Matrix<Integer> MinusLowBound(fusion_rank, fusion_rank);
- for(size_t i = 0; i< fusion_rank; ++i){
+ for(size_t i = 0; i< nr_rows_low_part; ++i){
vector<Integer> cand_extension = ThisLowPart[i];
+ // cout << "cccc " << cand_extension.size() << endl;
for(size_t j = 0; j < fusion_rank; ++j){
+ // cout << "j " << j << endl;
for(size_t k = j; k < fusion_rank; ++k){
MinusLowBound[j][k] += cand_extension[j] * cand_extension[k];
}
@@ -392,6 +518,9 @@
// Bounds.debug_print();
+ // Now the conditions for the high part
+ // Remaining: the difference between whe goal and the contribution of the low part
+
Matrix<Integer> Remaining = Bounds.add(MinusLowBound);
// Remaining.debug_print('R');
@@ -404,7 +533,7 @@
for(size_t k = j; k < fusion_rank; ++k){
vector<Integer> this_equ;
for(size_t i = 0; i < HighRepresentations.nr_of_rows(); ++i){
- this_equ.push_back(HighRepresentations[i][j] * HighRepresentations[i][k]);
+ this_equ.push_back(HighRepresentations[i][j] * HighRepresentations[i][k]);
}
this_equ.push_back(-Remaining[j][k]);
// cout << j << " " << k << " " << "ttt " << this_equ;
@@ -412,6 +541,8 @@
}
}
+ // now the eruation for the FPdim of the center
+
vector<Integer> this_equ;
for(size_t i = 0; i < HighRepresentations.nr_of_rows(); ++i){
Integer m_new = v_scalar_product(HighRepresentations[i], fusion_type);
@@ -423,7 +554,7 @@
// InhomEqu.debug_print('&');
- // we use inequalitiesqualities to avoid coordinate transformation
+ // we use inequalities to avoid coordinate transformation
Matrix<Integer> Copy = InhomEqu;
Copy.scalar_multiplication(MinusOne);
InhomEqu.append(Copy);
@@ -434,6 +565,8 @@
C.compute(ConeProperty::HilbertBasis, ConeProperty::Projection);
Matrix<Integer> LP = C.getLatticePointsMatrix();
+ // LP.debug_print('P');
+
if(talkative && LP.nr_of_rows() == 0)
verboseOutput() << "N" << endl;
@@ -450,11 +583,13 @@
}
InductionMatrices.push_back(IndMat);
- if(verbose)
+ /*if(verbose){
IndMat.debug_print('I');
- if(talkative)
- verboseOutput() << "I" << endl;
+ verboseOutput() << endl;
+ }*/
}
+
+ }
}
template<typename Integer>
@@ -514,53 +649,11 @@
if(!mult_of_ev_ok)
return;
- start_low_parts();
+ build_low_parts();
+ from_low_to_full();
augment_induction_matrices();
}
-/* Not used anamore
-template<typename Integer>
-void Induction<Integer>::extend_matrix(Matrix<Integer> matrix_so_far, key_t rep_index,
- Matrix<Integer> bounds_so_far, Integer FPdim_so_far){
-
- if(rep_index >= HighRepresentations.nr_of_rows())
- return;
-
- vector<Integer> cand_ext = HighRepresentations[rep_index];
- Integer new_m = v_scalar_product(cand_ext, fusion_type);
-
- while(true){
-
- extend_matrix(matrix_so_far, rep_index +1, bounds_so_far, FPdim_so_far);
- FPdim_so_far += new_m* new_m;
- if(FPdim_so_far > FPSquare){
- return;
- }
- bool potential_solution = true;
- if(FPdim_so_far < FPSquare)
- potential_solution = false;
-
- for(size_t j = 0; j < fusion_rank; ++j){
- for(size_t k = j; k < fusion_rank; ++k){
- bounds_so_far[j][k] += cand_ext[j] * cand_ext[k];
- if(bounds_so_far[j][k] > Bounds[j][k]){
- return;
- }
- if(bounds_so_far[j][k] < Bounds[j][k])
- potential_solution = false;
- }
- }
- matrix_so_far.append(cand_ext);
-
- if(potential_solution){
- InductionMatrices.push_back(matrix_so_far);
- // matrix_so_far.debug_print('$');
- return;
- }
-
- }
-}
-*/
template class Induction<mpz_class>;
template class Induction<long long>;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/induction.h normaliz-3.10.5+ds/source/libnormaliz/induction.h
--- normaliz-3.10.4+ds/source/libnormaliz/induction.h 2024-10-07 06:02:16.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/induction.h 2025-06-03 11:09:57.000000000 -0400
@@ -26,6 +26,7 @@
#include <vector>
#include <list>
+#include <utility>
#include "libnormaliz/general.h"
#include "libnormaliz/matrix.h"
@@ -44,6 +45,7 @@
bool verbose;
bool mult_of_ev_ok;
+ bool commutative;
Matrix<Integer> F;
@@ -62,30 +64,39 @@
vector<Matrix<Integer> > Tables;
vector<Integer> divisors;
- vector<size_t> MultEV;
+ // In the next line the first size_t is the multiplicity, the second the n_i
+ map<Integer,pair<size_t, size_t> > EV_mult_n_i;
Matrix<Integer> EVMat;
- vector<Integer> low_m; // the m_i for i < r
+ // first: the m_i for i < s = number of irreducible presentations
+ // second: the dimensions of the irreducibles as an Integer
+ vector<pair<Integer, Integer> > low_m;
vector<Matrix<Integer> > InductionMatrices;
vector<Matrix<Integer> > LowParts;
// vector<Matrix<Integer> > LowPartsBounds;
size_t iupper_bound;
-
+ size_t nr_rows_low_part; // = number of irreducibles
Integer N(const key_t i, const key_t j, const key_t k);
- map< Integer, Matrix<Integer > > LowRepresentations; // F_ij for i <= r (counting from 1), F_i1 = 1
+ // map< Integer, Matrix<Integer > > LowRepresentations; // F_ij for i <= r (counting from 1), F_i1 = 1
Matrix<Integer > HighRepresentations; // F_ij for i > 1 (counting from 1), F_i1 = 0
Matrix<Integer> Bounds;
Induction();
Induction(const vector<Integer>& fus_type, const vector<key_t>& fus_duality , const vector<Integer>& FusRing, bool verb);
- void start_low_parts();
- void build_low_matrices(Matrix<Integer> matrix_so_far, Matrix<Integer> bounds_so_far);
- void from_low_to_full(const Matrix<Integer>& ThisLowPart);
+ void test_commutativity();
+
+ void eigenvalues_and_mult_commutative();
+ void eigenvalues_and_mult_noncommutative();
+
+ // void start_low_parts();
+ void build_low_parts();
+ void solve_system_low_parts();
+ void from_low_to_full();
void augment_induction_matrices();
Matrix<Integer> make_allowed_transpositions(Matrix<Integer> FusionMap);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/input.cpp normaliz-3.10.5+ds/source/libnormaliz/input.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/input.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/input.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -1024,8 +1024,8 @@
options.activateNoMatricesOutput();
continue;
}
- if (type_string == "NoOutputOnInterrupt") {
- options.activateNoOutputOnInterrupt();
+ if (type_string == "OutputOnInterrupt") {
+ options.activateOutputOnInterrupt();
continue;
}
if (type_string == "NoSuppHypsOutput") {
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/input.h normaliz-3.10.5+ds/source/libnormaliz/input.h
--- normaliz-3.10.4+ds/source/libnormaliz/input.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/input.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/input_type.h normaliz-3.10.5+ds/source/libnormaliz/input_type.h
--- normaliz-3.10.4+ds/source/libnormaliz/input_type.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/input_type.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/integer.h normaliz-3.10.5+ds/source/libnormaliz/integer.h
--- normaliz-3.10.4+ds/source/libnormaliz/integer.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/integer.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/lattice_ideal.cpp normaliz-3.10.5+ds/source/libnormaliz/lattice_ideal.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/lattice_ideal.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/lattice_ideal.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -91,7 +91,7 @@
MarkovProjectAndLift::MarkovProjectAndLift(Matrix<Integer>& LatticeIdeal, const bool verb){
verbose = verb;
- degree_bound = -1;
+ // degree_bound = -1;
// cout << "Given lattice ideal in Laurent polynomial ring" << endl;
// LatticeIdeal.pretty_print(cout);
@@ -340,50 +340,19 @@
binomial_list gr(CurrentMarkov);
gr.set_verbose(verbose);
bool graph_success;
- if(degree_bound >= 0){
- gr.set_grading(grading);
- gr.set_degree_bound(degree_bound);
- }
- else{
+ // if(degree_bound >= 0){
+ // gr.set_grading(grading);
+ // gr.set_degree_bound(degree_bound); // only by selection now
+ // }
+ // else{
gr.set_grading(LiftedWeight);
- }
+ // }
binomial_list min_markov = gr.graph_minimize(graph_success);
if(!graph_success){
min_markov = gr.bb_and_minimize(LiftedWeight);
}
MinimalMarkov = min_markov.to_matrix();
- /*binomial_list min_markovGB = gr.bb_and_minimizeGB(LiftedWeight);
- Matrix<long long> MinimalMarkovGB(0, LiftedWeight.size());
- MinimalMarkovGB = min_markovGB.to_matrix();
- cout << "CCCCCCCCCCCC " << min_markov.size() << " GGGGGGGGGG " << min_markovGB.size() << endl;
-
- vector<long long> OurDegrees;
- for(size_t i = 0; i< MinimalMarkov.nr_of_rows(); ++i){
- OurDegrees.push_back(pos_degree(MinimalMarkov[i], LiftedWeight));
- }
- map<long long, size_t> DegMap = count_in_map<long long, size_t>(OurDegrees);
- cout << "Grading " << LiftedWeight;
- cout << "CCCCCC " << DegMap;
- cout << endl;
-
- vector<long long> OurDegreesGB;
- for(size_t i = 0; i< MinimalMarkovGB.nr_of_rows(); ++i){
- OurDegreesGB.push_back(pos_degree(MinimalMarkovGB[i], LiftedWeight));
- };
- map<long long, size_t> DegMapGB = count_in_map<long long, size_t>(OurDegreesGB);
- cout << "GGGGGG " << DegMapGB;
- cout << endl;
-
- cout << endl << "CCCCCC " << DegMap.size() << " GGGGGG " << DegMapGB.size() << endl;
-
- for(auto& D: DegMap){
- if(D.second != DegMapGB[D.first])
- cout << D.first << " " << D.second << " ------ " << DegMapGB[D.first] << endl;
- }
-
- cout << endl << "=========================================================" << endl;*/
-
if(verbose)
verboseOutput() << "Size of minimal Markov basis " << MinimalMarkov.nr_of_rows() << endl;
@@ -578,14 +547,17 @@
swap(MinimalMarkov, MinMark);
}
+/*
void MarkovProjectAndLift::set_degree_bound(const long deg_bound) {
assert(grading.size() > 0);
degree_bound = deg_bound;
}
+
void MarkovProjectAndLift::set_grading(const vector<long long>& grad) {
grading = grad;
}
+*/
//---------------------------------------------------------------
// lattice ideal
@@ -634,17 +606,23 @@
Matrix<Integer> LatticeIdeal::getMarkovBasis(){
if(!isComputed(ConeProperty::MarkovBasis))
compute(ConeProperty::MarkovBasis);
- /* vector<long long> OurDegrees;
+ vector<long long> OurDegrees;
for(size_t i = 0; i< MinimalMarkov.nr_of_rows(); ++i){
OurDegrees.push_back(pos_degree(MinimalMarkov[i], Grading));
}
- map<long long, size_t> DegMap;
- cout << "Grading " << Grading;
- cout << "GGGG " << count_in_map<long long, size_t>(OurDegrees);
- */
+ if(verbose){
+ map<long long, size_t> DegMap = count_in_map<long long, size_t>(OurDegrees);
+ verboseOutput() << "Grading " << Grading;
+ verboseOutput() << "Degrees in minimal Markovbasis " << DegMap;
+ verboseOutput() << "---------------------------------------------------" << endl;
+ }
+
if(MinimalMarkov.nr_of_rows() >0 ){
if(degree_bound >= 0 || min_degree >= 0){
sort_by_pos_degree(MinimalMarkov, Grading);
+ if(verbose){
+ verboseOutput() << "Selecting max deg " << degree_bound << " min deg " << min_degree << endl;
+ }
return select_by_degree(MinimalMarkov, Grading, degree_bound, min_degree);
}
else
@@ -673,11 +651,15 @@
void LatticeIdeal::computeMarkov(){
+ // cout << "IIIIIIIIIIIIIIII " << OurInput.nr_of_rows() << endl;
+ // OurInput.debug_print();
+
MarkovProjectAndLift PandL(OurInput, verbose);
- if(Grading.size() > 0 && degree_bound != -1){
- PandL.set_grading(Grading);
- PandL.set_degree_bound(degree_bound);
- }
+ // if(Grading.size() > 0 && degree_bound != -1){
+ // PandL.set_grading(Grading);
+ // cout << "BBBBBBBBBBBBB " << degree_bound << endl;
+ //PandL.set_degree_bound(degree_bound);
+ // }
PandL.compute(Markov, MinimalMarkov);
if(MinimalMarkov.nr_of_rows() > 0){
is_positively_graded = true;
@@ -740,7 +722,7 @@
verboseOutput()<<"---------------------------------------------------" << endl;
}
-void LatticeIdeal::computeHilbertSeries(){
+void LatticeIdeal::computeHilbertSeries(const ConeProperties& ToCompute){
assert(degree_bound == -1);
assert(Grading.size() > 0);
@@ -751,7 +733,18 @@
vector<mpz_class> numerator = bl_HilbertSeries.compute_HilbertSeries(Grading);
vector<long> Grading_long;
convert(Grading_long, Grading);
+ long save_nr_coeff_quasipol = HilbSer.get_nr_coeff_quasipol();
+ long save_expansion_degree = HilbSer.get_expansion_degree();
HilbSer = HilbertSeries(numerator, Grading_long);
+ HilbSer.set_expansion_degree(save_expansion_degree);
+ HilbSer.set_nr_coeff_quasipol(save_nr_coeff_quasipol);
+ if(ToCompute.test(ConeProperty::OnlyCyclotomicHilbSer)){
+ HilbSer.set_only_cyclotomic(true);
+ HilbSer.forbid_quasipol(true);
+ }
+ if(ToCompute.test(ConeProperty::NoQuasiPolynomial)){
+ HilbSer.forbid_quasipol(true);
+ }
HilbSer.simplify();
/* if(verbose){
verboseOutput() << "Hilbert series numerator " << HilbSer.getNum();
@@ -792,7 +785,7 @@
}
if(ToCompute.test(ConeProperty::HilbertSeries)){
- computeHilbertSeries();
+ computeHilbertSeries(ToCompute);
setComputed(ConeProperty::HilbertSeries);
ToCompute.reset(is_Computed);
}
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/lattice_ideal.h normaliz-3.10.5+ds/source/libnormaliz/lattice_ideal.h
--- normaliz-3.10.4+ds/source/libnormaliz/lattice_ideal.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/lattice_ideal.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -48,8 +48,18 @@
MarkovProjectAndLift(Matrix<Integer>& LatticeIdeal, const bool verb);
void compute(Matrix<long long>& Mark, Matrix<long long>& MinMark);
- void set_degree_bound(const long deg_bound);
- void set_grading(const vector<long long>& grad);
+
+ // The grading and the degree bound were introduced for tze minimization of
+ // Markov bases. This is at present disabled in favor of selecting
+ // tte elements that satisfy the bound from the full minimal
+ // Markov basis in lattice_ideal.cpp.
+ // Reason: the components of the grading would have to be
+ // permuted along with the components of the binomials. This
+ // had been forgotten and has not been implemented now. There is
+ // no essentail loss as many examples show.
+
+ // void set_degree_bound(const long deg_bound);
+ // void set_grading(const vector<long long>& grad);
private:
bool verbose;
@@ -57,8 +67,8 @@
size_t rank;
size_t nr_vars;
- long degree_bound;
- vector<long long> grading;
+ // long degree_bound;
+ // vector<long long> grading;
Matrix<Integer> LattiiceIdealInput; // the original argument from the constructor (witout any reordering)
Matrix<Integer> LatticeBasis; // as computed by row echelon reduce
@@ -75,7 +85,6 @@
Matrix<Integer> MinimalMarkov;
vector<Integer> CurrentWeight; // used for Buchberger
vector<Integer> LiftedWeight; // same as CurrentWeight, but with last coordinate
- vector<Integer> PreComputedFinalGrading; // to check positively graded a priori
libnormaliz::dynamic_bitset CurrentSatturationSupport; // for tail criterion
bool CurrentOrder; // true for revles, false for kex
@@ -120,11 +129,11 @@
void set_min_degree(const long deg);
void set_gb_weight(const vector<long long>& given_weight);
+ libnormaliz::HilbertSeries HilbSer;
private:
ConeProperties is_Computed;
- libnormaliz::HilbertSeries HilbSer;
Matrix<long long> OurInput;
vector<long long> Grading;
Matrix<long long> Markov; // the full MarkovBasis which is a GB for some monomial order
@@ -133,7 +142,7 @@
void computeMarkov();
void computeGroebner(ConeProperties ToCompute);
- void computeHilbertSeries();
+ void computeHilbertSeries(const ConeProperties& ToCompute);
bool is_positively_graded;
bool verbose;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/libnormaliz.h normaliz-3.10.5+ds/source/libnormaliz/libnormaliz.h
--- normaliz-3.10.4+ds/source/libnormaliz/libnormaliz.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/libnormaliz.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/list_and_map_operations.h normaliz-3.10.5+ds/source/libnormaliz/list_and_map_operations.h
--- normaliz-3.10.4+ds/source/libnormaliz/list_and_map_operations.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/list_and_map_operations.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/matrix.cpp normaliz-3.10.5+ds/source/libnormaliz/matrix.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/matrix.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/matrix.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1869,7 +1869,7 @@
assert(corner < nr);
renf_elem_class d, u, w, z, v;
for (size_t j = corner + 1; j < nc; ++j) {
- d = elem[corner][corner], elem[corner]; // ext_gcd(elem[corner][corner],elem[corner][j],u,v);
+ d = elem[corner][corner]; // elem[corner]; // ext_gcd(elem[corner][corner],elem[corner][j],u,v);
u = 1;
v = 0;
w = -elem[corner][j] / d;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_hash.cpp normaliz-3.10.5+ds/source/libnormaliz/nmz_hash.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_hash.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_hash.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,7 +1,7 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_hash.h normaliz-3.10.5+ds/source/libnormaliz/nmz_hash.h
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_hash.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_hash.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_integral.cpp normaliz-3.10.5+ds/source/libnormaliz/nmz_integral.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_integral.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_integral.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -861,7 +861,7 @@
vector<long> denomDeg = denom2degrees(H.denom);
libnormaliz::HilbertSeries HS(HCoeff3, count_in_map<long, long>(denomDeg));
- HS.simplify();
+ // HS.simplify();
return (HS);
}
@@ -878,8 +878,8 @@
vector<SIMPLINEXDATA_INT>& inExSimplData) {
size_t dim = S.key.size();
vector<key_type> key = S.key;
- for (size_t i = 0; i < dim; ++i)
- key[i];
+ // for (size_t i = 0; i < dim; ++i)
+ // key[i];
dynamic_bitset intersection(dim), Excluded(dim);
@@ -1288,9 +1288,11 @@
mpz_class commonDen; // common denominator of coefficients of numerator of H
libnormaliz::HilbertSeries HS(nmzHilbertSeries(HRat, commonDen));
- HS.set_nr_coeff_quasipol(C.getIntData().getWeightedEhrhartSeries().first.get_nr_coeff_quasipol());
+ HS.get_variants(C.getIntData().getWeightedEhrhartSeries().first);
+ HS.simplify();
+ /* HS.set_nr_coeff_quasipol(C.getIntData().getWeightedEhrhartSeries().first.get_nr_coeff_quasipol());
HS.set_expansion_degree(C.getIntData().getWeightedEhrhartSeries().first.get_expansion_degree());
- HS.set_period_bounded(C.getIntData().getWeightedEhrhartSeries().first.get_period_bounded());
+ HS.set_period_bounded(C.getIntData().getWeightedEhrhartSeries().first.get_period_bounded()); */
C.getIntData().setWeightedEhrhartSeries(make_pair(HS, commonDen));
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_integrate.h normaliz-3.10.5+ds/source/libnormaliz/nmz_integrate.h
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_integrate.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_integrate.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_nauty.cpp normaliz-3.10.5+ds/source/libnormaliz/nmz_nauty.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_nauty.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_nauty.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_nauty.h normaliz-3.10.5+ds/source/libnormaliz/nmz_nauty.h
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_nauty.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_nauty.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_polynomial.cpp normaliz-3.10.5+ds/source/libnormaliz/nmz_polynomial.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_polynomial.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_polynomial.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/nmz_polynomial.h normaliz-3.10.5+ds/source/libnormaliz/nmz_polynomial.h
--- normaliz-3.10.4+ds/source/libnormaliz/nmz_polynomial.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/nmz_polynomial.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/normaliz_exception.h normaliz-3.10.5+ds/source/libnormaliz/normaliz_exception.h
--- normaliz-3.10.4+ds/source/libnormaliz/normaliz_exception.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/normaliz_exception.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/options.cpp normaliz-3.10.5+ds/source/libnormaliz/options.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/options.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/options.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -32,7 +32,7 @@
using std::ifstream;
static void printCopying() {
- cout << "Copyright (C) 2007-2022 The Normaliz Team, University of Osnabrueck." << endl
+ cout << "Copyright (C) 2007-2025 The Normaliz Team, University of Osnabrueck." << endl
<< "This program comes with ABSOLUTELY NO WARRANTY; This is free software," << endl
<< "and you are welcome to redistribute it under certain conditions;" << endl
<< "See COPYING for details." << endl;
@@ -437,8 +437,8 @@
no_matrices_output = true;
continue;
}
- if (LongOption == "NoOutputOnInterrupt") {
- no_output_on_interrupt = true;
+ if (LongOption == "OutputOnInterrupt" || LongOption == "OOI") {
+ output_on_interrupt = true;
continue;
}
if (LongOption == "NoHilbertBasisOutput") {
@@ -457,6 +457,11 @@
write_all_files = true;
continue;
}
+ if(LongOption == "NoEmptyOutput"){
+ to_compute.set(ConeProperty::NoEmptyOutput);
+ no_empty_output = true;
+ continue;
+ }
if(LongOption == "UWP"){
to_compute.set(ConeProperty::UseWeightsPatching);
continue;
@@ -472,7 +477,6 @@
if(LongOption == "DCM"){
to_compute.set(ConeProperty::DistributedComp);
continue;
-
}
if(LongOption == "NHM"){
to_compute.set(ConeProperty::NoHeuristicMinimization);
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/options.h normaliz-3.10.5+ds/source/libnormaliz/options.h
--- normaliz-3.10.4+ds/source/libnormaliz/options.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/options.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -97,9 +97,9 @@
if (!ignoreInFileOpt)
no_matrices_output = true;
}
- inline void activateNoOutputOnInterrupt() {
+ inline void activateOutputOnInterrupt() {
if (!ignoreInFileOpt)
- no_output_on_interrupt = true;
+ output_on_interrupt = true;
}
@@ -154,8 +154,8 @@
inline bool isBinomialsPacked() const {
return binomials_packed;
}
- inline bool isNoOutputOnInterrupt() const {
- return no_output_on_interrupt;
+ inline bool isOutputOnInterrupt() const {
+ return output_on_interrupt;
}
inline bool isNoMatricesOutput() const {
return no_matrices_output;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/output.cpp normaliz-3.10.5+ds/source/libnormaliz/output.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/output.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/output.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -811,17 +811,17 @@
inv << "integer number_vertices_polyhedron = " << Result->getNrVerticesOfPolyhedron() << endl;
}
if (Result->isComputed(ConeProperty::MarkovBasis)) {
- inv << "integer number_markov_basis_elemrnts = " << Result->getNrMarkovBasis() << endl;
+ inv << "integer number_markov_basis_elements = " << Result->getNrMarkovBasis() << endl;
}
if (Result->isComputed(ConeProperty::GroebnerBasis)) {
- inv << "integer number_groebner_basis_elemrnts = " << Result->getNrGroebnerBasis() << endl;
+ inv << "integer number_groebner_basis_elements = " << Result->getNrGroebnerBasis() << endl;
}
if (Result->isComputed(ConeProperty::Representations)) {
inv << "integer number_representations = " << Result->getNrRepresentations() << endl;
vector<key_t> KeyForOutput = Result-> getHilbertBasisKey();
for(size_t i = 0; i < KeyForOutput.size(); ++i)
KeyForOutput[i]++;
- inv << "vector " << KeyForOutput.size() << "hilbert_basis_key = "
+ inv << "vector " << KeyForOutput.size() << " hilbert_basis_key = "
<< KeyForOutput << endl;
}
if (Result->isComputed(ConeProperty::ExtremeRays)) {
@@ -908,13 +908,11 @@
inv << "vector " << Result->getAxesScaling().size() << " axes_scaling " << Result->getAxesScaling();
if (Result->isComputed(ConeProperty::Grading) == false) {
if (Result->isComputed(ConeProperty::ExtremeRays)) {
- inv << "boolean graded = "
- << "false" << endl;
+ inv << "boolean graded = " << "false" << endl;
}
}
else {
- inv << "boolean graded = "
- << "true" << endl;
+ inv << "boolean graded = " << "true" << endl;
if (!Result->isComputed(ConeProperty::Dehomogenization) && Result->isComputed(ConeProperty::NumberLatticePoints)) {
inv << "integer degree_1_elements = " << Result->getNumberLatticePoints() << endl;
}
@@ -925,19 +923,29 @@
}
inv << endl;
inv << "integer grading_denom = " << Result->getGradingDenom() << endl;
- if (Result->isComputed(ConeProperty::Multiplicity)) {
- mpq_class mult = Result->getMultiplicity();
- inv << "integer multiplicity = " << mult.get_num() << endl;
- inv << "integer multiplicity_denom = " << mult.get_den() << endl;
- }
- if (Result->isComputed(ConeProperty::Volume) && !using_renf<Integer>()) {
- mpq_class vol = Result->getVolume();
- inv << "integer volume = " << vol.get_num() << endl;
- inv << "integer volume_denom = " << vol.get_den() << endl;
- }
- if (Result->isComputed(ConeProperty::WeightedEhrhartSeries)) {
- const HilbertSeries& HS = Result->getIntData().getWeightedEhrhartSeries().first;
+ }
+ if (Result->isComputed(ConeProperty::Multiplicity)) {
+ mpq_class mult = Result->getMultiplicity();
+ inv << "integer multiplicity_num = " << mult.get_num() << endl;
+ inv << "integer multiplicity_denom = " << mult.get_den() << endl;
+ }
+ if (Result->isComputed(ConeProperty::Volume) && !using_renf<Integer>()) {
+ mpq_class vol = Result->getVolume();
+ inv << "integer volume_num = " << vol.get_num() << endl;
+ inv << "integer volume_denom = " << vol.get_den() << endl;
+ }
+ if (Result->isComputed(ConeProperty::WeightedEhrhartSeries)) {
+ const HilbertSeries& HS = Result->getIntData().getWeightedEhrhartSeries().first;
+
+ vector<mpz_class> HSCyclonum = HS.getCyclotomicNum();
+ vector<denom_t> HSCyclodenom = to_vector(HS.getCyclotomicDenom());
+
+ inv << "vector " << HSCyclonum.size() << " weighted_ehrhart_series_cyclo_num = ";
+ inv << HSCyclonum;
+ inv << "vector " << HSCyclodenom.size() << " weighted_ehrhart_series_cyclo_denom = ";
+ inv << HSCyclodenom;
+ if(!HS.get_only_cyclotomic()){
inv << "vector " << HS.getNum().size() << " weighted_ehrhart_series_num = " << HS.getNum();
inv << "integer num_common_denom = " << Result->getIntData().getWeightedEhrhartSeries().second << endl;
inv << "vector " << to_vector(HS.getDenom()).size()
@@ -959,30 +967,38 @@
inv << "integer expansion_coeff_common_denom = " << Result->getIntData().getWeightedEhrhartSeries().second
<< endl;
}
- }
+ } // cyclonomic
+ }
- if (Result->isComputed(ConeProperty::VirtualMultiplicity)) {
- mpq_class mult = Result->getVirtualMultiplicity();
- inv << "integer virtual_multiplicity = " << mult.get_num() << endl;
- inv << "integer virtual_multiplicity_denom = " << mult.get_den() << endl;
+ if (Result->isComputed(ConeProperty::VirtualMultiplicity)) {
+ mpq_class mult = Result->getVirtualMultiplicity();
+ inv << "integer virtual_multiplicity_num = " << mult.get_num() << endl;
+ inv << "integer virtual_multiplicity_denom = " << mult.get_den() << endl;
+ }
+ if (Result->isComputed(ConeProperty::Integral)) {
+ mpq_class mult = Result->getIntegral();
+ inv << "integer integral_num = " << mult.get_num() << endl;
+ inv << "integer integral_denom = " << mult.get_den() << endl;
+ }
+ if (Result->isComputed(ConeProperty::HilbertSeries)) {
+ const HilbertSeries& HS = Result->getHilbertSeries();
+ vector<mpz_class> HSnum;
+ vector<denom_t> HSdenom;
+ vector<mpz_class> HSCyclonum = HS.getCyclotomicNum();
+ vector<denom_t> HSCyclodenom = to_vector(HS.getCyclotomicDenom());
+ if (Result->isComputed(ConeProperty::HSOP)) {
+ HSnum = HS.getHSOPNum();
+ HSdenom = to_vector(HS.getHSOPDenom());
}
- if (Result->isComputed(ConeProperty::Integral)) {
- mpq_class mult = Result->getIntegral();
- inv << "integer integral = " << mult.get_num() << endl;
- inv << "integer integral_denom = " << mult.get_den() << endl;
+ else {
+ HSnum = HS.getNum();
+ HSdenom = to_vector(HS.getDenom());
}
- if (Result->isComputed(ConeProperty::HilbertSeries)) {
- const HilbertSeries& HS = Result->getHilbertSeries();
- vector<mpz_class> HSnum;
- vector<denom_t> HSdenom;
- if (Result->isComputed(ConeProperty::HSOP)) {
- HSnum = HS.getHSOPNum();
- HSdenom = to_vector(HS.getHSOPDenom());
- }
- else {
- HSnum = HS.getNum();
- HSdenom = to_vector(HS.getDenom());
- }
+ inv << "vector " << HSCyclonum.size() << " hilbert_series_cyclo_num = ";
+ inv << HSCyclonum;
+ inv << "vector " << HSCyclodenom.size() << " hilbert_series_cyclo_denom = ";
+ inv << HSCyclodenom;
+ if(!HS.get_only_cyclotomic()){
inv << "vector " << HSnum.size() << " hilbert_series_num = ";
inv << HSnum;
inv << "vector " << HSdenom.size() << " hilbert_series_denom = ";
@@ -1002,7 +1018,8 @@
inv << "vector Hilbert_series_expansion " << expansion.size() << " = " << expansion;
}
}
- }
+ } // cyclotomic
+
if (Result->isComputed(ConeProperty::IsReesPrimary)) {
if (Result->isReesPrimary()) {
inv << "boolean primary = true" << endl;
@@ -1048,19 +1065,37 @@
template <typename Integer>
void Output<Integer>::writeWeightedEhrhartSeries(ofstream& out) const {
HilbertSeries HS = Result->getIntData().getWeightedEhrhartSeries().first;
- out << "Weighted Ehrhart series:" << endl;
- vector<mpz_class> num(HS.getNum());
- for (const auto& i : num)
- out << i << " ";
- out << endl << "Common denominator of coefficients: ";
- out << Result->getIntData().getWeightedEhrhartSeries().second << endl;
- map<long, long> HS_Denom = HS.getDenom();
- long nr_factors = 0;
- for (const auto& it : HS_Denom) {
- nr_factors += it.second;
+
+ // vector<mpz_class> HS_Num;
+ map<long, long> HS_Denom;
+ bool only_cyclotomic = HS.get_only_cyclotomic();
+ bool no_quasipol = !HS.get_quasipol_allowed();
+ long period = HS.getPeriod();
+
+ bool write_series = !only_cyclotomic;
+ bool write_cyclo = only_cyclotomic;
+ bool write_polynomial = !only_cyclotomic && period == 1 && (HS_Denom.size() == 0 || HS_Denom.begin()->first == (long)HS_Denom.size());
+ bool write_quasi_pol = !write_polynomial;
+ write_polynomial &= !no_quasipol;
+ write_cyclo = write_cyclo || !write_polynomial;
+ write_polynomial &= !no_quasipol;
+ write_quasi_pol &= !no_quasipol;
+
+ if(write_series){
+ out << "Weighted Ehrhart series:" << endl;
+ vector<mpz_class> num(HS.getNum());
+ for (const auto& i : num)
+ out << i << " ";
+ out << endl << "Common denominator of coefficients: ";
+ out << Result->getIntData().getWeightedEhrhartSeries().second << endl;
+ map<long, long> HS_Denom = HS.getDenom();
+ long nr_factors = 0;
+ for (const auto& it : HS_Denom) {
+ nr_factors += it.second;
+ }
+ out << "Series denominator with " << nr_factors << " factors:" << endl;
+ out << HS.getDenom();
}
- out << "Series denominator with " << nr_factors << " factors:" << endl;
- out << HS.getDenom();
if (HS.getShift() != 0) {
out << "shift = " << HS.getShift() << endl << endl;
}
@@ -1076,19 +1111,26 @@
out << endl;
}
- long period = HS.getPeriod();
- if (period == 1) {
- out << "Weighted Ehrhart polynomial:" << endl;
- for (const auto& i : HS.getHilbertQuasiPolynomial()[0])
- out << i << " ";
- out << endl;
- out << "with common denominator = ";
- out << HS.getHilbertQuasiPolynomialDenom() * Result->getIntData().getNumeratorCommonDenom();
+ if(write_polynomial){
+ if (period == 1) {
+ out << "Weighted Ehrhart polynomial:" << endl;
+ for (const auto& i : HS.getHilbertQuasiPolynomial()[0])
+ out << i << " ";
+ out << endl;
+ out << "with common denominator = ";
+ out << HS.getHilbertQuasiPolynomialDenom() * Result->getIntData().getNumeratorCommonDenom() << endl << endl;
+
+ long deg = HS.getHilbertQuasiPolynomial()[0].size() - 1;
+ out << "Degree of (quasi)polynomial: " << deg << endl;
+
+ long virtDeg = Result->getRank() + Result->getIntData().getDegreeOfPolynomial() - 1;
+ out << endl << "Expected degree = " << virtDeg << endl;
+ }
}
- else {
+ if(write_cyclo) {
// output cyclonomic representation
out << "Weighted Ehrhart series with cyclotomic denominator:" << endl;
- num = HS.getCyclotomicNum();
+ vector<mpz_class> num = HS.getCyclotomicNum();
for (const auto& i : num)
out << i << " ";
out << endl << "Common denominator of coefficients = ";
@@ -1096,6 +1138,8 @@
out << "Series cyclotomic denominator:" << endl;
out << HS.getCyclotomicDenom();
out << endl;
+ }
+ if(write_quasi_pol){
// Weighted Ehrhart quasi-polynomial
// vector< vector<mpz_class> > hilbert_quasi_poly = HS.getHilbertQuasiPolynomial();
if (HS.isHilbertQuasiPolynomialComputed()) {
@@ -1106,21 +1150,19 @@
}
Matrix<mpz_class> HQP(HS.getHilbertQuasiPolynomial());
HQP.pretty_print(out, true);
- out << "with common denominator: " << Result->getIntData().getWeightedEhrhartQuasiPolynomialDenom() << endl;
- }
- else {
- out << "Weighted Ehrhart quasi-polynomial has period " << period << endl;
- }
- }
+ out << "with common denominator: " << Result->getIntData().getWeightedEhrhartQuasiPolynomialDenom() << endl << endl;
- out << endl << endl;
+ long deg = HS.getHilbertQuasiPolynomial()[0].size() - 1;
+ out << "Degree of (quasi)polynomial: " << deg << endl;
- if (HS.isHilbertQuasiPolynomialComputed()) {
- long deg = HS.getHilbertQuasiPolynomial()[0].size() - 1;
- out << "Degree of (quasi)polynomial: " << deg << endl;
+ long virtDeg = Result->getRank() + Result->getIntData().getDegreeOfPolynomial() - 1;
+ out << endl << "Expected degree = " << virtDeg << endl;
+ }
+ else{
+ out << "Weighted Ehrhart quasi-polynomial has period " << period << endl;
+ }
- long virtDeg = Result->getRank() + Result->getIntData().getDegreeOfPolynomial() - 1;
- out << endl << "Expected degree = " << virtDeg << endl;
+ out << endl;
}
if (Result->isComputed(ConeProperty::VirtualMultiplicity)) {
@@ -1128,7 +1170,7 @@
if (Result->isComputed(ConeProperty::FixedPrecision))
virtual_mult_string += " (fixed precision)";
virtual_mult_string += " = ";
- out << endl << virtual_mult_string;
+ out <<endl << virtual_mult_string;
out << Result->getIntData().getVirtualMultiplicity() << endl;
if (Result->getIntData().getVirtualMultiplicity().get_den() != 1)
out << "Virtual multiplicity (float) = " << std::setprecision(12)
@@ -1143,57 +1185,76 @@
void Output<Integer>::writeSeries(ofstream& out, const HilbertSeries& HS, string HilbertOrEhrhart) const {
vector<mpz_class> HS_Num;
map<long, long> HS_Denom;
- if (Result->isComputed(ConeProperty::HSOP)) {
- HS_Denom = HS.getHSOPDenom();
- HS_Num = HS.getHSOPNum();
- string HSOP;
- if (!HS_Denom.empty()) // we disable the HSOP attribute if the series is a polynomial
- HSOP = " (HSOP)";
- out << HilbertOrEhrhart << "series" << HSOP << ":" << endl << HS_Num;
- }
- else {
- HS_Denom = HS.getDenom();
- HS_Num = HS.getNum();
- out << HilbertOrEhrhart + "series:" << endl << HS_Num;
- }
- long nr_factors = 0;
- for (auto& it : HS_Denom) {
- nr_factors += it.second;
- }
- out << "denominator with " << nr_factors << " factors:" << endl;
- out << HS_Denom;
- out << endl;
- if (HS.getShift() != 0) {
- out << "shift = " << HS.getShift() << endl << endl;
+ bool only_cyclotomic = HS.get_only_cyclotomic();
+ bool no_quasipol = !HS.get_quasipol_allowed();
+ long period = HS.getPeriod();
+
+ bool write_series = !only_cyclotomic;
+ bool write_cyclo = only_cyclotomic;
+ bool write_polynomial = !only_cyclotomic && period == 1 && (HS_Denom.size() == 0 || HS_Denom.begin()->first == (long)HS_Denom.size());
+ bool write_quasi_pol = !write_polynomial;
+ write_cyclo = write_cyclo || write_quasi_pol;
+ write_polynomial &= !no_quasipol;
+ write_quasi_pol &= !no_quasipol;
+
+ if(write_series){
+ if (Result->isComputed(ConeProperty::HSOP)) {
+ HS_Denom = HS.getHSOPDenom();
+ HS_Num = HS.getHSOPNum();
+ string HSOP;
+ if (!HS_Denom.empty()) // we disable the HSOP attribute if the series is a polynomial
+ HSOP = " (HSOP)";
+ out << HilbertOrEhrhart << "series" << HSOP << ":" << endl << HS_Num;
+ }
+ else {
+ HS_Denom = HS.getDenom();
+ HS_Num = HS.getNum();
+ out << HilbertOrEhrhart + "series:" << endl << HS_Num;
+ }
+ long nr_factors = 0;
+ for (auto& it : HS_Denom) {
+ nr_factors += it.second;
+ }
+ out << "denominator with " << nr_factors << " factors:" << endl;
+ out << HS_Denom;
+ out << endl;
+ if (HS.getShift() != 0) {
+ out << "shift = " << HS.getShift() << endl << endl;
+ }
}
out << "degree of " + HilbertOrEhrhart + "Series as rational function = " << HS.getDegreeAsRationalFunction() << endl << endl;
- if (v_is_symmetric(HS_Num)) {
+ if(write_series && v_is_symmetric(HS_Num)) {
out << "The numerator of the " + HilbertOrEhrhart + "series is symmetric." << endl << endl;
}
- if (HS.get_expansion_degree() > -1) {
+ if (write_series && HS.get_expansion_degree() > -1) {
vector<mpz_class> expansion = HS.getExpansion();
out << "Expansion of " + HilbertOrEhrhart + "series" << endl;
for (size_t i = 0; i < expansion.size(); ++i)
out << i + HS.getShift() << ": " << expansion[i] << endl;
out << endl;
}
- long period = HS.getPeriod();
- if (period == 1 && (HS_Denom.size() == 0 || HS_Denom.begin()->first == (long)HS_Denom.size())) {
+ if (write_polynomial) {
out << HilbertOrEhrhart + "polynomial:" << endl;
+ if (HS.get_nr_coeff_quasipol() >= 0) {
+ out << "only " << HS.get_nr_coeff_quasipol() << " highest coefficients computed" << endl;
+ // out << "their common period is " << HS.getHilbertQuasiPolynomial().size() << "" << endl;
+ }
out << HS.getHilbertQuasiPolynomial()[0];
out << "with common denominator = ";
out << HS.getHilbertQuasiPolynomialDenom();
out << endl << endl;
}
- else {
+ if(write_cyclo) {
// output cyclonomic representation
out << HilbertOrEhrhart << "series with cyclotomic denominator:" << endl;
out << HS.getCyclotomicNum();
out << "cyclotomic denominator:" << endl;
out << HS.getCyclotomicDenom();
out << endl;
- // Hilbert quasi-polynomial
+ }
+
+ if(write_quasi_pol){
HS.computeHilbertQuasiPolynomial();
if (HS.isHilbertQuasiPolynomialComputed()) {
out << HilbertOrEhrhart + "quasi-polynomial of period " << period << ":" << endl;
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/output.h normaliz-3.10.5+ds/source/libnormaliz/output.h
--- normaliz-3.10.4+ds/source/libnormaliz/output.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/output.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/project_and_lift.cpp normaliz-3.10.5+ds/source/libnormaliz/project_and_lift.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/project_and_lift.cpp 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/project_and_lift.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -242,7 +242,7 @@
dynamic_bitset sparse_bounds(nr_all_supps);
for(size_t i = 0; i< nr_all_supps; ++i){
- if(upper_bounds[i] /* && Indicator[i].count() <= EmbDim/5*/){ // our criterion for sparseness
+ if(upper_bounds[i] && Indicator[i].count() < EmbDim){ // our criterion for sparseness
union_upper_bounds |= Indicator[i];
sparse_bounds[i] = 1;
}
@@ -252,7 +252,7 @@
if(!sparse){
if(verbose)
- verboseOutput() << "System not sparse" << endl;
+ verboseOutput() << "System not sparse or only 1 patch" << endl;
return;
}
@@ -1058,7 +1058,7 @@
dynamic_bitset test_covered_coords(dim);
dynamic_bitset min_covered_coords(dim);
bool first = true;
- size_t min_at;
+ size_t min_at = 0; //value to make g++ happy
double min_added_weight = 0; // =0 to make gcc happy
for( size_t i = 0; i < covering_equations.size(); ++i){
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/project_and_lift.h normaliz-3.10.5+ds/source/libnormaliz/project_and_lift.h
--- normaliz-3.10.4+ds/source/libnormaliz/project_and_lift.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/project_and_lift.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/reduction.cpp normaliz-3.10.5+ds/source/libnormaliz/reduction.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/reduction.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/reduction.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/reduction.h normaliz-3.10.5+ds/source/libnormaliz/reduction.h
--- normaliz-3.10.4+ds/source/libnormaliz/reduction.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/reduction.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/signed_dec.cpp normaliz-3.10.5+ds/source/libnormaliz/signed_dec.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/signed_dec.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/signed_dec.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -87,7 +87,7 @@
vector<Integer>& NewDegrees,
const Matrix<Integer>& ValuesGeneric,
Matrix<Integer>& NewValues) {
- size_t new_vert;
+ size_t new_vert = 0; // value to make g++ happy
size_t old_place = 0; // this is the place of i in the ascending sequence of generators in Subfacet_start
size_t g = 0;
for (size_t i = 0; i < nr_gen; ++i) {
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/signed_dec.h normaliz-3.10.5+ds/source/libnormaliz/signed_dec.h
--- normaliz-3.10.4+ds/source/libnormaliz/signed_dec.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/signed_dec.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/simplex.cpp normaliz-3.10.5+ds/source/libnormaliz/simplex.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/simplex.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/simplex.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/simplex.h normaliz-3.10.5+ds/source/libnormaliz/simplex.h
--- normaliz-3.10.4+ds/source/libnormaliz/simplex.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/simplex.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/sublattice_representation.cpp normaliz-3.10.5+ds/source/libnormaliz/sublattice_representation.cpp
--- normaliz-3.10.4+ds/source/libnormaliz/sublattice_representation.cpp 2024-10-03 11:05:27.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/sublattice_representation.cpp 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/sublattice_representation.h normaliz-3.10.5+ds/source/libnormaliz/sublattice_representation.h
--- normaliz-3.10.4+ds/source/libnormaliz/sublattice_representation.h 2024-10-03 11:05:33.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/sublattice_representation.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/libnormaliz/vector_operations.h normaliz-3.10.5+ds/source/libnormaliz/vector_operations.h
--- normaliz-3.10.4+ds/source/libnormaliz/vector_operations.h 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/libnormaliz/vector_operations.h 2025-06-03 11:09:57.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
diff -Nru normaliz-3.10.4+ds/source/Makefile.am normaliz-3.10.5+ds/source/Makefile.am
--- normaliz-3.10.4+ds/source/Makefile.am 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/source/Makefile.am 2025-06-03 11:09:57.000000000 -0400
@@ -99,7 +99,7 @@
libnormaliz/simplex.h \
libnormaliz/collection.h
-libnormaliz_la_LDFLAGS = -no-undefined -version-info 13:3:10
+libnormaliz_la_LDFLAGS = -no-undefined -version-info 13:5:10
## Conjecture: x.y.z yields x-z.z.y
#libnormaliz_la_LIBADD = $(GMP_LIBS)
diff -Nru normaliz-3.10.4+ds/source/normaliz.cpp normaliz-3.10.5+ds/source/normaliz.cpp
--- normaliz-3.10.4+ds/source/normaliz.cpp 2024-10-07 06:02:16.000000000 -0400
+++ normaliz-3.10.5+ds/source/normaliz.cpp 2025-06-03 11:10:48.000000000 -0400
@@ -1,6 +1,6 @@
/*
* Normaliz
- * Copyright (C) 2007-2022 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
+ * Copyright (C) 2007-2025 W. Bruns, B. Ichim, Ch. Soeger, U. v. d. Ohe
* This program 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 of the License, or
@@ -436,11 +436,11 @@
cout << endl;
cout << "Computation was interrupted." << endl;
cout << e.what() << endl;
- if(no_output_on_interrupt){
- cout << "No output on interrupt set" << endl;
+ if(!output_on_interrupt){
+ cout << "No output on inmterrupt" << endl;
exit(10);
}
- cout << "Writing only available data." << endl;
+ cout << "Output on interrupt activated. Writing available data." << endl;
}
if(is_split_patching){
@@ -603,6 +603,16 @@
pair<bool, bool> result = test_fusion.data_from_string(global_project, true);
standard_fusion_name = result.first;
only_partition = result.second;
+ if(no_empty_output && standard_fusion_name && only_partition){
+ set<unsigned long> test_dupl;
+ for(auto& t: test_fusion.fusion_type)
+ test_dupl.insert(t);
+ if(test_dupl.size() == test_fusion.fusion_type.size()){
+ only_partition = false;
+ test_fusion.duality = identity_key(test_fusion.fusion_type.size());
+ }
+ }
+
if(!standard_fusion_name){
cerr << "error: Failed to open file " << name_in << "." << endl;
return 1;
@@ -710,7 +720,7 @@
} catch (const TimeBoundException& e) {
cerr << e.what() << endl;
cerr << "Time bound exceeded for " << global_project << " exiting." << endl;
- if(!is_split_patching){
+ if(!is_split_patching && !no_empty_output){
cerr << "Creating signal file with suffix exc" << endl;
string exc_name = options.getProjectName() + ".exc";
ofstream exc_file(exc_name.c_str());
diff -Nru normaliz-3.10.4+ds/test/Makefile.am normaliz-3.10.5+ds/test/Makefile.am
--- normaliz-3.10.4+ds/test/Makefile.am 2024-10-06 05:20:49.000000000 -0400
+++ normaliz-3.10.5+ds/test/Makefile.am 2025-06-03 11:09:57.000000000 -0400
@@ -964,6 +964,18 @@
test-q/lowrank.ref \
test-q/medium.in \
test-q/medium.ref \
+ test-q/mon.in \
+ test-q/mon.ref \
+ test-q/mon_1.in \
+ test-q/mon_1.ref \
+ test-q/mon_2.in \
+ test-q/mon_2.ref \
+ test-q/mon_normal.in \
+ test-q/mon_normal.ref \
+ test-q/mon_normal_1.in \
+ test-q/mon_normal_1.ref \
+ test-q/mon_normal_2.in \
+ test-q/mon_normal_2.ref \
test-q/NonCMDiv.in \
test-q/NonCMDiv.ref \
test-q/notpointed.in \
@@ -1402,6 +1414,12 @@
test-Aut/A443-input.in \
test-Aut/A443-input.ref \
test-Aut/A443-input.aut.ref \
+ test-Aut/B3.in \
+ test-Aut/B3.ref \
+ test-Aut/B3.aut.ref \
+ test-Aut/B3_DEg1.in \
+ test-Aut/B3_DEg1.ref \
+ test-Aut/B3_DEg1.aut.ref \
test-Aut/birkhoff6.in \
test-Aut/birkhoff6.ref \
test-Aut/birkhoff6.aut.ref \
@@ -1486,6 +1504,12 @@
test-nf-Aut/icosahedron_prec_comb.aut.ref \
test-Int/Condorcet-q.in \
test-Int/Condorcet-q.ref \
+ test-Int/Condorcet_1.in \
+ test-Int/Condorcet_1.ref \
+ test-Int/Condorcet_2.in \
+ test-Int/Condorcet_2.ref \
+ test-Int/Condorcet_3.in \
+ test-Int/Condorcet_3.ref \
test-Int/Condorcet-v.in \
test-Int/Condorcet-v.ref \
test-Int/Condorcet-v-sd.in \
@@ -1836,8 +1860,14 @@
test-ind/chosen_1.in \
test-ind/chosen_1.ind.ref \
test-ind/chosen_1.ref \
+ test-ind/noncomm_1.in \
+ test-ind/noncomm_1.ind.ref \
+ test-ind/noncomm_1.ref \
+ test-ind/noncomm_2.in \
+ test-ind/noncomm_2.ind.ref \
+ test-ind/noncomm_2.ref \
test-ind/chosen_2.in \
- test-ind/chosen_2.ind.ref \
+ test-ind/chosen_2.ind.ref \
test-ind/chosen_2.ref
EXTRA_DIST += $(NMZTESTS)
diff -Nru normaliz-3.10.4+ds/test/test-/empty_polyhedron2.ref normaliz-3.10.5+ds/test/test-/empty_polyhedron2.ref
--- normaliz-3.10.4+ds/test/test-/empty_polyhedron2.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/empty_polyhedron2.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-/excl_nonp.ref normaliz-3.10.5+ds/test/test-/excl_nonp.ref
--- normaliz-3.10.4+ds/test/test-/excl_nonp.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/excl_nonp.ref 2025-06-03 11:09:57.000000000 -0400
@@ -26,11 +26,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-/excl.ref normaliz-3.10.5+ds/test/test-/excl.ref
--- normaliz-3.10.4+ds/test/test-/excl.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/excl.ref 2025-06-03 11:09:57.000000000 -0400
@@ -23,11 +23,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-/excl_unb.ref normaliz-3.10.5+ds/test/test-/excl_unb.ref
--- normaliz-3.10.4+ds/test/test-/excl_unb.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/excl_unb.ref 2025-06-03 11:09:57.000000000 -0400
@@ -26,11 +26,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-/n_6_infeas.ref normaliz-3.10.5+ds/test/test-/n_6_infeas.ref
--- normaliz-3.10.4+ds/test/test-/n_6_infeas.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/n_6_infeas.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-/zero_polyhedron.ref normaliz-3.10.5+ds/test/test-/zero_polyhedron.ref
--- normaliz-3.10.4+ds/test/test-/zero_polyhedron.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-/zero_polyhedron.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3.aut.ref normaliz-3.10.5+ds/test/test-Aut/B3.aut.ref
--- normaliz-3.10.4+ds/test/test-Aut/B3.aut.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3.aut.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,41 @@
+Integral automorphism group of order 96 (possibly approximation if very large)
+Automorphisms are integral
+************************************************************************
+3 permutations of 48 extreme rays
+
+Perm 1: 1 7 8 27 26 25 2 3 14 15 11 30 13 9 10 29 28 18 37 33 32 45 44 43 6 5 4 17 16 12 31 21 20 39 40 36 19 38 34 35 46 47 24 23 22 41 42 48
+Perm 2: 2 1 7 9 13 14 3 18 4 19 20 22 5 6 21 23 24 8 10 11 15 12 16 17 32 33 37 34 38 39 41 25 26 28 43 44 27 29 30 45 31 46 35 36 40 42 48 47
+Perm 3: 4 5 6 1 2 3 19 20 38 39 40 26 34 35 36 25 32 21 7 8 18 27 37 33 16 12 22 31 41 42 28 17 24 13 14 15 23 9 10 11 29 30 46 47 48 43 44 45
+
+Cycle decompositions
+
+Perm 1: (2 7) (3 8) (4 27) (5 26) (6 25) (9 14) (10 15) (12 30) (16 29) (17 28) (19 37) (20 33) (21 32) (22 45) (23 44) (24 43) (34 39) (35 40) (41 46) (42 47) --
+Perm 2: (1 2) (3 7) (4 9) (5 13) (6 14) (8 18) (10 19) (11 20) (12 22) (15 21) (16 23) (17 24) (25 32) (26 33) (27 37) (28 34) (29 38) (30 39) (31 41) (35 43) (36 44) (40 45) (42 46) (47 48) --
+Perm 3: (1 4) (2 5) (3 6) (7 19) (8 20) (9 38) (10 39) (11 40) (12 26) (13 34) (14 35) (15 36) (16 25) (17 32) (18 21) (22 27) (23 37) (24 33) (28 31) (29 41) (30 42) (43 46) (44 47) (45 48) --
+
+1 orbits of extreme rays
+
+Orbit 1 , length 48: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
+
+************************************************************************
+3 permutations of 82 support hyperplanes
+
+Perm 1: 1 32 7 31 78 77 3 24 74 41 38 37 40 39 63 17 16 18 19 68 27 30 29 8 28 57 21 25 23 22 4 2 36 34 35 33 12 11 14 13 10 73 70 69 72 71 50 48 49 47 81 79 61 60 58 62 26 55 75 54 53 56 15 64 65 67 66 20 44 43 46 45 42 9 59 80 6 5 52 76 51 82
+Perm 2: 15 11 3 12 8 7 6 5 9 13 2 4 10 14 1 64 63 65 67 66 24 35 37 21 38 27 26 51 54 53 52 55 33 39 22 40 23 25 34 36 41 42 47 49 58 60 43 61 44 50 28 31 30 29 32 57 56 45 62 46 48 59 17 16 18 20 19 82 69 73 79 81 70 74 78 77 76 75 71 80 72 68
+Perm 3: 21 25 3 23 17 6 74 75 76 36 55 41 52 34 15 16 5 22 24 26 1 18 4 19 2 20 56 72 40 53 70 38 46 14 48 10 50 32 44 29 12 71 54 39 51 33 73 35 69 37 45 13 30 43 11 27 63 81 64 79 65 82 57 59 61 78 67 68 49 31 42 28 47 7 8 9 77 66 60 80 58 62
+
+Cycle decompositions
+
+Perm 1: (2 32) (3 7) (4 31) (5 78) (6 77) (8 24) (9 74) (10 41) (11 38) (12 37) (13 40) (14 39) (15 63) (16 17) (20 68) (21 27) (22 30) (23 29) (25 28) (26 57) (33 36) (42 73) (43 70) (44 69) (45 72) (46 71) (47 50) (51 81) (52 79) (53 61) (54 60) (55 58) (56 62) (59 75) (66 67) (76 80) --
+Perm 2: (1 15) (2 11) (4 12) (5 8) (6 7) (10 13) (16 64) (17 63) (18 65) (19 67) (20 66) (21 24) (22 35) (23 37) (25 38) (26 27) (28 51) (29 54) (30 53) (31 52) (32 55) (34 39) (36 40) (43 47) (44 49) (45 58) (46 60) (48 61) (56 57) (59 62) (68 82) (70 73) (71 79) (72 81) (75 78) (76 77) --
+Perm 3: (1 21) (2 25) (4 23) (5 17) (7 74) (8 75) (9 76) (10 36) (11 55) (12 41) (13 52) (14 34) (18 22) (19 24) (20 26) (27 56) (28 72) (29 40) (30 53) (31 70) (32 38) (33 46) (35 48) (37 50) (39 44) (42 71) (43 54) (45 51) (47 73) (49 69) (57 63) (58 81) (59 64) (60 79) (61 65) (62 82) (66 78) --
+
+6 orbits of support hyperplanes
+
+Orbit 1 , length 24: 4 10 12 13 23 29 31 33 36 37 40 41 42 43 46 47 50 52 54 60 70 71 73 79
+Orbit 2 , length 6: 14 34 39 44 49 69
+Orbit 3 , length 12: 2 11 25 28 32 38 45 51 55 58 72 81
+Orbit 4 , length 8: 18 22 30 35 48 53 61 65
+Orbit 5 , length 24: 1 5 8 15 16 17 19 20 21 24 26 27 56 57 59 62 63 64 66 67 68 75 78 82
+Orbit 6 , length 8: 3 6 7 9 74 76 77 80
+
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.aut.ref normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.aut.ref
--- normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.aut.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.aut.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,41 @@
+Integral automorphism group of order 96 (possibly approximation if very large)
+Automorphisms are integral
+************************************************************************
+3 permutations of 48 extreme rays
+
+Perm 1: 1 7 8 27 26 25 2 3 14 15 11 30 13 9 10 29 28 18 37 33 32 45 44 43 6 5 4 17 16 12 31 21 20 39 40 36 19 38 34 35 46 47 24 23 22 41 42 48
+Perm 2: 2 1 7 9 13 14 3 18 4 19 20 22 5 6 21 23 24 8 10 11 15 12 16 17 32 33 37 34 38 39 41 25 26 28 43 44 27 29 30 45 31 46 35 36 40 42 48 47
+Perm 3: 4 5 6 1 2 3 19 20 38 39 40 26 34 35 36 25 32 21 7 8 18 27 37 33 16 12 22 31 41 42 28 17 24 13 14 15 23 9 10 11 29 30 46 47 48 43 44 45
+
+Cycle decompositions
+
+Perm 1: (2 7) (3 8) (4 27) (5 26) (6 25) (9 14) (10 15) (12 30) (16 29) (17 28) (19 37) (20 33) (21 32) (22 45) (23 44) (24 43) (34 39) (35 40) (41 46) (42 47) --
+Perm 2: (1 2) (3 7) (4 9) (5 13) (6 14) (8 18) (10 19) (11 20) (12 22) (15 21) (16 23) (17 24) (25 32) (26 33) (27 37) (28 34) (29 38) (30 39) (31 41) (35 43) (36 44) (40 45) (42 46) (47 48) --
+Perm 3: (1 4) (2 5) (3 6) (7 19) (8 20) (9 38) (10 39) (11 40) (12 26) (13 34) (14 35) (15 36) (16 25) (17 32) (18 21) (22 27) (23 37) (24 33) (28 31) (29 41) (30 42) (43 46) (44 47) (45 48) --
+
+1 orbits of extreme rays
+
+Orbit 1 , length 48: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
+
+************************************************************************
+3 permutations of 82 support hyperplanes
+
+Perm 1: 1 32 7 31 78 77 3 24 74 41 38 37 40 39 63 17 16 18 19 68 27 30 29 8 28 57 21 25 23 22 4 2 36 34 35 33 12 11 14 13 10 73 70 69 72 71 50 48 49 47 81 79 61 60 58 62 26 55 75 54 53 56 15 64 65 67 66 20 44 43 46 45 42 9 59 80 6 5 52 76 51 82
+Perm 2: 15 11 3 12 8 7 6 5 9 13 2 4 10 14 1 64 63 65 67 66 24 35 37 21 38 27 26 51 54 53 52 55 33 39 22 40 23 25 34 36 41 42 47 49 58 60 43 61 44 50 28 31 30 29 32 57 56 45 62 46 48 59 17 16 18 20 19 82 69 73 79 81 70 74 78 77 76 75 71 80 72 68
+Perm 3: 21 25 3 23 17 6 74 75 76 36 55 41 52 34 15 16 5 22 24 26 1 18 4 19 2 20 56 72 40 53 70 38 46 14 48 10 50 32 44 29 12 71 54 39 51 33 73 35 69 37 45 13 30 43 11 27 63 81 64 79 65 82 57 59 61 78 67 68 49 31 42 28 47 7 8 9 77 66 60 80 58 62
+
+Cycle decompositions
+
+Perm 1: (2 32) (3 7) (4 31) (5 78) (6 77) (8 24) (9 74) (10 41) (11 38) (12 37) (13 40) (14 39) (15 63) (16 17) (20 68) (21 27) (22 30) (23 29) (25 28) (26 57) (33 36) (42 73) (43 70) (44 69) (45 72) (46 71) (47 50) (51 81) (52 79) (53 61) (54 60) (55 58) (56 62) (59 75) (66 67) (76 80) --
+Perm 2: (1 15) (2 11) (4 12) (5 8) (6 7) (10 13) (16 64) (17 63) (18 65) (19 67) (20 66) (21 24) (22 35) (23 37) (25 38) (26 27) (28 51) (29 54) (30 53) (31 52) (32 55) (34 39) (36 40) (43 47) (44 49) (45 58) (46 60) (48 61) (56 57) (59 62) (68 82) (70 73) (71 79) (72 81) (75 78) (76 77) --
+Perm 3: (1 21) (2 25) (4 23) (5 17) (7 74) (8 75) (9 76) (10 36) (11 55) (12 41) (13 52) (14 34) (18 22) (19 24) (20 26) (27 56) (28 72) (29 40) (30 53) (31 70) (32 38) (33 46) (35 48) (37 50) (39 44) (42 71) (43 54) (45 51) (47 73) (49 69) (57 63) (58 81) (59 64) (60 79) (61 65) (62 82) (66 78) --
+
+6 orbits of support hyperplanes
+
+Orbit 1 , length 24: 4 10 12 13 23 29 31 33 36 37 40 41 42 43 46 47 50 52 54 60 70 71 73 79
+Orbit 2 , length 6: 14 34 39 44 49 69
+Orbit 3 , length 12: 2 11 25 28 32 38 45 51 55 58 72 81
+Orbit 4 , length 8: 18 22 30 35 48 53 61 65
+Orbit 5 , length 24: 1 5 8 15 16 17 19 20 21 24 26 27 56 57 59 62 63 64 66 67 68 75 78 82
+Orbit 6 , length 8: 3 6 7 9 74 76 77 80
+
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.in normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.in
--- normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,53 @@
+amb_space 10
+cone_and_lattice 48
+1 1 1 1 1 1 1 1 1 1
+0 1 1 1 1 1 1 1 1 1
+1 0 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 1 1 1
+0 1 0 1 1 1 1 1 1 1
+0 1 1 1 0 1 1 1 1 1
+1 1 0 1 1 0 1 1 1 1
+1 0 1 1 1 0 1 1 1 1
+0 1 1 0 0 1 1 1 1 1
+1 1 0 1 1 0 0 1 1 1
+1 0 1 0 1 0 1 1 1 1
+1 0 1 0 0 1 1 1 1 1
+0 1 0 1 1 1 1 0 1 1
+1 0 0 1 1 0 1 1 1 1
+0 1 1 1 0 1 1 0 1 1
+0 0 1 0 0 1 1 1 1 1
+0 1 0 1 1 1 0 0 1 1
+1 0 0 1 1 0 0 1 1 1
+0 1 1 0 0 1 1 0 1 1
+1 1 0 1 1 0 0 0 1 1
+1 0 1 0 1 0 1 1 0 1
+0 1 0 1 0 1 1 0 1 1
+1 0 1 0 0 1 1 1 0 1
+0 1 0 1 1 0 0 0 1 1
+1 0 1 0 1 0 0 1 0 1
+0 1 0 1 0 1 0 0 1 1
+0 0 1 0 0 1 1 1 0 1
+1 0 0 1 1 0 0 1 0 1
+0 1 1 0 0 1 1 0 0 1
+1 0 1 0 0 0 1 1 0 1
+1 1 0 1 1 0 0 0 0 1
+1 0 0 0 1 0 0 1 0 1
+0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 0 0 1 0 1
+0 1 0 1 1 0 0 0 0 1
+0 1 0 1 0 1 0 0 0 1
+0 0 1 0 0 1 1 0 0 1
+1 0 0 1 1 0 0 0 0 1
+0 1 0 0 0 1 0 0 0 1
+0 0 1 0 0 1 0 0 0 1
+1 0 0 0 1 0 0 0 0 1
+1 0 1 0 0 0 0 0 0 1
+0 1 0 1 0 0 0 0 0 1
+0 0 1 0 0 0 0 0 0 1
+0 1 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 0 1
+ExploitAutomsVectors
+Deg1Elements
+Automorphisms
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.ref normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.ref
--- normaliz-3.10.4+ds/test/test-Aut/B3_DEg1.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3_DEg1.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,203 @@
+48 lattice points in polytope (Hilbert basis elements of degree 1)
+48 extreme rays
+82 support hyperplanes
+
+embedding dimension = 10
+rank = 10 (maximal)
+external index = 1
+internal index = 1
+
+grading:
+0 0 0 0 0 0 0 0 0 1
+
+degrees of extreme rays:
+1:48
+
+Integral automorphism group has order 96 (possibly approximation if very large)
+Automorphisms are integral
+***********************************************************************
+
+48 lattice points in polytope (Hilbert basis elements of degree 1):
+ 0 0 0 0 0 0 0 0 0 1
+ 0 0 1 0 0 0 0 0 0 1
+ 0 0 1 0 0 1 0 0 0 1
+ 0 0 1 0 0 1 1 0 0 1
+ 0 0 1 0 0 1 1 1 0 1
+ 0 0 1 0 0 1 1 1 1 1
+ 0 1 0 0 0 0 0 0 0 1
+ 0 1 0 0 0 1 0 0 0 1
+ 0 1 0 1 0 0 0 0 0 1
+ 0 1 0 1 0 1 0 0 0 1
+ 0 1 0 1 0 1 0 0 1 1
+ 0 1 0 1 0 1 1 0 1 1
+ 0 1 0 1 1 0 0 0 0 1
+ 0 1 0 1 1 0 0 0 1 1
+ 0 1 0 1 1 1 0 0 1 1
+ 0 1 0 1 1 1 1 0 1 1
+ 0 1 0 1 1 1 1 1 1 1
+ 0 1 1 0 0 1 0 0 0 1
+ 0 1 1 0 0 1 1 0 0 1
+ 0 1 1 0 0 1 1 0 1 1
+ 0 1 1 0 0 1 1 1 1 1
+ 0 1 1 1 0 1 1 0 1 1
+ 0 1 1 1 0 1 1 1 1 1
+ 0 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 0 1
+ 1 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1
+ 1 0 0 1 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 1 1 1
+ 1 0 0 1 1 0 1 1 1 1
+ 1 0 1 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 1 1 0 1
+ 1 0 1 0 0 1 1 1 0 1
+ 1 0 1 0 0 1 1 1 1 1
+ 1 0 1 0 1 0 0 1 0 1
+ 1 0 1 0 1 0 1 1 0 1
+ 1 0 1 0 1 0 1 1 1 1
+ 1 0 1 0 1 1 1 1 1 1
+ 1 0 1 1 1 0 1 1 1 1
+ 1 0 1 1 1 1 1 1 1 1
+ 1 1 0 1 1 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1
+ 1 1 0 1 1 0 0 1 1 1
+ 1 1 0 1 1 0 1 1 1 1
+ 1 1 0 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1
+
+48 extreme rays:
+ 0 0 0 0 0 0 0 0 0 1
+ 0 0 1 0 0 0 0 0 0 1
+ 0 0 1 0 0 1 0 0 0 1
+ 0 0 1 0 0 1 1 0 0 1
+ 0 0 1 0 0 1 1 1 0 1
+ 0 0 1 0 0 1 1 1 1 1
+ 0 1 0 0 0 0 0 0 0 1
+ 0 1 0 0 0 1 0 0 0 1
+ 0 1 0 1 0 0 0 0 0 1
+ 0 1 0 1 0 1 0 0 0 1
+ 0 1 0 1 0 1 0 0 1 1
+ 0 1 0 1 0 1 1 0 1 1
+ 0 1 0 1 1 0 0 0 0 1
+ 0 1 0 1 1 0 0 0 1 1
+ 0 1 0 1 1 1 0 0 1 1
+ 0 1 0 1 1 1 1 0 1 1
+ 0 1 0 1 1 1 1 1 1 1
+ 0 1 1 0 0 1 0 0 0 1
+ 0 1 1 0 0 1 1 0 0 1
+ 0 1 1 0 0 1 1 0 1 1
+ 0 1 1 0 0 1 1 1 1 1
+ 0 1 1 1 0 1 1 0 1 1
+ 0 1 1 1 0 1 1 1 1 1
+ 0 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 0 1
+ 1 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1
+ 1 0 0 1 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 1 1 1
+ 1 0 0 1 1 0 1 1 1 1
+ 1 0 1 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 1 1 0 1
+ 1 0 1 0 0 1 1 1 0 1
+ 1 0 1 0 0 1 1 1 1 1
+ 1 0 1 0 1 0 0 1 0 1
+ 1 0 1 0 1 0 1 1 0 1
+ 1 0 1 0 1 0 1 1 1 1
+ 1 0 1 0 1 1 1 1 1 1
+ 1 0 1 1 1 0 1 1 1 1
+ 1 0 1 1 1 1 1 1 1 1
+ 1 1 0 1 1 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1
+ 1 1 0 1 1 0 0 1 1 1
+ 1 1 0 1 1 0 1 1 1 1
+ 1 1 0 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1
+
+82 support hyperplanes:
+ -1 -1 -1 0 1 1 0 0 -1 2
+ -1 -1 0 0 1 0 0 0 0 1
+ -1 -1 0 1 0 -1 1 0 -1 2
+ -1 -1 0 1 0 0 0 0 0 1
+ -1 -1 1 0 1 0 0 -1 1 1
+ -1 -1 1 1 0 0 -1 1 0 1
+ -1 0 -1 -1 1 -1 1 0 0 2
+ -1 0 -1 0 -1 -1 0 1 1 2
+ -1 0 0 -1 1 0 -1 1 1 1
+ -1 0 0 -1 1 0 0 0 0 1
+ -1 0 0 0 0 -1 0 1 0 1
+ -1 0 0 0 0 -1 1 0 0 1
+ -1 0 0 0 0 0 -1 1 0 1
+ -1 0 0 0 0 0 0 0 0 1
+ -1 1 1 0 0 -1 0 1 -1 1
+ 0 -1 -1 -1 0 1 0 -1 1 2
+ 0 -1 -1 0 -1 1 -1 1 0 2
+ 0 -1 -1 0 0 1 0 0 0 1
+ 0 -1 -1 0 1 1 1 0 -1 1
+ 0 -1 -1 1 -1 1 0 1 0 1
+ 0 -1 0 0 -1 -1 1 -1 1 2
+ 0 -1 0 0 0 0 0 -1 1 1
+ 0 -1 0 0 0 0 0 0 0 1
+ 0 -1 0 1 -1 -1 0 -1 1 2
+ 0 -1 0 1 -1 0 0 0 0 1
+ 0 -1 1 0 1 0 -1 -1 1 1
+ 0 0 -1 -1 -1 -1 0 1 1 2
+ 0 0 -1 -1 0 0 0 0 1 1
+ 0 0 -1 -1 0 0 1 0 0 1
+ 0 0 -1 0 -1 0 0 1 0 1
+ 0 0 -1 0 0 0 0 0 0 1
+ 0 0 -1 0 0 0 1 0 -1 1
+ 0 0 0 -1 0 0 -1 0 1 1
+ 0 0 0 -1 0 0 0 0 0 1
+ 0 0 0 0 -1 -1 0 0 1 1
+ 0 0 0 0 -1 0 0 0 0 1
+ 0 0 0 0 0 -1 0 0 0 1
+ 0 0 0 0 0 -1 1 -1 0 1
+ 0 0 0 0 0 0 -1 0 0 1
+ 0 0 0 0 0 0 0 -1 0 1
+ 0 0 0 0 0 0 0 0 -1 1
+ 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 -1 1 0 0
+ 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 1 1 0 0 -1 0
+ 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 1 0 0 1 0 -1 0
+ 0 0 1 0 0 0 -1 0 1 0
+ 0 0 1 0 0 0 0 0 0 0
+ 0 0 1 0 1 0 0 -1 0 0
+ 0 0 1 1 0 0 -1 0 0 0
+ 0 0 1 1 0 0 0 0 -1 0
+ 0 0 1 1 1 1 0 -1 -1 0
+ 0 1 -1 0 -1 0 1 1 -1 1
+ 0 1 0 -1 1 0 0 0 0 0
+ 0 1 0 -1 1 1 0 1 -1 0
+ 0 1 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 1 -1 0
+ 0 1 0 0 1 1 -1 1 -1 0
+ 0 1 1 -1 1 -1 0 -1 0 1
+ 0 1 1 0 -1 -1 -1 0 1 1
+ 0 1 1 0 0 -1 0 0 0 0
+ 0 1 1 0 1 -1 1 -1 0 0
+ 0 1 1 1 0 -1 0 1 -1 0
+ 1 -1 -1 0 0 1 0 -1 1 1
+ 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 -1 0 0
+ 1 0 0 0 0 1 -1 0 0 0
+ 1 0 0 0 0 1 0 -1 0 0
+ 1 0 0 1 -1 0 0 0 0 0
+ 1 0 0 1 -1 0 1 -1 -1 1
+ 1 0 1 0 1 1 0 -1 -1 0
+ 1 0 1 1 -1 1 -1 0 0 0
+ 1 1 -1 -1 0 0 1 -1 0 1
+ 1 1 -1 0 -1 0 0 1 -1 1
+ 1 1 0 -1 0 0 0 0 0 0
+ 1 1 0 -1 0 1 -1 0 1 0
+ 1 1 0 0 -1 0 0 0 0 0
+ 1 1 1 0 -1 -1 0 0 1 0
+
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3.in normaliz-3.10.5+ds/test/test-Aut/B3.in
--- normaliz-3.10.4+ds/test/test-Aut/B3.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,53 @@
+amb_space 10
+cone_and_lattice 48
+1 1 1 1 1 1 1 1 1 1
+0 1 1 1 1 1 1 1 1 1
+1 0 1 1 1 1 1 1 1 1
+1 1 0 1 1 1 1 1 1 1
+1 0 1 0 1 1 1 1 1 1
+0 1 0 1 1 1 1 1 1 1
+0 1 1 1 0 1 1 1 1 1
+1 1 0 1 1 0 1 1 1 1
+1 0 1 1 1 0 1 1 1 1
+0 1 1 0 0 1 1 1 1 1
+1 1 0 1 1 0 0 1 1 1
+1 0 1 0 1 0 1 1 1 1
+1 0 1 0 0 1 1 1 1 1
+0 1 0 1 1 1 1 0 1 1
+1 0 0 1 1 0 1 1 1 1
+0 1 1 1 0 1 1 0 1 1
+0 0 1 0 0 1 1 1 1 1
+0 1 0 1 1 1 0 0 1 1
+1 0 0 1 1 0 0 1 1 1
+0 1 1 0 0 1 1 0 1 1
+1 1 0 1 1 0 0 0 1 1
+1 0 1 0 1 0 1 1 0 1
+0 1 0 1 0 1 1 0 1 1
+1 0 1 0 0 1 1 1 0 1
+0 1 0 1 1 0 0 0 1 1
+1 0 1 0 1 0 0 1 0 1
+0 1 0 1 0 1 0 0 1 1
+0 0 1 0 0 1 1 1 0 1
+1 0 0 1 1 0 0 1 0 1
+0 1 1 0 0 1 1 0 0 1
+1 0 1 0 0 0 1 1 0 1
+1 1 0 1 1 0 0 0 0 1
+1 0 0 0 1 0 0 1 0 1
+0 1 1 0 0 1 0 0 0 1
+1 0 1 0 0 0 0 1 0 1
+0 1 0 1 1 0 0 0 0 1
+0 1 0 1 0 1 0 0 0 1
+0 0 1 0 0 1 1 0 0 1
+1 0 0 1 1 0 0 0 0 1
+0 1 0 0 0 1 0 0 0 1
+0 0 1 0 0 1 0 0 0 1
+1 0 0 0 1 0 0 0 0 1
+1 0 1 0 0 0 0 0 0 1
+0 1 0 1 0 0 0 0 0 1
+0 0 1 0 0 0 0 0 0 1
+0 1 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 0 1
+ExploitAutomsVectors
+HilbertBasis
+Automorphisms
diff -Nru normaliz-3.10.4+ds/test/test-Aut/B3.ref normaliz-3.10.5+ds/test/test-Aut/B3.ref
--- normaliz-3.10.4+ds/test/test-Aut/B3.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Aut/B3.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,209 @@
+48 Hilbert basis elements
+48 lattice points in polytope (Hilbert basis elements of degree 1)
+48 extreme rays
+82 support hyperplanes
+
+embedding dimension = 10
+rank = 10 (maximal)
+external index = 1
+internal index = 1
+original monoid is integrally closed in chosen lattice
+
+grading:
+0 0 0 0 0 0 0 0 0 1
+
+degrees of extreme rays:
+1:48
+
+Hilbert basis elements are of degree 1
+
+Integral automorphism group has order 96 (possibly approximation if very large)
+Automorphisms are integral
+***********************************************************************
+
+48 lattice points in polytope (Hilbert basis elements of degree 1):
+ 0 0 0 0 0 0 0 0 0 1
+ 0 0 1 0 0 0 0 0 0 1
+ 0 0 1 0 0 1 0 0 0 1
+ 0 0 1 0 0 1 1 0 0 1
+ 0 0 1 0 0 1 1 1 0 1
+ 0 0 1 0 0 1 1 1 1 1
+ 0 1 0 0 0 0 0 0 0 1
+ 0 1 0 0 0 1 0 0 0 1
+ 0 1 0 1 0 0 0 0 0 1
+ 0 1 0 1 0 1 0 0 0 1
+ 0 1 0 1 0 1 0 0 1 1
+ 0 1 0 1 0 1 1 0 1 1
+ 0 1 0 1 1 0 0 0 0 1
+ 0 1 0 1 1 0 0 0 1 1
+ 0 1 0 1 1 1 0 0 1 1
+ 0 1 0 1 1 1 1 0 1 1
+ 0 1 0 1 1 1 1 1 1 1
+ 0 1 1 0 0 1 0 0 0 1
+ 0 1 1 0 0 1 1 0 0 1
+ 0 1 1 0 0 1 1 0 1 1
+ 0 1 1 0 0 1 1 1 1 1
+ 0 1 1 1 0 1 1 0 1 1
+ 0 1 1 1 0 1 1 1 1 1
+ 0 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 0 1
+ 1 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1
+ 1 0 0 1 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 1 1 1
+ 1 0 0 1 1 0 1 1 1 1
+ 1 0 1 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 1 1 0 1
+ 1 0 1 0 0 1 1 1 0 1
+ 1 0 1 0 0 1 1 1 1 1
+ 1 0 1 0 1 0 0 1 0 1
+ 1 0 1 0 1 0 1 1 0 1
+ 1 0 1 0 1 0 1 1 1 1
+ 1 0 1 0 1 1 1 1 1 1
+ 1 0 1 1 1 0 1 1 1 1
+ 1 0 1 1 1 1 1 1 1 1
+ 1 1 0 1 1 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1
+ 1 1 0 1 1 0 0 1 1 1
+ 1 1 0 1 1 0 1 1 1 1
+ 1 1 0 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1
+
+0 further Hilbert basis elements of higher degree:
+
+48 extreme rays:
+ 0 0 0 0 0 0 0 0 0 1
+ 0 0 1 0 0 0 0 0 0 1
+ 0 0 1 0 0 1 0 0 0 1
+ 0 0 1 0 0 1 1 0 0 1
+ 0 0 1 0 0 1 1 1 0 1
+ 0 0 1 0 0 1 1 1 1 1
+ 0 1 0 0 0 0 0 0 0 1
+ 0 1 0 0 0 1 0 0 0 1
+ 0 1 0 1 0 0 0 0 0 1
+ 0 1 0 1 0 1 0 0 0 1
+ 0 1 0 1 0 1 0 0 1 1
+ 0 1 0 1 0 1 1 0 1 1
+ 0 1 0 1 1 0 0 0 0 1
+ 0 1 0 1 1 0 0 0 1 1
+ 0 1 0 1 1 1 0 0 1 1
+ 0 1 0 1 1 1 1 0 1 1
+ 0 1 0 1 1 1 1 1 1 1
+ 0 1 1 0 0 1 0 0 0 1
+ 0 1 1 0 0 1 1 0 0 1
+ 0 1 1 0 0 1 1 0 1 1
+ 0 1 1 0 0 1 1 1 1 1
+ 0 1 1 1 0 1 1 0 1 1
+ 0 1 1 1 0 1 1 1 1 1
+ 0 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 0 1
+ 1 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1
+ 1 0 0 1 1 0 0 1 0 1
+ 1 0 0 1 1 0 0 1 1 1
+ 1 0 0 1 1 0 1 1 1 1
+ 1 0 1 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 1 1 0 1
+ 1 0 1 0 0 1 1 1 0 1
+ 1 0 1 0 0 1 1 1 1 1
+ 1 0 1 0 1 0 0 1 0 1
+ 1 0 1 0 1 0 1 1 0 1
+ 1 0 1 0 1 0 1 1 1 1
+ 1 0 1 0 1 1 1 1 1 1
+ 1 0 1 1 1 0 1 1 1 1
+ 1 0 1 1 1 1 1 1 1 1
+ 1 1 0 1 1 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1
+ 1 1 0 1 1 0 0 1 1 1
+ 1 1 0 1 1 0 1 1 1 1
+ 1 1 0 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1
+
+82 support hyperplanes:
+ -1 -1 -1 0 1 1 0 0 -1 2
+ -1 -1 0 0 1 0 0 0 0 1
+ -1 -1 0 1 0 -1 1 0 -1 2
+ -1 -1 0 1 0 0 0 0 0 1
+ -1 -1 1 0 1 0 0 -1 1 1
+ -1 -1 1 1 0 0 -1 1 0 1
+ -1 0 -1 -1 1 -1 1 0 0 2
+ -1 0 -1 0 -1 -1 0 1 1 2
+ -1 0 0 -1 1 0 -1 1 1 1
+ -1 0 0 -1 1 0 0 0 0 1
+ -1 0 0 0 0 -1 0 1 0 1
+ -1 0 0 0 0 -1 1 0 0 1
+ -1 0 0 0 0 0 -1 1 0 1
+ -1 0 0 0 0 0 0 0 0 1
+ -1 1 1 0 0 -1 0 1 -1 1
+ 0 -1 -1 -1 0 1 0 -1 1 2
+ 0 -1 -1 0 -1 1 -1 1 0 2
+ 0 -1 -1 0 0 1 0 0 0 1
+ 0 -1 -1 0 1 1 1 0 -1 1
+ 0 -1 -1 1 -1 1 0 1 0 1
+ 0 -1 0 0 -1 -1 1 -1 1 2
+ 0 -1 0 0 0 0 0 -1 1 1
+ 0 -1 0 0 0 0 0 0 0 1
+ 0 -1 0 1 -1 -1 0 -1 1 2
+ 0 -1 0 1 -1 0 0 0 0 1
+ 0 -1 1 0 1 0 -1 -1 1 1
+ 0 0 -1 -1 -1 -1 0 1 1 2
+ 0 0 -1 -1 0 0 0 0 1 1
+ 0 0 -1 -1 0 0 1 0 0 1
+ 0 0 -1 0 -1 0 0 1 0 1
+ 0 0 -1 0 0 0 0 0 0 1
+ 0 0 -1 0 0 0 1 0 -1 1
+ 0 0 0 -1 0 0 -1 0 1 1
+ 0 0 0 -1 0 0 0 0 0 1
+ 0 0 0 0 -1 -1 0 0 1 1
+ 0 0 0 0 -1 0 0 0 0 1
+ 0 0 0 0 0 -1 0 0 0 1
+ 0 0 0 0 0 -1 1 -1 0 1
+ 0 0 0 0 0 0 -1 0 0 1
+ 0 0 0 0 0 0 0 -1 0 1
+ 0 0 0 0 0 0 0 0 -1 1
+ 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 -1 1 0 0
+ 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 1 1 0 0 -1 0
+ 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 1 0 0 1 0 -1 0
+ 0 0 1 0 0 0 -1 0 1 0
+ 0 0 1 0 0 0 0 0 0 0
+ 0 0 1 0 1 0 0 -1 0 0
+ 0 0 1 1 0 0 -1 0 0 0
+ 0 0 1 1 0 0 0 0 -1 0
+ 0 0 1 1 1 1 0 -1 -1 0
+ 0 1 -1 0 -1 0 1 1 -1 1
+ 0 1 0 -1 1 0 0 0 0 0
+ 0 1 0 -1 1 1 0 1 -1 0
+ 0 1 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 1 -1 0
+ 0 1 0 0 1 1 -1 1 -1 0
+ 0 1 1 -1 1 -1 0 -1 0 1
+ 0 1 1 0 -1 -1 -1 0 1 1
+ 0 1 1 0 0 -1 0 0 0 0
+ 0 1 1 0 1 -1 1 -1 0 0
+ 0 1 1 1 0 -1 0 1 -1 0
+ 1 -1 -1 0 0 1 0 -1 1 1
+ 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 -1 0 0
+ 1 0 0 0 0 1 -1 0 0 0
+ 1 0 0 0 0 1 0 -1 0 0
+ 1 0 0 1 -1 0 0 0 0 0
+ 1 0 0 1 -1 0 1 -1 -1 1
+ 1 0 1 0 1 1 0 -1 -1 0
+ 1 0 1 1 -1 1 -1 0 0 0
+ 1 1 -1 -1 0 0 1 -1 0 1
+ 1 1 -1 0 -1 0 0 1 -1 1
+ 1 1 0 -1 0 0 0 0 0 0
+ 1 1 0 -1 0 1 -1 0 1 0
+ 1 1 0 0 -1 0 0 0 0 0
+ 1 1 1 0 -1 -1 0 0 1 0
+
diff -Nru normaliz-3.10.4+ds/test/test-d/n_6_infeas.ref normaliz-3.10.5+ds/test/test-d/n_6_infeas.ref
--- normaliz-3.10.4+ds/test/test-d/n_6_infeas.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-d/n_6_infeas.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty0E.ref normaliz-3.10.5+ds/test/test-degenerate/empty0E.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty0E.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty0E.ref 2025-06-03 11:09:57.000000000 -0400
@@ -24,11 +24,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -37,11 +37,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty0M.ref normaliz-3.10.5+ds/test/test-degenerate/empty0M.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty0M.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty0M.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty0V.ref normaliz-3.10.5+ds/test/test-degenerate/empty0V.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty0V.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty0V.ref 2025-06-03 11:09:57.000000000 -0400
@@ -24,11 +24,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -37,11 +37,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2lineE.ref normaliz-3.10.5+ds/test/test-degenerate/empty2lineE.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2lineE.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2lineE.ref 2025-06-03 11:09:57.000000000 -0400
@@ -25,11 +25,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -38,11 +38,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2lineM.ref normaliz-3.10.5+ds/test/test-degenerate/empty2lineM.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2lineM.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2lineM.ref 2025-06-03 11:09:57.000000000 -0400
@@ -23,11 +23,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2lineV.ref normaliz-3.10.5+ds/test/test-degenerate/empty2lineV.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2lineV.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2lineV.ref 2025-06-03 11:09:57.000000000 -0400
@@ -25,11 +25,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -38,11 +38,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2pointE.ref normaliz-3.10.5+ds/test/test-degenerate/empty2pointE.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2pointE.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2pointE.ref 2025-06-03 11:09:57.000000000 -0400
@@ -24,11 +24,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -37,11 +37,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2pointM.ref normaliz-3.10.5+ds/test/test-degenerate/empty2pointM.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2pointM.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2pointM.ref 2025-06-03 11:09:57.000000000 -0400
@@ -22,11 +22,11 @@
multiplicity = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-degenerate/empty2pointV.ref normaliz-3.10.5+ds/test/test-degenerate/empty2pointV.ref
--- normaliz-3.10.4+ds/test/test-degenerate/empty2pointV.ref 2024-09-17 11:31:43.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-degenerate/empty2pointV.ref 2025-06-03 11:09:57.000000000 -0400
@@ -24,11 +24,11 @@
volume (Euclidean) = 0
Hilbert series:
-0
+
denominator with 0 factors:
-degree of Hilbert Series as rational function = 0
+degree of Hilbert Series as rational function = -1
The numerator of the Hilbert series is symmetric.
@@ -37,11 +37,11 @@
with common denominator = 1
Ehrhart series:
-0
+
denominator with 0 factors:
-degree of Ehrhart Series as rational function = 0
+degree of Ehrhart Series as rational function = -1
The numerator of the Ehrhart series is symmetric.
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_1.in normaliz-3.10.5+ds/test/test-ind/noncomm_1.in
--- normaliz-3.10.4+ds/test/test-ind/noncomm_1.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_1.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,10 @@
+amb_space 8
+
+fusion_type
+1 1 1 1 1 1 1 1
+
+fusion_duality
+0 1 2 3 4 5 7 6
+
+
+InductionMatrices
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_1.ind.ref normaliz-3.10.5+ds/test/test-ind/noncomm_1.ind.ref
--- normaliz-3.10.4+ds/test/test-ind/noncomm_1.ind.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_1.ind.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,1559 @@
+[
+ [
+ [
+ [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,4,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [6,6],
+ [7,7],
+ [8,8],
+ [9,9]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [6,6],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [8,8],
+ [8,9],
+ [8,10],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [12,12]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [6,6],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [8,8],
+ [8,9],
+ [8,10],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [12,12]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [6,6],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [8,8],
+ [8,9],
+ [8,10],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [11,12],
+ [11,13],
+ [11,14],
+ [12,12],
+ [12,13],
+ [12,14],
+ [13,13],
+ [13,14],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [6,6],
+ [6,7],
+ [6,8],
+ [7,7],
+ [7,8],
+ [8,8],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [12,12]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [6,6],
+ [6,7],
+ [6,8],
+ [7,7],
+ [7,8],
+ [8,8],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [11,12],
+ [11,13],
+ [11,14],
+ [12,12],
+ [12,13],
+ [12,14],
+ [13,13],
+ [13,14],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [6,6],
+ [6,7],
+ [6,8],
+ [7,7],
+ [7,8],
+ [8,8],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [11,12],
+ [11,13],
+ [11,14],
+ [12,12],
+ [12,13],
+ [12,14],
+ [13,13],
+ [13,14],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0]
+ ],
+ [
+ [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [6,6],
+ [6,7],
+ [6,8],
+ [7,7],
+ [7,8],
+ [8,8],
+ [9,9],
+ [9,10],
+ [10,10],
+ [11,11],
+ [11,12],
+ [11,13],
+ [11,14],
+ [12,12],
+ [12,13],
+ [12,14],
+ [13,13],
+ [13,14],
+ [14,14],
+ [15,15],
+ [15,16],
+ [15,17],
+ [15,18],
+ [16,16],
+ [16,17],
+ [16,18],
+ [17,17],
+ [17,18],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,4,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [10,10],
+ [11,11],
+ [12,12]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [10,10],
+ [10,11],
+ [10,12],
+ [10,13],
+ [11,11],
+ [11,12],
+ [11,13],
+ [12,12],
+ [12,13],
+ [13,13],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [10,10],
+ [10,11],
+ [10,12],
+ [10,13],
+ [11,11],
+ [11,12],
+ [11,13],
+ [12,12],
+ [12,13],
+ [13,13],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [10,10],
+ [10,11],
+ [10,12],
+ [10,13],
+ [11,11],
+ [11,12],
+ [11,13],
+ [12,12],
+ [12,13],
+ [13,13],
+ [14,14],
+ [14,15],
+ [14,16],
+ [14,17],
+ [15,15],
+ [15,16],
+ [15,17],
+ [16,16],
+ [16,17],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [9,10],
+ [9,11],
+ [9,12],
+ [10,10],
+ [10,11],
+ [10,12],
+ [11,11],
+ [11,12],
+ [12,12],
+ [13,13],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [9,10],
+ [9,11],
+ [9,12],
+ [10,10],
+ [10,11],
+ [10,12],
+ [11,11],
+ [11,12],
+ [12,12],
+ [13,13],
+ [14,14],
+ [14,15],
+ [14,16],
+ [14,17],
+ [15,15],
+ [15,16],
+ [15,17],
+ [16,16],
+ [16,17],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [9,10],
+ [9,11],
+ [9,12],
+ [10,10],
+ [10,11],
+ [10,12],
+ [11,11],
+ [11,12],
+ [12,12],
+ [13,13],
+ [14,14],
+ [14,15],
+ [14,16],
+ [14,17],
+ [15,15],
+ [15,16],
+ [15,17],
+ [16,16],
+ [16,17],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,2,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [5,5],
+ [5,6],
+ [5,7],
+ [6,6],
+ [6,7],
+ [7,7],
+ [8,8],
+ [9,9],
+ [9,10],
+ [9,11],
+ [9,12],
+ [10,10],
+ [10,11],
+ [10,12],
+ [11,11],
+ [11,12],
+ [12,12],
+ [13,13],
+ [14,14],
+ [14,15],
+ [14,16],
+ [14,17],
+ [15,15],
+ [15,16],
+ [15,17],
+ [16,16],
+ [16,17],
+ [17,17],
+ [18,18],
+ [18,19],
+ [18,20],
+ [18,21],
+ [19,19],
+ [19,20],
+ [19,21],
+ [20,20],
+ [20,21],
+ [21,21]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,4,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [14,14],
+ [15,15]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,0,0,0,0,2,2],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,0,0,0,0,2,2]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [17,18],
+ [17,19],
+ [17,20],
+ [18,18],
+ [18,19],
+ [18,20],
+ [19,19],
+ [19,20],
+ [20,20],
+ [21,21]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,2,2,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,4,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [18,18]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,0,2,2,0,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [17,18],
+ [17,19],
+ [17,20],
+ [18,18],
+ [18,19],
+ [18,20],
+ [19,19],
+ [19,20],
+ [20,20],
+ [21,21]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,2,0,0,2,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,4]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [17,18],
+ [17,19],
+ [17,20],
+ [18,18],
+ [18,19],
+ [18,20],
+ [19,19],
+ [19,20],
+ [20,20],
+ [21,21]
+ ],
+ [
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [1,0,0,0,0,0,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [0,0,0,0,0,1,0,0],
+ [2,0,0,0,0,0,0,0],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,0,0,0,0,1,1],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,0,1,1,0,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0],
+ [0,1,0,0,1,0,0,0]
+ ],
+ [
+ [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]
+ ],
+ [
+ [1,1],
+ [1,2],
+ [1,3],
+ [2,2],
+ [2,3],
+ [3,3],
+ [4,4],
+ [4,5],
+ [4,6],
+ [4,7],
+ [4,8],
+ [4,9],
+ [4,10],
+ [4,11],
+ [5,5],
+ [5,6],
+ [5,7],
+ [5,8],
+ [5,9],
+ [5,10],
+ [5,11],
+ [6,6],
+ [6,7],
+ [6,8],
+ [6,9],
+ [6,10],
+ [6,11],
+ [7,7],
+ [7,8],
+ [7,9],
+ [7,10],
+ [7,11],
+ [8,8],
+ [8,9],
+ [8,10],
+ [8,11],
+ [9,9],
+ [9,10],
+ [9,11],
+ [10,10],
+ [10,11],
+ [11,11],
+ [12,12],
+ [13,13],
+ [13,14],
+ [13,15],
+ [13,16],
+ [14,14],
+ [14,15],
+ [14,16],
+ [15,15],
+ [15,16],
+ [16,16],
+ [17,17],
+ [17,18],
+ [17,19],
+ [17,20],
+ [18,18],
+ [18,19],
+ [18,20],
+ [19,19],
+ [19,20],
+ [20,20],
+ [21,21],
+ [21,22],
+ [21,23],
+ [21,24],
+ [22,22],
+ [22,23],
+ [22,24],
+ [23,23],
+ [23,24],
+ [24,24]
+ ]
+ ]
+]
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_1.ref normaliz-3.10.5+ds/test/test-ind/noncomm_1.ref
--- normaliz-3.10.4+ds/test/test-ind/noncomm_1.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_1.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+1 fusion rings up to isomorphism
+0 simple fusion rings up to isomorphism
+1 nonsimple fusion rings up to isomorphism
+
+Embedding dimension = 78
+
+dehomogenization
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+
+***********************************************************************
+
+0 simple fusion rings up to isomorphism:
+
+1 nonsimple fusion rings up to isomorphism:
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_2.in normaliz-3.10.5+ds/test/test-ind/noncomm_2.in
--- normaliz-3.10.4+ds/test/test-ind/noncomm_2.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_2.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,10 @@
+amb_space 6
+
+fusion_type
+1 1 1 1 1 1
+
+fusion_duality
+0 1 2 3 5 4
+
+InductionMatrices
+
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_2.ind.ref normaliz-3.10.5+ds/test/test-ind/noncomm_2.ind.ref
--- normaliz-3.10.4+ds/test/test-ind/noncomm_2.ind.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_2.ind.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,33 @@
+[
+ [
+ [
+ [0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1]
+ ],
+ [
+ [1,0,0,0,0,0],
+ [1,0,0,0,0,0],
+ [2,0,0,0,0,0],
+ [0,0,0,0,1,1],
+ [0,0,0,0,1,1],
+ [0,0,0,0,1,1],
+ [0,1,1,1,0,0],
+ [0,1,1,1,0,0]
+ ],
+ [
+ [1,1,2,2,2,2,3,3]
+ ],
+ [
+ [1,1],
+ [2,2],
+ [3,3],
+ [3,4],
+ [3,5],
+ [4,4],
+ [4,5],
+ [5,5],
+ [6,6],
+ [6,7],
+ [7,7]
+ ]
+ ]
+]
diff -Nru normaliz-3.10.4+ds/test/test-ind/noncomm_2.ref normaliz-3.10.5+ds/test/test-ind/noncomm_2.ref
--- normaliz-3.10.4+ds/test/test-ind/noncomm_2.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-ind/noncomm_2.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+1 fusion rings up to isomorphism
+0 simple fusion rings up to isomorphism
+1 nonsimple fusion rings up to isomorphism
+
+Embedding dimension = 31
+
+dehomogenization
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+
+***********************************************************************
+
+0 simple fusion rings up to isomorphism:
+
+1 nonsimple fusion rings up to isomorphism:
+ 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_1.in normaliz-3.10.5+ds/test/test-Int/Condorcet_1.in
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_1.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_1.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,13 @@
+amb_space 24
+inequalities 3
+1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+nonnegative
+total_degree
+HilbertSeries
+/* NoQuasiPolynomial */
+NoSymmetrization
+/* OnlyCyclotomicHilbSer*/
+nr_coeff_quasipol 2
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_1.ref normaliz-3.10.5+ds/test/test-Int/Condorcet_1.ref
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_1.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_1.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,306 @@
+6 lattice points in polytope (Hilbert basis elements of degree 1)
+234 extreme rays
+27 support hyperplanes
+
+embedding dimension = 24
+rank = 24 (maximal)
+external index = 1
+
+size of triangulation = 1344671
+resulting sum of |det|s = 1816323
+
+grading:
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+degrees of extreme rays:
+1:6 2:132 4:96
+
+multiplicity = 1717/8192
+multiplicity (float) = 0.209594726562
+
+Hilbert series:
+1 5 133 363 4581 8655 69821 100915 596834 697232 3255226 3176870 12235441 10182887 33268048 23917200 67509138 42243510 104272000 56990048 123966919 59177761 113925878 47336170 80758791 28993857 43770180 13415068 17837843 4580485 5320122 1111974 1113216 180850 152891 17845 12346 890 481 15 6
+denominator with 24 factors:
+1:1 2:14 4:9
+
+degree of Hilbert Series as rational function = -25
+
+Hilbert series with cyclotomic denominator:
+1 5 133 363 4581 8655 69821 100915 596834 697232 3255226 3176870 12235441 10182887 33268048 23917200 67509138 42243510 104272000 56990048 123966919 59177761 113925878 47336170 80758791 28993857 43770180 13415068 17837843 4580485 5320122 1111974 1113216 180850 152891 17845 12346 890 481 15 6
+cyclotomic denominator:
+1:24 2:23 4:9
+
+Hilbert quasi-polynomial of period 4:
+only 2 highest coefficients computed
+their common period is 2
+ 0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15982652919 56262656
+ 1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15528493056 56262656
+with common denominator = 6939597901822221635907747840000
+
+***********************************************************************
+
+234 extreme rays:
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+
+27 support hyperplanes:
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_2.in normaliz-3.10.5+ds/test/test-Int/Condorcet_2.in
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_2.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_2.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,14 @@
+amb_space 24
+inequalities 3
+1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+nonnegative
+total_degree
+HilbertSeries
+NoQuasiPolynomial
+/* NoSymmetrization */
+/* OnlyCyclotomicHilbSer*/
+/* nr_coeff_quasipol 2 */
+expansion_degree 12
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_2.ref normaliz-3.10.5+ds/test/test-Int/Condorcet_2.ref
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_2.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_2.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,37 @@
+6 lattice points in polytope (Hilbert basis elements of degree 1)
+
+embedding dimension = 24
+
+grading:
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+
+Hilbert series:
+1 5 133 363 4581 8655 69821 100915 596834 697232 3255226 3176870 12235441 10182887 33268048 23917200 67509138 42243510 104272000 56990048 123966919 59177761 113925878 47336170 80758791 28993857 43770180 13415068 17837843 4580485 5320122 1111974 1113216 180850 152891 17845 12346 890 481 15 6
+denominator with 24 factors:
+1:1 2:14 4:9
+
+degree of Hilbert Series as rational function = -25
+
+Expansion of Hilbert series
+0: 1
+1: 6
+2: 153
+3: 586
+4: 7143
+5: 21450
+6: 171253
+7: 438150
+8: 2629320
+9: 5991900
+10: 29167410
+11: 60841668
+12: 251971621
+
+Hilbert series with cyclotomic denominator:
+1 5 133 363 4581 8655 69821 100915 596834 697232 3255226 3176870 12235441 10182887 33268048 23917200 67509138 42243510 104272000 56990048 123966919 59177761 113925878 47336170 80758791 28993857 43770180 13415068 17837843 4580485 5320122 1111974 1113216 180850 152891 17845 12346 890 481 15 6
+cyclotomic denominator:
+1:24 2:23 4:9
+
+***********************************************************************
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_3.in normaliz-3.10.5+ds/test/test-Int/Condorcet_3.in
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_3.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_3.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,13 @@
+amb_space 24
+inequalities 3
+1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+1 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+1 1 1 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+nonnegative
+total_degree
+HilbertSeries
+/* NoQuasiPolynomial */
+/* NoSymmetrization */
+OnlyCyclotomicHilbSer
+
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/Condorcet_3.ref normaliz-3.10.5+ds/test/test-Int/Condorcet_3.ref
--- normaliz-3.10.4+ds/test/test-Int/Condorcet_3.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-Int/Condorcet_3.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,17 @@
+0 lattice points in polytope (Hilbert basis elements of degree 1)
+
+embedding dimension = 24
+
+grading:
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+
+degree of Hilbert Series as rational function = -25
+
+Hilbert series with cyclotomic denominator:
+1 5 133 363 4581 8655 69821 100915 596834 697232 3255226 3176870 12235441 10182887 33268048 23917200 67509138 42243510 104272000 56990048 123966919 59177761 113925878 47336170 80758791 28993857 43770180 13415068 17837843 4580485 5320122 1111974 1113216 180850 152891 17845 12346 890 481 15 6
+cyclotomic denominator:
+1:24 2:23 4:9
+
+***********************************************************************
+
diff -Nru normaliz-3.10.4+ds/test/test-Int/rational-E.ref normaliz-3.10.5+ds/test/test-Int/rational-E.ref
--- normaliz-3.10.4+ds/test/test-Int/rational-E.ref 2024-09-17 11:31:44.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-Int/rational-E.ref 2025-06-03 11:09:57.000000000 -0400
@@ -62,11 +62,11 @@
11: -85133027 -99212391 3921729 21008057 2063775 -1017093 -96509 -22605
with common denominator: 15676416
-
Degree of (quasi)polynomial: 7
Expected degree = 7
+
Virtual multiplicity = -37675/5184
Virtual multiplicity (float) = -7.26755401235
diff -Nru normaliz-3.10.4+ds/test/test-Int/rational-E-vert.ref normaliz-3.10.5+ds/test/test-Int/rational-E-vert.ref
--- normaliz-3.10.4+ds/test/test-Int/rational-E-vert.ref 2024-09-17 11:31:44.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-Int/rational-E-vert.ref 2025-06-03 11:09:57.000000000 -0400
@@ -58,11 +58,11 @@
11: -85133027 -99212391 3921729 21008057 2063775 -1017093 -96509 -22605
with common denominator: 15676416
-
Degree of (quasi)polynomial: 7
Expected degree = 7
+
Virtual multiplicity = -37675/5184
Virtual multiplicity (float) = -7.26755401235
diff -Nru normaliz-3.10.4+ds/test/test-Int/triv_integral-E-NGD.ref normaliz-3.10.5+ds/test/test-Int/triv_integral-E-NGD.ref
--- normaliz-3.10.4+ds/test/test-Int/triv_integral-E-NGD.ref 2024-09-17 11:31:44.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-Int/triv_integral-E-NGD.ref 2025-06-03 11:09:57.000000000 -0400
@@ -36,11 +36,11 @@
1: 0 0
with common denominator: 2
-
Degree of (quasi)polynomial: 1
Expected degree = 1
+
Virtual multiplicity = 1/2
Virtual multiplicity (float) = 0.5
diff -Nru normaliz-3.10.4+ds/test/test-mrk/3x7.mrk.ref normaliz-3.10.5+ds/test/test-mrk/3x7.mrk.ref
--- normaliz-3.10.4+ds/test/test-mrk/3x7.mrk.ref 2023-06-26 04:17:27.000000000 -0400
+++ normaliz-3.10.5+ds/test/test-mrk/3x7.mrk.ref 2025-06-03 11:09:57.000000000 -0400
@@ -1,23 +1,21 @@
-34
37
+4 10 -1 30 1 36 1 37 -1
+4 3 -1 24 1 36 1 37 -1
4 16 -1 34 1 36 1 37 -1
+4 6 -1 27 1 36 1 37 -1
+5 3 1 14 -1 15 1 17 1 36 -1
+5 15 1 17 1 20 -1 30 1 37 -1
+5 10 1 15 1 17 1 20 -1 36 -1
+5 14 -1 15 1 17 1 24 1 37 -1
+4 4 -1 25 1 36 1 37 -1
4 13 -1 32 1 36 1 37 -1
-4 12 -1 31 1 36 1 37 -1
5 5 -1 10 -1 29 1 33 -1 36 1
-4 10 -1 30 1 36 1 37 -1
-4 6 -1 27 1 36 1 37 -1
-4 1 -1 21 1 36 1 37 -1
+5 5 1 29 -1 30 1 33 1 37 -1
5 3 -1 5 -1 22 1 33 -1 36 1
-4 3 -1 24 1 36 1 37 -1
-4 4 -1 25 1 36 1 37 -1
-4 7 -1 28 1 36 1 37 -1
-5 5 1 28 -1 30 1 32 1 37 -1
+5 5 1 22 -1 24 1 33 1 37 -1
5 10 1 13 1 17 1 19 -1 36 -1
-5 5 1 29 -1 30 1 33 1 37 -1
-5 1 -1 3 1 5 1 32 1 37 -1
-5 5 1 7 -1 10 1 32 1 37 -1
-5 1 -1 3 1 5 1 13 1 36 -1
-5 5 1 7 -1 10 1 13 1 36 -1
+4 12 -1 31 1 36 1 37 -1
5 5 1 9 -1 15 1 30 1 37 -1
5 2 -1 3 1 5 1 15 1 36 -1
5 5 1 9 -1 10 1 15 1 36 -1
@@ -25,12 +23,14 @@
5 17 1 30 1 32 1 35 -1 37 -1
5 10 1 17 1 32 1 35 -1 36 -1
5 3 1 12 -1 13 1 17 1 36 -1
-5 3 1 14 -1 15 1 17 1 36 -1
-5 15 1 17 1 20 -1 30 1 37 -1
-5 10 1 15 1 17 1 20 -1 36 -1
4 19 1 35 -1 36 -1 37 1
-5 5 1 22 -1 24 1 33 1 37 -1
-5 5 1 21 -1 24 1 32 1 37 -1
5 2 -1 5 1 15 1 24 1 37 -1
5 17 1 24 1 31 -1 32 1 37 -1
-5 14 -1 15 1 17 1 24 1 37 -1
+5 5 1 28 -1 30 1 32 1 37 -1
+5 1 -1 3 1 5 1 32 1 37 -1
+5 5 1 7 -1 10 1 32 1 37 -1
+5 1 -1 3 1 5 1 13 1 36 -1
+5 5 1 7 -1 10 1 13 1 36 -1
+4 1 -1 21 1 36 1 37 -1
+5 5 1 21 -1 24 1 32 1 37 -1
+4 7 -1 28 1 36 1 37 -1
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_1.in normaliz-3.10.5+ds/test/test-q/mon_1.in
--- normaliz-3.10.4+ds/test/test-q/mon_1.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_1.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+2 0 0
+1 1 2
+0 3 1
+3 0 2
+grading 5 5 5
+
+HilbertSeries
+/* nr_coeff_quasipol 2 */
+expansion_degree 10
+/* OnlyCyclotomicHilbSer */
+/* NoGradingDenom */
+/* HilbertQuasiPolynomial */
+NoQuasiPolynomial
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_1.ref normaliz-3.10.5+ds/test/test-q/mon_1.ref
--- normaliz-3.10.4+ds/test/test-q/mon_1.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_1.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,55 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is not integrally closed in chosen lattice
+
+grading:
+5 5 5
+with denominator = 5
+
+
+Hilbert series:
+1 -1 1 -1 2 -1 1 -1 2 -1 2 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 2 -1 2 -1 1 -1 2 -1 1 -1 1
+denominator with 3 factors:
+1:1 4:1 20:1
+
+degree of Hilbert Series as rational function = 51
+
+The numerator of the Hilbert series is symmetric.
+
+Expansion of Hilbert series
+0: 1
+1: 0
+2: 1
+3: 0
+4: 3
+5: 1
+6: 3
+7: 1
+8: 6
+9: 3
+10: 7
+
+Hilbert series with cyclotomic denominator:
+-1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1
+cyclotomic denominator:
+1:3 2:2 4:2 5:1
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 2 0 0
+ 0 3 1
+ 1 1 2
+ 3 0 2
+
+4 support hyperplanes:
+ 0 -1 3
+ 0 1 0
+ 2 4 -3
+ 5 1 -3
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_2.in normaliz-3.10.5+ds/test/test-q/mon_2.in
--- normaliz-3.10.4+ds/test/test-q/mon_2.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_2.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+2 0 0
+1 1 2
+0 3 1
+3 0 2
+grading 5 5 5
+
+HilbertSeries
+/* nr_coeff_quasipol 2 */
+expansion_degree 10
+OnlyCyclotomicHilbSer
+/* NoGradingDenom */
+/* HilbertQuasiPolynomial */
+/* NoQuasiPolynomial */
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_2.ref normaliz-3.10.5+ds/test/test-q/mon_2.ref
--- normaliz-3.10.4+ds/test/test-q/mon_2.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_2.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,35 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is not integrally closed in chosen lattice
+
+grading:
+5 5 5
+with denominator = 5
+
+
+degree of Hilbert Series as rational function = 51
+
+Hilbert series with cyclotomic denominator:
+-1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1
+cyclotomic denominator:
+1:3 2:2 4:2 5:1
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 2 0 0
+ 0 3 1
+ 1 1 2
+ 3 0 2
+
+4 support hyperplanes:
+ 0 -1 3
+ 0 1 0
+ 2 4 -3
+ 5 1 -3
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon.in normaliz-3.10.5+ds/test/test-q/mon.in
--- normaliz-3.10.4+ds/test/test-q/mon.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+2 0 0
+1 1 2
+0 3 1
+3 0 2
+grading 5 5 5
+
+HilbertSeries
+nr_coeff_quasipol 2
+expansion_degree 10
+/* OnlyCyclotomicHilbSer */
+/* NoGradingDenom */
+/* HilbertQuasiPolynomial */
+/* NoQuasiPolynomial */
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal_1.in normaliz-3.10.5+ds/test/test-q/mon_normal_1.in
--- normaliz-3.10.4+ds/test/test-q/mon_normal_1.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal_1.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+0 0 1
+1 0 1
+0 1 1
+1 1 1
+grading 0 0 1
+
+HilbertSeries
+nr_coeff_quasipol 2
+expansion_degree 10
+/* OnlyCyclotomicHilbSer */
+/* NoGradingDenom */
+NoQuasiPolynomial
+/* HilbertQuasiPolynomial */
+/* HSOP */
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal_1.ref normaliz-3.10.5+ds/test/test-q/mon_normal_1.ref
--- normaliz-3.10.4+ds/test/test-q/mon_normal_1.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal_1.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,51 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is integrally closed in chosen lattice
+
+grading:
+0 0 1
+
+
+multiplicity = 2
+
+Hilbert series:
+1 1
+denominator with 3 factors:
+1:3
+
+degree of Hilbert Series as rational function = -2
+
+The numerator of the Hilbert series is symmetric.
+
+Expansion of Hilbert series
+0: 1
+1: 4
+2: 9
+3: 16
+4: 25
+5: 36
+6: 49
+7: 64
+8: 81
+9: 100
+10: 121
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 0 0 1
+ 0 1 1
+ 1 0 1
+ 1 1 1
+
+4 support hyperplanes:
+ -1 0 1
+ 0 -1 1
+ 0 1 0
+ 1 0 0
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal_2.in normaliz-3.10.5+ds/test/test-q/mon_normal_2.in
--- normaliz-3.10.4+ds/test/test-q/mon_normal_2.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal_2.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+0 0 1
+1 0 1
+0 1 1
+1 1 1
+grading 0 0 1
+
+HilbertSeries
+nr_coeff_quasipol 2
+expansion_degree 10
+OnlyCyclotomicHilbSer
+/* NoGradingDenom */
+/* NoQuasiPolynomial */
+/* HilbertQuasiPolynomial */
+/* HSOP */
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal_2.ref normaliz-3.10.5+ds/test/test-q/mon_normal_2.ref
--- normaliz-3.10.4+ds/test/test-q/mon_normal_2.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal_2.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,36 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is integrally closed in chosen lattice
+
+grading:
+0 0 1
+
+
+multiplicity = 2
+
+degree of Hilbert Series as rational function = -2
+
+Hilbert series with cyclotomic denominator:
+-1 -1
+cyclotomic denominator:
+1:3
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 0 0 1
+ 0 1 1
+ 1 0 1
+ 1 1 1
+
+4 support hyperplanes:
+ -1 0 1
+ 0 -1 1
+ 0 1 0
+ 1 0 0
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal.in normaliz-3.10.5+ds/test/test-q/mon_normal.in
--- normaliz-3.10.4+ds/test/test-q/mon_normal.in 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal.in 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,16 @@
+amb_space 3
+monoid 4
+0 0 1
+1 0 1
+0 1 1
+1 1 1
+grading 0 0 1
+
+HilbertSeries
+nr_coeff_quasipol 2
+expansion_degree 10
+/* OnlyCyclotomicHilbSer */
+/* NoGradingDenom */
+/* NoQuasiPolynomial */
+/* HilbertQuasiPolynomial */
+/* HSOP */
diff -Nru normaliz-3.10.4+ds/test/test-q/mon_normal.ref normaliz-3.10.5+ds/test/test-q/mon_normal.ref
--- normaliz-3.10.4+ds/test/test-q/mon_normal.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon_normal.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,56 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is integrally closed in chosen lattice
+
+grading:
+0 0 1
+
+
+multiplicity = 2
+
+Hilbert series:
+1 1
+denominator with 3 factors:
+1:3
+
+degree of Hilbert Series as rational function = -2
+
+The numerator of the Hilbert series is symmetric.
+
+Expansion of Hilbert series
+0: 1
+1: 4
+2: 9
+3: 16
+4: 25
+5: 36
+6: 49
+7: 64
+8: 81
+9: 100
+10: 121
+
+Hilbert polynomial:
+only 2 highest coefficients computed
+0 2 1
+with common denominator = 1
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 0 0 1
+ 0 1 1
+ 1 0 1
+ 1 1 1
+
+4 support hyperplanes:
+ -1 0 1
+ 0 -1 1
+ 0 1 0
+ 1 0 0
+
diff -Nru normaliz-3.10.4+ds/test/test-q/mon.ref normaliz-3.10.5+ds/test/test-q/mon.ref
--- normaliz-3.10.4+ds/test/test-q/mon.ref 1969-12-31 19:00:00.000000000 -0500
+++ normaliz-3.10.5+ds/test/test-q/mon.ref 2025-06-03 11:09:57.000000000 -0400
@@ -0,0 +1,64 @@
+4 Hilbert basis elements
+4 support hyperplanes
+
+embedding dimension = 3
+rank = 3 (maximal)
+external index = 1
+internal index = 1
+original monoid is not integrally closed in chosen lattice
+
+grading:
+5 5 5
+with denominator = 5
+
+
+Hilbert series:
+1 -1 1 -1 2 -1 1 -1 2 -1 2 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 3 -2 2 -1 2 -1 1 -1 2 -1 1 -1 1
+denominator with 3 factors:
+1:1 4:1 20:1
+
+degree of Hilbert Series as rational function = 51
+
+The numerator of the Hilbert series is symmetric.
+
+Expansion of Hilbert series
+0: 1
+1: 0
+2: 1
+3: 0
+4: 3
+5: 1
+6: 3
+7: 1
+8: 6
+9: 3
+10: 7
+
+Hilbert series with cyclotomic denominator:
+-1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1
+cyclotomic denominator:
+1:3 2:2 4:2 5:1
+
+Hilbert quasi-polynomial of period 20:
+only 2 highest coefficients computed
+their common period is 4
+ 0: 0 -1508 33
+ 1: 0 -1838 33
+ 2: 0 -1528 33
+ 3: 0 -1858 33
+with common denominator = 160
+
+***********************************************************************
+
+4 Hilbert basis elements:
+ 2 0 0
+ 0 3 1
+ 1 1 2
+ 3 0 2
+
+4 support hyperplanes:
+ 0 -1 3
+ 0 1 0
+ 2 4 -3
+ 5 1 -3
+
--- End Message ---