[mathicgb] 342/393: Made DivLookup entirely non-virtual and instead added a virtual wrapper in DivisorLookup.cpp that also took over responsibility for some of the information such as the basis.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:32 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 e2703b8ccd88a619df6aeee0c4b4fd1c3316c553
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Wed Aug 28 14:10:29 2013 +0200
Made DivLookup entirely non-virtual and instead added a virtual wrapper in DivisorLookup.cpp that also took over responsibility for some of the information such as the basis.
---
src/mathicgb/DivLookup.hpp | 126 +++++++++++++++--------------------------
src/mathicgb/DivisorLookup.cpp | 119 +++++++++++++++++++++++++++++++++++++-
2 files changed, 164 insertions(+), 81 deletions(-)
diff --git a/src/mathicgb/DivLookup.hpp b/src/mathicgb/DivLookup.hpp
index eaa199d..dd6c635 100755
--- a/src/mathicgb/DivLookup.hpp
+++ b/src/mathicgb/DivLookup.hpp
@@ -30,8 +30,13 @@ template<
class DivLookup;
template<template<class> class BaseLookupTemplate, bool AR, bool DM>
-class DivLookup : public DivisorLookup {
+class DivLookup {
private:
+ typedef PolyRing::Monoid Monoid;
+ typedef Monoid::ConstMonoRef ConstMonoRef;
+ typedef Monoid::ConstMonoPtr ConstMonoPtr;
+ typedef DivisorLookup::EntryOutput EntryOutput;
+
/// Configuration for a Mathic KDTree or DivList.
class Configuration {
public:
@@ -107,50 +112,9 @@ public:
static_assert
(!Configuration::UseTreeDivMask || Configuration::UseDivMask, "");
- DivLookup(
- const Monoid& monoid,
- int type,
- bool preferSparseReducers
- ):
- mLookup(Configuration(monoid)),
- mType(type),
- mPreferSparseReducers(preferSparseReducers),
- mBasis(0),
- mSigBasis(0)
- {}
-
- virtual int type() const {return mType;}
-
- void setBasis(const PolyBasis& basis) {
- if (mBasis == &basis)
- return;
- MATHICGB_ASSERT(mBasis == 0);
- MATHICGB_ASSERT(monoid() == basis.ring().monoid());
- mBasis = &basis;
- }
-
- void setSigBasis(const SigPolyBasis& sigBasis) {
- if (mSigBasis == &sigBasis)
- return;
- MATHICGB_ASSERT(mSigBasis == 0);
- MATHICGB_ASSERT(mBasis == 0 || mBasis == &sigBasis.basis());
- MATHICGB_ASSERT(monoid() == sigBasis.basis().ring().monoid());
- mSigBasis = &sigBasis;
- setBasis(sigBasis.basis());
- }
-
- const SigPolyBasis& sigBasis() const {
- MATHICGB_ASSERT(mSigBasis != 0);
- return *mSigBasis;
- }
-
- const PolyBasis& basis() const {
- MATHICGB_ASSERT(mBasis != 0);
- return *mBasis;
- }
+ DivLookup(const Monoid& monoid): mLookup(Configuration(monoid)) {}
const Monoid& monoid() const {return mLookup.getConfiguration().monoid();}
- bool preferSparseReducers() const {return mPreferSparseReducers;}
template<class Lambda>
class LambdaWrap {
@@ -168,20 +132,23 @@ public:
// *** Signature specific functionality
- virtual size_t regularReducer(ConstMonoRef sig, ConstMonoRef mono) const {
+ size_t regularReducer(
+ ConstMonoRef sig,
+ ConstMonoRef mono,
+ const SigPolyBasis& sigBasis,
+ const bool preferSparseReducers
+ ) const {
SigPolyBasis::StoredRatioCmp ratioCmp
- (Monoid::toOld(sig), Monoid::toOld(mono), sigBasis());
+ (Monoid::toOld(sig), Monoid::toOld(mono), sigBasis);
+ const auto& basis = sigBasis.basis();
auto reducer = size_t(-1);
- const auto& basis = this->basis(); // workaround for issue in gcc 4.5.3
- const bool preferSparse =
- preferSparseReducers(); // workaround for issue in gcc 4.5.3
auto proceed = [&, this](const Entry& e) {
if (ratioCmp.compare(e.index) != GT)
return true;
if (reducer != size_t(-1)) {
- if (preferSparse) {
+ if (preferSparseReducers) {
const auto newTermCount = basis.poly(e.index).nTerms();
const auto oldTermCount = basis.poly(reducer).nTerms();
if (newTermCount > oldTermCount)
@@ -202,13 +169,13 @@ public:
return reducer;
}
- virtual void lowBaseDivisors(
+ void lowBaseDivisors(
std::vector<size_t>& divisors,
- size_t maxDivisors,
- size_t newGenerator
+ const size_t maxDivisors,
+ const size_t newGenerator,
+ const SigPolyBasis& basis
) const {
- MATHICGB_ASSERT(newGenerator < sigBasis().size());
- const auto& basis = sigBasis(); // workaround for issue in gcc 4.5.3
+ MATHICGB_ASSERT(newGenerator < basis.size());
auto proceed = [&](const Entry& entry) {
if (entry.index >= newGenerator)
return true;
@@ -233,14 +200,16 @@ public:
divisors.clear();
divisors.reserve(maxDivisors + 1);
auto wrap = lambdaWrap(proceed);
- mLookup.findAllDivisors(sigBasis().getSignature(newGenerator), wrap);
+ mLookup.findAllDivisors(basis.getSignature(newGenerator), wrap);
}
- virtual size_t highBaseDivisor(size_t newGenerator) const {
- MATHICGB_ASSERT(newGenerator < sigBasis().size());
+ size_t highBaseDivisor(
+ const size_t newGenerator,
+ const SigPolyBasis& basis
+ ) const {
+ MATHICGB_ASSERT(newGenerator < basis.size());
auto highDivisor = size_t(-1);
- const auto& basis = sigBasis(); // workaround for issue in gcc 4.5.3
- auto proceed = [&, this](const Entry& entry) {
+ auto proceed = [&](const Entry& entry) {
if (entry.index >= newGenerator)
return true;
if (highDivisor != size_t(-1)) {
@@ -254,11 +223,14 @@ public:
return true;
};
auto wrap = lambdaWrap(proceed);
- mLookup.findAllDivisors(sigBasis().getLeadMonomial(newGenerator), wrap);
+ mLookup.findAllDivisors(basis.getLeadMonomial(newGenerator), wrap);
return highDivisor;
}
- virtual size_t minimalLeadInSig(ConstMonoRef sig) const {
+ size_t minimalLeadInSig(
+ ConstMonoRef sig,
+ const SigPolyBasis& basis
+ ) const {
// Given signature sig, we want to minimize (S/G)g where
// g and G are the lead term and signature taken over basis elements
// whose signature G divide S. The code here instead maximizes G/g,
@@ -270,7 +242,6 @@ public:
// still a tie, we select the basis element with the largest
// signature. There can be no further ties since all basis
// elements have distinct signatures.
- const auto& basis = sigBasis(); // workaround for issue in gcc 4.5.3
auto minLeadGen = size_t(-1);
auto proceed = [&](const Entry& entry) {
if (minLeadGen != size_t(-1)) {
@@ -308,17 +279,18 @@ public:
// *** Classic GB specific functionality
- virtual size_t classicReducer(ConstMonoRef mono) const {
+ size_t classicReducer(
+ ConstMonoRef mono,
+ const PolyBasis& basis,
+ const bool preferSparseReducers
+ ) const {
auto reducer = size_t(-1);
- const auto& basis = this->basis(); // workaround for issue in gcc 4.5.3
- const bool preferSparse =
- preferSparseReducers(); // workaround for issue in gcc 4.5.3
auto proceed = [&](const Entry& entry) {
if (reducer == size_t(-1)) {
reducer = entry.index;
return true;
}
- if (preferSparse) {
+ if (preferSparseReducers) {
const auto oldTermCount = basis.poly(reducer).nTerms();
const auto newTermCount = basis.poly(entry.index).nTerms();
if (oldTermCount > newTermCount) {
@@ -340,48 +312,42 @@ public:
// *** General functionality
- virtual size_t divisor(ConstMonoRef mono) const {
+ size_t divisor(ConstMonoRef mono) const {
const Entry* entry = mLookup.findDivisor(mono);
return entry == 0 ? static_cast<size_t>(-1) : entry->index;
}
- virtual void divisors(ConstMonoRef mono, EntryOutput& consumer) const {
+ void divisors(ConstMonoRef mono, EntryOutput& consumer) const {
auto proceed = [&](const Entry& e) {return consumer.proceed(e.index);};
auto wrap = lambdaWrap(proceed);
mLookup.findAllDivisors(mono, wrap);
}
- virtual void multiples(ConstMonoRef mono, EntryOutput& consumer) const {
+ void multiples(ConstMonoRef mono, EntryOutput& consumer) const {
auto proceed = [&](const Entry& e) {return consumer.proceed(e.index);};
auto wrap = lambdaWrap(proceed);
mLookup.findAllMultiples(mono, wrap);
}
- virtual void removeMultiples(ConstMonoRef mono) {
+ void removeMultiples(ConstMonoRef mono) {
mLookup.removeMultiples(mono);
}
- virtual void remove(ConstMonoRef mono) {mLookup.removeElement(mono);}
+ void remove(ConstMonoRef mono) {mLookup.removeElement(mono);}
- virtual size_t size() const {
- return mLookup.size();
- }
+ size_t size() const {return mLookup.size();}
std::string getName() const {return mLookup.getName();}
const PolyRing& ring() const {return mLookup.configuration().ring();}
size_t getMemoryUse() const {return mLookup.getMemoryUse();}
- virtual void insert(ConstMonoRef mono, size_t value) {
+ void insert(ConstMonoRef mono, size_t value) {
mLookup.insert(Entry(mono, value));
}
private:
BaseLookup mLookup;
- const int mType;
- const bool mPreferSparseReducers;
- PolyBasis const* mBasis;
- SigPolyBasis const* mSigBasis;
};
MATHICGB_NAMESPACE_END
diff --git a/src/mathicgb/DivisorLookup.cpp b/src/mathicgb/DivisorLookup.cpp
index f80186c..8e010ea 100755
--- a/src/mathicgb/DivisorLookup.cpp
+++ b/src/mathicgb/DivisorLookup.cpp
@@ -11,6 +11,123 @@ MATHICGB_NAMESPACE_BEGIN
namespace {
template<
+ template<class> class BaseLookupTemplate,
+ bool AllowRemovals,
+ bool UseDivMask
+ >
+ class ConcreteDivisorLookup : public DivisorLookup {
+ public:
+ ConcreteDivisorLookup(
+ const Monoid& monoid,
+ int type,
+ bool preferSparseReducers
+ ):
+ mLookup(monoid),
+ mType(type),
+ mPreferSparseReducers(preferSparseReducers),
+ mBasis(0),
+ mSigBasis(0)
+ {}
+
+ const Monoid& monoid() const {return mLookup.monoid();}
+ bool preferSparseReducers() const {return mPreferSparseReducers;}
+
+ // *** Virtual interface follows
+
+ virtual void setBasis(const PolyBasis& basis) {
+ if (mBasis == &basis)
+ return;
+ MATHICGB_ASSERT(mBasis == 0);
+ MATHICGB_ASSERT(monoid() == basis.ring().monoid());
+ mBasis = &basis;
+ }
+
+ virtual void setSigBasis(const SigPolyBasis& sigBasis) {
+ if (mSigBasis == &sigBasis)
+ return;
+ MATHICGB_ASSERT(mSigBasis == 0);
+ MATHICGB_ASSERT(mBasis == 0 || mBasis == &sigBasis.basis());
+ MATHICGB_ASSERT(monoid() == sigBasis.basis().ring().monoid());
+ mSigBasis = &sigBasis;
+ setBasis(sigBasis.basis());
+ }
+
+ const SigPolyBasis& sigBasis() const {
+ MATHICGB_ASSERT(mSigBasis != 0);
+ return *mSigBasis;
+ }
+
+ const PolyBasis& basis() const {
+ MATHICGB_ASSERT(mBasis != 0);
+ return *mBasis;
+ }
+
+ virtual void insert(ConstMonoRef mono, size_t index) {
+ mLookup.insert(mono, index);
+ }
+
+ virtual size_t regularReducer(ConstMonoRef sig, ConstMonoRef mono) const {
+ return mLookup.regularReducer
+ (sig, mono, sigBasis(), preferSparseReducers());
+ }
+
+ virtual size_t classicReducer(ConstMonoRef mono) const {
+ return mLookup.classicReducer(mono, basis(), preferSparseReducers());
+ }
+
+ virtual std::string getName() const {return mLookup.getName();}
+
+ virtual size_t getMemoryUse() const {return mLookup.getMemoryUse();}
+
+ virtual size_t highBaseDivisor(size_t newGenerator) const {
+ return mLookup.highBaseDivisor(newGenerator, sigBasis());
+ }
+
+ virtual void lowBaseDivisors(
+ std::vector<size_t>& divisors,
+ size_t maxDivisors,
+ size_t newGenerator
+ ) const {
+ return mLookup.lowBaseDivisors
+ (divisors, maxDivisors, newGenerator, sigBasis());
+ }
+ virtual size_t minimalLeadInSig(ConstMonoRef sig) const {
+ return mLookup.minimalLeadInSig(sig, sigBasis());
+ }
+
+ virtual int type() const {return mType;}
+
+ virtual void multiples(ConstMonoRef mono, EntryOutput& consumer) const {
+ mLookup.multiples(mono, consumer);
+ }
+
+ virtual size_t divisor(ConstMonoRef mono) const {
+ return mLookup.divisor(mono);
+ }
+
+ virtual void divisors(ConstMonoRef mono, EntryOutput& consumer) const {
+ mLookup.divisors(mono, consumer);
+ }
+
+ virtual void removeMultiples(ConstMonoRef mono) {
+ mLookup.removeMultiples(mono);
+ }
+
+ virtual void remove(ConstMonoRef mono) {
+ return mLookup.remove(mono);
+ }
+
+ virtual size_t size() const {return mLookup.size();}
+
+ private:
+ DivLookup<BaseLookupTemplate, AllowRemovals, UseDivMask> mLookup;
+ const int mType;
+ const bool mPreferSparseReducers;
+ PolyBasis const* mBasis;
+ SigPolyBasis const* mSigBasis;
+ };
+
+ template<
template<class> class BaseLookup,
bool AllowRemovals,
bool UseDivMask
@@ -20,7 +137,7 @@ namespace {
int type,
bool preferSparseReducers
) {
- auto p = new DivLookup<BaseLookup, AllowRemovals, UseDivMask>
+ auto p = new ConcreteDivisorLookup<BaseLookup, AllowRemovals, UseDivMask>
(monoid, type, preferSparseReducers);
return std::unique_ptr<DivisorLookup>(p);
}
--
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