[mathicgb] 393/393: Connected the module input library basis to a module backend and added a unit test for it that passes.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:39 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 c72c945ba8e18e68e5650e7e4982b86e558abe6c
Author: Bjarke Hammersholt Roune <www.broune.com>
Date:   Sun Oct 6 17:36:31 2013 -0700

    Connected the module input library basis to a module backend and added a unit test for it that passes.
---
 src/mathicgb.cpp              |   8 +-
 src/mathicgb.h                |   2 +-
 src/mathicgb/ClassicGBAlg.cpp |  18 +++-
 src/mathicgb/MonoMonoid.hpp   |   3 +-
 src/test/mathicgb.cpp         | 218 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 241 insertions(+), 8 deletions(-)

diff --git a/src/mathicgb.cpp b/src/mathicgb.cpp
index 60a5fbc..ddf2400 100755
--- a/src/mathicgb.cpp
+++ b/src/mathicgb.cpp
@@ -735,6 +735,7 @@ void GroebnerInputIdealStream::appendTermBegin(const Component com) {
   MATHICGB_IF_DEBUG(mPimpl->checker.appendTermBegin(com));
 
   std::fill_n(mExponents, varCount(), 0);
+  mPimpl->ring.monoid().setComponent(com, mPimpl->monomial);
 
   MATHICGB_ASSERT(debugAssertValid());
 }
@@ -852,6 +853,7 @@ namespace mgbi {
     MATHICGB_ASSERT(p.ring().monoid() == monoid);
 
     const auto& from = *mPimpl->mTermIt;
+    const auto com = monoid.component(*from.mono);
     auto to = mPimpl->tmpTerm.get();
     for (VarIndex var = 0; var < monoid.varCount(); ++var)
       to[var] = monoid.externalExponent(*from.mono, var);
@@ -872,7 +874,7 @@ namespace mgbi {
     ConstTerm term;
     term.coef = from.coef;
     term.exponents = to;
-    term.com = 0;
+    term.com = com;
     return term;
   }
 }
