diff --git a/SConstruct b/SConstruct index dee6ab2a06a0d21044143a92a28cafea18319dc1..ae484f9eac74fb2cb7e123d720ea63ee345394ec 100644 --- a/SConstruct +++ b/SConstruct @@ -7,10 +7,23 @@ env = Environment( #variables = vars, CXX = 'g++', CXXFLAGS = Split('-I./include -I./src \ -march=native -mtune=native -std=gnu++14 -fabi-version=6 \ - -fpermissive -Wall -Wextra -fopenmp'), - LIBPATH = '#lib/', - LIBS = Split('-lopenblas -lgivaro -lgmpxx -lgmp'), - LINKFLAGS = '-fopenmp' + -fpermissive -Wall -Wextra -fopenmp'), + LIBPATH = '#lib/', + LIBS = Split('-lopenblas -lgivaro -lgmpxx -lgmp'), + LINKFLAGS = '-fopenmp', + SRC_CC = ['#src/finite_field_arithmetic/givaro_wrapper.cc', + '#src/logger.cc', + '#src/monomial.cc', + '#src/select_reductors.cc', + '#src/critical_pair.cc', + '#src/polynomial_in_matrix.cc', + '#src/polynomial.cc', + '#src/matrices/io_utils.cc', + '#src/matrices/spmat.cc', + '#src/utils.cc', + '#src/linalg/storage_matrix.cc', + '#src/glob_params.cc', + '#src/matrices/rowmajmat.cc'] ) #Help(vars.GenerateHelpText(env)) diff --git a/src/abstract_field.h b/src/abstract_field.h index 431951d57ab51bd334d1ecbfd307d6768de68e1a..1f2a8a35642381dce71d01135736cf7beef15725 100644 --- a/src/abstract_field.h +++ b/src/abstract_field.h @@ -12,39 +12,34 @@ namespace tinygb { template // CRTP class AbstractField { public: - std::string description() const { - return static_cast(this)->description(); + std::string description() const { + return static_cast(this)->description(); } -}; - -// T is the CRTP parameter -// Field is a concrete field -template -class AbstractFieldElement { - static_assert(std::is_base_of, Field>::value, - "Field should be derived from AbstractField"); - public: - typedef Field Parent; - - void operator+=(const AbstractFieldElement& e) { - static_cast(this)->operator+=(e); - } - void operator-=(const AbstractFieldElement& e) { - static_cast(this)->operator-=(e); - } - void operator*=(const AbstractFieldElement& e) { - static_cast(this)->operator*=(e); - } - void operator/=(const AbstractFieldElement& e) { - static_cast(this)->operator/=(e); - } - void inv() { - static_cast(this)->inv(); - } - bool IsZero() const { - return static_cast(this)->isZero(); - } + template // CRTP + class Element { + public: + typedef T Parent; + + void operator+=(const Element& e) { + static_cast(this)->operator+=(e); + } + void operator-=(const Element& e) { + static_cast(this)->operator-=(e); + } + void operator*=(const Element& e) { + static_cast(this)->operator*=(e); + } + void operator/=(const Element& e) { + static_cast(this)->operator/=(e); + } + void inv() { + static_cast(this)->inv(); + } + bool IsZero() const { + return static_cast(this)->isZero(); + } + }; }; } // namespace tinygb diff --git a/src/abstract_polynomial.h b/src/abstract_polynomial.h index aab50c941a84efab0a7f89362aaed4aa7c451199..ea87637571aee1bba8a9d7a176aaf6a73823353c 100644 --- a/src/abstract_polynomial.h +++ b/src/abstract_polynomial.h @@ -10,15 +10,14 @@ namespace tinygb { // implementations of polynomials are implemented in subclasses via static // polymorphism. -template // T is the CRTP parameter +template // T is the CRTP parameter class AbstractPolynomial { - static_assert(std::is_base_of, - FieldElement>::value, + static_assert(std::is_base_of, Field>::value, "Field should be derived from AbstractField"); public: Monomial LeadingMonomial() const { return static_cast(this)->LeadingMonomial();} - FieldElement LeadingCoefficient() const { + typename Field::Element LeadingCoefficient() const { return static_cast(this)->LeadingCoefficient();} void DivideByLeadingCoefficient() { static_cast(this)->DivideByLeadingCoefficient();} diff --git a/src/addcrit/SConscript b/src/addcrit/SConscript index b3878fda50afa097a9a3dbc07f7c3ca18c57b115..2cb85972a0bc9a8c4acf8b1f59d49ac5422c90b8 100644 --- a/src/addcrit/SConscript +++ b/src/addcrit/SConscript @@ -1,15 +1,6 @@ Import('env') -source_files = ['addcrit.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc', - '#src/monomial.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['addcrit.cc'] + env.Program('addcrit', source_files) diff --git a/src/buildmats/SConscript b/src/buildmats/SConscript index 0f3077e33a1b3b1687e90e48a76626b6a49d74b4..a261b669014d911fc0541633897c7c9867b2005b 100644 --- a/src/buildmats/SConscript +++ b/src/buildmats/SConscript @@ -1,16 +1,6 @@ Import('env') -source_files = ['buildmats.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc', - '#src/monomial.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/spmat.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['buildmats.cc'] + env.Program('buildmats', source_files) diff --git a/src/finite_field_arithmetic/givaro_wrapper.h b/src/finite_field_arithmetic/givaro_wrapper.h index 2613ea7c04c64338ff6e3853fa295709f88bbcb0..ad2ddb0109adc9199ca60b6b0ae9c79a121e3025 100644 --- a/src/finite_field_arithmetic/givaro_wrapper.h +++ b/src/finite_field_arithmetic/givaro_wrapper.h @@ -10,53 +10,54 @@ namespace tinygb { -class GFp : public AbstractField { +class GFp_Givaro : public AbstractField { public: std::string description() const { return "Finite field of prime cardinality p";} -}; + class Element : public AbstractField::Element { + public: + typedef Givaro::Integer elt_t; + typedef Givaro::Modular ring_t; -class GivaroWrapper : public AbstractFieldElement { - public: - typedef Givaro::Integer elt_t; - typedef Givaro::Modular ring_t; - - static ring_t k; - elt_t v; + static ring_t k; + elt_t v; - // Constructors - GivaroWrapper() {} - GivaroWrapper(const char* n) { k.init(v, n); } - GivaroWrapper(int n) { k.init(v, n); } - GivaroWrapper(const mpz_class& n) { k.init(v, n);} - GivaroWrapper(const elt_t& n) { k.init(v, n); } - GivaroWrapper(const std::string& s) { k.init(v, s.c_str()); } + // Constructors + Element() {} + Element(const char* n) { k.init(v, n); } + Element(int n) { k.init(v, n); } + Element(const mpz_class& n) { k.init(v, n);} + Element(const elt_t& n) { k.init(v, n); } + Element(const std::string& s) { k.init(v, s.c_str()); } - // Copy constructor - GivaroWrapper(const GivaroWrapper& x) { k.assign(v, x.v); } + // Copy constructor + Element(const Element& x) { k.assign(v, x.v); } - // TODO rule of 0/3/5 - GivaroWrapper& operator=(const GivaroWrapper& x) { - k.assign(v, x.v); - return *this; - } + // TODO rule of 0/3/5 + Element& operator=(const Element& x) { + k.assign(v, x.v); + return *this; + } - inline bool is_zero() const { return k.isZero(v); } - friend std::ostream& operator<<(std::ostream&, const GivaroWrapper&); - friend std::istream& operator>>(std::istream&, GivaroWrapper&); - inline void neg() { v = -v; } - void operator+=(const GivaroWrapper& a) { k.addin(v, a.v); } - void operator-=(const GivaroWrapper& a) { k.subin(v, a.v); } - void operator*=(const GivaroWrapper& a) { k.mulin(v, a.v); } - void operator/=(const GivaroWrapper& a) { k.divin(v, a.v); } - bool operator==(const GivaroWrapper& a) const { return v == a.v; } - bool operator!=(const GivaroWrapper& a) const { return v != a.v; } - void inv() { k.invin(v); } - mpz_srcptr get_mpz() const { return v.get_mpz(); } - void set_mpz(const mpz_class& a) { k.init(v, elt_t(a)); } + inline bool is_zero() const { return k.isZero(v); } + friend std::ostream& operator<<(std::ostream&, const Element&); + friend std::istream& operator>>(std::istream&, Element&); + inline void neg() { v = -v; } + void operator+=(const Element& a) { k.addin(v, a.v); } + void operator-=(const Element& a) { k.subin(v, a.v); } + void operator*=(const Element& a) { k.mulin(v, a.v); } + void operator/=(const Element& a) { k.divin(v, a.v); } + bool operator==(const Element& a) const { return v == a.v; } + bool operator!=(const Element& a) const { return v != a.v; } + void inv() { k.invin(v); } + mpz_srcptr get_mpz() const { return v.get_mpz(); } + void set_mpz(const mpz_class& a) { k.init(v, elt_t(a)); } + }; }; +typedef GFp_Givaro::Element GivaroWrapper; + std::ostream& operator<<(std::ostream&, const GivaroWrapper &); std::istream& operator>>(std::istream&, GivaroWrapper&); diff --git a/src/matmulsub/SConscript b/src/matmulsub/SConscript index c6c800d01f8adff1be08a58b1ecde0c8f5ef8aed..1ea7fa7418ee3707792b3b78135238440394f245 100644 --- a/src/matmulsub/SConscript +++ b/src/matmulsub/SConscript @@ -1,15 +1,5 @@ Import('env') -source_files = ['matmulsub.cc', - '#src/monomial.cc', - '#src/logger.cc', - '#src/polynomial.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/matrices/rowmajmat.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc'] +source_files = env['SRC_CC'] + ['matmulsub.cc'] env.Program('matmulsub', source_files) diff --git a/src/polynomial.h b/src/polynomial.h index dba25637f1bb915ac917d515c2badc39dfde541e..e621f7646f8317e5eda30ae07df27cd844eee9ed 100644 --- a/src/polynomial.h +++ b/src/polynomial.h @@ -10,7 +10,7 @@ namespace tinygb { -class Polynomial : public AbstractPolynomial { +class Polynomial : public AbstractPolynomial { public: typedef std::pair Term; diff --git a/src/polynomial_in_matrix.h b/src/polynomial_in_matrix.h index 4c0b7850afb1af0e1c3dd1303ede3fa381b4a0ba..f16aff98c93bd9c51a4c96a8d07e337c875739ae 100644 --- a/src/polynomial_in_matrix.h +++ b/src/polynomial_in_matrix.h @@ -13,7 +13,7 @@ namespace tinygb { -class PolynomialInMatrix { +class PolynomialInMatrix : public AbstractPolynomial { public: PolynomialInMatrix() : pMatrix_(nullptr), row_(0), nbMonoms_(0) {} diff --git a/src/rowech/SConscript b/src/rowech/SConscript index 5f00138fb9cccfd478c11a162209024cab57affd..181930cc8d08edf0e811e8d9dbb0df6a9431f475 100644 --- a/src/rowech/SConscript +++ b/src/rowech/SConscript @@ -1,15 +1,6 @@ Import('env') -source_files = ['rowech.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc', - '#src/monomial.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['rowech.cc'] + env.Program('rowech', source_files) diff --git a/src/selcrit/SConscript b/src/selcrit/SConscript index 47dc360328355da7f1f943eb4d1df23df43aa6f6..84a773fbc13590ed33ac9655d8e3b0b5e92c948c 100644 --- a/src/selcrit/SConscript +++ b/src/selcrit/SConscript @@ -1,15 +1,6 @@ Import('env') -source_files = ['selcrit.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc', - '#src/monomial.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['selcrit.cc'] + env.Program('selcrit', source_files) diff --git a/src/selred/select_reductors.cc b/src/select_reductors.cc similarity index 100% rename from src/selred/select_reductors.cc rename to src/select_reductors.cc diff --git a/src/selred/select_reductors.h b/src/select_reductors.h similarity index 100% rename from src/selred/select_reductors.h rename to src/select_reductors.h diff --git a/src/selred/SConscript b/src/selred/SConscript index 7ae3b9c8a2b138ee5622a1c180b05d81adcfba91..f0077e738cdf350913c942147db8a391b84d7e19 100644 --- a/src/selred/SConscript +++ b/src/selred/SConscript @@ -1,17 +1,6 @@ Import('env') -source_files = ['selred.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc', - '#src/monomial.cc', - 'select_reductors.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['selred.cc'] env.Program('selred', source_files) diff --git a/src/selred/selred.cc b/src/selred/selred.cc index 3a542388fa8468164f2d936bd502a795f5360f44..96085a988252edd3b9ed3924531e6a1bdf860d8b 100644 --- a/src/selred/selred.cc +++ b/src/selred/selred.cc @@ -5,7 +5,7 @@ #include "./finite_field_arithmetic/givaro_wrapper.h" #include "./common.h" #include "./utils.h" -#include "selred/select_reductors.h" +#include "./select_reductors.h" #include "./macros.h" #include "./logger.h" diff --git a/src/tinygb_init/SConscript b/src/tinygb_init/SConscript index 4b61a57c42a9dd9fbadedecef0e99361ad760f6b..e28787823a2aec7179eea706b909f14836caf95b 100644 --- a/src/tinygb_init/SConscript +++ b/src/tinygb_init/SConscript @@ -1,16 +1,6 @@ Import('env') -source_files = ['tinygb_init.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/monomial.cc', - '#src/logger.cc', - '#src/critical_pair.cc', - '#src/polynomial_in_matrix.cc', - '#src/polynomial.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/linalg/storage_matrix.cc', - '#src/matrices/rowmajmat.cc'] +source_files = env['SRC_CC'] + ['tinygb_init.cc'] + env.Program('tinygb_init', source_files) diff --git a/src/utsolve/SConscript b/src/utsolve/SConscript index 98393cc76c67ab792a329f68f22936cab645b17d..1fb50a6d2ef235d3536c005345908e4df2c2d5b1 100644 --- a/src/utsolve/SConscript +++ b/src/utsolve/SConscript @@ -1,16 +1,5 @@ Import('env') -source_files = ['utsolve.cc', - '#src/critical_pair.cc', - '#src/monomial.cc', - '#src/polynomial.cc', - '#src/polynomial_in_matrix.cc', - '#src/matrices/spmat.cc', - '#src/matrices/rowmajmat.cc', - '#src/matrices/io_utils.cc', - '#src/utils.cc', - '#src/glob_params.cc', - '#src/finite_field_arithmetic/givaro_wrapper.cc', - '#src/logger.cc'] +source_files = env['SRC_CC'] + ['utsolve.cc'] env.Program('utsolve', source_files)