Macaulay2 Engine
Loading...
Searching...
No Matches
FreeMonoid.hpp
Go to the documentation of this file.
1#ifndef _free_monoid_hpp_
2#define _free_monoid_hpp_
3
36
37#include "Polynomial.hpp" // for Monom
38#include "newdelete.hpp" // for our_new_delete
39#include "polyring.hpp" // for PolynomialRing
40#include "style.hpp" // for GT
41#include "NCAlgebras/Word.hpp" // for Word
42#include "MemoryBlock.hpp" // for MemoryBlock
43#include <iosfwd> // for string, ostream
44#include <vector> // for vector
45
46class Monoid; // lines 15-15
47//class Word; // lines 16-16
48class buffer; // lines 17-17
49
50// TODO for weights in orders
51// 1. make sure it is input correctly from front end.
52// 2. make sure that monomials have weight function values put in.
53// 3. make sure compare uses that info
54// 4.
55// format
56// [total length] wt0 wt1 ... w(tr-1) w0 w1 ... ws
57
69{
70public:
71 static size_t mCompares;
72
73 static void reset()
74 {
75 mCompares = 0;
76 }
77
78 static void logCompare()
79 {
80 mCompares++;
81 }
82};
83
84std::ostream& operator<<(std::ostream& o, FreeMonoidLogger a);
85
104{
105 // types of monomials: (MES: just note to ourselves: remove it eventually).
106 // 1. packed varpower (region of memory filled with int's)
107 // 2. pointer into a region of int's.
108 // 3. (FreeMonoid, pointer into a region of int's)
109 // 4. exponent vector (only used for commutative case)
110 // 5. Monomial format.
111private:
112 const std::vector<std::string> mVariableNames;
114 const std::vector<int> mDegrees; // length numVars()*(length of a single degree vector)
115 const std::vector<int> mWeightVectors; // length numVars()*(length of a single weight vector)
116 const std::vector<int> mHeftVector; // length is size of degree vector
117 std::vector<int> mHeftDegrees; // length numVars(). Should be const (after construction)
118 const int mNumWeights;
120 // length numVars(), each is a pointer to an allocated degree vector.
121 // Should be const (after construction)
122public:
124 const std::vector<std::string>& variableNames,
126 const std::vector<int>& degrees,
127 const std::vector<int>& wtvecs,
128 const std::vector<int>& heftVector
129 );
130
131 // Informational
132 const std::vector<std::string>& variableNames() const { return mVariableNames; }
133 const std::vector<int>& flattenedDegrees() const { return mDegrees; }
134
135 unsigned int numVars() const { return static_cast<unsigned int>(mVariableNames.size()); }
136 unsigned int numWeights() const { return mNumWeights; }
137
138 const PolynomialRing* degreeRing() const { return mDegreeRing; }
139 const Monoid& degreeMonoid() const { return * mDegreeRing->getMonoid(); }
140
141 // Monomial operations
143
144 void one(MonomialInserter& m) const;
145
146 bool is_one(const Monom& m) const;
147
148 void copy(const Monom& m, MonomialInserter& result) const;
149
150 void mult(const Monom& m1, const Monom& m2, MonomialInserter& result) const;
151 void mult3(const Monom& m1, const Monom& m2, const Monom& m3, MonomialInserter& result) const;
152
153 int compare(const Monom& m1, const Monom& m2) const;
154 int compare(const Word& w1, const Word& m2) const;
155
156 bool isEqual(const Monom& m1, const Monom& m2) const;
157
158 // index_of_variable: returns 0..numgens-1, if monomial is that, otherwise returns -1.
159 int index_of_variable(const Monom& m) const;
160
161 void var(int v, MonomialInserter& result) const;
162
163 // Determine the multidegree of the monomial m. Result is placed into
164 // already_allocated_degree_vector which should have been allocated with
165 // e.g. degreeMonoid().make_one()
166 void multi_degree(const Monom& m, monomial already_allocated_degree_vector) const;
167
168 // display (to a buffer, and to a ostream)
169 void elem_text_out(buffer& o, const Monom& m1) const;
170
171 // transfer to Monomial, from Monomial
172
173 // getMonomial:
174 // Input is of the form: [len deg v1 v2 ... vn]
175 // where len = n + 2 and deg is the sum of the degree of vi
176 // The output is of the form, and stored in result.
177 // [2n+1 v1 e1 v2 e2 ... vn en], where each ei > 0, (in 'varpower' format)
178 void getMonomial(Monom monom, std::vector<int>& result) const;
179 void getMonomialReversed(Monom monom, std::vector<int>& result) const;
180
181 // fromMonomial:
182 // Input is of the form: [2n+1 v1 e1 v2 e2 ... vn en] (in 'varpower' format)
183 // The output is of the form, and stored in result.
184 // [len deg v1 v2 v3 ... vn], where each ei > 0, (in 'varpower' format)
185 // where len = n+2 and deg = sum of the degrees of the vi
187
188 // these functions create a Word from the (prefix/suffix of) a Monom and visa versa
189 void wordFromMonom(Word& result, const Monom& m) const;
190 void wordPrefixFromMonom(Word& result, const Monom& m, int endIndex) const;
191 void wordSuffixFromMonom(Word& result, const Monom& m, int beginIndex) const;
192 void monomInsertFromWord(MonomialInserter& result, const Word& w) const;
193
194 // some functions to create monoms from words and monoms, placing result in
195 // a MemoryBlock object. This is primarily for NCF4.
196 Monom wordProductAsMonom(const Word& left,
197 const Word& right,
198 MemoryBlock& memBlock) const;
199 Monom wordProductAsMonom(const Word& left,
200 const Word& mid,
201 const Word& right,
202 MemoryBlock & memBlock) const;
203 Monom wordProductAsMonom(const Word& left,
204 const Monom& mid,
205 const Word& right,
206 MemoryBlock & memBlock) const;
207
208 Word wordProductAsWord(const Word& left,
209 const Word& right,
210 MemoryBlock& memBlock) const;
211 Word wordProductAsWord(const Word& left,
212 const Word& mid,
213 const Word& right,
214 MemoryBlock& memBlock) const;
215
216
217 int wordHeft(Word& word) const { return wordWeight(word, mHeftDegrees, 0); }
218 int wordHeft(Word& word, int start_index) const { return wordWeight(word, mHeftDegrees, start_index); }
219
220 // monomial support functions
221 void support(const Monom& m, std::vector<int>& result) const;
222
223private:
224 int wordLength(const Monom&m) const { return m[0] - mNumWeights - 1; }
225
226 void setWeights(Monom&m ) const; // assumes length and word are already in place.
227
228 int weightOfVar(int v, int wt) const { return mWeightVectors[v+wt*numVars()]; }
229 int heftOfVar(int v) const { return mHeftDegrees[v]; }
230
231 int wordWeight(Word& word, const std::vector<int>& weight, int start_index) const;
232};
233
246{
247public:
248 MonomEq() : mMonoid(nullptr) {}
249 MonomEq(const FreeMonoid& M) : mMonoid(&M) {}
250 MonomEq(const MonomEq& M) : mMonoid(M.mMonoid) {}
253
254 bool operator() (const Monom a, const Monom b) const
255 {
256 int retval = mMonoid->compare(a, b);
257 return (retval == GT);
258 }
259
260private:
262};
263
276public:
277 int operator()(const Monom &V) const {
278 int hash = V[0];
279 for(auto &i : V) {
280 hash ^= i + 0x9e3779b9 + (hash << 6) + (hash >> 2);
281 }
282 return hash;
283 }
284 int operator()(const Word &V) const {
285 int hash = V.begin()[0];
286 for(auto &i : V) {
287 hash ^= i + 0x9e3779b9 + (hash << 6) + (hash >> 2);
288 }
289 return hash;
290 }
291};
292
306public:
307 MonomHashEqual() : mMonoid(nullptr) {}
312
313 bool operator() (const Monom a, const Monom b) const
314 {
315 //int retval = mMonoid->compare(a, b);
316 //return (retval == EQ);
317 return mMonoid->isEqual(a,b);
318 }
319 // should make an operator() that works on Words too
320 bool operator() (const Word a, const Word b) const
321 {
322 return std::equal(a.begin(),a.end(),b.begin(),b.end());
323 }
324
325
326private:
328};
329
330// this works whether T = std::vector<Monom> or std::vector<Word>
331template<class T>
332struct MonomSort {
335
336 MonomSort(const FreeMonoid* monoid, const T* container) :
337 mMonoid(monoid),
338 mMonomContainer(container) {}
339
340 bool operator() (int a, int b) const
341 {
342 // this function determines whether the monomial in position
343 // a of the container is less than than the monomial in position b
344 // of the container
345 int retval = mMonoid->compare((*mMonomContainer)[a], (*mMonomContainer)[b]);
346 return (retval == GT);
347 }
348};
349
350#endif
351
352// Local Variables:
353// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
354// indent-tabs-mode: nil
355// End:
std::ostream & operator<<(std::ostream &o, FreeMonoidLogger a)
Bump-pointer arena allocator for transient inner-loop allocations.
std::vector< int > word
Modern Monom / Polynomial value types shared by NC algebras and the refactored F4.
Word and WordWithData — non-owning views over the flat-int encoding of a non-commutative word.
const Monoid & degreeMonoid() const
const int mNumWeights
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
int wordHeft(Word &word) const
std::vector< int > mHeftDegrees
void setWeights(Monom &m) const
unsigned int numWeights() const
int wordHeft(Word &word, int start_index) 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 > &degrees, 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
int heftOfVar(int v) 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
const std::vector< int > & flattenedDegrees() 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
The free non-commutative monoid on a set of named variables, with monomial ordering and degree / weig...
static void reset()
static size_t mCompares
static void logCompare()
Static counter for non-commutative monomial comparisons.
Thin RAII wrapper around memtailor::Arena providing bump-pointer array allocation with optional mutex...
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
bool operator()(const Monom a, const Monom b) const
const FreeMonoid * mMonoid
MonomEq(const MonomEq &M)
MonomEq(const FreeMonoid &M)
MonomEq(MonomEq &M)
int operator()(const Word &V) const
int operator()(const Monom &V) const
MonomHashEqual(const MonomHashEqual &M)
bool operator()(const Monom a, const Monom b) const
MonomHashEqual(const FreeMonoid &M)
const FreeMonoid * mMonoid
MonomHashEqual(MonomHashEqual &M)
Hash functor on Monom (or Word) suitable for std::unordered_map / std::unordered_set.
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
const int * begin() const
Definition Word.hpp:72
const int * end() const
Definition Word.hpp:73
Non-owning view of a non-commutative word: [begin, end) of int variable indices.
Definition Word.hpp:56
#define monomial
Definition gb-toric.cpp:11
const int * const_monomial
Definition imonorder.hpp:45
VALGRIND_MAKE_MEM_DEFINED & result(result)
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
Definition newdelete.hpp:76
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
Non-owning view onto a [length, degree, v1, v2, ..., vn] packed monomial in some externally managed b...
const FreeMonoid * mMonoid
MonomSort(const FreeMonoid *monoid, const T *container)
const T * mMonomContainer
bool operator()(int a, int b) const
const int GT
Definition style.hpp:41
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
#define T
Definition table.c:13