[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