[mathicgb] 227/393: SPairs no longer uses PolyRing, except to access a MonoMonoid. Also, it has about the same speed as previously by using a MonoVector.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:07 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 ae7fecf58bb77bdf075c81b32401243fb3e7e62f
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Fri Apr 5 19:02:47 2013 +0200

    SPairs no longer uses PolyRing, except to access a MonoMonoid. Also, it has about the same speed as previously by using a MonoVector.
---
 src/mathicgb/MonoMonoid.hpp | 24 ++++++++++++--
 src/mathicgb/SPairs.cpp     | 81 +++++++++++++++++++++++----------------------
 src/mathicgb/SPairs.hpp     |  7 ++--
 3 files changed, 64 insertions(+), 48 deletions(-)

diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index 8f79365..8212f17 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -1058,18 +1058,36 @@ public:
     }
 
     // ** Modifiers
+
+    void reserve(size_t count) {
+      mMonos.reserve(count * monoid().entryCount());
+    }
+
+    /// Appends the identity.
+    void push_back() {
+      const auto offset = mMonos.size();
+      mMonos.resize(offset + monoid().entryCount());
+      MATHICGB_ASSERT(monoid().isIdentity(back()));
+      MATHICGB_ASSERT(monoid().debugValid(back()));
+    }
+
     void push_back(ConstMonoRef mono) {
       MATHICGB_ASSERT(monoid().debugValid(mono));
       const auto offset = mMonos.size();
       mMonos.resize(offset + monoid().entryCount());
       monoid().copy(mono, *MonoPtr(mMonos.data() + offset));
+      MATHICGB_ASSERT(monoid().debugValid(back()));
     }
 
