24 const std::vector<int>& degrees,
25 const std::vector<int>& wtvecs,
26 const std::vector<int>& heftVector)
36 assert(nvars * ndegrees ==
mDegrees.size());
83 result.push_back(m1[i] + m2[i]);
93 result.push_back(m1[i] + m2[i] + m3[i]);
112 if (m1[j] > m2[j])
return GT;
113 if (m1[j] < m2[j])
return LT;
125 if (m1[j] > m2[j])
return LT;
126 if (m1[j] < m2[j])
return GT;
142 for (
int j = 0; j < w1.
size(); ++j)
144 for (
int j = 0; j < w2.
size(); ++j)
146 if (weight1 > weight2)
return GT;
147 if (weight1 < weight2)
return LT;
153 for (
int i = 0; i < w1.
size(); ++i)
155 if (w1[i] > w2[i])
return LT;
156 if (w1[i] < w2[i])
return GT;
170 int*
result = already_allocated_degree_vector;
175 for (
auto j = 0; j < word_length; j++)
185 for (
auto j = 0; j < word_length; j++)
188 int curvar = word_ptr[j];
191 while ((j < word_length) && (word_ptr[j] == curvar))
196 if (curvarPower > 1) o <<
"^" << curvarPower;
211 auto start =
result.size();
216 for (
auto j = 0; j < word_length; j++)
218 int curvar = word_ptr[j];
221 while ((j < word_length) && (word_ptr[j] == curvar))
226 result.push_back(curvarPower);
230 result[start] =
static_cast<int>(
result.size() - start);
240 auto start =
result.size();
244 for (
auto j = word_length-1; j >= 0; --j)
246 int curvar = word_ptr[j];
249 while ((j >= 0) && (word_ptr[j] == curvar))
254 result.push_back(curvarPower);
258 result[start] =
static_cast<int>(
result.size() - start);
268 int inputMonomLength = *monom;
269 int startMon =
static_cast<int>(
result.size());
273 for (
int j = inputMonomLength-2; j >= 1; j -= 2)
276 for (
int k = 0; k < monom[j+1]; k++)
281 result[startMon] =
static_cast<int>(
result.size() - startMon);
318 auto monom =
const_cast<int*
>(m.
begin());
327 for (
int j = 0; j < word_len; ++j)
338 assert(start_index <=
word.size());
340 for (
int j = start_index; j <
word.size(); ++j)
352 std::copy(left.
begin(), left.
end(), rg.first + monomOffset);
353 std::copy(right.
begin(), right.
end(), rg.first + monomOffset + left.
size());
361 int sz = left.
size() + right.
size();
363 std::copy(left.
begin(), left.
end(), rg.first);
364 std::copy(right.
begin(), right.
end(), rg.first + left.
size());
365 Word newword(rg.first, rg.second);
372 int sz = left.
size() + mid.
size() + right.
size() + monomOffset;
375 std::copy(left.
begin(), left.
end(), rg.first + monomOffset);
376 std::copy(mid.
begin(), mid.
end(), rg.first + left.
size() + monomOffset);
377 std::copy(right.
begin(), right.
end(), rg.first + left.
size() + mid.
size() + monomOffset);
390 std::copy(left.
begin(), left.
end(), rg.first);
391 std::copy(mid.
begin(), mid.
end(), rg.first + left.
size());
393 Word newword(rg.first, rg.second);
406 std::copy(left.
begin(), left.
end(), rg.first + monomOffset);
407 std::copy(mid.
begin()+monomOffset, mid.
end(), rg.first + left.
size() + monomOffset);
418 int numVarsFound = 0;
421 std::vector<int> varsFound;
422 for (
auto i = 0; i <
numVars(); i++)
423 varsFound.push_back(0);
424 for (
auto i = m.
begin() + monomOffset; i < m.
end(); i++)
426 if (varsFound[*i] == 0) numVarsFound++;
428 if (numVarsFound ==
numVars())
break;
430 for (
auto i = 0; i <
numVars(); i++)
431 if (varsFound[i] > 0)
result.push_back(i);
std::ostream & operator<<(std::ostream &o, FreeMonoidLogger a)
FreeMonoid — monoid of length-prefixed non-commutative words with weight-vector prefix.
Bump-pointer arena allocator for transient inner-loop allocations.
Word and WordWithData — non-owning views over the flat-int encoding of a non-commutative word.
Append-only GC-backed byte buffer used throughout the engine for text output.
const Monoid & degreeMonoid() const
bool isEqual(const Monom &m1, const Monom &m2) const
int wordWeight(Word &word, const std::vector< int > &weight, int start_index) const
void getMonomialReversed(Monom monom, std::vector< int > &result) const
gc_vector< int > MonomialInserter
const PolynomialRing * mDegreeRing
Word wordProductAsWord(const Word &left, const Word &right, MemoryBlock &memBlock) const
void mult3(const Monom &m1, const Monom &m2, const Monom &m3, MonomialInserter &result) const
std::vector< int > mHeftDegrees
void setWeights(Monom &m) const
unsigned int numWeights() const
void getMonomial(Monom monom, std::vector< int > &result) const
const std::vector< int > mWeightVectors
const std::vector< int > mHeftVector
FreeMonoid(const std::vector< std::string > &variableNames, const PolynomialRing *degreeRing, const std::vector< int > °rees, const std::vector< int > &wtvecs, const std::vector< int > &heftVector)
void support(const Monom &m, std::vector< int > &result) const
Monom wordProductAsMonom(const Word &left, const Word &right, MemoryBlock &memBlock) const
void fromMonomial(const_monomial monom, MonomialInserter &result) const
const std::vector< int > mDegrees
const std::vector< std::string > & variableNames() const
const PolynomialRing * degreeRing() const
const std::vector< std::string > mVariableNames
int compare(const Monom &m1, const Monom &m2) const
void monomInsertFromWord(MonomialInserter &result, const Word &w) const
void copy(const Monom &m, MonomialInserter &result) const
void elem_text_out(buffer &o, const Monom &m1) const
void wordFromMonom(Word &result, const Monom &m) const
void mult(const Monom &m1, const Monom &m2, MonomialInserter &result) const
gc_vector< const int * > mDegreeOfVar
int weightOfVar(int v, int wt) const
void multi_degree(const Monom &m, monomial already_allocated_degree_vector) const
void one(MonomialInserter &m) const
int index_of_variable(const Monom &m) const
void var(int v, MonomialInserter &result) const
void wordPrefixFromMonom(Word &result, const Monom &m, int endIndex) const
unsigned int numVars() const
void wordSuffixFromMonom(Word &result, const Monom &m, int beginIndex) const
bool is_one(const Monom &m) const
int wordLength(const Monom &m) const
Static counter for non-commutative monomial comparisons.
std::pair< T *, T * > allocateArray(size_t nelems)
Thin RAII wrapper around memtailor::Arena providing bump-pointer array allocation with optional mutex...
monomial make_one() const
void one(monomial result) const
void mult(const_monomial m, const_monomial n, monomial result) const
void from_expvector(const_exponents exp, monomial result) const
Abstract base for the engine's polynomial-ring hierarchy.
const int * begin() const
Non-owning view of a non-commutative word: [begin, end) of int variable indices.
VALGRIND_MAKE_MEM_DEFINED & result(result)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
const int * begin() const
Non-owning view onto a [length, degree, v1, v2, ..., vn] packed monomial in some externally managed b...