[mathicgb] 341/393: Moved configuration for DivLookup into the class as a private sub-class and moved as much stuff out of the configuration as possible.

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 6a48fd19386ed1871cab82af7fe3b55a7a1b7db9
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Wed Aug 28 12:31:31 2013 +0200

    Moved configuration for DivLookup into the class as a private sub-class and moved as much stuff out of the configuration as possible.
---
 src/mathicgb/DivLookup.hpp     | 261 +++++++++++++++++++----------------------
 src/mathicgb/DivisorLookup.cpp |   3 +-
 2 files changed, 121 insertions(+), 143 deletions(-)

diff --git a/src/mathicgb/DivLookup.hpp b/src/mathicgb/DivLookup.hpp
index 8a01846..eaa199d 100755
--- a/src/mathicgb/DivLookup.hpp
+++ b/src/mathicgb/DivLookup.hpp
@@ -6,38 +6,121 @@
 #include "SigPolyBasis.hpp"
 #include "DivisorLookup.hpp"
 #include "PolyRing.hpp"
+#include <mathic.h>
+#include <type_traits>
 #include <string>
 #include <vector>
 #include <iostream>
 
 MATHICGB_NAMESPACE_BEGIN
 
-/** Configuration class for interface to KDTree, DivList */
-/* As such, it has entries that both will expect */
-/* It also contains enough for the Naive monomial table use */
+template<
+  /// Should be mathic::DivList or mathic::KDTree
+  template<class> class BaseLookupTemplate,
 