@@ -968,7 +970,9 @@ namespace mgbi {
     if (!callback.isNull())
       params.callback = [&callback](){return callback();};
 
-    auto gb = computeGBClassicAlg(std::move(basis), params);
+    auto gb = conf.comCount() == 1 ?
+      computeGBClassicAlg(std::move(basis), params) :
+      computeModuleGBClassicAlg(std::move(basis), params);
 
     typedef mgb::GroebnerConfiguration::Callback::Action Action;
     if (callback.lastAction() != Action::StopWithNoOutputAction) {
diff --git a/src/mathicgb.h b/src/mathicgb.h
index 2b021ce..10dae31 100755
--- a/src/mathicgb.h
+++ b/src/mathicgb.h
@@ -72,7 +72,7 @@ namespace mgb { // Part of the public interface of MathicGB
 
     /// Type for the component of a module monomial. The module monomial
     /// x*y*z * e_i has component i.
-    typedef size_t Component;
+    typedef unsigned int Component;
 
     /// A configuration in a module over a polynomial ring with varCount
     /// variables and the coefficients are from the finite field with
diff --git a/src/mathicgb/ClassicGBAlg.cpp b/src/mathicgb/ClassicGBAlg.cpp
index 004fd80..9571e5e 100755
--- a/src/mathicgb/ClassicGBAlg.cpp
+++ b/src/mathicgb/ClassicGBAlg.cpp
@@ -20,6 +20,13 @@ MATHICGB_DEFINE_LOG_DOMAIN(
     "Buchberger's algorithm."
 );
 
+MATHICGB_DEFINE_LOG_DOMAIN(
+  GBInsert,
+  "Outputs polynomials that are inserted into the current "
+  "basis during Groebner basis computation using Buchberger's. "
+  "algorithm."
+);
+
 MATHICGB_NAMESPACE_BEGIN
 
 /// Calculates a classic Grobner basis using Buchberger's algorithm.
@@ -146,9 +153,9 @@ void ClassicGBAlg::setSPairGroupSize(unsigned int groupSize) {
     mSPairGroupSize = groupSize;
 }
 
-void ClassicGBAlg::insertPolys
-(std::vector<std::unique_ptr<Poly> >& polynomials)
-{
+void ClassicGBAlg::insertPolys(
+  std::vector<std::unique_ptr<Poly> >& polynomials
+) {
   if (!mUseAutoTopReduction) {
     for (auto it = polynomials.begin(); it != polynomials.end(); ++it) {
       MATHICGB_ASSERT(it->get() != 0);
@@ -189,6 +196,11 @@ void ClassicGBAlg::insertPolys
       if (mBasis.divisor((*it)->leadMono()) != static_cast<size_t>(-1))
         toReduce.push_back(std::move(*it));
       else {
+        MATHICGB_IF_STREAM_LOG(GBInsert) {
+          stream << "Inserting basis element " << mBasis.size() << ": ";
+          MathicIO<>().writePoly(**it, true, stream);
+          stream << '\n';
+        };
         mBasis.insert(std::move(*it));
         MATHICGB_ASSERT(toRetire.empty());
         mSPairs.addPairsAssumeAutoReduce(mBasis.size() - 1, toRetire);
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index def5533..0ea2393 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -994,11 +994,10 @@ public:
   /// exponents must point to an array of size varCount().
   /// After this, exponent(mono, var) is exponents[externalVar(var)].
   /// The value of exponents[var] becomes the exponent of internalVar(var).
+  /// Does not set the component.
   void setExternalExponents(const Exponent* exponents, MonoRef mono) const {
     MATHICGB_ASSERT(exponents != 0);
 
-    if (HasComponent)
-      access(mono, componentIndex()) = 0;
     for (VarIndex iVar = 0; iVar < varCount(); ++iVar) {
       const auto eVar = externalVar(iVar);
       access(mono, exponentsIndexBegin() + iVar) = exponents[eVar];
diff --git a/src/test/mathicgb.cpp b/src/test/mathicgb.cpp
index 0a31130..594b108 100755
--- a/src/test/mathicgb.cpp
+++ b/src/test/mathicgb.cpp
@@ -278,6 +278,198 @@ namespace {
     s.appendPolynomialDone();
     s.idealDone();
   }
+
+  template<class Stream>
+  void makeSimpleModuleBasis(Stream& s) {
+    MATHICGB_ASSERT(s.varCount() >= 4);
+    MATHICGB_ASSERT(s.comCount() >= 4);
+    // The basis is
+    //   c2<0>-b<1>+d<2>
+    //   bd<0>-a<1>+c<2>
+    //   ac<0>-b<2>-d<3>
+    //   b2<0>-a<2>-c<3>
+    const auto minusOne = s.modulus() - 1;
+    s.idealBegin(4);
+      s.appendPolynomialBegin(3); //   c2<0>-b<1>+d<2>
+        s.appendTermBegin(0);
+          s.appendExponent(2, 2);
+        s.appendTermDone(1);
+        s.appendTermBegin(1);
+          s.appendExponent(1, 1);
+        s.appendTermDone(minusOne);
+        s.appendTermBegin(2);
+          s.appendExponent(3, 1);
+        s.appendTermDone(1);
+      s.appendPolynomialDone();
+ 
+      s.appendPolynomialBegin(3); // bd<0>-a<1>+c<2>
+        s.appendTermBegin(0);
+          s.appendExponent(1, 1);
+          s.appendExponent(3, 1);
+        s.appendTermDone(1);
+        s.appendTermBegin(1);
+          s.appendExponent(0, 1);
+        s.appendTermDone(minusOne);
+        s.appendTermBegin(2);
+          s.appendExponent(2, 1);
+        s.appendTermDone(1);
+      s.appendPolynomialDone();
+
+      s.appendPolynomialBegin(3); // ac<0>-b<2>-d<3>
+        s.appendTermBegin(0);
+          s.appendExponent(0, 1);
+          s.appendExponent(2, 1);
+        s.appendTermDone(1);
+        s.appendTermBegin(2);
+          s.appendExponent(1, 1);
+        s.appendTermDone(minusOne);
+        s.appendTermBegin(3);
+          s.appendExponent(3, 1);
+        s.appendTermDone(minusOne);
+      s.appendPolynomialDone();
+
+      s.appendPolynomialBegin(3); // b2<0>-a<2>-c<3>
+        s.appendTermBegin(0);
+          s.appendExponent(1, 2);
+        s.appendTermDone(1);
+        s.appendTermBegin(2);
+          s.appendExponent(0, 1);
+        s.appendTermDone(minusOne);
+        s.appendTermBegin(3);
+          s.appendExponent(2, 1);
+        s.appendTermDone(minusOne);
+      s.appendPolynomialDone();
+ 
+    s.idealDone();
+  }
+
+  template<class Stream>
+  void makeSimpleModuleGroebnerBasis(Stream& s) {
+    s.idealBegin(5); // polyCount
+    s.appendPolynomialBegin(3);
+    s.appendTermBegin(0);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 2); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendTermBegin(1);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 1); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(2);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 1); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendPolynomialDone();
+    s.appendPolynomialBegin(3);
+    s.appendTermBegin(0);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 1); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 1); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendTermBegin(1);
+    s.appendExponent(0, 1); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(2);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 1); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendPolynomialDone();
+    s.appendPolynomialBegin(3);
+    s.appendTermBegin(0);
+    s.appendExponent(0, 1); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 1); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendTermBegin(2);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 1); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(3);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 1); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendPolynomialDone();
+    s.appendPolynomialBegin(3);
+    s.appendTermBegin(0);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 2); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendTermBegin(2);
+    s.appendExponent(0, 1); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(3);
+    s.appendExponent(0, 0); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 1); // index, exponent
+    s.appendExponent(3, 0); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendPolynomialDone();
+    s.appendPolynomialBegin(4);
+    s.appendTermBegin(1);
+    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.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(1); // coefficient
+    s.appendTermBegin(2);
+    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.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(2);
+    s.appendExponent(0, 1); // index, exponent
+    s.appendExponent(1, 0); // index, exponent
+    s.appendExponent(2, 0); // index, exponent
+    s.appendExponent(3, 1); // index, exponent
+    s.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendTermBegin(3);
+    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.appendExponent(4, 0); // index, exponent
+    s.appendTermDone(100); // coefficient
+    s.appendPolynomialDone();
+    s.idealDone();
+  }
 }
 
 TEST(MathicGBLib, NullIdealStream) {
@@ -500,6 +692,32 @@ TEST(MathicGBLib, Cyclic5) {
   }
 }
 
