[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