[mathicgb] 208/393: Minor cleanup to MonoMonoid and added product along with tests.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:02 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 f6e9bbbd3aefa4984fad3422840580626022c03a
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Fri Mar 29 13:39:27 2013 +0100
Minor cleanup to MonoMonoid and added product along with tests.
---
src/mathicgb/MonoMonoid.hpp | 49 ++++++++++++++++++++++-----------------------
src/test/MonoMonoid.cpp | 46 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 69 insertions(+), 26 deletions(-)
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index bb3a14a..0ccaa02 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -17,15 +17,6 @@
/// TODO: support grading and comparison.
template<class E>
class MonoMonoid {
-private:
- friend class Mono;
- friend class MonoRef;
- friend class ConstMonoRef;
- friend class MonoPtr;
- friend class ConstMonoPtr;
- friend class MonoVector;
- friend class MonoPool;
-
public:
static_assert(std::numeric_limits<E>::is_signed, "");
@@ -157,6 +148,10 @@ public:
return static_cast<HashValue>(access(mono, hashIndex()));
}
+ bool equal(ConstMonoRef a, ConstMonoRef b) const {
+ return std::equal(begin(a), end(a), begin(b));
+ }
+
/// Returns the hash of the product of a and b.
HashValue hashOfProduct(ConstMonoRef a, ConstMonoRef b) const {
// See computeHash() for an explanation of all the casts.
@@ -165,10 +160,6 @@ public:
return static_cast<HashValue>(static_cast<Exponent>(hashA + hashB));
}
- bool equal(ConstMonoRef a, ConstMonoRef b) const {
- return std::equal(begin(a), end(a), begin(b));
- }
-
/// Returns true if all the exponents of mono are zero. In other
/// words, returns true if mono is the identity for multiplication
/// of monomials.
@@ -232,6 +223,17 @@ public:
MATHICGB_ASSERT(debugValid(mono));
}
+ void multiply(ConstMonoRef a, ConstMonoRef b, MonoRef prod) const {
+ MATHICGB_ASSERT(debugValid(a));
+ MATHICGB_ASSERT(debugValid(b));
+
+ for (auto i = 0; i < entryCount(); ++i)
+ access(prod, i) = access(a, i) + access(b, i);
+
+ MATHICGB_ASSERT(hashOfProduct(a, b) == hash(prod));
+ MATHICGB_ASSERT(debugValid(prod));
+ }
+
/// Parses a monomial out of a string. Valid examples: 1 abc a2bc
/// aA. Variable names are case sensitive. Whitespace terminates the
/// parse as does any other character that is not a letter or a
@@ -344,9 +346,6 @@ public:
private:
friend class MonoMonoid;
- friend class MonoVector;
- friend class MonoPtr;
- friend class ConstMonoRef;
const Exponent* internalRawPtr() const {return mMono;}
ConstMonoPtr(const Exponent* mono): mMono(mono) {}
@@ -356,10 +355,6 @@ public:
class MonoPtr {
public:
- friend class Mono;
- friend class MonoRef;
- friend class MonoVector;
- friend class MonoPool;
MonoPtr(): mMono(0) {}
MonoPtr(const MonoPtr& mono): mMono(mono.mMono) {}
// todo: xxx
@@ -417,11 +412,9 @@ public:
}
private:
- friend class MonoMonoid;
-
Mono(const Mono&); // not available
void operator=(const Mono&); // not available
- friend class MonoPool;
+ friend class MonoMonoid;
Mono(const MonoPtr mono, MonoPool& pool):
mMono(mono), mPool(&pool) {}
@@ -441,7 +434,6 @@ public:
private:
void operator=(const MonoRef&); // not available
friend class MonoMonoid;
- friend class MonoPtr;
MonoRef(MonoPtr mono): mMono(mono) {}
Exponent* internalRawPtr() const {return rawPtr(mMono);}
@@ -460,7 +452,6 @@ public:
private:
void operator=(const MonoRef&); // not available
friend class MonoMonoid;
- friend class ConstMonoPtr;
ConstMonoRef(ConstMonoPtr mono): mMono(mono) {}
const Exponent* internalRawPtr() const {return rawPtr(mMono);}
@@ -672,6 +663,14 @@ public:
private:
+ friend class Mono;
+ friend class MonoRef;
+ friend class ConstMonoRef;
+ friend class MonoPtr;
+ friend class ConstMonoPtr;
+ friend class MonoVector;
+ friend class MonoPool;
+
bool debugValid(ConstMonoRef mono) const {
MATHICGB_ASSERT(debugOrderValid(mono));
MATHICGB_ASSERT(debugHashValid(mono));
diff --git a/src/test/MonoMonoid.cpp b/src/test/MonoMonoid.cpp
index 7d209e7..3d3f024 100755
--- a/src/test/MonoMonoid.cpp
+++ b/src/test/MonoMonoid.cpp
@@ -308,9 +308,53 @@ TEST(MonoMonoid, ParsePrintM2) {
ASSERT_EQ(v, v2);
}
+TEST(MonoMonoid, Product) {
+ typedef MonoMonoid<int32> Monoid;
+ Monoid m(49);
+ Monoid::MonoPool pool(m);
+ auto mono = pool.alloc();
+ auto checkProd = [&](const char* str) {
+ auto v = parseVector(m, str);
+ MATHICGB_ASSERT(v.size() == 3);
+ const auto& a = v.front();
+ const auto& b = *++v.begin();
+ const auto& c = v.back();
+ ASSERT_EQ(m.hashOfProduct(a, b), m.hash(c));
+ ASSERT_EQ(m.hashOfProduct(a, b), m.hashOfProduct(b, a));
+
+ m.multiply(a, b, mono);
+ ASSERT_TRUE(m.equal(c, mono));
+ ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo);
+ ASSERT_EQ(m.hash(c), m.hash(mono));
+
+ m.multiply(b, a, mono);
+ ASSERT_TRUE(m.equal(c, mono));
+ ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo);
+ ASSERT_EQ(m.hash(c), m.hash(mono));
+
+ if (!m.isIdentity(a))
+ ASSERT_TRUE(m.lessThan(b, mono));
+ else
+ ASSERT_TRUE(m.compare(b, mono) == Monoid::EqualTo);
+
+ if (!m.isIdentity(b))
+ ASSERT_TRUE(m.lessThan(a, mono));
+ else
+ ASSERT_TRUE(m.compare(a, mono) == Monoid::EqualTo);
+ };
+ checkProd("1 1 1");
+ checkProd("a 1 a");
+ checkProd("1 Vx Vx");
+ checkProd("aV bx abxV");
+ checkProd("a a2 a3");
+ checkProd("V V2 V3");
+ checkProd("arlgh svug arlg2hsvu");
+ checkProd("abcdefghiV ab2c3d4e5f6g7h8i9V11 a2b3c4d5e6f7g8h9i10V12");
+}
+
TEST(MonoMonoid, Order) {
typedef MonoMonoid<int32> Monoid;
- Monoid m(100);
+ Monoid m(52);
auto v = parseVector(m, "1 Z A z c b a c2 bc ac b2 ab a2 c3 abc b3 a3");
for (auto greater = v.begin(); greater != v.end(); ++greater) {
--
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