[mathicgb] 312/393: Added readBasis and writeBasis to MathicIO along with tests.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:27 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 b400a54c7c2a7bf3d52051a6d5e8261500be813a
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Mon May 6 17:04:01 2013 +0200
Added readBasis and writeBasis to MathicIO along with tests.
---
src/mathicgb/Basis.cpp | 16 ++++++----------
src/mathicgb/Basis.hpp | 17 ++++++++++++-----
src/mathicgb/MathicIO.hpp | 24 ++++++++++++++++++++----
src/test/MathicIO.cpp | 35 ++++++++++++++++++++++++++++++++++-
4 files changed, 72 insertions(+), 20 deletions(-)
diff --git a/src/mathicgb/Basis.cpp b/src/mathicgb/Basis.cpp
index 7b1048e..508e16a 100755
--- a/src/mathicgb/Basis.cpp
+++ b/src/mathicgb/Basis.cpp
@@ -9,24 +9,20 @@
#include <iostream>
#include <cctype>
-Basis::~Basis()
-{
- for (size_t i = 0; i<mGenerators.size(); i++)
- delete mGenerators[i];
-}
-
-void Basis::insert(std::unique_ptr<Poly> p) {
+void Basis::insert(std::unique_ptr<Poly>&& p) {
MATHICGB_ASSERT(p.get() != 0);
MATHICGB_ASSERT(p->termsAreInDescendingOrder());
- mGenerators.reserve(mGenerators.size() + 1);
- mGenerators.push_back(p.release());
+ mGenerators.push_back(std::move(p));
}
namespace {
class BasisSort {
public:
BasisSort(const FreeModuleOrder& order): mOrder(order) {}
- bool operator()(const Poly* a, const Poly* b) {
+ bool operator()(
+ const std::unique_ptr<Poly>& a,
+ const std::unique_ptr<Poly>& b
+ ) {
return mOrder.signatureCompare
(a->getLeadMonomial(), b->getLeadMonomial()) == LT;
}
diff --git a/src/mathicgb/Basis.hpp b/src/mathicgb/Basis.hpp
index 26eabf9..9c1b6b9 100755
--- a/src/mathicgb/Basis.hpp
+++ b/src/mathicgb/Basis.hpp
@@ -17,9 +17,9 @@ class FreeModuleOrder;
class Basis {
public:
Basis(const PolyRing &R) : mRing(R) {}
- ~Basis();
+ Basis(Basis&& basis): mRing(basis.ring()), mGenerators(std::move(basis.mGenerators)) {}
- void insert(std::unique_ptr<Poly> p);
+ void insert(std::unique_ptr<Poly>&& p);
/// reads ring, #gens, each generator in turn
typedef std::tuple<
@@ -35,8 +35,13 @@ public:
const PolyRing& ring() const { return mRing; }
const PolyRing *getPolyRing() const { return &mRing; }
- const std::vector<Poly *>& viewGenerators() { return mGenerators; }
- const Poly *getPoly(size_t i) const { return mGenerators[i]; }
+ const std::vector<std::unique_ptr<Poly>>& viewGenerators() {
+ return mGenerators;
+ }
+ const Poly *getPoly(size_t i) const {
+ MATHICGB_ASSERT(i < size());
+ return mGenerators[i].get();
+ }
size_t size() const {return mGenerators.size();}
bool empty() const {return mGenerators.empty();}
void reserve(size_t size) {mGenerators.reserve(size);}
@@ -44,8 +49,10 @@ public:
void sort(FreeModuleOrder& order);
private:
+ Basis(const Basis&); // not available
+
const PolyRing& mRing;
- std::vector<Poly*> mGenerators;
+ std::vector<std::unique_ptr<Poly>> mGenerators;
};
#endif
diff --git a/src/mathicgb/MathicIO.hpp b/src/mathicgb/MathicIO.hpp
index 58da553..43dae37 100755
--- a/src/mathicgb/MathicIO.hpp
+++ b/src/mathicgb/MathicIO.hpp
@@ -1,10 +1,11 @@
#ifndef MATHICGB_MATHIC_IO_GUARD
#define MATHICGB_MATHIC_IO_GUARD
+#include "Basis.hpp"
+#include "Poly.hpp"
#include "Scanner.hpp"
#include "PolyRing.hpp"
#include "MonoProcessor.hpp"
-#include "Poly.hpp"
#include <ostream>
#include <string>
@@ -63,6 +64,18 @@ public:
std::ostream& out
);
+ Basis readBasis(
+ const PolyRing& ring,
+ const bool readComponent,
+ Scanner& in
+ );
+
+ void writeBasis(
+ const Basis& basis,
+ const bool writeComponent,
+ std::ostream& out
+ );
+
Poly readPoly(
const PolyRing& ring,
const bool readComponent,
@@ -254,22 +267,25 @@ Basis MathicIO::readBasis(
const bool readComponent,
Scanner& in
) {
- const auto polyCount = mIn.readInteger<size_t>();
+ const auto polyCount = in.readInteger<size_t>();
+ Basis basis(ring);
for (size_t i = 0; i < polyCount; ++i) {
auto p = make_unique<Poly>(readPoly(ring, readComponent, in));
p->sortTermsDescending();
- basis->insert(std::move(p));
+ basis.insert(std::move(p));
}
+ return std::move(basis);
}
void MathicIO::writeBasis(
const Basis& basis,
+ const bool writeComponent,
std::ostream& out
) {
out << basis.size() << '\n';
for (size_t i = 0; i < basis.size(); ++i) {
out << ' ';
- writePoly(*basis.getPoly(i), out);
+ writePoly(*basis.getPoly(i), writeComponent, out);
out << '\n';
}
}
diff --git a/src/test/MathicIO.cpp b/src/test/MathicIO.cpp
index f05ec3e..ca82054 100755
--- a/src/test/MathicIO.cpp
+++ b/src/test/MathicIO.cpp
@@ -104,10 +104,43 @@ TEST(MathicIO, ReadWriteMonomial) {
check("ab<2>", 2, 0,1, 1,1);
}
-TEST(MathicIO, ReadWritePoly) {
+TEST(MathicIO, ReadWriteBasis) {
typedef PolyRing::Monoid Monoid;
typedef PolyRing::Field Field;
+ PolyRing ring(Field(101), Monoid(28));
+
+ auto check = [&](
+ const char* const inStr,
+ const char* const outStr,
+ const bool doComponent
+ ) {
+ for (int i = 0; i < 2; ++i) {
+ const char* str = i == 0 ? inStr : outStr;
+ if (str == 0)
+ continue;
+ Scanner in(str);
+ const auto basis = MathicIO().readBasis(ring, doComponent, in);
+ std::ostringstream out;
+ MathicIO().writeBasis(basis, doComponent, out);
+ const auto correctStr = outStr == 0 ? inStr : outStr;
+ ASSERT_EQ(correctStr, out.str());
+ }
+ };
+
+ check("0", "0\n", false);
+ check("0", "0\n", true);
+ check("1 0", "1\n 0\n", false);
+ check("1 0", "1\n 0\n", true);
+
+ check("1 1", "1\n 1\n", false);
+ check("1 a<0>", "1\n a<0>\n", true);
+ check("2 a b", "2\n a\n b\n", false);
+}
+
+TEST(MathicIO, ReadWritePoly) {
+ typedef PolyRing::Monoid Monoid;
+ typedef PolyRing::Field Field;
PolyRing ring(Field(101), Monoid(28));
auto check = [&](
--
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