[mathicgb] 304/393: Moved handling of Schreyer order into Basis and added syntax for that to ring description. The number given to a free module order then no longer does anything at all, so code passing that around has been removed.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:26 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 fee815cb01956c8dd6f348c0bfc69ce8d4de1cec
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Mon Apr 29 21:58:59 2013 +0200
Moved handling of Schreyer order into Basis and added syntax for that to ring description. The number given to a free module order then no longer does anything at all, so code passing that around has been removed.
---
src/cli/GBAction.cpp | 12 +-----------
src/cli/SigGBAction.cpp | 14 ++------------
src/cli/SigGBAction.hpp | 1 -
src/mathicgb.cpp | 2 +-
src/mathicgb/Basis.cpp | 10 +++++++++-
src/mathicgb/BuchbergerAlg.cpp | 3 +--
src/mathicgb/BuchbergerAlg.hpp | 3 +--
src/mathicgb/MonoMonoid.hpp | 22 +++++++++++++++++-----
src/mathicgb/PolyRing.cpp | 2 +-
src/mathicgb/PolyRing.hpp | 2 +-
src/mathicgb/SignatureGB.cpp | 13 +++----------
src/mathicgb/SignatureGB.hpp | 6 +++---
src/test/MonoMonoid.cpp | 2 +-
src/test/gb-test.cpp | 41 ++++++++++++++++++++---------------------
src/test/ideals.cpp | 25 ++++++++++++++-----------
src/test/ideals.hpp | 2 +-
16 files changed, 76 insertions(+), 84 deletions(-)
diff --git a/src/cli/GBAction.cpp b/src/cli/GBAction.cpp
index 32f1322..85c3147 100755
--- a/src/cli/GBAction.cpp
+++ b/src/cli/GBAction.cpp
@@ -21,11 +21,6 @@ GBAction::GBAction():
"classic Buchberger algorithm.",
true),
- //mTermOrder("termOrder",
- // "The term order to compute a Grobner basis with respect to. This is "
- // "currently actually a free module term order, but that should be changed.",
- // 4),
-
mSPairGroupSize("sPairGroupSize",
"Specifies how many S-pair to reduce at one time. A value of 0 "
"indicates to use an appropriate default.",
@@ -39,11 +34,7 @@ GBAction::GBAction():
0),
mParams(1, 1)
-{
- std::ostringstream orderOut;
- FreeModuleOrder::displayOrderTypes(orderOut);
- //mTermOrder.appendToDescription(orderOut.str());
-}
+{}
void GBAction::directOptions(
std::vector<std::string> tokens,
@@ -87,7 +78,6 @@ void GBAction::performAction() {
BuchbergerAlg alg(
*basis,
- 4 /*mModuleOrder.value()*/ , // todo: alg should not take a *module* order
*reducer,
mGBParams.mDivisorLookup.value(),
mGBParams.mPreferSparseReducers.value(),
diff --git a/src/cli/SigGBAction.cpp b/src/cli/SigGBAction.cpp
index b7566af..ce83dbe 100755
--- a/src/cli/SigGBAction.cpp
+++ b/src/cli/SigGBAction.cpp
@@ -25,16 +25,8 @@ SigGBAction::SigGBAction():
"S-spairs quickly based on signature.",
true),
- mModuleOrder("moduleOrder",
- "The free module term order.\n",
- 4),
-
mParams(1, 1)
-{
- std::ostringstream orderOut;
- FreeModuleOrder::displayOrderTypes(orderOut);
- mModuleOrder.appendToDescription(orderOut.str());
-}
+{}
void SigGBAction::directOptions(
std::vector<std::string> tokens,
@@ -59,8 +51,7 @@ void SigGBAction::performAction() {
SignatureGB alg(
std::move(*basis),
- mModuleOrder.value(),
- std::get<2>(tuple)->componentsAscendingDesired(),
+ std::move(*std::get<2>(tuple)),
Reducer::reducerType(mGBParams.mReducer.value()),
mGBParams.mDivisorLookup.value(),
mGBParams.mMonomialTable.value(),
@@ -126,5 +117,4 @@ void SigGBAction::pushBackParameters(
parameters.push_back(&mUseSingularCriterionEarly);
parameters.push_back(&mPostponeKoszul);
parameters.push_back(&mUseBaseDivisors);
- parameters.push_back(&mModuleOrder);
}
diff --git a/src/cli/SigGBAction.hpp b/src/cli/SigGBAction.hpp
old mode 100644
new mode 100755
index b63b409..c25e199
--- a/src/cli/SigGBAction.hpp
+++ b/src/cli/SigGBAction.hpp
@@ -30,7 +30,6 @@ private:
mic::BoolParameter mUseSingularCriterionEarly;
mic::BoolParameter mPostponeKoszul;
mic::BoolParameter mUseBaseDivisors;
- mic::IntegerParameter mModuleOrder;
};
#endif
diff --git a/src/mathicgb.cpp b/src/mathicgb.cpp
index ceb66ba..c99e7fe 100755
--- a/src/mathicgb.cpp
+++ b/src/mathicgb.cpp
@@ -803,7 +803,7 @@ namespace mgbi {
);
// Set up and configure algorithm
- BuchbergerAlg alg(basis, 4, *reducer, 2, true, 0);
+ BuchbergerAlg alg(basis, *reducer, 2, true, 0);
alg.setReducerMemoryQuantum(100 * 1024);
alg.setUseAutoTopReduction(true);
alg.setUseAutoTailReduction(false);
diff --git a/src/mathicgb/Basis.cpp b/src/mathicgb/Basis.cpp
index 7e86811..0e3665c 100755
--- a/src/mathicgb/Basis.cpp
+++ b/src/mathicgb/Basis.cpp
@@ -49,7 +49,7 @@ auto Basis::parse(std::istream& in) -> Parsed
auto basis = make_unique<Basis>(*ring);
auto processor = make_unique<MonoProcessor<Monoid>>(ring->monoid());
- processor->setComponentsAscendingDesired(r.second);
+ processor->setComponentsAscendingDesired(r.second.first);
size_t polyCount;
in >> polyCount;
@@ -60,6 +60,14 @@ auto Basis::parse(std::istream& in) -> Parsed
poly->parse(in);
basis->insert(std::move(poly));
}
+
+ if (r.second.second) {
+ Monoid::MonoVector schreyer(ring->monoid());
+ for (size_t gen = 0; gen < basis->size(); ++gen)
+ schreyer.push_back(basis->getPoly(gen)->getLeadMonomial());
+ processor->setModuleAdjustments(std::move(schreyer));
+ }
+
return std::make_tuple(
std::move(ring),
std::move(basis),
diff --git a/src/mathicgb/BuchbergerAlg.cpp b/src/mathicgb/BuchbergerAlg.cpp
index c086d6a..0c6b69d 100755
--- a/src/mathicgb/BuchbergerAlg.cpp
+++ b/src/mathicgb/BuchbergerAlg.cpp
@@ -12,7 +12,6 @@ MATHICGB_DEFINE_LOG_DOMAIN(
BuchbergerAlg::BuchbergerAlg(
const Basis& basis,
- FreeModuleOrderType orderType,
Reducer& reducer,
int divisorLookupType,
bool preferSparseReducers,
@@ -25,7 +24,7 @@ BuchbergerAlg::BuchbergerAlg(
mUseAutoTopReduction(true),
mUseAutoTailReduction(false),
mRing(*basis.getPolyRing()),
- mOrder(FreeModuleOrder::makeOrder(orderType, *basis.getPolyRing())),
+ mOrder(FreeModuleOrder::makeOrder(0, *basis.getPolyRing())), // todo: remove
mReducer(reducer),
mBasis(mRing, *mOrder, DivisorLookup::makeFactory(
*basis.getPolyRing(),
diff --git a/src/mathicgb/BuchbergerAlg.hpp b/src/mathicgb/BuchbergerAlg.hpp
index 700bbe6..7e582b6 100755
--- a/src/mathicgb/BuchbergerAlg.hpp
+++ b/src/mathicgb/BuchbergerAlg.hpp
@@ -17,7 +17,6 @@ class BuchbergerAlg {
public:
BuchbergerAlg(
const Basis& basis,
- FreeModuleOrderType orderType,
Reducer& reducer,
int divisorLookupType,
bool preferSparseReducers,
@@ -93,7 +92,7 @@ private:
void insertPolys(std::vector<std::unique_ptr<Poly> >& polynomials);
const PolyRing& mRing;
- std::unique_ptr<FreeModuleOrder> mOrder;
+ std::unique_ptr<FreeModuleOrder> mOrder; // todo: remove
Reducer& mReducer;
PolyBasis mBasis;
SPairs mSPairs;
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index 0e891a9..baaf447 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -331,9 +331,12 @@ public:
return MonoMonoid(order);
}
- /// The second component of the return pair indicates whether it is
- /// desired that i>j => e_i > e_j.
- static std::pair<MonoMonoid, bool> readMonoid(std::istream& in);
+ /// The second.first value of the return pair indicates whether it
+ /// is desired that i>j => e_i > e_j. the second.second value
+ /// indicates whether to do a Schreyer order. TODO: clearly this is
+ /// a mess that needs to be cleaned up. Step 1 is to move IO out of
+ /// MonoMonoid entirely.
+ static std::pair<MonoMonoid, std::pair<bool, bool>> readMonoid(std::istream& in);
void printMonoid
(const bool componentsAscendingDesired, std::ostream& out) const;
@@ -1742,12 +1745,13 @@ namespace MonoMonoidHelper {
template<class E, bool HC, bool SH, bool SO>
auto MonoMonoid<E, HC, SH, SO>::readMonoid(std::istream& in) ->
- std::pair<MonoMonoid, bool>
+ std::pair<MonoMonoid, std::pair<bool, bool>>
{
using MonoMonoidHelper::unchar;
VarIndex varCount;
in >> varCount;
+ bool doSchreyer = false;
bool lexBaseOrder = false;
std::string str;
char c;
@@ -1756,6 +1760,11 @@ auto MonoMonoid<E, HC, SH, SO>::readMonoid(std::istream& in) ->
if (!std::isdigit(c)) {
std::string str;
in >> str;
+ if (str == "schreyer") {
+ doSchreyer = true;
+ in >> str;
+ }
+
if (str == "revlex")
lexBaseOrder = false;
else if (str == "lex")
@@ -1835,7 +1844,10 @@ auto MonoMonoid<E, HC, SH, SO>::readMonoid(std::istream& in) ->
lexBaseOrder ? Order::LexBaseOrder : Order::RevLexBaseOrder,
componentCompareIndex
);
- return std::make_pair(MonoMonoid(order), componentsAscendingDesired);
+ return std::make_pair(
+ MonoMonoid(order),
+ std::make_pair(componentsAscendingDesired, doSchreyer)
+ );
}
template<class E, bool HC, bool SH, bool SO>
diff --git a/src/mathicgb/PolyRing.cpp b/src/mathicgb/PolyRing.cpp
index e07aed6..1c50fd1 100755
--- a/src/mathicgb/PolyRing.cpp
+++ b/src/mathicgb/PolyRing.cpp
@@ -228,7 +228,7 @@ void PolyRing::printMonomialFrobbyM2Format(std::ostream& out, ConstMonomial m) c
out << '1';
}
-std::pair<PolyRing*, bool> PolyRing::read(std::istream &i)
+std::pair<PolyRing*, std::pair<bool, bool>> PolyRing::read(std::istream &i)
{
int64 characInt;
coefficient charac;
diff --git a/src/mathicgb/PolyRing.hpp b/src/mathicgb/PolyRing.hpp
index 66547d7..4b5e3f5 100755
--- a/src/mathicgb/PolyRing.hpp
+++ b/src/mathicgb/PolyRing.hpp
@@ -219,7 +219,7 @@ public:
// const std::vector<int> °s,
// const std::string &monorder);
- static std::pair<PolyRing*, bool> read(std::istream &i);
+ static std::pair<PolyRing*, std::pair<bool, bool>> read(std::istream &i);
void write(std::ostream &o, bool componentIncreasingDesired) const;
// Format for ring
// <char> <mNumVars> <deg1> ... <deg_n> <monorder>
diff --git a/src/mathicgb/SignatureGB.cpp b/src/mathicgb/SignatureGB.cpp
index 9e352f3..999c60b 100755
--- a/src/mathicgb/SignatureGB.cpp
+++ b/src/mathicgb/SignatureGB.cpp
@@ -14,8 +14,7 @@ int tracingLevel = 0;
SignatureGB::SignatureGB(
Basis&& basis,
- FreeModuleOrderType typ,
- bool componentsAscendingDesired,
+ Processor&& processor,
Reducer::ReducerType reductiontyp,
int divlookup_type,
int montable_type,
@@ -28,7 +27,7 @@ SignatureGB::SignatureGB(
mBreakAfter(0),
mPrintInterval(0),
R(basis.getPolyRing()),
- F(FreeModuleOrder::makeOrder(typ, *basis.getPolyRing())),
+ F(FreeModuleOrder::makeOrder(0, *basis.getPolyRing())),
mPostponeKoszul(postponeKoszul),
mUseBaseDivisors(useBaseDivisors),
stats_sPairSignaturesDone(0),
@@ -45,14 +44,8 @@ SignatureGB::SignatureGB(
reducer(Reducer::makeReducer(reductiontyp, *R)),
SP(make_unique<SigSPairs>(R, F.get(), GB.get(), Hsyz.get(), reducer.get(), mPostponeKoszul, mUseBaseDivisors, useSingularCriterionEarly, queueType))
{
- MonoVector schreyer(monoid());
- if (typ == 5 || typ == 4 || typ == 3 || typ == 2 || typ == 6 || typ == 7)
- for (size_t gen = 0; gen < basis.size(); ++gen)
- schreyer.push_back(basis.getPoly(gen)->getLeadMonomial());
- mProcessor = make_unique<MonoProcessor<Monoid>>(monoid());
- mProcessor->setComponentsAscendingDesired(componentsAscendingDesired);
+ mProcessor = make_unique<MonoProcessor<Monoid>>(std::move(processor));
mProcessor->setComponentCount(basis.size());
- mProcessor->setModuleAdjustments(std::move(schreyer));
// Populate GB
for (size_t j = 0; j < basis.size(); j++)
diff --git a/src/mathicgb/SignatureGB.hpp b/src/mathicgb/SignatureGB.hpp
index ff3e47e..4177ae5 100755
--- a/src/mathicgb/SignatureGB.hpp
+++ b/src/mathicgb/SignatureGB.hpp
@@ -21,11 +21,11 @@ class SignatureGB {
public:
typedef PolyRing::Monoid Monoid;
typedef Monoid::MonoVector MonoVector;
+ typedef MonoProcessor<Monoid> Processor;
SignatureGB(
Basis&& basis,
- FreeModuleOrderType typ,
- bool componentsAscendingDesired,
+ Processor&& processor,
Reducer::ReducerType reductiontyp,
int divlookup_type,
int montable_type,
@@ -74,7 +74,7 @@ private:
bool step();
const PolyRing *R;
- std::unique_ptr<FreeModuleOrder> F;
+ std::unique_ptr<FreeModuleOrder> F; // todo: remove
diff --git a/src/test/MonoMonoid.cpp b/src/test/MonoMonoid.cpp
index 7cb2a26..e0ca013 100755
--- a/src/test/MonoMonoid.cpp
+++ b/src/test/MonoMonoid.cpp
@@ -211,7 +211,7 @@ TYPED_TEST(Monoid, ReadWriteMonoid) {
const auto& m = p.first;
std::ostringstream out;
- m.printMonoid(p.second, out);
+ m.printMonoid(p.second.first, out);
ASSERT_EQ(outStr, out.str());
ASSERT_EQ(varCount, m.varCount());
ASSERT_EQ(gradingCount, m.gradingCount());
diff --git a/src/test/gb-test.cpp b/src/test/gb-test.cpp
index e3c5810..1a5c3a8 100755
--- a/src/test/gb-test.cpp
+++ b/src/test/gb-test.cpp
@@ -35,13 +35,13 @@ TEST(IO, ideal) {
EXPECT_EQ(" -bc+ad\n -b2+af\n -bc2+a2e\n", toString(I.get()));
}
-void testGB(int freeModuleOrder,
- std::string idealStr,
- std::string sigBasisStr,
- std::string syzygiesStr,
- std::string initialIdealStr,
- size_t nonSingularReductions)
-{
+void testGB(
+ std::string idealStr,
+ std::string sigBasisStr,
+ std::string syzygiesStr,
+ std::string initialIdealStr,
+ size_t nonSingularReductions
+) {
// Put the contents of pict.out into allPairsTest as a string. This
// works because pict.out does not have any commas and we do not
// care about whitespace. pict.out contains a set of tests such that
@@ -300,7 +300,7 @@ spairQueue reducerType divLookup monTable buchberger postponeKoszul useBaseDivis
const auto reducer = Reducer::makeReducer
(Reducer::reducerType(reducerType), I->ring());
BuchbergerAlg alg
- (*I, freeModuleOrder, *reducer,
+ (*I, *reducer,
divLookup, preferSparseReducers, spairQueue);
alg.setUseAutoTopReduction(autoTopReduce);
alg.setUseAutoTailReduction(autoTailReduce);
@@ -314,8 +314,7 @@ spairQueue reducerType divLookup monTable buchberger postponeKoszul useBaseDivis
} else {
SignatureGB basis(
std::move(*I),
- freeModuleOrder,
- std::get<2>(tuple)->componentsAscendingDesired(),
+ std::move(*std::get<2>(tuple)),
Reducer::reducerType(reducerType),
divLookup,
monTable,
@@ -343,59 +342,59 @@ spairQueue reducerType divLookup monTable buchberger postponeKoszul useBaseDivis
}
TEST(GB, small) {
- testGB(1, smallIdealComponentLastDescending(),
+ testGB(smallIdealComponentLastDescending(),
idealSmallBasis, idealSmallSyzygies, idealSmallInitial, 7);
}
TEST(GB, liu_0_1) {
- testGB(1, liuIdealComponentLastDescending(), liu_gb_strat0_free1,
+ testGB(liuIdealComponentLastDescending(), liu_gb_strat0_free1,
liu_syzygies_strat0_free1, liu_initial_strat0_free1, 13);
}
TEST(GB, weispfennig97_0_4) {
- testGB(4, weispfennig97IdealComponentLast(true),
+ testGB(weispfennig97IdealComponentLast(true),
weispfennig97_gb_strat0_free4,
weispfennig97_syzygies_strat0_free4, weispfennig97_initial_strat0_free4, 31);
}
TEST(GB, weispfennig97_0_5) {
- testGB(5, weispfennig97IdealComponentLast(false),
+ testGB(weispfennig97IdealComponentLast(false),
weispfennig97_gb_strat0_free5,
weispfennig97_syzygies_strat0_free5, weispfennig97_initial_strat0_free5, 27);
}
TEST(GB, gerdt93_0_1) {
- testGB(1, gerdt93IdealComponentLast(false), gerdt93_gb_strat0_free1,
+ testGB(gerdt93IdealComponentLast(false, false), gerdt93_gb_strat0_free1,
gerdt93_syzygies_strat0_free1, gerdt93_initial_strat0_free1, 9);
}
TEST(GB, gerdt93_0_2) {
- testGB(2, gerdt93IdealComponentMiddle(true), gerdt93_gb_strat0_free2,
+ testGB(gerdt93IdealComponentMiddle(true), gerdt93_gb_strat0_free2,
gerdt93_syzygies_strat0_free2, gerdt93_initial_strat0_free2, 7);
}
TEST(GB, gerdt93_0_3) {
- testGB(3, gerdt93IdealComponentMiddle(false), gerdt93_gb_strat0_free3,
+ testGB(gerdt93IdealComponentMiddle(false), gerdt93_gb_strat0_free3,
gerdt93_syzygies_strat0_free3, gerdt93_initial_strat0_free3, 9);
}
TEST(GB, gerdt93_0_4) {
- testGB(4, gerdt93IdealComponentLast(true), gerdt93_gb_strat0_free4,
+ testGB(gerdt93IdealComponentLast(true, true), gerdt93_gb_strat0_free4,
gerdt93_syzygies_strat0_free4, gerdt93_initial_strat0_free4, 7);
}
TEST(GB, gerdt93_0_5) {
- testGB(5, gerdt93IdealComponentLast(false), gerdt93_gb_strat0_free5,
+ testGB(gerdt93IdealComponentLast(false, true), gerdt93_gb_strat0_free5,
gerdt93_syzygies_strat0_free5, gerdt93_initial_strat0_free5, 7);
}
TEST(GB, gerdt93_0_6) {
- testGB(6, gerdt93IdealComponentFirst(true), gerdt93_gb_strat0_free6,
+ testGB(gerdt93IdealComponentFirst(true), gerdt93_gb_strat0_free6,
gerdt93_syzygies_strat0_free6, gerdt93_initial_strat0_free6, 7);
}
TEST(GB, gerdt93_0_7) {
- testGB(7, gerdt93IdealComponentFirst(false), gerdt93_gb_strat0_free7,
+ testGB(gerdt93IdealComponentFirst(false), gerdt93_gb_strat0_free7,
gerdt93_syzygies_strat0_free7, gerdt93_initial_strat0_free7, 9);
}
diff --git a/src/test/ideals.cpp b/src/test/ideals.cpp
index 13313b3..cb87fdd 100755
--- a/src/test/ideals.cpp
+++ b/src/test/ideals.cpp
@@ -72,7 +72,7 @@ const char* liu_initial_strat0_free1 =
std::string weispfennig97IdealComponentLast(bool componentsAscending) {
std::ostringstream out;
- out << "7583 4 1\n";
+ out << "7583 4 schreyer revlex 1\n";
if (componentsAscending)
out << "1 1 1 1 _revlex component\n";
else
@@ -170,35 +170,38 @@ const char* Gert93RawIdeal =
"a3+b2c-a2d\n";
-std::string gerdt93IdealComponentLast(bool componentsAscending) {
+std::string gerdt93IdealComponentLast(bool componentsAscending, bool schreyer) {
std::ostringstream out;
- out << "7583 6 ";
+ out << "7583 6\n";
+ if (schreyer)
+ out << "schreyer ";
+ out << "revlex 1\n";
if (componentsAscending)
- out << "1 1 1 1 1 1 1 _revlex component\n";
+ out << " 1 1 1 1 1 1 _revlex component\n";
else
- out << "1 1 1 1 1 1 1 _revlex revcomponent\n";
+ out << " 1 1 1 1 1 1 _revlex revcomponent\n";
out << Gert93RawIdeal;
return out.str();
}
std::string gerdt93IdealComponentFirst(bool componentsAscending) {
std::ostringstream out;
- out << "7583 6 ";
+ out << "7583 6 schreyer revlex 2\n";
if (componentsAscending)
- out << "2 component 1 1 1 1 1 1\n";
+ out << " component\n 1 1 1 1 1 1\n";
else
- out << "2 revcomponent 1 1 1 1 1 1\n";
+ out << " revcomponent\n 1 1 1 1 1 1\n";
out << Gert93RawIdeal;
return out.str();
}
std::string gerdt93IdealComponentMiddle(bool componentsAscending) {
std::ostringstream out;
- out << "7583 6 ";
+ out << "7583 6 schreyer revlex 2\n";
if (componentsAscending)
- out << "2 1 1 1 1 1 1 component\n";
+ out << "1 1 1 1 1 1\n component\n";
else
- out << "2 1 1 1 1 1 1 revcomponent\n";
+ out << "1 1 1 1 1 1\n revcomponent\n";
out << Gert93RawIdeal;
return out.str();
}
diff --git a/src/test/ideals.hpp b/src/test/ideals.hpp
index 4c03da9..4b0b709 100755
--- a/src/test/ideals.hpp
+++ b/src/test/ideals.hpp
@@ -29,7 +29,7 @@ extern const char* weispfennig97_initial_strat0_free5;
// gerdt93
std::string gerdt93IdealComponentFirst(bool componentsAscending);
std::string gerdt93IdealComponentMiddle(bool componentsAscending);
-std::string gerdt93IdealComponentLast(bool componentsAscending);
+std::string gerdt93IdealComponentLast(bool componentsAscending, bool schreyer);
extern const char* gerdt93_gb_strat0_free1;
extern const char* gerdt93_syzygies_strat0_free1;
--
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