-template<bool AllowRemovals, bool UseDivMask>
-class DivLookupConfiguration;
+  /// Indicate whether elements should be allowed to be removed from the
+  /// data structure. There can be a slight performance benefit from
+  /// disallowing removal.
+  bool AllowRemovals,
+
+  /// Whether to use bit vectors of features to speed up divisibility
+  /// checks. This is usually a big speed up.
+  bool UseDivMask
+>
+class DivLookup;
+
+template<template<class> class BaseLookupTemplate, bool AR, bool DM>
+class DivLookup : public DivisorLookup {
+private:
+  /// Configuration for a Mathic KDTree or DivList.
+  class Configuration {
+  public:
+    Configuration(const Monoid& monoid): mMonoid(monoid) {}
+    const Monoid& monoid() const {return mMonoid;}
+
+    typedef int Exponent;
+    typedef ConstMonoRef Monomial;
+    struct Entry {
+      Entry(): monom(), index(static_cast<size_t>(-1)) {}
+      Entry(ConstMonoRef monom0, size_t index0):
+        monom(monom0.ptr()), index(index0) {}
+
+      ConstMonoPtr monom;
+      size_t index;
+    };
+
+    Exponent getExponent(const Monomial& m, size_t var) const {
+      return monoid().exponent(m, var);
+    }
+
+    Exponent getExponent(const Entry& e, size_t var) const {
+      return monoid().exponent(*e.monom, var);
+    }
+
+    bool divides(const Monomial& a, const Monomial& b) const {
+      return monoid().divides(a, b);
+    }
+
+    bool divides(const Entry& a, const Monomial& b) const {
+      return monoid().divides(*a.monom, b);
+    }
+
+    bool divides(const Monomial& a, const Entry& b) const {
+      return monoid().divides(a, *b.monom);
+    }
+
+    bool divides(const Entry& a, const Entry& b) const {
+      return monoid().divides(*a.monom, *b.monom);
+    }
+
+    bool getSortOnInsert() const {return false;}
+    template<class A, class B>
+    bool isLessThan(const A& a, const B& b) const {
+      MATHICGB_ASSERT(false);
+      return false;
+    }
+
+    size_t getVarCount() const {return monoid().varCount();}
+
+    static const bool UseTreeDivMask = DM;
+    static const bool UseLinkedList = false;
+    static const bool UseDivMask = DM;
+    static const size_t LeafSize = 1;
+    static const bool PackedTree = true;
+    static const bool AllowRemovals = AR;
+
+    bool getUseDivisorCache() const {return true;}
+    bool getMinimizeOnInsert() const {return false;}
+
+    bool getDoAutomaticRebuilds() const {return UseDivMask;}
+    double getRebuildRatio() const {return 0.5;}
+    size_t getRebuildMin() const {return 50;}
+
+  private:
+    const Monoid& mMonoid;
+  };
 
-template<bool AR, bool DM>
-class DivLookupConfiguration {
 public:
-  typedef PolyRing::Monoid Monoid;
-  typedef Monoid::ConstMonoPtr ConstMonoPtr;
-  typedef Monoid::ConstMonoRef ConstMonoRef;
+  typedef BaseLookupTemplate<Configuration> BaseLookup;
+  typedef typename BaseLookup::Entry Entry;
 
-  DivLookupConfiguration(
+  static_assert
+    (!Configuration::UseTreeDivMask || Configuration::UseDivMask, "");
+
+  DivLookup(
     const Monoid& monoid,
     int type,
     bool preferSparseReducers
   ):
-    mBasis(0),
-    mSigBasis(0),
-    mMonoid(monoid),
+    mLookup(Configuration(monoid)),
     mType(type),
-    mPreferSparseReducers(preferSparseReducers)
+    mPreferSparseReducers(preferSparseReducers),
+    mBasis(0),
+    mSigBasis(0)
   {}
 
+  virtual int type() const {return mType;}
+
   void setBasis(const PolyBasis& basis) {
     if (mBasis == &basis)
       return;
@@ -60,119 +143,15 @@ public:
     MATHICGB_ASSERT(mSigBasis != 0);
     return *mSigBasis;
   }
-  
+
   const PolyBasis& basis() const {
     MATHICGB_ASSERT(mBasis != 0);
     return *mBasis;
   }
 
-  const Monoid& monoid() const {return mMonoid;}
-  int type() const {return mType;}
+  const Monoid& monoid() const {return mLookup.getConfiguration().monoid();}
   bool preferSparseReducers() const {return mPreferSparseReducers;}
 
-  // *** Interface expected by mathic follows below
-
-  typedef int Exponent;
-  typedef ConstMonoRef Monomial;
-  struct Entry {
-    Entry(): monom(), index(static_cast<size_t>(-1)) {}
-    Entry(ConstMonoRef monom0, size_t index0):
-      monom(monom0.ptr()), index(index0) {}
-
-    ConstMonoPtr monom;
-    size_t index;
-  };
-
-  Exponent getExponent(const Monomial& m, size_t var) const {
-    return monoid().exponent(m, var);
-  }
-
-  Exponent getExponent(const Entry& e, size_t var) const {
-    return monoid().exponent(*e.monom, var);
-  }
-
-  bool divides(const Monomial& a, const Monomial& b) const {
-    return monoid().divides(a, b);
-  }
-
-  bool divides(const Entry& a, const Monomial& b) const {
-    return monoid().divides(*a.monom, b);
-  }
-
-  bool divides(const Monomial& a, const Entry& b) const {
-    return monoid().divides(a, *b.monom);
-  }
-
-  bool divides(const Entry& a, const Entry& b) const {
-    return monoid().divides(*a.monom, *b.monom);
-  }
-
-  bool getSortOnInsert() const {return false;}
-  template<class A, class B>
-  bool isLessThan(const A& a, const B& b) const {
-    MATHICGB_ASSERT(false);
-    return false;
-  }
-
-  size_t getVarCount() const {return monoid().varCount();}
-
-  static const bool UseTreeDivMask = DM;
-  static const bool UseLinkedList = false;
-  static const bool UseDivMask = DM;
-  static const size_t LeafSize = 1;
-  static const bool PackedTree = true;
-  static const bool AllowRemovals = AR;
-
-  bool getUseDivisorCache() const {return true;}
-  bool getMinimizeOnInsert() const {return false;}
-
-  bool getDoAutomaticRebuilds() const {return UseDivMask;}
-  double getRebuildRatio() const {return 0.5;}
-  size_t getRebuildMin() const {return 50;}
-
-private:
-  PolyBasis const* mBasis;
-  SigPolyBasis const* mSigBasis;
-  const Monoid& mMonoid;
-  const int mType;
-  bool const mPreferSparseReducers;
-};
-
-template<class BaseLookup>
-class DivLookup;
-
-template<class BL>
-class DivLookup : public DivisorLookup {
-public:
-  typedef BL BaseLookup;
-  typedef typename BaseLookup::Monomial Monomial;
-  typedef typename BaseLookup::Entry Entry;
-  typedef typename BaseLookup::Configuration Configuration;
-
-  static_assert
-    (!Configuration::UseTreeDivMask || Configuration::UseDivMask, "");
-
-  DivLookup(const Configuration& c): mLookup(c) {}
-
-  DivLookup(
-    const Monoid& monoid,
-    int type,
-    bool preferSparseReducers
-  ):
-    mLookup(Configuration(monoid, type, preferSparseReducers))
-  {}
-
-
-  virtual void setBasis(const PolyBasis& basis) {
-    mLookup.getConfiguration().setBasis(basis);
-  }
-
-  virtual void setSigBasis(const SigPolyBasis& sigBasis) {
-    mLookup.getConfiguration().setSigBasis(sigBasis);
-  }
-
-  virtual int type() const {return mLookup.getConfiguration().type();}
-
   template<class Lambda>
   class LambdaWrap {
   public:
@@ -190,14 +169,14 @@ public:
   // *** Signature specific functionality
 
   virtual size_t regularReducer(ConstMonoRef sig, ConstMonoRef mono) const {
-    const auto& conf = mLookup.getConfiguration();
     SigPolyBasis::StoredRatioCmp ratioCmp
-      (Monoid::toOld(sig), Monoid::toOld(mono), conf.sigBasis());
-    const auto& basis = conf.basis();
-    const bool preferSparse = conf.preferSparseReducers();
+      (Monoid::toOld(sig), Monoid::toOld(mono), sigBasis());
 
     auto reducer = size_t(-1);
-    auto proceed = [&](const Entry& e) {
+    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;
 
@@ -228,9 +207,8 @@ public:
     size_t maxDivisors,
     size_t newGenerator
   ) const {
-    const auto& basis = mLookup.getConfiguration().sigBasis();
-    MATHICGB_ASSERT(newGenerator < basis.size());
-
+    MATHICGB_ASSERT(newGenerator < sigBasis().size());
+    const auto& basis = sigBasis(); // workaround for issue in gcc 4.5.3 
     auto proceed = [&](const Entry& entry) {
       if (entry.index >= newGenerator)
         return true;
@@ -255,15 +233,14 @@ public:
     divisors.clear();
     divisors.reserve(maxDivisors + 1);
     auto wrap = lambdaWrap(proceed);
-    mLookup.findAllDivisors(basis.getSignature(newGenerator), wrap);
+    mLookup.findAllDivisors(sigBasis().getSignature(newGenerator), wrap);
   }
 
   virtual size_t highBaseDivisor(size_t newGenerator) const {
-    const auto& basis = mLookup.getConfiguration().sigBasis();
-    MATHICGB_ASSERT(newGenerator < basis.size());
+    MATHICGB_ASSERT(newGenerator < sigBasis().size());
     auto highDivisor = size_t(-1);
-
-    auto proceed = [&](const Entry& entry) {
+    const auto& basis = sigBasis(); // workaround for issue in gcc 4.5.3 
+    auto proceed = [&, this](const Entry& entry) {
       if (entry.index >= newGenerator)
         return true;
       if (highDivisor != size_t(-1)) {
@@ -277,7 +254,7 @@ public:
       return true;
     };
     auto wrap = lambdaWrap(proceed);
-    mLookup.findAllDivisors(basis.getLeadMonomial(newGenerator), wrap);
+    mLookup.findAllDivisors(sigBasis().getLeadMonomial(newGenerator), wrap);
     return highDivisor;
   }
 
@@ -293,8 +270,7 @@ 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 = mLookup.getConfiguration().sigBasis();
-
+    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)) {
@@ -333,11 +309,10 @@ public:
   // *** Classic GB specific functionality
 
   virtual size_t classicReducer(ConstMonoRef mono) const {
-    const auto& basis = mLookup.getConfiguration().basis();
-    const auto preferSparse =
-      mLookup.getConfiguration().preferSparseReducers();
-
     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;
@@ -403,6 +378,10 @@ public:
 
 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 1dc4887..f80186c 100755
--- a/src/mathicgb/DivisorLookup.cpp
+++ b/src/mathicgb/DivisorLookup.cpp
@@ -20,8 +20,7 @@ namespace {
     int type,
     bool preferSparseReducers
   ) {
-    typedef DivLookupConfiguration<AllowRemovals, UseDivMask> Configuration;
-    auto p = new DivLookup<BaseLookup<Configuration>>
+    auto p = new DivLookup<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