[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