[mathicgb] 256/393: Fixed a few ASSERTs and bugs for varCount==0 that needed to be fixed for multigraded ordering.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:14 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 a7884a20b95fee3a42aa363701ffc84e3cf7a15b
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Tue Apr 16 13:07:31 2013 -0400

    Fixed a few ASSERTs and bugs for varCount==0 that needed to be fixed for multigraded ordering.
---
 src/mathicgb.cpp            |  5 +----
 src/mathicgb/MonoMonoid.hpp | 28 ++++++++++++++++++++++------
 src/test/MonoMonoid.cpp     |  5 +++++
 3 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/src/mathicgb.cpp b/src/mathicgb.cpp
index 975bd57..9af7c77 100755
--- a/src/mathicgb.cpp
+++ b/src/mathicgb.cpp
@@ -413,11 +413,8 @@ namespace mgb {
     MonomialOrderData order
   ) {
     MATHICGB_ASSERT(Pimpl::baseOrderValid(order.baseOrder));
-    MATHICGB_ASSERT(order.gradingsSize % varCount() == 0);
+    MATHICGB_ASSERT(varCount() == 0 || order.gradingsSize % varCount() == 0);
     
-    // Currently only single grading supported. TODO: make it work.
-    MATHICGB_ASSERT(order.gradingsSize / varCount() <= 1);
-
     // Currently only reverse lex supported. TODO: make it work
     MATHICGB_ASSERT(order.baseOrder == ReverseLexicographicBaseOrder);
 
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index 22c33c1..5c17713 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -135,14 +135,17 @@ public:
 
   MonoMonoid(VarIndex varCount, const std::vector<Exponent>& gradings):
     mVarCount(varCount),
-    mGradingCount(gradings.size() / varCount),
+    mGradingCount(varCount == 0 ? 0 : gradings.size() / varCount),
     mOrderIndexBegin(HasComponent + varCount),
     mOrderIndexEnd(mOrderIndexBegin + StoreOrder * mGradingCount),
+    mEntryCount
+      (mOrderIndexEnd + StoreHash == 0 ? 1 : mOrderIndexEnd + StoreHash),
     mHashCoefficients(varCount),
     mGradingIsTotalDegree(
       [&]() {
-        MATHICGB_ASSERT(gradings.size() % varCount == 0);
-        if (gradings.size() != varCount)
+        MATHICGB_ASSERT(varCount == 0 || gradings.size() % varCount == 0);
+        MATHICGB_ASSERT((varCount == 0) == (gradings.empty()));
+        if (gradings.size() != varCount || varCount == 0)
           return false;
         for (auto it = gradings.begin(); it != gradings.end(); ++it)
           if (*it != 1)
@@ -153,7 +156,8 @@ public:
     mGradings(),
     mPool(*this)
   {
-    MATHICGB_ASSERT(gradings.size() % varCount == 0);
+    MATHICGB_ASSERT(varCount == 0 || gradings.size() % varCount == 0);
+    MATHICGB_ASSERT((varCount == 0) == (gradings.empty()));
     if (!mGradingIsTotalDegree) {
       // Take negative values since reverse lex makes bigger values
       // give smaller monomials, but we need bigger degrees to give
@@ -179,6 +183,8 @@ public:
     mGradingCount(1),
     mOrderIndexBegin(HasComponent + mVarCount),
     mOrderIndexEnd(mOrderIndexBegin + StoreOrder * mGradingCount),
+    mEntryCount
+      (mOrderIndexEnd + StoreHash == 0 ? 1 : mOrderIndexEnd + StoreHash),
     mHashCoefficients(mVarCount),
     mGradingIsTotalDegree(true),
     mGradings(),
@@ -197,6 +203,8 @@ public:
     mGradingCount(monoid.gradingCount()),
     mOrderIndexBegin(HasComponent + mVarCount),
     mOrderIndexEnd(mOrderIndexBegin + StoreOrder * mGradingCount),
+    mEntryCount
+      (mOrderIndexEnd + StoreHash == 0 ? 1 : mOrderIndexEnd + StoreHash),
     mHashCoefficients(mVarCount),
     mGradingIsTotalDegree(monoid.mGradingIsTotalDegree),
     mGradings(monoid.mGradings),
@@ -214,6 +222,8 @@ public:
     mGradingCount(monoid.gradingCount()),
     mOrderIndexBegin(HasComponent + mVarCount),
     mOrderIndexEnd(mOrderIndexBegin + StoreOrder * mGradingCount),
+    mEntryCount
+      (mOrderIndexEnd + StoreHash == 0 ? 1 : mOrderIndexEnd + StoreHash),
     mHashCoefficients(mVarCount),
     mGradingIsTotalDegree(monoid.mGradingIsTotalDegree),
     mGradings(monoid.mGradings),
@@ -1218,8 +1228,13 @@ private:
     const auto storedDegrees = StoreOrder * gradingCount();
     MATHICGB_ASSERT(orderIndexEnd() == orderIndexBegin() + storedDegrees);
     MATHICGB_ASSERT(orderIndexEnd() <= entryCount());
+    if (mOrderIndexEnd + StoreHash == 0) {
+      MATHICGB_ASSERT(entryCount() == 1);
+    } else {
+      MATHICGB_ASSERT(entryCount() == mOrderIndexEnd + StoreHash);
+    }
 
-    MATHICGB_ASSERT(gradingCount() >= 1); // todo: if rev lex
+    MATHICGB_ASSERT(varCount() == 0 || gradingCount() >= 1); // todo: if rev lex
 
     if (mGradingIsTotalDegree) {
       MATHICGB_ASSERT(mGradings.empty());
@@ -1431,7 +1446,7 @@ private:
   /// Returns how many Exponents are necessary to store a
   /// monomial. This can include other data than the exponents, so
   /// this number can be larger than varCount().
-  size_t entryCount() const {return mOrderIndexEnd + StoreHash;}
+  size_t entryCount() const {return mEntryCount;}
 
   VarIndex componentIndex() const {
     //static_assert(HasComponent, "");
@@ -1466,6 +1481,7 @@ private:
   const VarIndex mGradingCount;
   const VarIndex mOrderIndexBegin;
   const VarIndex mOrderIndexEnd;
+  const VarIndex mEntryCount;
 
   /// Take dot product of exponents with this vector to get hash value.
   std::vector<HashValue> mHashCoefficients;
diff --git a/src/test/MonoMonoid.cpp b/src/test/MonoMonoid.cpp
index 21856e0..9472e37 100755
--- a/src/test/MonoMonoid.cpp
+++ b/src/test/MonoMonoid.cpp
@@ -559,6 +559,11 @@ TYPED_TEST(Monoid, Order) {
   check(Monoid(52), sortedTotalDegreeRevLex);
   check(Monoid(52, std::vector<Exponent>(52, 1)), sortedTotalDegreeRevLex);
   check(Monoid(52, std::vector<Exponent>(52, 7)), sortedTotalDegreeRevLex);
+  std::vector<Exponent> revLexGradings(52, 1);
+  for (size_t grading = 51; grading != static_cast<size_t>(-1); --grading)
+    for (size_t var = 0; var < 52; ++var)
+      revLexGradings.push_back(var == grading ? -1 : 0);
+  check(Monoid(52, revLexGradings), sortedTotalDegreeRevLex);
 
   std::vector<Exponent> dupGradings = {
      5, 2, 3,

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