Macaulay2 Engine
Loading...
Searching...
No Matches
monoid.hpp
Go to the documentation of this file.
1// Copyright 2004. Michael E. Stillman
2#pragma once
3
38
39#ifdef HAVE_ALLOCA_H
40#include <alloca.h> // for alloca
41#endif
42#include <stddef.h> // for size_t
43#include <string> // for string
44#include <vector> // for vector
45
46#include "ExponentList.hpp"
47#include "ExponentVector.hpp"
48#include "hash.hpp"
49#include "imonorder.hpp"
50#include "newdelete.hpp"
51#include "style.hpp"
52
53class PolynomialRing;
54class buffer;
55struct MonomialOrdering;
56
57// monomial is an encoded array of size monomial_size()
58typedef int *monomial;
59typedef const int *const_monomial;
60
61
62#define ALLOCATE_EXPONENTS(byte_len) static_cast<exponents_t>(alloca(byte_len))
63#define EXPONENT_BYTE_SIZE(nvars) static_cast<int>((sizeof(int) * (nvars)))
64
65#define ALLOCATE_MONOMIAL(byte_len) static_cast<monomial>(alloca(byte_len))
66#define MONOMIAL_BYTE_SIZE(mon_size) \
67 static_cast<int>((sizeof(int) * (mon_size)))
68
69// TODO: rename and document all variables
70// (e.g. see NCAlgebras/FreeMonoid.hpp and mathicgb/MonoMonoid.hpp)
71// TODO: make sure monoid is deconstructed and not garbage collected
89{
92
95 // Internal version, with encoding information
96 MonomialOrder *monorder_;
97
99 const int mVariableCount;
101 const std::vector<std::string> mVariableNames;
103 const std::vector<int> mDegrees;
105 const std::vector<int> mHeftVector;
107 // TODO: make this const
108 std::vector<int> mHeftDegrees;
109
114
116 void set_degrees();
117
120 size_t exp_size;
121
123 int monomial_size_; // in ints
124 int monomial_bound_; // not yet used
125
126 // TODO: the following should be handled by the monomial order
138 std::vector<int> local_vars;
140 std::vector<bool> mLaurentVariablesPredicate;
142 // TODO: why is this one a gc_vector?
145 void set_overflow_flags();
147
150
152 Monoid();
153 Monoid(const MonomialOrdering *mo,
154 const PolynomialRing *DR, /* degree ring */
155 const std::vector<std::string> names,
156 const std::vector<int> degs,
157 const std::vector<int> hefts);
158
159 public:
160 static Monoid *create(const MonomialOrdering *mo,
161 const PolynomialRing *DR, /* degree ring */
162 const std::vector<std::string> &names,
163 const std::vector<int> &degs,
164 const std::vector<int> &hefts);
165
166 ~Monoid();
167
168 static void set_trivial_monoid_degree_ring(const PolynomialRing *DR);
169 // ONLY to be called by PolyRing::get_trivial_poly_ring()
170
171 static Monoid *get_trivial_monoid();
172
173 const MonomialOrdering *getMonomialOrdering() const { return mo_; }
174 const PolynomialRing *get_degree_ring() const { return mDegreeRing; }
175 const Monoid *degree_monoid() const { return mDegreeMonoid; }
176 const_monomial degree_of_var(int v) const { return mDegreeOfVar[v]; }
177 int primary_degree_of_var(int v) const { return mHeftDegrees[v]; }
178 const std::vector<int> &primary_degree_of_vars() const { return mHeftDegrees; }
179 const std::vector<int> &get_heft_vector() const { return mHeftVector; }
181
182 bool is_group() const { return n_invertible_vars_ == mVariableCount; }
183 bool is_local() const { return local_vars.size() > 0; }
185 {
186 return (n_invertible_vars_ > 0 || local_vars.size() > 0);
187 }
188
190 int numNonTermOrderVariables() const { return local_vars.size(); }
191 // returns an empty vector if the first part of the monomial ordering is
192 // not a weight vector
193 std::vector<int> getFirstWeightVector() const;
194
195 std::vector<int> getPrimaryDegreeVector() const;
196
197 bool isLaurentVariable(int i) const {
198 return monorder_->is_laurent[i];
199 }
200
201 std::vector<bool> laurentVariables() const {
203 }
204
205 void text_out(buffer &o) const;
206
207 int n_vars() const { return mVariableCount; }
208 int max_degree() const { return monomial_bound_; }
209 int monomial_size() const { return monomial_size_; }
210 int n_slots(int nparts) const;
211 int num_parts() const;
212
213 unsigned int computeHashValue(const_monomial m) const;
214
216 // Monomial arithmetic //
219 void to_varpower(const_monomial m, gc_vector<int>& result_vp) const;
220
221 // convert to and from the exponent vector representation
223 void to_expvector(const_monomial m, exponents_t result_exp) const;
224
225 bool in_subring(int nslots, const_monomial m) const;
226 inline int compare(int nslots, const_monomial m, const_monomial n) const
227 {
228 for (int i = nslots; i != 0; --i)
229 {
230 if (*m > *n) return GT;
231 if (*m < *n) return LT;
232 m++;
233 n++;
234 }
235 return EQ;
236 }
237
239 monomial make_one() const;
240 void remove(monomial d) const;
241
242 bool is_one(const_monomial m) const;
243 bool is_invertible(const_monomial m) const; // is every variable that occurs
244 // in 'm' allowed to be negative?
245
246 void one(monomial result) const;
247 void copy(const_monomial m, monomial result) const;
248
250 void power(const_monomial m, int n, monomial result) const;
251 inline int compare(const_monomial m, const_monomial n) const
252 {
253 int i = monomial_size_;
254 if (i == 0) return EQ;
255 while (1)
256 {
257 if (*m > *n) return GT;
258 if (*m < *n) return LT;
259 if (--i == 0) return EQ;
260 m++, n++;
261 }
262 }
263 int partial_compare(int num, const_monomial m, const_monomial n) const;
264 int compare(const_monomial m, int mcomp, const_monomial n, int ncomp) const;
265 bool is_equal(const_monomial m1, const_monomial m2) const { return compare(m1, m2) == EQ; }
266
267 bool divides_partial_order(const_monomial m, const_monomial n) const; // s.t. n/m only has >= exponents.
268 bool divides(const_monomial m, const_monomial n) const; // s.t. n/m might have negative exponents, for Laurent variables.
272 void monsyz(const_monomial m,
274 monomial result_sm,
275 monomial result_sn) const;
276
277 // TODO: define all three
278 void elem_text_out(buffer &o, const_monomial m, bool p_one = true) const;
279 //void elem_text_out(buffer &o, const_exponents m, bool p_one = true) const;
280 //void elem_text_out(buffer &o, const_varpower m, bool p_one = true) const;
281
283 int primary_degree(const_monomial m) const;
284
285 template<typename T>
286 T degree_weights(const_monomial m, const std::vector<T>& wts) const;
287 int degree_weights(const_monomial m, const std::vector<int> &wts) const;
288
289 int simple_degree(const_monomial m) const; // simply sum of exponents
291
292 template<typename T>
293 void degree_of_expvector(const T* expvector, monomial result) const
294 {
295 mDegreeMonoid->one(result);
296 monomial mon1 = mDegreeMonoid->make_one();
297 for (int i=0; i<n_vars(); i++)
298 {
299 if (expvector[i] != 0)
300 {
301 mDegreeMonoid->power(mDegreeOfVar[i], expvector[i], mon1);
302 mDegreeMonoid->mult(result, mon1, result);
303 }
304 }
305 mDegreeMonoid->remove(mon1);
306 }
307
308 bool weight_value_exists() const { return first_weights_slot_ >= 0; }
309 // True if the first part of the order has a weight vector.
310 // MUST be true in order for first_weight_value to not give erroneous value
311
313 {
314 return m[first_weights_slot_];
315 }
316 // Returns the value of the first weight vector in the monomial order.
317 // If none, returns 0. First call weight_value_exists() before using.
318};
319
320#if 0
321// // These will become the unsafe versions, I guess, if they are still
322// // needed...
323// inline void Monoid::mult(const_monomial m, const_monomial n, monomial result) const
324// { for (int i=0; i<monomial_size_; i++) *result++ = *m++ + *n++; }
325//
326// inline void Monoid::power(const_monomial m, int n, monomial result) const
327// { for (int i=0; i<monomial_size_; i++) *result++ = *m++ * n; }
328#endif
329
330// WARNING!! 'divide' assumes that division is possible
333 monomial result) const
334{
335 for (int i = monomial_size_; i > 0; i--) *result++ = *m++ - *n++;
336}
337
338// Local Variables:
339// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
340// indent-tabs-mode: nil
341// End:
varpower::ConstExponents const_varpower
Variable-length sparse (variable, exponent) encoding of monomials.
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
Dense exponent-vector template [e_0, ..., e_{nvars-1}] for monomial operations.
bool component_up_
indicates whether free module components are ordered lexicographically
Definition monoid.hpp:136
int numNonTermOrderVariables() const
Definition monoid.hpp:190
T degree_weights(const_monomial m, const std::vector< T > &wts) const
Definition monoid.cpp:683
void gcd(const_monomial m, const_monomial n, monomial result) const
Definition monoid.cpp:548
static void set_trivial_monoid_degree_ring(const PolynomialRing *DR)
Definition monoid.cpp:23
~Monoid()
Definition monoid.cpp:53
void elem_text_out(buffer &o, const_monomial m, bool p_one=true) const
Definition monoid.cpp:575
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
bool in_subring(int nslots, const_monomial m) const
Definition monoid.cpp:395
const std::vector< int > mDegrees
length mVariableCount * (length of a single degree vector)
Definition monoid.hpp:103
const PolynomialRing * get_degree_ring() const
Definition monoid.hpp:174
bool is_invertible(const_monomial m) const
Definition monoid.cpp:714
void lcm(const_monomial m, const_monomial n, monomial result) const
Definition monoid.cpp:561
void power(const_monomial m, int n, monomial result) const
Definition monoid.cpp:511
bool divides_partial_order(const_monomial m, const_monomial n) const
Definition monoid.cpp:480
int monomial_size() const
Definition monoid.hpp:209
std::vector< bool > mLaurentVariablesPredicate
These are the variables which can have negative exponents.
Definition monoid.hpp:140
int n_after_component_
Definition monoid.hpp:134
int primary_degree_of_var(int v) const
Definition monoid.hpp:177
overflow_type
Definition monoid.hpp:146
@ OVER2
Definition monoid.hpp:146
@ OVER4
Definition monoid.hpp:146
@ OVER1
Definition monoid.hpp:146
void to_varpower(const_monomial m, gc_vector< int > &result_vp) const
Definition monoid.cpp:735
bool is_group() const
Definition monoid.hpp:182
const Monoid * mDegreeMonoid
Definition monoid.hpp:90
long first_weight_value(const_monomial m) const
Definition monoid.hpp:312
int compare(const_monomial m, const_monomial n) const
Definition monoid.hpp:251
int first_weights_slot_
Definition monoid.hpp:129
void text_out(buffer &o) const
Definition monoid.cpp:305
bool primary_degrees_of_vars_positive() const
Definition monoid.cpp:298
void multi_degree(const_monomial m, monomial result) const
Definition monoid.cpp:626
void degree_of_expvector(const T *expvector, monomial result) const
Definition monoid.hpp:293
gc_vector< int > nslots_
number of slots per monomial order block
Definition monoid.hpp:143
void from_varpower(const_varpower vp, monomial result) const
Definition monoid.cpp:728
Monoid()
constructors
Definition monoid.cpp:30
std::vector< bool > laurentVariables() const
Definition monoid.hpp:201
const_monomial degree_of_var(int v) const
Definition monoid.hpp:176
int max_degree() const
Definition monoid.hpp:208
bool is_one(const_monomial m) const
Definition monoid.cpp:707
std::vector< int > getPrimaryDegreeVector() const
Definition monoid.cpp:237
int n_vars() const
Definition monoid.hpp:207
bool is_local() const
Definition monoid.hpp:183
size_t exp_size
Definition monoid.hpp:120
bool has_monomials_lt_one() const
Definition monoid.hpp:184
monomial make_one() const
Definition monoid.cpp:455
const PolynomialRing * mDegreeRing
Definition monoid.hpp:91
const std::vector< int > & get_heft_vector() const
Definition monoid.hpp:179
unsigned int computeHashValue(const_monomial m) const
Definition monoid.cpp:349
const std::vector< int > & primary_degree_of_vars() const
Definition monoid.hpp:178
int n_invertible_vars_
number of invertible variables
Definition monoid.hpp:131
static Monoid * create(const MonomialOrdering *mo, const PolynomialRing *DR, const std::vector< std::string > &names, const std::vector< int > &degs, const std::vector< int > &hefts)
Definition monoid.cpp:61
void set_degrees()
sets mHeftDegrees and mDegreeOfVar
Definition monoid.cpp:182
int compare(int nslots, const_monomial m, const_monomial n) const
Definition monoid.hpp:226
int num_parts() const
Definition monoid.cpp:385
void remove(monomial d) const
Definition monoid.cpp:462
void monsyz(const_monomial m, const_monomial n, monomial result_sm, monomial result_sn) const
Definition monoid.cpp:521
bool divides(const_monomial m, const_monomial n) const
Definition monoid.cpp:493
const int mVariableCount
number of variables
Definition monoid.hpp:99
int simple_degree(const_monomial m) const
Definition monoid.cpp:698
const MonomialOrdering * mo_
the monomial ordering of the variables
Definition monoid.hpp:94
const MonomialOrdering * getMonomialOrdering() const
Definition monoid.hpp:173
void set_overflow_flags()
used for preventing overflows
Definition monoid.cpp:242
bool is_equal(const_monomial m1, const_monomial m2) const
Definition monoid.hpp:265
int primary_degree(const_monomial m) const
Definition monoid.cpp:665
void degree_of_varpower(const_varpower vp, monomial result) const
Definition monoid.cpp:647
const Monoid * degree_monoid() const
Definition monoid.hpp:175
std::vector< int > mHeftDegrees
length mVariableCount
Definition monoid.hpp:108
void one(monomial result) const
Definition monoid.cpp:470
int numInvertibleVariables() const
Definition monoid.hpp:189
enum Monoid::overflow_type * overflow
int partial_compare(int num, const_monomial m, const_monomial n) const
Definition monoid.cpp:402
gc_vector< const_monomial > mDegreeOfVar
Definition monoid.hpp:113
std::vector< int > local_vars
These are the variables which are < 1 in the monomial order.
Definition monoid.hpp:138
std::vector< int > getFirstWeightVector() const
Definition monoid.cpp:220
void copy(const_monomial m, monomial result) const
Definition monoid.cpp:475
bool weight_value_exists() const
Definition monoid.hpp:308
void mult(const_monomial m, const_monomial n, monomial result) const
Definition monoid.cpp:363
int n_before_component_
indicates where the free module components are in the monomial order
Definition monoid.hpp:133
void divide(const_monomial m, const_monomial n, monomial result) const
Definition monoid.hpp:331
static Monoid * get_trivial_monoid()
Definition monoid.cpp:54
const std::vector< int > mHeftVector
length of a single degree vector
Definition monoid.hpp:105
bool isLaurentVariable(int i) const
Definition monoid.hpp:197
const std::vector< std::string > mVariableNames
names of variables
Definition monoid.hpp:101
static Monoid * trivial_monoid
the trivial monoid
Definition monoid.hpp:149
int monomial_bound_
Definition monoid.hpp:124
int monomial_size_
size of an encoded monomial
Definition monoid.hpp:123
MonomialOrder * monorder_
Definition monoid.hpp:96
monomial make_new(const_monomial d) const
Definition monoid.cpp:448
void from_expvector(const_exponents exp, monomial result) const
Definition monoid.cpp:742
int n_slots(int nparts) const
Definition monoid.cpp:386
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
#define monomial
Definition gb-toric.cpp:11
EngineObject / MutableEngineObject — shared bases that supply the hash an M2 interpreter object expec...
const int * const_monomial
Definition imonorder.hpp:45
Internal (runtime) form of a monomial ordering.
VALGRIND_MAKE_MEM_DEFINED & result(result)
const int * const_monomial
Definition monoid.hpp:59
int * monomial
Definition monoid.hpp:58
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.
Front-end-side description of a monomial ordering as a list of mon_part blocks.
const int EQ
Definition style.hpp:40
const int GT
Definition style.hpp:41
const int LT
Definition style.hpp:39
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
#define T
Definition table.c:13