[mathicgb] 324/393: merge
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:29 UTC 2015
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch upstream
in repository mathicgb.
commit 17eb6124bce98ce47997665b3025eb2453d1f081
Merge: 7b531a0 0a6fe2a
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Thu Aug 1 16:10:49 2013 +0200
merge
.gitignore | 1 +
Makefile.am | 134 +-
build/autotools/m4/ax_cxx_compile_stdcxx_11.m4 | 133 +
build/setup/make-Makefile.sh | 32 +-
configure.ac | 63 +-
examples/cyclic4.ideal | 6 +
examples/cyclic5.ideal | 7 +
examples/cyclic7.ideal | 9 +
examples/hilbertkunz1.ideal | 7 +
examples/hyclic8-101-trimmed.ideal | 0
examples/tiny.ideal | 7 +
src/checksource/CheckSource.cpp | 180 +
src/checksource/Scanner.cpp | 171 +
src/checksource/Scanner.hpp | 255 ++
src/cli/CommonParams.cpp | 15 +-
src/cli/CommonParams.hpp | 6 +
src/cli/GBAction.cpp | 75 +-
src/cli/GBAction.hpp | 5 +
src/cli/GBCommonParams.cpp | 13 +
src/cli/GBCommonParams.hpp | 6 +
src/cli/GBMain.cpp | 22 +-
src/cli/HelpAction.cpp | 7 +-
src/cli/HelpAction.hpp | 28 +-
src/cli/MatrixAction.cpp | 24 +-
src/cli/MatrixAction.hpp | 5 +
src/cli/SigGBAction.cpp | 105 +-
src/cli/SigGBAction.hpp | 6 +-
src/mathicgb.cpp | 422 ++-
src/mathicgb.h | 295 +-
src/mathicgb/Atomic.hpp | 77 +-
src/mathicgb/Basis.cpp | 43 +
src/mathicgb/Basis.hpp | 58 +
src/mathicgb/BjarkeGeobucket.cpp | 11 +-
src/mathicgb/BjarkeGeobucket.hpp | 18 +-
src/mathicgb/BjarkeGeobucket2.cpp | 10 +-
src/mathicgb/BjarkeGeobucket2.hpp | 18 +-
src/mathicgb/CFile.cpp | 62 +-
src/mathicgb/CFile.hpp | 79 +-
src/mathicgb/ChainedHashTable.cpp | 11 +-
src/mathicgb/ChainedHashTable.hpp | 19 +-
.../{BuchbergerAlg.cpp => ClassicGBAlg.cpp} | 219 +-
.../{BuchbergerAlg.hpp => ClassicGBAlg.hpp} | 40 +-
src/mathicgb/DivLookup.hpp | 119 +-
src/mathicgb/DivisorLookup.cpp | 16 +-
src/mathicgb/DivisorLookup.hpp | 32 +-
src/mathicgb/F4MatrixBuilder.cpp | 50 +-
src/mathicgb/F4MatrixBuilder.hpp | 320 +-
src/mathicgb/F4MatrixBuilder2.cpp | 77 +-
src/mathicgb/F4MatrixBuilder2.hpp | 289 +-
src/mathicgb/F4MatrixProjection.cpp | 68 +-
src/mathicgb/F4MatrixProjection.hpp | 14 +-
src/mathicgb/F4MatrixReducer.cpp | 171 +-
src/mathicgb/F4MatrixReducer.hpp | 84 +-
src/mathicgb/F4ProtoMatrix.cpp | 26 +-
src/mathicgb/F4ProtoMatrix.hpp | 13 +-
src/mathicgb/F4Reducer.cpp | 86 +-
src/mathicgb/F4Reducer.hpp | 15 +-
src/mathicgb/FixedSizeMonomialMap.h | 66 +-
src/mathicgb/FreeModuleOrder.cpp | 735 ----
src/mathicgb/FreeModuleOrder.hpp | 58 -
src/mathicgb/HashTourReducer.cpp | 12 +-
src/mathicgb/HashTourReducer.hpp | 16 +-
src/mathicgb/Ideal.cpp | 74 -
src/mathicgb/Ideal.hpp | 51 -
src/mathicgb/KoszulQueue.cpp | 12 -
src/mathicgb/KoszulQueue.hpp | 93 +-
src/mathicgb/LogDomain.cpp | 210 +-
src/mathicgb/LogDomain.hpp | 654 ++--
src/mathicgb/LogDomainSet.cpp | 15 +
src/mathicgb/LogDomainSet.hpp | 180 +-
src/mathicgb/MTArray.cpp | 19 +-
src/mathicgb/MTArray.hpp | 18 +-
src/mathicgb/MathicIO.cpp | 379 +++
src/mathicgb/MathicIO.hpp | 146 +
src/mathicgb/MonTableDivList.hpp | 17 +-
src/mathicgb/MonTableKDTree.hpp | 15 +-
src/mathicgb/MonTableNaive.cpp | 14 +-
src/mathicgb/MonTableNaive.hpp | 19 +-
src/mathicgb/MonoMonoid.hpp | 3541 +++++++++++---------
src/mathicgb/MonoOrder.hpp | 216 ++
src/mathicgb/MonoProcessor.hpp | 136 +
src/mathicgb/MonomialHashTable.hpp | 17 +-
src/mathicgb/MonomialMap.hpp | 41 +-
src/mathicgb/NonCopyable.hpp | 27 +
src/mathicgb/PairTriangle.cpp | 16 +-
src/mathicgb/PairTriangle.hpp | 98 +-
src/mathicgb/Poly.cpp | 14 +-
src/mathicgb/Poly.hpp | 64 +-
src/mathicgb/PolyBasis.cpp | 34 +-
src/mathicgb/PolyBasis.hpp | 68 +-
src/mathicgb/PolyGeoBucket.cpp | 12 +-
src/mathicgb/PolyGeoBucket.hpp | 17 +-
src/mathicgb/PolyHashReducer.cpp | 11 +-
src/mathicgb/PolyHashReducer.hpp | 16 +-
src/mathicgb/PolyHashTable.cpp | 12 +-
src/mathicgb/PolyHashTable.hpp | 23 +-
src/mathicgb/PolyHeap.cpp | 10 +-
src/mathicgb/PolyHeap.hpp | 16 +-
src/mathicgb/PolyReducer.cpp | 10 +-
src/mathicgb/PolyReducer.hpp | 16 +-
src/mathicgb/PolyRing.cpp | 236 +-
src/mathicgb/PolyRing.hpp | 146 +-
src/mathicgb/PrimeField.hpp | 32 +-
src/mathicgb/QuadMatrix.cpp | 58 +-
src/mathicgb/QuadMatrix.hpp | 33 +-
src/mathicgb/QuadMatrixBuilder.cpp | 261 +-
src/mathicgb/QuadMatrixBuilder.hpp | 404 +--
src/mathicgb/RawVector.hpp | 619 ++--
src/mathicgb/Reducer.cpp | 12 +-
src/mathicgb/Reducer.hpp | 27 +-
src/mathicgb/ReducerDedup.hpp | 20 +-
src/mathicgb/ReducerHash.hpp | 21 +-
src/mathicgb/ReducerHashPack.hpp | 21 +-
src/mathicgb/ReducerHelper.hpp | 14 +-
src/mathicgb/ReducerNoDedup.hpp | 20 +-
src/mathicgb/ReducerPack.hpp | 19 +-
src/mathicgb/ReducerPackDedup.hpp | 20 +-
src/mathicgb/SPairs.cpp | 26 +-
src/mathicgb/SPairs.hpp | 65 +-
src/mathicgb/Scanner.cpp | 190 ++
src/mathicgb/Scanner.hpp | 278 ++
src/mathicgb/ScopeExit.hpp | 202 +-
.../{GroebnerBasis.cpp => SigPolyBasis.cpp} | 106 +-
.../{GroebnerBasis.hpp => SigPolyBasis.hpp} | 77 +-
src/mathicgb/SigSPairQueue.cpp | 201 +-
src/mathicgb/SigSPairQueue.hpp | 147 +-
src/mathicgb/SigSPairs.cpp | 27 +-
src/mathicgb/SigSPairs.hpp | 31 +-
src/mathicgb/SignatureGB.cpp | 176 +-
src/mathicgb/SignatureGB.hpp | 49 +-
src/mathicgb/SparseMatrix.cpp | 68 +-
src/mathicgb/SparseMatrix.hpp | 64 +-
src/mathicgb/TournamentReducer.cpp | 12 +-
src/mathicgb/TournamentReducer.hpp | 16 +-
src/mathicgb/TypicalReducer.cpp | 456 +--
src/mathicgb/TypicalReducer.hpp | 146 +-
src/mathicgb/Unchar.hpp | 43 +
src/mathicgb/io-util.cpp | 94 +-
src/mathicgb/io-util.hpp | 51 +-
src/mathicgb/mtbb.hpp | 362 +-
src/mathicgb/stdinc.h | 16 +-
src/test/F4MatrixBuilder.cpp | 363 +-
src/test/F4MatrixReducer.cpp | 258 +-
src/test/FreeModuleOrderTest.cpp | 94 -
src/test/MathicIO.cpp | 317 ++
src/test/MonoMonoid.cpp | 1604 +++++----
src/test/PrimeField.cpp | 6 +-
src/test/QuadMatrixBuilder.cpp | 494 +--
src/test/Scanner.cpp | 124 +
src/test/SparseMatrix.cpp | 175 +-
src/test/gb-test.cpp | 118 +-
src/test/gtestInclude.cpp | 27 +-
src/test/ideals.cpp | 605 ++--
src/test/ideals.hpp | 123 +-
src/test/mathicgb.cpp | 323 +-
src/test/monoidPict.in | 58 +-
src/test/monoidPict.seed | 18 +-
src/test/pict.in | 116 +-
src/test/poly-test.cpp | 73 +-
src/test/testMain.cpp | 6 +
160 files changed, 12397 insertions(+), 8673 deletions(-)
diff --cc src/mathicgb.h
index e6af0c2,4091e90..3269021
--- a/src/mathicgb.h
+++ b/src/mathicgb.h
@@@ -500,15 -788,17 +788,18 @@@ namespace mgb
GroebnerInputIdealStream& inputWhichWillBeCleared,
OutputStream& output
) {
+ typedef mgbi::IdealAdapter::ConstTerm ConstTerm;
mgbi::IdealAdapter ideal;
- mgbi::internalComputeGroebnerBasis(inputWhichWillBeCleared, ideal);
+ const bool doOutput =
+ mgbi::internalComputeGroebnerBasis(inputWhichWillBeCleared, ideal);
+ if (!doOutput)
+ return;
- const auto varCount = ideal.varCount();
- const auto polyCount = ideal.polyCount();
+ const size_t varCount = ideal.varCount();
+ const size_t polyCount = ideal.polyCount();
output.idealBegin(polyCount);
for (size_t polyIndex = 0; polyIndex < polyCount; ++polyIndex) {
- const auto termCount = ideal.termCount(polyIndex);
+ const size_t termCount = ideal.termCount(polyIndex);
output.appendPolynomialBegin(termCount);
for (size_t termIndex = 0; termIndex < termCount; ++termIndex) {
output.appendTermBegin();
diff --cc src/test/mathicgb.cpp
index 5c37f70,f7381ed..c2b0010
--- a/src/test/mathicgb.cpp
+++ b/src/test/mathicgb.cpp
@@@ -1,249 -1,561 +1,560 @@@
-// MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY
-// NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt.
-#include "mathicgb/stdinc.h"
-
-#include "mathicgb.h"
-#include <gtest/gtest.h>
-
-using namespace mgb;
-
-namespace {
- template<class Stream>
- void makeBasis(Stream& s) {
- s.idealBegin();
- s.appendPolynomialBegin(); // x^2 - y
- s.appendTermBegin();
- s.appendExponent(0,2);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(1,1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2); // x^3-z
- s.appendTermBegin();
- s.appendExponent(0,3);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(2,1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.idealDone();
- }
-
- template<class Stream>
- void makeGroebnerBasis(Stream& s) {
- s.idealBegin(3);
- s.appendPolynomialBegin(2); // x^2 - y
- s.appendTermBegin();
- s.appendExponent(0, 2);
- s.appendExponent(1, 0);
- s.appendExponent(2, 0);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(0, 0);
- s.appendExponent(1, 1);
- s.appendExponent(2, 0);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2); // xy - z
- s.appendTermBegin();
- s.appendExponent(0, 1);
- s.appendExponent(1, 1);
- s.appendExponent(2, 0);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(0, 0);
- s.appendExponent(1, 0);
- s.appendExponent(2, 1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2); // y^2 - xy
- s.appendTermBegin();
- s.appendExponent(0, 0);
- s.appendExponent(1, 2);
- s.appendExponent(2, 0);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(0, 1);
- s.appendExponent(1, 0);
- s.appendExponent(2, 1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.idealDone();
- }
-
- template<class Stream>
- void makeCyclic5Basis(Stream& s) {
- s.idealBegin(5); // polyCount
- s.appendPolynomialBegin(5);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(1, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(2, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(5);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(5);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(5);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendExponent(4, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendTermDone(100); // coefficient
- s.appendPolynomialDone();
- s.idealDone();
- }
-
- template<class Stream>
- void makeSimpleIdeal(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd.
- s.idealBegin();
- s.appendPolynomialBegin(); // a^2-b*c
- s.appendTermBegin();
- s.appendExponent(0,2);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(1,1);
- s.appendExponent(2,1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2); // a*b-c*d
- s.appendTermBegin();
- s.appendExponent(0,1);
- s.appendExponent(1,1);
- s.appendTermDone(1);
- s.appendTermBegin();
- s.appendExponent(2,1);
- s.appendExponent(3,1);
- s.appendTermDone(s.modulus() - 1);
- s.appendPolynomialDone();
- s.idealDone();
- }
-
- template<class Stream>
- void makeSimpleIdealGroebnerBasis(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd.
- // Groebner basis is {a^2-b*c,a*b-c*d,a*c*d-b^2*c,b^3*c-c^2*d^2}
- // (order: eliminate 1 variable: [1 0 0 0; 1 1 1 1]).
- s.idealBegin(4); // polyCount
- s.appendPolynomialBegin(2);
- s.appendTermBegin();
- s.appendExponent(0, 2); // index, exponent
- s.appendExponent(1, 0); // index, exponent
- s.appendExponent(2, 0); // index, exponent
- s.appendExponent(3, 0); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 0); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 0); // index, exponent
- s.appendTermDone(100); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 1); // index, exponent
- s.appendExponent(2, 0); // index, exponent
- s.appendExponent(3, 0); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 0); // index, exponent
- s.appendExponent(1, 0); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(100); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2);
- s.appendTermBegin();
- s.appendExponent(0, 1); // index, exponent
- s.appendExponent(1, 0); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 1); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 0); // index, exponent
- s.appendExponent(1, 2); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 0); // index, exponent
- s.appendTermDone(100); // coefficient
- s.appendPolynomialDone();
- s.appendPolynomialBegin(2);
- s.appendTermBegin();
- s.appendExponent(0, 0); // index, exponent
- s.appendExponent(1, 3); // index, exponent
- s.appendExponent(2, 1); // index, exponent
- s.appendExponent(3, 0); // index, exponent
- s.appendTermDone(1); // coefficient
- s.appendTermBegin();
- s.appendExponent(0, 0); // index, exponent
- s.appendExponent(1, 0); // index, exponent
- s.appendExponent(2, 2); // index, exponent
- s.appendExponent(3, 2); // index, exponent
- s.appendTermDone(100); // coefficient
- s.appendPolynomialDone();
- s.idealDone();
- }
-}
-
-TEST(MathicGBLib, NullIdealStream) {
- {
- mgb::NullIdealStream stream(2, 3);
- ASSERT_EQ(2, stream.modulus());
- ASSERT_EQ(3, stream.varCount());
- makeBasis(stream);
- }
-
- {
- mgb::NullIdealStream stream(101, 0);
- ASSERT_EQ(101, stream.modulus());
- ASSERT_EQ(0, stream.varCount());
- }
-}
-
-TEST(MathicGBLib, IdealStreamLog) {
- {
- const char* const idealStr =
- "s.idealBegin();\n"
- "s.appendPolynomialBegin();\n"
- "s.appendTermBegin();\n"
- "s.appendExponent(0, 2); // index, exponent\n"
- "s.appendTermDone(1); // coefficient\n"
- "s.appendTermBegin();\n"
- "s.appendExponent(1, 1); // index, exponent\n"
- "s.appendTermDone(6); // coefficient\n"
- "s.appendPolynomialDone();\n"
- "s.appendPolynomialBegin(2);\n"
- "s.appendTermBegin();\n"
- "s.appendExponent(0, 3); // index, exponent\n"
- "s.appendTermDone(1); // coefficient\n"
- "s.appendTermBegin();\n"
- "s.appendExponent(2, 1); // index, exponent\n"
- "s.appendTermDone(6); // coefficient\n"
- "s.appendPolynomialDone();\n"
- "s.idealDone();\n";
-
- std::ostringstream out1;
- mgb::IdealStreamLog<> stream1(out1, 7, 3);
-
- mgb::IdealStreamChecker<decltype(stream1)> checker(stream1);
-
- std::ostringstream out2;
- mgb::IdealStreamLog<decltype(checker)> stream2(out2, checker);
-
- std::ostringstream out3;
- mgb::IdealStreamLog<decltype(stream2)> stream3(out3, stream2);
-
- ASSERT_EQ(7, stream1.modulus());
- ASSERT_EQ(3, stream1.varCount());
- ASSERT_EQ(7, checker.modulus());
- ASSERT_EQ(3, checker.varCount());
- ASSERT_EQ(7, stream2.modulus());
- ASSERT_EQ(3, stream2.varCount());
- ASSERT_EQ(7, stream3.modulus());
- ASSERT_EQ(3, stream3.varCount());
-
- makeBasis(stream3);
- const auto str1 = std::string(
- "IdealStreamLog s(stream, 7, 3);\n"
- ) + idealStr;
- ASSERT_EQ(str1, out1.str())
- << "Displayed expected:\n" << out1.str()
- << "Displayed actual:\n" << str1 << std::endl;
-
- const auto str2 = std::string(
- "IdealStreamLog s(stream, log); // modulus=7, varCount=3\n"
- ) + idealStr;
- ASSERT_EQ(str2, out2.str()) << "Displayed expected:\n" << out2.str();
- ASSERT_EQ(str2, out3.str()) << "Displayed expected:\n" << out3.str();
- }
-
- // The ideal <> in no variables
- {
- std::ostringstream out;
- mgb::IdealStreamLog<> stream(out, 101, 0);
- ASSERT_EQ(101, stream.modulus());
- ASSERT_EQ(0, stream.varCount());
- stream.idealBegin(0);
- stream.idealDone();
- }
-
- // The ideal <1, 0> in no variables
- {
- std::ostringstream out;
- mgb::IdealStreamLog<> stream(out, 101, 0);
- ASSERT_EQ(101, stream.modulus());
- ASSERT_EQ(0, stream.varCount());
- stream.idealBegin(2);
- stream.appendPolynomialBegin(0); // 1
- stream.appendTermBegin();
- stream.appendTermDone(1);
- stream.appendPolynomialDone();
- stream.appendPolynomialBegin(0); // 0
- stream.appendPolynomialDone();
- stream.idealDone();
- }
-}
-
-TEST(MathicGBLib, ZeroIdealGB) {
- mgb::GroebnerConfiguration configuration(2, 0);
- mgb::GroebnerInputIdealStream input(configuration);
- std::ostringstream out;
- mgb::IdealStreamLog<> logStream(out, 2, 0);
-
- input.idealBegin(0);
- input.idealDone();
- mgb::computeGroebnerBasis(input, logStream);
-
- const auto msg =
- "IdealStreamLog s(stream, 2, 0);\n"
- "s.idealBegin(0); // polyCount\n"
- "s.idealDone();\n";
- EXPECT_EQ(msg, out.str());
-}
-
-TEST(MathicGBLib, OneIdealGB) {
- mgb::GroebnerConfiguration configuration(2, 0);
- mgb::GroebnerInputIdealStream input(configuration);
- std::ostringstream out;
- mgb::IdealStreamLog<> logStream(out, 2, 0);
-
- input.idealBegin(1);
- input.appendPolynomialBegin(1);
- input.appendTermBegin();
- input.appendTermDone(1);
- input.appendPolynomialDone();
- input.idealDone();
- mgb::computeGroebnerBasis(input, logStream);
-
- const auto msg =
- "IdealStreamLog s(stream, 2, 0);\n"
- "s.idealBegin(1); // polyCount\n"
- "s.appendPolynomialBegin(1);\n"
- "s.appendTermBegin();\n"
- "s.appendTermDone(1); // coefficient\n"
- "s.appendPolynomialDone();\n"
- "s.idealDone();\n";
- EXPECT_EQ(msg, out.str());
-}
-
-TEST(MathicGBLib, EasyGB) {
- mgb::GroebnerConfiguration configuration(101, 3);
- mgb::GroebnerInputIdealStream input(configuration);
- std::ostringstream computedStr;
- mgb::IdealStreamLog<> computed(computedStr, 101, 3);
- mgb::IdealStreamChecker<decltype(computed)> checked(computed);
-
- makeBasis(input);
- mgb::computeGroebnerBasis(input, checked);
-
- std::ostringstream correctStr;
- mgb::IdealStreamLog<> correct(correctStr, 101, 3);
- mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
- makeGroebnerBasis(correctChecked);
-
- EXPECT_EQ(correctStr.str(), computedStr.str())
- << "\nDisplayed expected:\n" << correctStr.str()
- << "\nDisplayed computed:\n" << computedStr.str();
-}
-
-TEST(MathicGBLib, EasyReGB) {
- mgb::GroebnerConfiguration configuration(101, 3);
- mgb::GroebnerInputIdealStream input(configuration);
- std::ostringstream computedStr;
- mgb::IdealStreamLog<> computed(computedStr, 101, 3);
- mgb::IdealStreamChecker<decltype(computed)> checked(computed);
-
- makeGroebnerBasis(input);
- mgb::computeGroebnerBasis(input, checked);
-
- std::ostringstream correctStr;
- mgb::IdealStreamLog<> correct(correctStr, 101, 3);
- mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
- makeGroebnerBasis(correctChecked);
-
- EXPECT_EQ(correctStr.str(), computedStr.str())
- << "\nDisplayed expected:\n" << correctStr.str()
- << "\nDisplayed computed:\n" << computedStr.str();
-}
-
-TEST(MathicGBLib, Cyclic5) {
- for (int i = 0; i < 2; ++i) {
- mgb::GroebnerConfiguration configuration(101, 5);
- const auto reducer = i == 0 ?
- mgb::GroebnerConfiguration::ClassicReducer :
- mgb::GroebnerConfiguration::MatrixReducer;
- configuration.setReducer(reducer);
- mgb::GroebnerInputIdealStream input(configuration);
- makeCyclic5Basis(input);
-
- mgb::NullIdealStream computed(input.modulus(), input.varCount());
-
- mgb::computeGroebnerBasis(input, computed);
- }
-}
-
-namespace {
- class TestCallback : public mgb::GroebnerConfiguration::Callback {
- public:
- TestCallback(int count, Action action): mCount(count), mAction(action) {}
-
- virtual Action call() {
- --mCount;
- return mCount == 0 ? mAction : ContinueAction;
- }
-
- private:
- int mCount;
- const Action mAction;
- };
-}
-
-TEST(MathicGBLib, EarlyExit) {
- typedef mgb::GroebnerConfiguration::Callback::Action Action;
- auto check = [](bool useClassic, int count, Action action) {
- mgb::GroebnerConfiguration configuration(101, 5);
- const auto reducer = useClassic ?
- mgb::GroebnerConfiguration::ClassicReducer :
- mgb::GroebnerConfiguration::MatrixReducer;
- configuration.setReducer(reducer);
- TestCallback callback(count, action);
- configuration.setCallback(&callback);
- mgb::GroebnerInputIdealStream input(configuration);
- makeCyclic5Basis(input);
-
- std::ostringstream strOut;
- mgb::IdealStreamLog<> out(strOut, 101, 5);
- mgb::computeGroebnerBasis(input, out);
- return strOut.str().size();
- };
-
- for (int useClassic = 0; useClassic < 2; ++useClassic) {
- size_t none = check(useClassic, 5, Action::StopWithNoOutputAction);
- size_t minSize = check(useClassic, 1, Action::StopWithPartialOutputAction);
- size_t midSize = check(useClassic, 4, Action::StopWithPartialOutputAction);
- size_t maxSize = check(useClassic, 1, Action::ContinueAction);
- ASSERT_LT(none, 35); // the stream writes a header even for no output
- ASSERT_LT(none, minSize);
- ASSERT_LT(minSize, midSize);
- ASSERT_LT(midSize, maxSize);
- }
-}
-
-TEST(MathicGBLib, SimpleEliminationGB) {
- std::vector<mgb::GroebnerConfiguration::Exponent> gradings = {1,0,0,0, 1,1,1,1};
- for (int i = 0; i < 2; ++i) {
- mgb::GroebnerConfiguration configuration(101, 4);
- const auto reducer = i == 0 ?
- mgb::GroebnerConfiguration::ClassicReducer :
- mgb::GroebnerConfiguration::MatrixReducer;
- configuration.setReducer(reducer);
- configuration.setMonomialOrder(
- mgb::GroebnerConfiguration::BaseOrder::ReverseLexicographicBaseOrder,
- gradings
- );
-
- mgb::GroebnerInputIdealStream input(configuration);
- std::ostringstream computedStr;
- mgb::IdealStreamLog<> computed(computedStr, 101, 4);
- mgb::IdealStreamChecker<decltype(computed)> checked(computed);
-
- makeSimpleIdeal(input);
- mgb::computeGroebnerBasis(input, checked);
-
- std::ostringstream correctStr;
- mgb::IdealStreamLog<> correct(correctStr, 101, 4);
- mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
- makeSimpleIdealGroebnerBasis(correctChecked);
-
- EXPECT_EQ(correctStr.str(), computedStr.str())
- << "\nDisplayed expected:\n" << correctStr.str()
- << "\nDisplayed computed:\n" << computedStr.str();
-#if 0
- mgb::GroebnerInputIdealStream input(configuration);
- makeSimpleIdeal(input);
- mgb::NullIdealStream computed(input.modulus(), input.varCount());
- mgb::computeGroebnerBasis(input, computed);
-#endif
- }
-}
-
++// MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY
++// NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt.
+#include "mathicgb/stdinc.h"
+
- #include <gtest/gtest.h>
+#include "mathicgb.h"
++#include <gtest/gtest.h>
++
++using namespace mgb;
+
+namespace {
+ template<class Stream>
+ void makeBasis(Stream& s) {
- s.idealBegin(2);
- s.appendPolynomialBegin(2); // x^2 - y
++ s.idealBegin();
++ s.appendPolynomialBegin(); // x^2 - y
+ s.appendTermBegin();
+ s.appendExponent(0,2);
+ s.appendTermDone(1);
+ s.appendTermBegin();
+ s.appendExponent(1,1);
+ s.appendTermDone(s.modulus() - 1);
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(2); // x^3-z
+ s.appendTermBegin();
+ s.appendExponent(0,3);
+ s.appendTermDone(1);
+ s.appendTermBegin();
+ s.appendExponent(2,1);
+ s.appendTermDone(s.modulus() - 1);
+ s.appendPolynomialDone();
+ s.idealDone();
+ }
+
+ template<class Stream>
+ void makeGroebnerBasis(Stream& s) {
+ s.idealBegin(3);
+ s.appendPolynomialBegin(2); // x^2 - y
+ s.appendTermBegin();
+ s.appendExponent(0, 2);
+ s.appendExponent(1, 0);
+ s.appendExponent(2, 0);
+ s.appendTermDone(1);
+ s.appendTermBegin();
+ s.appendExponent(0, 0);
+ s.appendExponent(1, 1);
+ s.appendExponent(2, 0);
+ s.appendTermDone(s.modulus() - 1);
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(2); // xy - z
+ s.appendTermBegin();
+ s.appendExponent(0, 1);
+ s.appendExponent(1, 1);
+ s.appendExponent(2, 0);
+ s.appendTermDone(1);
+ s.appendTermBegin();
+ s.appendExponent(0, 0);
+ s.appendExponent(1, 0);
+ s.appendExponent(2, 1);
+ s.appendTermDone(s.modulus() - 1);
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(2); // y^2 - xz
+ s.appendTermBegin();
+ s.appendExponent(0, 0);
+ s.appendExponent(1, 2);
+ s.appendExponent(2, 0);
+ s.appendTermDone(1);
+ s.appendTermBegin();
+ s.appendExponent(0, 1);
+ s.appendExponent(1, 0);
+ s.appendExponent(2, 1);
+ s.appendTermDone(s.modulus() - 1);
+ s.appendPolynomialDone();
+ s.idealDone();
+ }
++
++ template<class Stream>
++ void makeCyclic5Basis(Stream& s) {
++ s.idealBegin(5); // polyCount
++ s.appendPolynomialBegin(5);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(1, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(2, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(5);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(5);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(5);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(2);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendExponent(4, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendTermDone(100); // coefficient
++ s.appendPolynomialDone();
++ s.idealDone();
++ }
++
++ template<class Stream>
++ void makeSimpleIdeal(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd.
++ s.idealBegin();
++ s.appendPolynomialBegin(); // a^2-b*c
++ s.appendTermBegin();
++ s.appendExponent(0,2);
++ s.appendTermDone(1);
++ s.appendTermBegin();
++ s.appendExponent(1,1);
++ s.appendExponent(2,1);
++ s.appendTermDone(s.modulus() - 1);
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(2); // a*b-c*d
++ s.appendTermBegin();
++ s.appendExponent(0,1);
++ s.appendExponent(1,1);
++ s.appendTermDone(1);
++ s.appendTermBegin();
++ s.appendExponent(2,1);
++ s.appendExponent(3,1);
++ s.appendTermDone(s.modulus() - 1);
++ s.appendPolynomialDone();
++ s.idealDone();
++ }
++
++ template<class Stream>
++ void makeSimpleIdealGroebnerBasis(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd.
++ // Groebner basis is {a^2-b*c,a*b-c*d,a*c*d-b^2*c,b^3*c-c^2*d^2}
++ // (order: eliminate 1 variable: [1 0 0 0; 1 1 1 1]).
++ s.idealBegin(4); // polyCount
++ s.appendPolynomialBegin(2);
++ s.appendTermBegin();
++ s.appendExponent(0, 2); // index, exponent
++ s.appendExponent(1, 0); // index, exponent
++ s.appendExponent(2, 0); // index, exponent
++ s.appendExponent(3, 0); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 0); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 0); // index, exponent
++ s.appendTermDone(100); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(2);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 1); // index, exponent
++ s.appendExponent(2, 0); // index, exponent
++ s.appendExponent(3, 0); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 0); // index, exponent
++ s.appendExponent(1, 0); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(100); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(2);
++ s.appendTermBegin();
++ s.appendExponent(0, 1); // index, exponent
++ s.appendExponent(1, 0); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 1); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 0); // index, exponent
++ s.appendExponent(1, 2); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 0); // index, exponent
++ s.appendTermDone(100); // coefficient
++ s.appendPolynomialDone();
++ s.appendPolynomialBegin(2);
++ s.appendTermBegin();
++ s.appendExponent(0, 0); // index, exponent
++ s.appendExponent(1, 3); // index, exponent
++ s.appendExponent(2, 1); // index, exponent
++ s.appendExponent(3, 0); // index, exponent
++ s.appendTermDone(1); // coefficient
++ s.appendTermBegin();
++ s.appendExponent(0, 0); // index, exponent
++ s.appendExponent(1, 0); // index, exponent
++ s.appendExponent(2, 2); // index, exponent
++ s.appendExponent(3, 2); // index, exponent
++ s.appendTermDone(100); // coefficient
++ s.appendPolynomialDone();
++ s.idealDone();
++ }
+}
+
+TEST(MathicGBLib, NullIdealStream) {
+ {
+ mgb::NullIdealStream stream(2, 3);
+ ASSERT_EQ(2, stream.modulus());
+ ASSERT_EQ(3, stream.varCount());
+ makeBasis(stream);
+ }
+
+ {
+ mgb::NullIdealStream stream(101, 0);
+ ASSERT_EQ(101, stream.modulus());
+ ASSERT_EQ(0, stream.varCount());
+ }
+}
+
+TEST(MathicGBLib, IdealStreamLog) {
+ {
+ const char* const idealStr =
- "s.idealBegin(2); // polyCount\n"
- "s.appendPolynomialBegin(2);\n"
++ "s.idealBegin();\n"
++ "s.appendPolynomialBegin();\n"
+ "s.appendTermBegin();\n"
+ "s.appendExponent(0, 2); // index, exponent\n"
+ "s.appendTermDone(1); // coefficient\n"
+ "s.appendTermBegin();\n"
+ "s.appendExponent(1, 1); // index, exponent\n"
+ "s.appendTermDone(6); // coefficient\n"
+ "s.appendPolynomialDone();\n"
+ "s.appendPolynomialBegin(2);\n"
+ "s.appendTermBegin();\n"
+ "s.appendExponent(0, 3); // index, exponent\n"
+ "s.appendTermDone(1); // coefficient\n"
+ "s.appendTermBegin();\n"
+ "s.appendExponent(2, 1); // index, exponent\n"
+ "s.appendTermDone(6); // coefficient\n"
+ "s.appendPolynomialDone();\n"
+ "s.idealDone();\n";
+
+ std::ostringstream out1;
+ mgb::IdealStreamLog<> stream1(out1, 7, 3);
+
+ mgb::IdealStreamChecker<decltype(stream1)> checker(stream1);
+
+ std::ostringstream out2;
+ mgb::IdealStreamLog<decltype(checker)> stream2(out2, checker);
+
+ std::ostringstream out3;
+ mgb::IdealStreamLog<decltype(stream2)> stream3(out3, stream2);
+
+ ASSERT_EQ(7, stream1.modulus());
+ ASSERT_EQ(3, stream1.varCount());
+ ASSERT_EQ(7, checker.modulus());
+ ASSERT_EQ(3, checker.varCount());
+ ASSERT_EQ(7, stream2.modulus());
+ ASSERT_EQ(3, stream2.varCount());
+ ASSERT_EQ(7, stream3.modulus());
+ ASSERT_EQ(3, stream3.varCount());
+
+ makeBasis(stream3);
+ const auto str1 = std::string(
+ "IdealStreamLog s(stream, 7, 3);\n"
+ ) + idealStr;
- ASSERT_EQ(str1, out1.str()) << "Displayed expected:\n" << out1.str();
++ ASSERT_EQ(str1, out1.str())
++ << "Displayed expected:\n" << out1.str()
++ << "Displayed actual:\n" << str1 << std::endl;
+
+ const auto str2 = std::string(
+ "IdealStreamLog s(stream, log); // modulus=7, varCount=3\n"
+ ) + idealStr;
+ ASSERT_EQ(str2, out2.str()) << "Displayed expected:\n" << out2.str();
+ ASSERT_EQ(str2, out3.str()) << "Displayed expected:\n" << out3.str();
+ }
+
+ // The ideal <> in no variables
+ {
+ std::ostringstream out;
+ mgb::IdealStreamLog<> stream(out, 101, 0);
+ ASSERT_EQ(101, stream.modulus());
+ ASSERT_EQ(0, stream.varCount());
+ stream.idealBegin(0);
+ stream.idealDone();
+ }
+
+ // The ideal <1, 0> in no variables
+ {
+ std::ostringstream out;
+ mgb::IdealStreamLog<> stream(out, 101, 0);
+ ASSERT_EQ(101, stream.modulus());
+ ASSERT_EQ(0, stream.varCount());
+ stream.idealBegin(2);
+ stream.appendPolynomialBegin(0); // 1
+ stream.appendTermBegin();
+ stream.appendTermDone(1);
+ stream.appendPolynomialDone();
+ stream.appendPolynomialBegin(0); // 0
+ stream.appendPolynomialDone();
+ stream.idealDone();
+ }
+}
+
+TEST(MathicGBLib, ZeroIdealGB) {
+ mgb::GroebnerConfiguration configuration(2, 0);
+ mgb::GroebnerInputIdealStream input(configuration);
+ std::ostringstream out;
+ mgb::IdealStreamLog<> logStream(out, 2, 0);
+
+ input.idealBegin(0);
+ input.idealDone();
+ mgb::computeGroebnerBasis(input, logStream);
+
+ const auto msg =
+ "IdealStreamLog s(stream, 2, 0);\n"
+ "s.idealBegin(0); // polyCount\n"
+ "s.idealDone();\n";
+ EXPECT_EQ(msg, out.str());
+}
+
+TEST(MathicGBLib, OneIdealGB) {
+ mgb::GroebnerConfiguration configuration(2, 0);
+ mgb::GroebnerInputIdealStream input(configuration);
+ std::ostringstream out;
+ mgb::IdealStreamLog<> logStream(out, 2, 0);
+
+ input.idealBegin(1);
+ input.appendPolynomialBegin(1);
+ input.appendTermBegin();
+ input.appendTermDone(1);
+ input.appendPolynomialDone();
+ input.idealDone();
+ mgb::computeGroebnerBasis(input, logStream);
+
+ const auto msg =
+ "IdealStreamLog s(stream, 2, 0);\n"
+ "s.idealBegin(1); // polyCount\n"
+ "s.appendPolynomialBegin(1);\n"
+ "s.appendTermBegin();\n"
+ "s.appendTermDone(1); // coefficient\n"
+ "s.appendPolynomialDone();\n"
+ "s.idealDone();\n";
+ EXPECT_EQ(msg, out.str());
+}
+
+TEST(MathicGBLib, EasyGB) {
+ mgb::GroebnerConfiguration configuration(101, 3);
+ mgb::GroebnerInputIdealStream input(configuration);
+ std::ostringstream computedStr;
+ mgb::IdealStreamLog<> computed(computedStr, 101, 3);
+ mgb::IdealStreamChecker<decltype(computed)> checked(computed);
+
+ makeBasis(input);
+ mgb::computeGroebnerBasis(input, checked);
+
+ std::ostringstream correctStr;
+ mgb::IdealStreamLog<> correct(correctStr, 101, 3);
+ mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
+ makeGroebnerBasis(correctChecked);
+
+ EXPECT_EQ(correctStr.str(), computedStr.str())
+ << "\nDisplayed expected:\n" << correctStr.str()
+ << "\nDisplayed computed:\n" << computedStr.str();
+}
+
+TEST(MathicGBLib, EasyReGB) {
+ mgb::GroebnerConfiguration configuration(101, 3);
+ mgb::GroebnerInputIdealStream input(configuration);
+ std::ostringstream computedStr;
+ mgb::IdealStreamLog<> computed(computedStr, 101, 3);
+ mgb::IdealStreamChecker<decltype(computed)> checked(computed);
+
+ makeGroebnerBasis(input);
+ mgb::computeGroebnerBasis(input, checked);
+
+ std::ostringstream correctStr;
+ mgb::IdealStreamLog<> correct(correctStr, 101, 3);
+ mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
+ makeGroebnerBasis(correctChecked);
+
+ EXPECT_EQ(correctStr.str(), computedStr.str())
+ << "\nDisplayed expected:\n" << correctStr.str()
+ << "\nDisplayed computed:\n" << computedStr.str();
+}
++
++TEST(MathicGBLib, Cyclic5) {
++ for (int i = 0; i < 2; ++i) {
++ mgb::GroebnerConfiguration configuration(101, 5);
++ const auto reducer = i == 0 ?
++ mgb::GroebnerConfiguration::ClassicReducer :
++ mgb::GroebnerConfiguration::MatrixReducer;
++ configuration.setReducer(reducer);
++ mgb::GroebnerInputIdealStream input(configuration);
++ makeCyclic5Basis(input);
++
++ mgb::NullIdealStream computed(input.modulus(), input.varCount());
++
++ mgb::computeGroebnerBasis(input, computed);
++ }
++}
++
++namespace {
++ class TestCallback : public mgb::GroebnerConfiguration::Callback {
++ public:
++ TestCallback(int count, Action action): mCount(count), mAction(action) {}
++
++ virtual Action call() {
++ --mCount;
++ return mCount == 0 ? mAction : ContinueAction;
++ }
++
++ private:
++ int mCount;
++ const Action mAction;
++ };
++}
++
++TEST(MathicGBLib, EarlyExit) {
++ typedef mgb::GroebnerConfiguration::Callback::Action Action;
++ auto check = [](bool useClassic, int count, Action action) {
++ mgb::GroebnerConfiguration configuration(101, 5);
++ const auto reducer = useClassic ?
++ mgb::GroebnerConfiguration::ClassicReducer :
++ mgb::GroebnerConfiguration::MatrixReducer;
++ configuration.setReducer(reducer);
++ TestCallback callback(count, action);
++ configuration.setCallback(&callback);
++ mgb::GroebnerInputIdealStream input(configuration);
++ makeCyclic5Basis(input);
++
++ std::ostringstream strOut;
++ mgb::IdealStreamLog<> out(strOut, 101, 5);
++ mgb::computeGroebnerBasis(input, out);
++ return strOut.str().size();
++ };
++
++ for (int useClassic = 0; useClassic < 2; ++useClassic) {
++ size_t none = check(useClassic, 5, Action::StopWithNoOutputAction);
++ size_t minSize = check(useClassic, 1, Action::StopWithPartialOutputAction);
++ size_t midSize = check(useClassic, 4, Action::StopWithPartialOutputAction);
++ size_t maxSize = check(useClassic, 1, Action::ContinueAction);
++ ASSERT_LT(none, 35); // the stream writes a header even for no output
++ ASSERT_LT(none, minSize);
++ ASSERT_LT(minSize, midSize);
++ ASSERT_LT(midSize, maxSize);
++ }
++}
++
++TEST(MathicGBLib, SimpleEliminationGB) {
++ std::vector<mgb::GroebnerConfiguration::Exponent> gradings = {1,0,0,0, 1,1,1,1};
++ for (int i = 0; i < 2; ++i) {
++ mgb::GroebnerConfiguration configuration(101, 4);
++ const auto reducer = i == 0 ?
++ mgb::GroebnerConfiguration::ClassicReducer :
++ mgb::GroebnerConfiguration::MatrixReducer;
++ configuration.setReducer(reducer);
++ configuration.setMonomialOrder(
++ mgb::GroebnerConfiguration::BaseOrder::ReverseLexicographicBaseOrder,
++ gradings
++ );
++
++ mgb::GroebnerInputIdealStream input(configuration);
++ std::ostringstream computedStr;
++ mgb::IdealStreamLog<> computed(computedStr, 101, 4);
++ mgb::IdealStreamChecker<decltype(computed)> checked(computed);
++
++ makeSimpleIdeal(input);
++ mgb::computeGroebnerBasis(input, checked);
++
++ std::ostringstream correctStr;
++ mgb::IdealStreamLog<> correct(correctStr, 101, 4);
++ mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
++ makeSimpleIdealGroebnerBasis(correctChecked);
++
++ EXPECT_EQ(correctStr.str(), computedStr.str())
++ << "\nDisplayed expected:\n" << correctStr.str()
++ << "\nDisplayed computed:\n" << computedStr.str();
++#if 0
++ mgb::GroebnerInputIdealStream input(configuration);
++ makeSimpleIdeal(input);
++ mgb::NullIdealStream computed(input.modulus(), input.varCount());
++ mgb::computeGroebnerBasis(input, computed);
++#endif
++ }
++}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/mathicgb.git
More information about the debian-science-commits
mailing list