[mathicgb] 280/393: Reduced one of the Schreyer orders to the other one by doing a transformation up front.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:20 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 e1e4933f8fd2f00c07dff0301d7f71025a676a10
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date:   Thu Apr 18 14:28:17 2013 -0400

    Reduced one of the Schreyer orders to the other one by doing a transformation up front.
---
 src/cli/SigGBAction.cpp          |   0
 src/mathicgb/FreeModuleOrder.cpp |   5 +-
 src/mathicgb/GroebnerBasis.cpp   |   9 +++
 src/mathicgb/GroebnerBasis.hpp   |   6 +-
 src/mathicgb/Ideal.cpp           |   4 ++
 src/mathicgb/Ideal.hpp           |   1 +
 src/mathicgb/MTArray.cpp         |   8 +++
 src/mathicgb/MTArray.hpp         |   2 +
 src/mathicgb/SignatureGB.cpp     | 122 ++++++++++++++++++++++-----------------
 src/mathicgb/SignatureGB.hpp     |   5 +-
 src/test/FreeModuleOrderTest.cpp |   2 +-
 11 files changed, 106 insertions(+), 58 deletions(-)

diff --git a/src/cli/SigGBAction.cpp b/src/cli/SigGBAction.cpp
old mode 100644
new mode 100755
diff --git a/src/mathicgb/FreeModuleOrder.cpp b/src/mathicgb/FreeModuleOrder.cpp
index 660a300..7a68e95 100755
--- a/src/mathicgb/FreeModuleOrder.cpp
+++ b/src/mathicgb/FreeModuleOrder.cpp
@@ -703,16 +703,17 @@ std::unique_ptr<FreeModuleOrder> FreeModuleOrder::makeOrder(FreeModuleOrderType
     type = 1;  // Set the default
 
   switch (type) {
+  case 5:
+    //return make_unique<ConcreteOrder<OrderD>>(OrderD(I, false));
   case 1:
     return make_unique<ConcreteOrder<OrderA>>(OrderA(I->getPolyRing()));
+
   case 2:
    return make_unique<ConcreteOrder<OrderB>>(OrderB(I));
   case 3:
    return make_unique<ConcreteOrder<OrderC>>(OrderC(I));
   case 4:
     return make_unique<ConcreteOrder<OrderD>>(OrderD(I, true));
-  case 5:
-    return make_unique<ConcreteOrder<OrderD>>(OrderD(I, false));
   case 6:
     return make_unique<ConcreteOrder<OrderE>>(OrderE(I, true));
   case 7:
diff --git a/src/mathicgb/GroebnerBasis.cpp b/src/mathicgb/GroebnerBasis.cpp
index 4bd3252..357d257 100755
--- a/src/mathicgb/GroebnerBasis.cpp
+++ b/src/mathicgb/GroebnerBasis.cpp
@@ -407,6 +407,15 @@ void GroebnerBasis::dump() const
   display(std::cerr);
 }
 
+void GroebnerBasis::unschreyer(const std::vector<Monomial>& leads) {
+  for (size_t i = 0; i < mSignatures.size(); ++i) {
+    auto sig = mSignatures[i];
+    auto c = ring().monomialGetComponent(sig);
+    MATHICGB_ASSERT(c < leads.size());
+    ring().monomialDivide(sig, leads[c], sig);
+  }
+}
+
 size_t GroebnerBasis::getMemoryUse() const
 {
   // Note: we do not count the signatures as they are counted elsewhere.
diff --git a/src/mathicgb/GroebnerBasis.hpp b/src/mathicgb/GroebnerBasis.hpp
index 4ec1686..9af351b 100755
--- a/src/mathicgb/GroebnerBasis.hpp
+++ b/src/mathicgb/GroebnerBasis.hpp
@@ -102,6 +102,10 @@ public:
   // and returns LT, EQ or GT.
   inline int ratioCompare(size_t a, size_t b) const;
 
+  /// Divides all signatures ae_i by leads[i]. This currently breaks
+  /// all sorts of internal invariants - it's a temporary hack.
+  void unschreyer(const std::vector<Monomial>& leads);
+
   class StoredRatioCmp {
   public:
     // Stores the ratio numerator/denominator and prepares it for comparing
@@ -181,7 +185,7 @@ private:
 
   std::vector<DivisorLookup*> mSignatureLookup;
 
-  // contains those lead terms that are minimal
+  // Contains those lead terms that are minimal.
   std::unique_ptr<DivisorLookup> const mMinimalDivisorLookup;
 
   PolyBasis mBasis;
diff --git a/src/mathicgb/Ideal.cpp b/src/mathicgb/Ideal.cpp
index 09163ab..2123438 100755
--- a/src/mathicgb/Ideal.cpp
+++ b/src/mathicgb/Ideal.cpp
@@ -37,6 +37,10 @@ namespace {
   };
 }
 
+void Ideal::reverse() {
+  std::reverse(mGenerators.begin(), mGenerators.end());
+}
+
 void Ideal::sort(FreeModuleOrder& order) {
   IdealSort cmp(order);
   std::sort(mGenerators.begin(), mGenerators.end(), cmp);
diff --git a/src/mathicgb/Ideal.hpp b/src/mathicgb/Ideal.hpp
index 2528ef5..3173674 100755
--- a/src/mathicgb/Ideal.hpp
+++ b/src/mathicgb/Ideal.hpp
@@ -36,6 +36,7 @@ public:
   bool empty() const {return mGenerators.empty();}
   void reserve(size_t size) {mGenerators.reserve(size);}
 
+  void reverse();
   void sort(FreeModuleOrder& order);
 
 private:
diff --git a/src/mathicgb/MTArray.cpp b/src/mathicgb/MTArray.cpp
index cc409d2..53ff925 100755
--- a/src/mathicgb/MTArray.cpp
+++ b/src/mathicgb/MTArray.cpp
@@ -43,6 +43,8 @@ public:
 
   void display(std::ostream &o, int level) const;
 
+  void getMonomials(std::vector<const_monomial>& monomials) const;
+  
   virtual void printFrobbyM2Format
     (std::ostream& out, size_t component) const;
 
@@ -109,6 +111,12 @@ void MTArrayT<MT>::displayStats(std::ostream & /* o */) const
 }
 
 template <typename MT>
+void MTArrayT<MT>::getMonomials(std::vector<const_monomial>& monomials) const {
+  for (size_t i = 0; i < tables.size(); ++i)
+    tables[i]->getMonomials(monomials);  
+}
+
+template <typename MT>
 void MTArrayT<MT>::display(std::ostream &o, int level) const
 {
   std::vector<const_monomial> monomials;
diff --git a/src/mathicgb/MTArray.hpp b/src/mathicgb/MTArray.hpp
old mode 100644
new mode 100755
index a04e8f9..22a5573
--- a/src/mathicgb/MTArray.hpp
+++ b/src/mathicgb/MTArray.hpp
@@ -65,6 +65,8 @@ public:
 
   virtual void displayStats(std::ostream &o) const = 0;
 
+  virtual void getMonomials(std::vector<const_monomial>& monomials) const = 0;
+
   virtual size_t n_elems() const = 0;
 
   void dump(int level=0) const
diff --git a/src/mathicgb/SignatureGB.cpp b/src/mathicgb/SignatureGB.cpp
index 8dd90b8..1a57d82 100755
--- a/src/mathicgb/SignatureGB.cpp
+++ b/src/mathicgb/SignatureGB.cpp
@@ -12,56 +12,6 @@
 
 int tracingLevel = 0;
 
-void SignatureGB::computeGrobnerBasis()
-{
-  size_t counter = 0;
-
-  mTimer.reset();
-  std::ostream& out = std::cout;
-
-  while (step()) {
-    if (mBreakAfter > 0 && GB->size() > mBreakAfter) {
-      break;
-      const size_t pairs = SP->pairCount();
-      size_t sigs = 0;
-      size_t syzygySigs = 0;
-      while (true) {
-        monomial sig = SP->popSignature(mSpairTmp);
-        if (sig.isNull())
-          break;
-        ++sigs;
-        size_t dummy;
-        if (Hsyz->member(sig, dummy))
-          ++syzygySigs;
-        else
-          GB->minimalLeadInSig(sig);
-        R->freeMonomial(sig);
-      }
-      const double syzygyRatio = static_cast<double>(syzygySigs) / sigs;
-      std::cerr << "*** Early exit statistics ***\n"
-       << "remaining spairs: " << pairs << '\n'
-       << "remaining spair signatures: " << sigs << '\n'
-       << "spair signature syzygies: " << syzygySigs
-       << " (" << syzygyRatio * 100 << "% of sigs)\n";
-      break;
-    }
-    if (mPrintInterval == 0 || (++counter % mPrintInterval) != 0)
-      continue;
-    out << "\n-------------------------------------------------------------\n";
-    displayMemoryUse(out);
-    out << "\n";
-    displaySomeStats(out);
-  }
-  //  exit(1);
-  /*displayMemoryUse(std::cout);
-  std::cout << "\n";
-  displaySomeStats(std::cout);*/
-
-  //  displayMemoryUse(std::cout);
-  stats_nsecs = mTimer.getMilliseconds() / 1000.0;
-  //GB->displayBrief(out);
-}
-
 SignatureGB::SignatureGB(
   const Ideal& ideal,
   FreeModuleOrderType typ,
@@ -90,6 +40,7 @@ SignatureGB::SignatureGB(
   GB(make_unique<GroebnerBasis>(R, F.get(), divlookup_type, montable_type, preferSparseReducers)),
   mKoszuls(make_unique<KoszulQueue>(F.get(), *R)),
   Hsyz(MonomialTableArray::make(R, montable_type, ideal.size(), !mPostponeKoszul)),
+  Hsyz2(MonomialTableArray::make(R, montable_type, ideal.size(), !mPostponeKoszul)),
   reducer(Reducer::makeReducer(reductiontyp, *R)),
   SP(make_unique<SigSPairs>(R, F.get(), GB.get(), Hsyz.get(), reducer.get(), mPostponeKoszul, mUseBaseDivisors, useSingularCriterionEarly, queueType))
 {
@@ -101,8 +52,14 @@ SignatureGB::SignatureGB(
 
     monomial sig = 0;
     sig = R->allocMonomial();
-    R->monomialEi(i, sig);
     GB->addComponent();
+    R->monomialEi(i, sig);
+    if (typ == 5) {
+      auto lead = R->allocMonomial();
+      R->monomialCopy(g->getLeadMonomial(), lead);
+      mSchreyerTerms.push_back(lead);
+      R->monomialMult(sig, g->getLeadMonomial(), sig);
+    }
     {
       std::unique_ptr<Poly> autoG(g);
       GB->insert(sig, std::move(autoG));
@@ -118,7 +75,68 @@ SignatureGB::SignatureGB(
   }
 }
 
-SignatureGB::~SignatureGB() {}
+void SignatureGB::computeGrobnerBasis()
+{
+  size_t counter = 0;
+
+  mTimer.reset();
+  std::ostream& out = std::cout;
+
+  while (step()) {
+    if (mBreakAfter > 0 && GB->size() > mBreakAfter) {
+      break;
+      const size_t pairs = SP->pairCount();
+      size_t sigs = 0;
+      size_t syzygySigs = 0;
+      while (true) {
+        monomial sig = SP->popSignature(mSpairTmp);
+        if (sig.isNull())
+          break;
+        ++sigs;
+        size_t dummy;
+        if (Hsyz->member(sig, dummy))
+          ++syzygySigs;
+        else
+          GB->minimalLeadInSig(sig);
+        R->freeMonomial(sig);
+      }
+      const double syzygyRatio = static_cast<double>(syzygySigs) / sigs;
+      std::cerr << "*** Early exit statistics ***\n"
+       << "remaining spairs: " << pairs << '\n'
+       << "remaining spair signatures: " << sigs << '\n'
+       << "spair signature syzygies: " << syzygySigs
+       << " (" << syzygyRatio * 100 << "% of sigs)\n";
+      break;
+    }
+    if (mPrintInterval == 0 || (++counter % mPrintInterval) != 0)
+      continue;
+    out << "\n-------------------------------------------------------------\n";
+    displayMemoryUse(out);
+    out << "\n";
+    displaySomeStats(out);
+  }
+  //  exit(1);
+  /*displayMemoryUse(std::cout);
+  std::cout << "\n";
+  displaySomeStats(std::cout);*/
+
+  //  displayMemoryUse(std::cout);
+  stats_nsecs = mTimer.getMilliseconds() / 1000.0;
+  //GB->displayBrief(out);
+
+  if (!mSchreyerTerms.empty()) {
+    GB->unschreyer(mSchreyerTerms);
+    std::vector<const_monomial> v;
+    Hsyz->getMonomials(v);
+    for (size_t i = 0; i < v.size(); ++i) {
+      auto sig = R->allocMonomial();
+      auto c = R->monomialGetComponent(v[i]);
+      MATHICGB_ASSERT(c < mSchreyerTerms.size());
+      R->monomialDivide(v[i], mSchreyerTerms[c], sig);
+      Hsyz2->insert(sig, 0);
+    }
+  }
+}
 
 bool SignatureGB::processSPair
   (monomial sig, const SigSPairs::PairContainer& pairs)
diff --git a/src/mathicgb/SignatureGB.hpp b/src/mathicgb/SignatureGB.hpp
index a2b1f8a..8546a7c 100755
--- a/src/mathicgb/SignatureGB.hpp
+++ b/src/mathicgb/SignatureGB.hpp
@@ -33,7 +33,6 @@ public:
     bool preferSparseReducers,
     bool useSingularCriterionEarly,
     size_t queueType);
-  ~SignatureGB();
 
   void computeGrobnerBasis();
 
@@ -44,7 +43,7 @@ public:
   unsigned long long getSingularReductionCount() const;
 
   GroebnerBasis* getGB() { return GB.get(); }
-  MonomialTableArray* getSyzTable() { return Hsyz.get(); }
+  MonomialTableArray* getSyzTable() { return mSchreyerTerms.empty() ? Hsyz.get() : Hsyz2.get(); }
   SigSPairs* getSigSPairs() { return SP.get(); }
 
   size_t getMemoryUse() const;
@@ -101,8 +100,10 @@ private:
   std::unique_ptr<GroebnerBasis> GB;
   std::unique_ptr<KoszulQueue> mKoszuls;
   std::unique_ptr<MonomialTableArray> Hsyz;
+  std::unique_ptr<MonomialTableArray> Hsyz2;
   std::unique_ptr<Reducer> reducer;
   std::unique_ptr<SigSPairs> SP;
+  std::vector<monomial> mSchreyerTerms;
 };
 
 #endif
diff --git a/src/test/FreeModuleOrderTest.cpp b/src/test/FreeModuleOrderTest.cpp
index e7a1ea3..89a4351 100755
--- a/src/test/FreeModuleOrderTest.cpp
+++ b/src/test/FreeModuleOrderTest.cpp
@@ -90,5 +90,5 @@ TEST(FreeModuleOrder, One) {
   runTest(ideal, sigs, "0 6 5 1 4 3 7 2", 2); 
   runTest(ideal, sigs, "0 6 5 1 7 4 3 2", 3); 
   runTest(ideal, sigs, "0 6 5 1 4 3 7 2", 4); 
-  runTest(ideal, sigs, "0 6 5 1 4 7 3 2", 5); 
+//  runTest(ideal, sigs, "0 6 5 1 4 7 3 2", 5); 
 }

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