-    /// Appends the identity.
-    void push_back() {
+    template<class Monoid>
+    void push_back(
+      const Monoid& monoidMono,
+      typename Monoid::ConstMonoRef mono
+    ) {
+      MATHICGB_ASSERT(monoidMono.debugValid(mono));
       const auto offset = mMonos.size();
       mMonos.resize(offset + monoid().entryCount());
-      MATHICGB_ASSERT(monoid().isIdentity(back()));
+      monoid().copy(monoidMono, mono, *MonoPtr(mMonos.data() + offset));
       MATHICGB_ASSERT(monoid().debugValid(back()));
     }
 
diff --git a/src/mathicgb/SPairs.cpp b/src/mathicgb/SPairs.cpp
index ae6fa9d..ae18b97 100755
--- a/src/mathicgb/SPairs.cpp
+++ b/src/mathicgb/SPairs.cpp
@@ -26,9 +26,8 @@ SPairs::SPairs(const PolyBasis& basis, bool preferSparseSPairs):
   mMonoid(basis.ring().monoid()),
   mOrderMonoid(mMonoid),
   mBareMonoid(mMonoid),
-  mQueue(QueueConfiguration(basis, mMonoid, mOrderMonoid, preferSparseSPairs)),
-  mBasis(basis),
-  mRing(basis.ring())
+  mQueue(QueueConfiguration(basis, mOrderMonoid, preferSparseSPairs)),
+  mBasis(basis)
  {}
 
 std::pair<size_t, size_t> SPairs::pop() {
@@ -205,51 +204,46 @@ void SPairs::addPairs(size_t newGen) {
   }
 
 
-  // todo: use a monovector
-  typedef std::pair<OrderMonoid::Mono, Queue::Index> PrePair;
-  std::vector<PrePair> prePairs;
-
-  MATHICGB_ASSERT(prePairs.empty());
   if (newGen == std::numeric_limits<Queue::Index>::max())
     throw std::overflow_error
       ("Too large basis element index in constructing S-pairs.");
 
-  OrderMonoid::MonoPool pool(mMonoid);
+  OrderMonoid::MonoVector prePairMonos(orderMonoid());
+  typedef std::pair<OrderMonoid::ConstMonoPtr, Queue::Index> PrePair;
+  std::vector<PrePair> prePairs;
+  prePairMonos.reserve(newGen);
+  prePairs.reserve(newGen);
+
   ConstMonoRef newLead = mBasis.leadMonomial(newGen);
   auto lcm = mBareMonoid.alloc();
   for (size_t oldGen = 0; oldGen < newGen; ++oldGen) {
     if (mBasis.retired(oldGen))
       continue;
     ConstMonoRef oldLead = mBasis.leadMonomial(oldGen);
-    if (mMonoid.relativelyPrime(newLead, oldLead)) {
+    if (monoid().relativelyPrime(newLead, oldLead)) {
       ++mStats.relativelyPrimeHits;
       mEliminated.setBit(newGen, oldGen, true);
       continue;
     }
-    mBareMonoid.lcm(mMonoid, newLead, mMonoid, oldLead, lcm);
+    mBareMonoid.lcm(monoid(), newLead, monoid(), oldLead, lcm);
     if (simpleBuchbergerLcmCriterion(newGen, oldGen, lcm)) {
       mEliminated.setBit(newGen, oldGen, true);
       continue;
     }
 
-    auto orderLcm = orderMonoid().alloc();
-    // todo: convert lcm instead of re-computing
-    orderMonoid().lcm(monoid(), newLead, monoid(), oldLead, orderLcm);
+    prePairMonos.push_back(bareMonoid(), lcm);
     prePairs.emplace_back
-      (std::move(orderLcm), static_cast<Queue::Index>(oldGen));
+      (prePairMonos.back().ptr(), static_cast<Queue::Index>(oldGen));
   }
 
   std::sort(prePairs.begin(), prePairs.end(),
     [&](const PrePair& a, const PrePair& b)
   {
     return mQueue.configuration().compare
-      (b.second, newGen, b.first, a.second, newGen, a.first);
+      (b.second, newGen, *b.first, a.second, newGen, *a.first);
   });
   mQueue.addColumnDescending
 	(makeSecondIterator(prePairs.begin()), makeSecondIterator(prePairs.end()));
-
-  for (auto it = prePairs.begin(); it != prePairs.end(); ++it)
-    orderMonoid().free(std::move(it->first));
 }
 
 size_t SPairs::getMemoryUse() const {
@@ -364,7 +358,7 @@ bool SPairs::simpleBuchbergerLcmCriterion(
           !applies &&
           !mBasis.retired(cacheB) &&
           mBareMonoid.divides
-            (mMonoid, mBasis.leadMonomial(cacheB), criterion.lcmAB())
+            (monoid(), mBasis.leadMonomial(cacheB), criterion.lcmAB())
       )
         applies = !criterion.Criterion::proceed(cacheB);
 
@@ -373,7 +367,7 @@ bool SPairs::simpleBuchbergerLcmCriterion(
         !applies &&
         !mBasis.retired(cacheA) &&
         mBareMonoid.divides
-          (mMonoid, mBasis.leadMonomial(cacheA), criterion.lcmAB())
+          (monoid(), mBasis.leadMonomial(cacheA), criterion.lcmAB())
       ) {
         applies = !criterion.Criterion::proceed(cacheA);
         if (applies)
@@ -422,36 +416,43 @@ bool SPairs::simpleBuchbergerLcmCriterionSlow(size_t a, size_t b) const {
   MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size());
 
   // todo: use iterators
-  monomial lcmAB = mRing.allocMonomial();
-  monomial lcm = mRing.allocMonomial();
-  mRing.monomialLeastCommonMultiple
-    (mBasis.leadMonomial(a), mBasis.leadMonomial(b), lcmAB);
+  auto lcmAB = bareMonoid().alloc();
+  auto lcm = bareMonoid().alloc();
+  bareMonoid().lcm(
+    monoid(), mBasis.leadMonomial(a),
+    monoid(), mBasis.leadMonomial(b),
+    lcmAB
+  );
   size_t stop = mBasis.size();
   size_t i = 0;
   for (; i < stop; ++i) {
     if (mBasis.retired(i))
       continue;
-    if (!mMonoid.divides(mBasis.leadMonomial(i), lcmAB))
+    if (!bareMonoid().divides(monoid(), mBasis.leadMonomial(i), lcmAB))
       continue;
     if (i == a || i == b)
       continue;
     if (!eliminated(i, a)) {
-      mRing.monomialLeastCommonMultiple
-        (mBasis.leadMonomial(a), mBasis.leadMonomial(i), lcm);
-      if (mRing.monomialEQ(lcmAB, lcm))
+      bareMonoid().lcm(
+        monoid(), mBasis.leadMonomial(a),
+        monoid(), mBasis.leadMonomial(i),
+        lcm
+      );
+      if (bareMonoid().equal(lcmAB, lcm))
         continue;
     }
 
     if (!eliminated(i, b)) {
-      mRing.monomialLeastCommonMultiple
-        (mBasis.leadMonomial(b), mBasis.leadMonomial(i), lcm);
-      if (mRing.monomialEQ(lcmAB, lcm))
+      bareMonoid().lcm(
+        monoid(), mBasis.leadMonomial(b),
+        monoid(), mBasis.leadMonomial(i),
+        lcm
+      );
+      if (bareMonoid().equal(lcmAB, lcm))
         continue;
     }
     break;
   }
-  mRing.freeMonomial(lcmAB);
-  mRing.freeMonomial(lcm);
   return i != stop;
 }
 
@@ -576,9 +577,9 @@ bool SPairs::advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const {
   MATHICGB_ASSERT(a != b);
   MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size());
 
-  auto lcmAB = mMonoid.alloc();
-  auto lcm = mMonoid.alloc();
-  mMonoid.lcm(mBasis.leadMonomial(a), mBasis.leadMonomial(b), lcmAB);
+  auto lcmAB = monoid().alloc();
+  auto lcm = monoid().alloc();
+  monoid().lcm(mBasis.leadMonomial(a), mBasis.leadMonomial(b), lcmAB);
   size_t stop = mBasis.size();
 
   // *** Build the graph vertices
@@ -590,7 +591,7 @@ bool SPairs::advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const {
   for (size_t i = 0; i != stop; ++i) {
     if (mBasis.retired(i))
       continue;
-    if (!mMonoid.divides(mBasis.leadMonomial(i), lcmAB))
+    if (!monoid().divides(mBasis.leadMonomial(i), lcmAB))
       continue;
     Connection con = NotConnected;
     if (i == a) {
@@ -622,8 +623,8 @@ bool SPairs::advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const {
       size_t const other = graph[i].first;
 
       const_monomial const leadOther = mBasis.leadMonomial(other);
-      mMonoid.lcm(leadNode, leadOther, lcm);
-      if (!eliminated(node.first, other) && mMonoid.equal(lcm, lcmAB))
+      monoid().lcm(leadNode, leadOther, lcm);
+      if (!eliminated(node.first, other) && monoid().equal(lcm, lcmAB))
         continue; // not an edge in G
       
       if (graph[i].second == NotConnected) {
diff --git a/src/mathicgb/SPairs.hpp b/src/mathicgb/SPairs.hpp
index 1434c7d..cf8d71a 100755
--- a/src/mathicgb/SPairs.hpp
+++ b/src/mathicgb/SPairs.hpp
@@ -80,8 +80,7 @@ public:
     return mEliminated.bitUnordered(a, b);
   }
 
-  const Monoid& monoid() const {return ring().monoid();}
-  const PolyRing& ring() const {return mRing;}
+  const Monoid& monoid() const {return mMonoid;}
   const PolyBasis& basis() const {return mBasis;}
 
   size_t getMemoryUse() const;
@@ -165,12 +164,11 @@ private:
   public:
     QueueConfiguration(
       const PolyBasis& basis,
-      const Monoid& monoid,
       const OrderMonoid& orderMonoid,
       const bool preferSparseSPairs
     ):
       mBasis(basis),
-      mMonoid(mBasis.ring().monoid()),
+      mMonoid(basis.ring().monoid()),
       mOrderMonoid(orderMonoid),
       mPreferSparseSPairs(preferSparseSPairs) {}
 
@@ -228,7 +226,6 @@ private:
   // S-polynomial of that pair has already been reduced.
   mathic::BitTriangle mEliminated;
   const PolyBasis& mBasis;
-  const PolyRing& mRing;
   mutable Stats mStats;
 
   static const bool mUseBuchbergerLcmHitCache = true;

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