[mathicgb] 226/393: SPairs now uses a dedicated hash-less monoid for ordering.

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 663b6961a7face19eaaf4a4069fa193be238260c
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Fri Apr 5 17:41:45 2013 +0200

    SPairs now uses a dedicated hash-less monoid for ordering.
---
 src/mathicgb/SPairs.cpp | 32 +++++++++++++++++---------------
 src/mathicgb/SPairs.hpp | 34 +++++++++++++++++++---------------
 2 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/src/mathicgb/SPairs.cpp b/src/mathicgb/SPairs.cpp
index 01aecbe..ae6fa9d 100755
--- a/src/mathicgb/SPairs.cpp
+++ b/src/mathicgb/SPairs.cpp
@@ -23,12 +23,13 @@ MATHICGB_DEFINE_LOG_ALIAS(
 );
 
 SPairs::SPairs(const PolyBasis& basis, bool preferSparseSPairs):
-  mQueue(QueueConfiguration(basis, basis.ring().monoid(), preferSparseSPairs)),
-  mBasis(basis),
-  mRing(basis.ring()),
   mMonoid(basis.ring().monoid()),
   mOrderMonoid(mMonoid),
-  mBareMonoid(mMonoid) {}
+  mBareMonoid(mMonoid),
+  mQueue(QueueConfiguration(basis, mMonoid, mOrderMonoid, preferSparseSPairs)),
+  mBasis(basis),
+  mRing(basis.ring())
+ {}
 
 std::pair<size_t, size_t> SPairs::pop() {
   MATHICGB_LOG_TIME(SPairLate);
@@ -43,7 +44,7 @@ std::pair<size_t, size_t> SPairs::pop() {
       continue;
     }
     auto lcm = bareMonoid().alloc(); // todo: just keep one around instead
-    bareMonoid().copy(monoid(), mQueue.topPairData(), lcm);
+    bareMonoid().copy(orderMonoid(), mQueue.topPairData(), lcm);
     mQueue.pop();
 
     MATHICGB_ASSERT(bareMonoid().isLcm(
@@ -70,7 +71,7 @@ std::pair<size_t, size_t> SPairs::pop(exponent& w) {
     if (mBasis.retired(p.first) || mBasis.retired(p.second))
       continue;
     auto lcm = bareMonoid().alloc(); // todo: just keep one around instead
-    bareMonoid().copy(monoid(), mQueue.topPairData(), lcm);
+    bareMonoid().copy(orderMonoid(), mQueue.topPairData(), lcm);
 
     MATHICGB_ASSERT(bareMonoid().isLcm(
       monoid(), mBasis.leadMonomial(p.first),
@@ -204,7 +205,8 @@ void SPairs::addPairs(size_t newGen) {
   }
 
 
-  typedef std::pair<Mono, Queue::Index> PrePair;
+  // todo: use a monovector
+  typedef std::pair<OrderMonoid::Mono, Queue::Index> PrePair;
   std::vector<PrePair> prePairs;
 
   MATHICGB_ASSERT(prePairs.empty());
@@ -212,7 +214,7 @@ void SPairs::addPairs(size_t newGen) {
     throw std::overflow_error
       ("Too large basis element index in constructing S-pairs.");
 
-  Monoid::MonoPool pool(mMonoid);
+  OrderMonoid::MonoPool pool(mMonoid);
   ConstMonoRef newLead = mBasis.leadMonomial(newGen);
   auto lcm = mBareMonoid.alloc();
   for (size_t oldGen = 0; oldGen < newGen; ++oldGen) {
@@ -230,9 +232,9 @@ void SPairs::addPairs(size_t newGen) {
       continue;
     }
 
-    auto orderLcm = monoid().alloc(); // todo: use orderMonoid
+    auto orderLcm = orderMonoid().alloc();
     // todo: convert lcm instead of re-computing
-    monoid().lcm(monoid(), newLead, monoid(), oldLead, orderLcm);
+    orderMonoid().lcm(monoid(), newLead, monoid(), oldLead, orderLcm);
     prePairs.emplace_back
       (std::move(orderLcm), static_cast<Queue::Index>(oldGen));
   }
@@ -247,7 +249,7 @@ void SPairs::addPairs(size_t newGen) {
 	(makeSecondIterator(prePairs.begin()), makeSecondIterator(prePairs.end()));
 
   for (auto it = prePairs.begin(); it != prePairs.end(); ++it)
-    mMonoid.free(std::move(it->first));
+    orderMonoid().free(std::move(it->first));
 }
 
 size_t SPairs::getMemoryUse() const {
@@ -654,7 +656,7 @@ std::string SPairs::name() const {
 void SPairs::QueueConfiguration::computePairData(
   size_t a,
   size_t b,
-  MonoRef orderBy
+  OrderMonoid::MonoRef orderBy
 ) const {
   MATHICGB_ASSERT(a != b);
   MATHICGB_ASSERT(a < mBasis.size());
@@ -663,8 +665,8 @@ void SPairs::QueueConfiguration::computePairData(
     // todo: do something special here?
     return; //return false;
   }
-  ConstMonoRef leadA = mBasis.leadMonomial(a);
-  ConstMonoRef leadB = mBasis.leadMonomial(b);
-  mMonoid.lcm(leadA, leadB, orderBy);
+  Monoid::ConstMonoRef leadA = mBasis.leadMonomial(a);
+  Monoid::ConstMonoRef leadB = mBasis.leadMonomial(b);
+  orderMonoid().lcm(monoid(), leadA, monoid(), leadB, orderBy);
   return; //todo: return true;
 }
diff --git a/src/mathicgb/SPairs.hpp b/src/mathicgb/SPairs.hpp
index 2cfa8b1..1434c7d 100755
--- a/src/mathicgb/SPairs.hpp
+++ b/src/mathicgb/SPairs.hpp
@@ -157,26 +157,32 @@ private:
   // As the non-slow version, but uses simpler and slower code.
   bool advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const;
 
+  const Monoid& mMonoid;
+  OrderMonoid mOrderMonoid;
+  BareMonoid mBareMonoid;
+
   class QueueConfiguration {
   public:
     QueueConfiguration(
       const PolyBasis& basis,
       const Monoid& monoid,
+      const OrderMonoid& orderMonoid,
       const bool preferSparseSPairs
     ):
       mBasis(basis),
       mMonoid(mBasis.ring().monoid()),
+      mOrderMonoid(orderMonoid),
       mPreferSparseSPairs(preferSparseSPairs) {}
 
-    typedef Mono PairData;
-	void computePairData(size_t col, size_t row, MonoRef m) const;
+    typedef OrderMonoid::Mono PairData;
+	void computePairData(size_t col, size_t row, OrderMonoid::MonoRef m) const;
 
 	typedef bool CompareResult;
 	bool compare(
-      size_t colA, size_t rowA, ConstMonoRef a,
-      size_t colB, size_t rowB, ConstMonoRef b
+      size_t colA, size_t rowA, OrderMonoid::ConstMonoRef a,
+      size_t colB, size_t rowB, OrderMonoid::ConstMonoRef b
     ) const {
-      const auto cmp = monoid().compare(a, b);
+      const auto cmp = orderMonoid().compare(a, b);
       if (cmp == GT)
         return true;
       if (cmp == LT)
@@ -199,16 +205,18 @@ private:
 	bool cmpLessThan(bool v) const {return v;}
 
     // The following methods are not required of a configuration.
-	Mono allocPairData() {return monoid().alloc();}
-	void freePairData(Mono&& mono) {
-      return monoid().free(std::move(mono));
+	OrderMonoid::Mono allocPairData() {return orderMonoid().alloc();}
+	void freePairData(OrderMonoid::Mono&& mono) {
+      return orderMonoid().free(std::move(mono));
     }
 
   private:
     const Monoid& monoid() const {return mMonoid;}
+    const OrderMonoid& orderMonoid() const {return mOrderMonoid;}
 
 	const PolyBasis& mBasis;
     const Monoid& mMonoid;
+    const OrderMonoid& mOrderMonoid;
     const bool mPreferSparseSPairs;
   };
   typedef mathic::PairQueue<QueueConfiguration> Queue;
@@ -223,10 +231,6 @@ private:
   const PolyRing& mRing;
   mutable Stats mStats;
 
-  const Monoid& mMonoid;
-  OrderMonoid mOrderMonoid;
-  BareMonoid mBareMonoid;
-
   static const bool mUseBuchbergerLcmHitCache = true;
   mutable std::vector<size_t> mBuchbergerLcmHitCache;
 
@@ -242,7 +246,7 @@ private:
   friend void mathic::PairQueueNamespace::constructPairData<QueueConfiguration>
     (void*, Index, Index, QueueConfiguration&);
   friend void mathic::PairQueueNamespace::destructPairData<QueueConfiguration>
-    (Mono*, Index, Index, QueueConfiguration&);
+    (OrderMonoid::Mono*, Index, Index, QueueConfiguration&);
 };
 
 namespace mathic {
@@ -256,13 +260,13 @@ namespace mathic {
     ) {
 	  MATHICGB_ASSERT(memory != 0);
 	  MATHICGB_ASSERT(col > row);
-	  auto pd = new (memory) SPairs::Mono(conf.allocPairData());
+	  auto pd = new (memory) SPairs::OrderMonoid::Mono(conf.allocPairData());
 	  conf.computePairData(col, row, *pd);
 	}
 
 	template<>
 	inline void destructPairData(
-      SPairs::Mono* pd,
+      SPairs::OrderMonoid::Mono* pd,
       const Index col,
       const Index row,
       SPairs::QueueConfiguration& conf

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