+TEST(MathicGBLib, SimpleModuleIdeal) {
+  for (int i = 0; i < 2; ++i) {
+    mgb::GroebnerConfiguration configuration(101, 5, 4);
+    const auto reducer = i == 0 ?
+      mgb::GroebnerConfiguration::ClassicReducer :
+      mgb::GroebnerConfiguration::MatrixReducer;
+    configuration.setReducer(reducer);
+    mgb::GroebnerInputIdealStream input(configuration);
+    std::ostringstream computedStr;
+    mgb::IdealStreamLog<> computed(computedStr, 101, 5, 4);
+    mgb::IdealStreamChecker<decltype(computed)> checked(computed);
+
+    makeSimpleModuleBasis(input);
+    mgb::computeGroebnerBasis(input, checked);
+
+    std::ostringstream correctStr;
+    mgb::IdealStreamLog<> correct(correctStr, 101, 5, 4);
+    mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
+    makeSimpleModuleGroebnerBasis(correctChecked);
+
+    EXPECT_EQ(correctStr.str(), computedStr.str())
+      << "\nDisplayed expected:\n" << correctStr.str()
+      << "\nDisplayed computed:\n" << computedStr.str();
+  }
+}
+
 namespace {
   class TestCallback : public mgb::GroebnerConfiguration::Callback {
   public:

-- 
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