[mathicgb] 393/393: Connected the module input library basis to a module backend and added a unit test for it that passes.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:39 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 c72c945ba8e18e68e5650e7e4982b86e558abe6c
Author: Bjarke Hammersholt Roune <www.broune.com>
Date: Sun Oct 6 17:36:31 2013 -0700
Connected the module input library basis to a module backend and added a unit test for it that passes.
---
src/mathicgb.cpp | 8 +-
src/mathicgb.h | 2 +-
src/mathicgb/ClassicGBAlg.cpp | 18 +++-
src/mathicgb/MonoMonoid.hpp | 3 +-
src/test/mathicgb.cpp | 218 ++++++++++++++++++++++++++++++++++++++++++
5 files changed, 241 insertions(+), 8 deletions(-)
diff --git a/src/mathicgb.cpp b/src/mathicgb.cpp
index 60a5fbc..ddf2400 100755
--- a/src/mathicgb.cpp
+++ b/src/mathicgb.cpp
@@ -735,6 +735,7 @@ void GroebnerInputIdealStream::appendTermBegin(const Component com) {
MATHICGB_IF_DEBUG(mPimpl->checker.appendTermBegin(com));
std::fill_n(mExponents, varCount(), 0);
+ mPimpl->ring.monoid().setComponent(com, mPimpl->monomial);
MATHICGB_ASSERT(debugAssertValid());
}
@@ -852,6 +853,7 @@ namespace mgbi {
MATHICGB_ASSERT(p.ring().monoid() == monoid);
const auto& from = *mPimpl->mTermIt;
+ const auto com = monoid.component(*from.mono);
auto to = mPimpl->tmpTerm.get();
for (VarIndex var = 0; var < monoid.varCount(); ++var)
to[var] = monoid.externalExponent(*from.mono, var);
@@ -872,7 +874,7 @@ namespace mgbi {
ConstTerm term;
term.coef = from.coef;
term.exponents = to;
- term.com = 0;
+ term.com = com;
return term;
}
}
@@ -968,7 +970,9 @@ namespace mgbi {
if (!callback.isNull())
params.callback = [&callback](){return callback();};
- auto gb = computeGBClassicAlg(std::move(basis), params);
+ auto gb = conf.comCount() == 1 ?
+ computeGBClassicAlg(std::move(basis), params) :
+ computeModuleGBClassicAlg(std::move(basis), params);
typedef mgb::GroebnerConfiguration::Callback::Action Action;
if (callback.lastAction() != Action::StopWithNoOutputAction) {
diff --git a/src/mathicgb.h b/src/mathicgb.h
index 2b021ce..10dae31 100755
--- a/src/mathicgb.h
+++ b/src/mathicgb.h
@@ -72,7 +72,7 @@ namespace mgb { // Part of the public interface of MathicGB
/// Type for the component of a module monomial. The module monomial
/// x*y*z * e_i has component i.
- typedef size_t Component;
+ typedef unsigned int Component;
/// A configuration in a module over a polynomial ring with varCount
/// variables and the coefficients are from the finite field with
diff --git a/src/mathicgb/ClassicGBAlg.cpp b/src/mathicgb/ClassicGBAlg.cpp
index 004fd80..9571e5e 100755
--- a/src/mathicgb/ClassicGBAlg.cpp
+++ b/src/mathicgb/ClassicGBAlg.cpp
@@ -20,6 +20,13 @@ MATHICGB_DEFINE_LOG_DOMAIN(
"Buchberger's algorithm."
);
+MATHICGB_DEFINE_LOG_DOMAIN(
+ GBInsert,
+ "Outputs polynomials that are inserted into the current "
+ "basis during Groebner basis computation using Buchberger's. "
+ "algorithm."
+);
+
MATHICGB_NAMESPACE_BEGIN
/// Calculates a classic Grobner basis using Buchberger's algorithm.
@@ -146,9 +153,9 @@ void ClassicGBAlg::setSPairGroupSize(unsigned int groupSize) {
mSPairGroupSize = groupSize;
}
-void ClassicGBAlg::insertPolys
-(std::vector<std::unique_ptr<Poly> >& polynomials)
-{
+void ClassicGBAlg::insertPolys(
+ std::vector<std::unique_ptr<Poly> >& polynomials
+) {
if (!mUseAutoTopReduction) {
for (auto it = polynomials.begin(); it != polynomials.end(); ++it) {
MATHICGB_ASSERT(it->get() != 0);
@@ -189,6 +196,11 @@ void ClassicGBAlg::insertPolys
if (mBasis.divisor((*it)->leadMono()) != static_cast<size_t>(-1))
toReduce.push_back(std::move(*it));
else {
+ MATHICGB_IF_STREAM_LOG(GBInsert) {
+ stream << "Inserting basis element " << mBasis.size() << ": ";
+ MathicIO<>().writePoly(**it, true, stream);
+ stream << '\n';
+ };
mBasis.insert(std::move(*it));
MATHICGB_ASSERT(toRetire.empty());
mSPairs.addPairsAssumeAutoReduce(mBasis.size() - 1, toRetire);
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index def5533..0ea2393 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -994,11 +994,10 @@ public:
/// exponents must point to an array of size varCount().
/// After this, exponent(mono, var) is exponents[externalVar(var)].
/// The value of exponents[var] becomes the exponent of internalVar(var).
+ /// Does not set the component.
void setExternalExponents(const Exponent* exponents, MonoRef mono) const {
MATHICGB_ASSERT(exponents != 0);
- if (HasComponent)
- access(mono, componentIndex()) = 0;
for (VarIndex iVar = 0; iVar < varCount(); ++iVar) {
const auto eVar = externalVar(iVar);
access(mono, exponentsIndexBegin() + iVar) = exponents[eVar];
diff --git a/src/test/mathicgb.cpp b/src/test/mathicgb.cpp
index 0a31130..594b108 100755
--- a/src/test/mathicgb.cpp
+++ b/src/test/mathicgb.cpp
@@ -278,6 +278,198 @@ namespace {
s.appendPolynomialDone();
s.idealDone();
}
+
+ template<class Stream>
+ void makeSimpleModuleBasis(Stream& s) {
+ MATHICGB_ASSERT(s.varCount() >= 4);
+ MATHICGB_ASSERT(s.comCount() >= 4);
+ // The basis is
+ // c2<0>-b<1>+d<2>
+ // bd<0>-a<1>+c<2>
+ // ac<0>-b<2>-d<3>
+ // b2<0>-a<2>-c<3>
+ const auto minusOne = s.modulus() - 1;
+ s.idealBegin(4);
+ s.appendPolynomialBegin(3); // c2<0>-b<1>+d<2>
+ s.appendTermBegin(0);
+ s.appendExponent(2, 2);
+ s.appendTermDone(1);
+ s.appendTermBegin(1);
+ s.appendExponent(1, 1);
+ s.appendTermDone(minusOne);
+ s.appendTermBegin(2);
+ s.appendExponent(3, 1);
+ s.appendTermDone(1);
+ s.appendPolynomialDone();
+
+ s.appendPolynomialBegin(3); // bd<0>-a<1>+c<2>
+ s.appendTermBegin(0);
+ s.appendExponent(1, 1);
+ s.appendExponent(3, 1);
+ s.appendTermDone(1);
+ s.appendTermBegin(1);
+ s.appendExponent(0, 1);
+ s.appendTermDone(minusOne);
+ s.appendTermBegin(2);
+ s.appendExponent(2, 1);
+ s.appendTermDone(1);
+ s.appendPolynomialDone();
+
+ s.appendPolynomialBegin(3); // ac<0>-b<2>-d<3>
+ s.appendTermBegin(0);
+ s.appendExponent(0, 1);
+ s.appendExponent(2, 1);
+ s.appendTermDone(1);
+ s.appendTermBegin(2);
+ s.appendExponent(1, 1);
+ s.appendTermDone(minusOne);
+ s.appendTermBegin(3);
+ s.appendExponent(3, 1);
+ s.appendTermDone(minusOne);
+ s.appendPolynomialDone();
+
+ s.appendPolynomialBegin(3); // b2<0>-a<2>-c<3>
+ s.appendTermBegin(0);
+ s.appendExponent(1, 2);
+ s.appendTermDone(1);
+ s.appendTermBegin(2);
+ s.appendExponent(0, 1);
+ s.appendTermDone(minusOne);
+ s.appendTermBegin(3);
+ s.appendExponent(2, 1);
+ s.appendTermDone(minusOne);
+ s.appendPolynomialDone();
+
+ s.idealDone();
+ }
+
+ template<class Stream>
+ void makeSimpleModuleGroebnerBasis(Stream& s) {
+ s.idealBegin(5); // polyCount
+ s.appendPolynomialBegin(3);
+ s.appendTermBegin(0);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 2); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendTermBegin(1);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 1); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 1); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(3);
+ s.appendTermBegin(0);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 1); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 1); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendTermBegin(1);
+ s.appendExponent(0, 1); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 1); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(3);
+ s.appendTermBegin(0);
+ s.appendExponent(0, 1); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 1); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 1); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(3);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 1); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(3);
+ s.appendTermBegin(0);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 2); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 1); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(3);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 1); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendPolynomialDone();
+ s.appendPolynomialBegin(4);
+ s.appendTermBegin(1);
+ s.appendExponent(0, 1); // index, exponent
+ s.appendExponent(1, 1); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(1); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 1); // index, exponent
+ s.appendExponent(2, 1); // index, exponent
+ s.appendExponent(3, 0); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(2);
+ s.appendExponent(0, 1); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 0); // index, exponent
+ s.appendExponent(3, 1); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendTermBegin(3);
+ s.appendExponent(0, 0); // index, exponent
+ s.appendExponent(1, 0); // index, exponent
+ s.appendExponent(2, 1); // index, exponent
+ s.appendExponent(3, 1); // index, exponent
+ s.appendExponent(4, 0); // index, exponent
+ s.appendTermDone(100); // coefficient
+ s.appendPolynomialDone();
+ s.idealDone();
+ }
}
TEST(MathicGBLib, NullIdealStream) {
@@ -500,6 +692,32 @@ TEST(MathicGBLib, Cyclic5) {
}
}
+TEST(MathicGBLib, SimpleModuleIdeal) {
+ for (int i = 0; i < 2; ++i) {
+ mgb::GroebnerConfiguration configuration(101, 5, 4);
+ const auto reducer = i == 0 ?
+ mgb::GroebnerConfiguration::ClassicReducer :
+ mgb::GroebnerConfiguration::MatrixReducer;
+ configuration.setReducer(reducer);
+ mgb::GroebnerInputIdealStream input(configuration);
+ std::ostringstream computedStr;
+ mgb::IdealStreamLog<> computed(computedStr, 101, 5, 4);
+ mgb::IdealStreamChecker<decltype(computed)> checked(computed);
+
+ makeSimpleModuleBasis(input);
+ mgb::computeGroebnerBasis(input, checked);
+
+ std::ostringstream correctStr;
+ mgb::IdealStreamLog<> correct(correctStr, 101, 5, 4);
+ mgb::IdealStreamChecker<decltype(correct)> correctChecked(correct);
+ makeSimpleModuleGroebnerBasis(correctChecked);
+
+ EXPECT_EQ(correctStr.str(), computedStr.str())
+ << "\nDisplayed expected:\n" << correctStr.str()
+ << "\nDisplayed computed:\n" << computedStr.str();
+ }
+}
+
namespace {
class TestCallback : public mgb::GroebnerConfiguration::Callback {
public:
--
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