3#ifndef _res_monomial_sorter_hpp_
4#define _res_monomial_sorter_hpp_
48#include <memtailor/Arena.h>
87 int cmp =
mMonoid.compare(m+2, m[1], n+2, n[1]);
93 auto cmptie = m[0] - n[0];
102 o <<
" result: " << (
result ?
"true" :
"false");
142 const std::vector<res_packed_monomial>& columns
154 for (
int i=0; i<
mColumns.size(); i++)
156 std::pair<int*, int*> mon =
mArena.allocArrayNoCon<
int>(
mMonoid.monomial_size() + 2);
166 for (
int i=1; i<
mMonoms.size(); i++)
168 if (not C(i-1,i))
return false;
179 for (
int i=0; i<
mColumns.size(); i++)
197 std::pair<int*, int*> exp =
mArena.allocArrayNoCon<
int>(nvars);
198 std::pair<int*, int*> exp2 =
mArena.allocArrayNoCon<
int>(nvars);
199 mResMonoid.to_expvector(mon, exp.first, comp);
202 auto p = resultAlreadyAllocateds.first;
205 mMonoid.from_expvector(exp2.first,
p);
206 mArena.freeTop(exp2.first);
207 mArena.freeTop(exp.first);
212class ResMonomialTransformer
214 ResMonomialTransformer(
const Monoid& M,
216 const ResSchreyerOrder& schreyerOrder,
222 mSchreyerOrder(schreyerOrder)
230 std::pair<int*, int*> transform(std::pair<int*, int*>& input)
233 int nvars = mMonoid.n_vars();
234 std::pair<int*, int*>
result = mArena.allocArrayNoCon<
int>(mMonoid.monomial_size() + 2);
235 std::pair<int*, int*>
exp = mArena.allocArrayNoCon<
int>(nvars);
236 std::pair<int*, int*>
exp2 = mArena.allocArrayNoCon<
int>(nvars);
237 mResMonoid.to_expvector(mon.first,
exp.first, comp);
238 mResMonoid.to_expvector(mSchreyerOrder.mTotalMonom[comp],
exp2.first, comp2);
240 auto p = resultAlreadyAllocateds.first;
241 *
p++ = mSchreyerOrder.mTieBreaker[comp];
243 mMonoid.from_expvector(
exp2.first,
p);
244 mArena.freeTop(
exp2.first);
245 mArena.freeTop(
exp.first);
249 const Monoid& mMonoid;
251 const ResSchreyerOrder& mSchreyerOrder;
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
static void mult(int nvars, ConstExponents a, ConstExponents b, Exponents result)
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
long numComparisons() const
static long mNumComparisons
const std::vector< int * > mMonoms
MonomialSorterObject(const Monoid &M, const std::vector< int * > monoms)
bool operator()(int a, int b)
void resetNumComparisons()
Strict-weak comparator on integer indices into a std::vector<int*> of monomials, used by the resoluti...
std::vector< int > sort()
const ResSchreyerOrder & mSchreyerOrder
std::vector< int > mPositions
std::vector< int * > mMonoms
const std::vector< res_packed_monomial > & mColumns
const ResMonoid & mResMonoid
ResMonomialSorter(const Monoid &M, const ResMonoid &resMonoid, const ResSchreyerOrder &S, const std::vector< res_packed_monomial > &columns)
long numComparisons() const
void toMonomial(res_packed_monomial mon, std::pair< int *, int * > resultAlreadyAllocateds)
VALGRIND_MAKE_MEM_DEFINED & result(result)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
const mpreal exp2(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
const mpreal exp(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
ResMonoid dispatcher — single typedef switch between ResMonoidDense and ResMonoidSparse.
res_monomial_word * res_packed_monomial
Typed-monomial vocabulary shared by ResMonoid, ResPolyRing, SchreyerFrame, and F4Res.
ResSchreyerOrder — per-free-module-summand data implementing the Schreyer order on the next level.
Per-level Schreyer-order data attached to a SchreyerFrame::Level.
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
void emit_line(const char *s)