Macaulay2 Engine
Loading...
Searching...
No Matches
monoid.cpp
Go to the documentation of this file.
1// Copyright 1996 Michael E. Stillman
2
3#include "monoid.hpp"
4
5#include <assert.h>
6#include <string.h>
7
8#include "ExponentList.hpp"
9#include "ExponentVector.hpp"
10#include "buffer.hpp"
11#include "error.h"
12#include "exceptions.hpp"
13#include "overflow.hpp"
14#include "polyring.hpp"
15#include "util.hpp"
16
17// TODO: remove this
19
21
22// ONLY to be called by PolyRing::get_trivial_poly_ring()
29
31 : mDegreeMonoid(nullptr), // will be set later
32 mDegreeRing(nullptr), // will be set later
33 mo_(nullptr),
34 monorder_(nullptr),
37 mDegrees({}),
38 mHeftVector({}),
39 mHeftDegrees({}),
40 exp_size(0),
41 monomial_size_(0),
42 monomial_bound_(0),
43 first_weights_slot_(-1),
44 n_invertible_vars_(0),
45 n_before_component_(0),
46 n_after_component_(0),
47 component_up_(true),
48 local_vars({}),
49 overflow(nullptr)
50{
51}
52
55{
56 if (trivial_monoid == nullptr) trivial_monoid = new Monoid;
57
58 return trivial_monoid;
59}
60
62 const PolynomialRing *deg_ring,
63 const std::vector<std::string> &names,
64 const std::vector<int> &degs,
65 const std::vector<int> &hefts)
66{
67 unsigned int nvars = rawNumberOfVariables(mo);
68 unsigned int degrk = deg_ring->n_vars();
69 if (degs.size() != nvars * degrk)
70 {
71 ERROR("degree list should be of length %d", nvars * degrk);
72 return nullptr;
73 }
74 if (names.size() != nvars)
75 {
76 ERROR("expected %d variable names", nvars);
77 return nullptr;
78 }
79
80 return new Monoid(mo, deg_ring, names, degs, hefts);
81}
82
84 const PolynomialRing *deg_ring,
85 const std::vector<std::string> names,
86 const std::vector<int> degs,
87 const std::vector<int> hefts)
88 : mDegreeMonoid(deg_ring->getMonoid()),
89 mDegreeRing(deg_ring),
90 mo_(mo),
91 monorder_(nullptr), // set below
93 mVariableNames(names),
94 mDegrees(degs),
95 mHeftVector(hefts),
96 mHeftDegrees({}), // set below, except in the trivial case.
97 exp_size(0), // set below
98 monomial_size_(0), // set below
99 monomial_bound_(0),
100 first_weights_slot_(-1), // set below
101 n_invertible_vars_(0), // set below
102 n_before_component_(0), // set below
103 n_after_component_(0), // set below
104 component_up_(true), // set below
105 local_vars({}), // set below
106 overflow(nullptr)
107// nslots: set below
108{
109 monorder_ = monomialOrderMake(mo);
110
111 monomial_size_ = monorder_->nslots;
112 n_before_component_ = monorder_->nslots_before_component;
113 n_after_component_ = monomial_size_ - n_before_component_;
114 component_up_ = monorder_->component_up;
115
116 // Set nslots_
117 int total = 0;
118 for (int i = 0; i < monorder_->nblocks; i++)
119 {
120 total += monorder_->blocks[i].nslots;
121 nslots_.push_back(total);
122 }
123
124 // Set first_weight_value_
125 bool get_out = false;
126 first_weights_slot_ = -1;
127 for (int i = 0; i < monorder_->nblocks && !get_out; i++)
128 {
129 switch (monorder_->blocks[i].typ)
130 {
131 case MO_LEX:
132 case MO_LEX2:
133 case MO_LEX4:
134 case MO_NC_LEX:
135 get_out = true;
136 break;
137 case MO_REVLEX:
138 case MO_LAURENT:
140 case MO_GREVLEX:
141 case MO_GREVLEX2:
142 case MO_GREVLEX4:
143 case MO_GREVLEX_WTS:
144 case MO_GREVLEX2_WTS:
145 case MO_GREVLEX4_WTS:
146 case MO_WEIGHTS:
147 first_weights_slot_ = 0;
148 case MO_POSITION_UP:
149 continue;
150 case MO_POSITION_DOWN:
151 continue;
152 default:
153 INTERNAL_ERROR("monomial order block type not handled");
154 }
155 }
156 exp_size = EXPONENT_BYTE_SIZE(mVariableCount);
157
158 n_invertible_vars_ = rawNumberOfInvertibleVariables(mo_);
159
160 set_degrees();
161 set_overflow_flags();
162
164
165 for (int i=0; i<n_vars(); ++i)
166 {
167 bool isLaurent = isLaurentVariable(i);
168 mLaurentVariablesPredicate.push_back(isLaurent);
169 }
170
171 // Debugging only:
172 // fprintf(stderr, "%d variables < 1\n", local_vars->len);
173 // if (local_vars->len > 0)
174 // {
175 // fprintf(stderr, "they are: ");
176 // for (int i=0; i<local_vars->len; i++)
177 // fprintf(stderr, "%d ", local_vars->array[i]);
178 // fprintf(stderr, "\n");
179 // }
180}
181
183{
184 if (mDegreeMonoid == nullptr)
185 {
186 mDegreeOfVar.push_back(static_cast<const_monomial>(nullptr));
187 return;
188 }
189
190 auto degrk = mDegreeMonoid->n_vars();
191 auto *iter = mDegrees.data();
192
193 if (mHeftVector.size() != degrk)
194 {
195 ERROR("internal error: mHeftVector.size() == %d != degrk == %d",
196 mHeftVector.size(),
197 degrk);
198 return;
199 }
200 if (degrk > 0)
201 for (int i = 0; i < mVariableCount; i++)
202 {
203 auto d = exponents::weight(degrk, iter, mHeftVector);
204 auto m = mDegreeMonoid->make_one();
205 mDegreeMonoid->from_expvector(iter, m);
206 mDegreeOfVar.push_back(m);
207 mHeftDegrees.push_back(d);
208 iter += degrk;
209 }
210 else
211 {
212 auto m = mDegreeMonoid->make_one();
213 mDegreeOfVar.assign(mVariableCount, m);
214 mHeftDegrees.assign(mVariableCount, 1);
215 }
216 // an extra entry for the degree of the zero element in the degree monoid
217 mDegreeOfVar.push_back(mDegreeMonoid->make_one());
218}
219
220std::vector<int> Monoid::getFirstWeightVector() const
221{
222 std::vector<int> result;
223
224 // grab the first weight vector
225 if (getMonomialOrdering()->len > 0 and
226 getMonomialOrdering()->array[0]->type == MO_WEIGHTS)
227 {
228 mon_part content = getMonomialOrdering()->array[0];
229 std::copy(content->wts,
230 content->wts + content->nvars,
231 std::back_inserter(result));
232 result.resize(n_vars());
233 }
234 return result;
235}
236
237std::vector<int> Monoid::getPrimaryDegreeVector() const
238{
239 return primary_degree_of_vars();
240}
241
243{
245 enum overflow_type flag;
246 int i = 0, k = 0;
247 for (; i < monorder_->nblocks; i++)
248 {
249 mo_block *b = &monorder_->blocks[i];
250 switch (monorder_->blocks[i].typ)
251 {
252 case MO_REVLEX:
253 case MO_WEIGHTS:
254 case MO_LAURENT:
256 case MO_NC_LEX:
257 flag = OVER;
258 goto fillin;
259 case MO_POSITION_UP:
260 case MO_POSITION_DOWN:
261 ERROR(
262 "internal error - MO_POSITION_DOWN or MO_POSITION_UP "
263 "encountered");
264 assert(0);
265 break;
266 case MO_LEX:
267 case MO_GREVLEX:
268 case MO_GREVLEX_WTS:
269 flag = OVER1;
270 goto fillin;
271 case MO_LEX2:
272 case MO_GREVLEX2:
273 case MO_GREVLEX2_WTS:
274 flag = OVER2;
275 goto fillin;
276 case MO_LEX4:
277 case MO_GREVLEX4:
278 case MO_GREVLEX4_WTS:
279 flag = OVER4;
280 goto fillin;
281 fillin:
282 assert(b->first_slot == k);
283 for (int p = b->nslots; p > 0; p--)
284 {
285 assert(k < monomial_size_);
286 overflow[k++] = flag;
287 }
288 break;
289 default:
290 ERROR("internal error - missing case");
291 assert(0);
292 break;
293 }
294 }
295 assert(k == monomial_size_);
296}
297
299{
300 for (int i = 0; i < mVariableCount; i++)
301 if (mHeftDegrees[i] <= 0) return false;
302 return true;
303}
304
306{
307 int i;
308 o << "[";
309 for (i = 0; i < mVariableCount - 1; i++) o << mVariableNames[i] << ",";
311
312 int degrk = mDegreeMonoid->n_vars();
313 o << "," << newline << " DegreeLength => " << degrk;
314
315 o << "," << newline << " Degrees => {";
316 for (i = 0; i < mVariableCount; i++)
317 {
318 if (i != 0) o << ", ";
319 if (degrk != 1) o << '{';
320 for (int j = 0; j < degrk; j++)
321 {
322 if (j != 0) o << ", ";
323 o << mDegrees[i * degrk + j];
324 }
325 if (degrk != 1) o << '}';
326 }
327 o << "}";
328
329 if (mHeftVector.size() != 0)
330 {
331 o << "," << newline << " Heft => {";
332 for (i = 0; i < mHeftVector.size(); i++)
333 {
334 if (i != 0) o << ", ";
335 o << mHeftVector[i];
336 }
337 o << "}";
338 }
339
340 if (mo_ != nullptr)
341 {
342 o << "," << newline << " ";
344 }
345
346 o << newline << " ]";
347}
348
350{
351 unsigned int seed = 0x3124252;
352 unsigned int hash = 0x43435728;
353 int len = monomial_size();
354 for (int i = 0; i < len; i++)
355 {
356 unsigned int val = *m++;
357 hash += seed * val;
358 seed = seed + 1342234;
359 }
360 return hash;
361}
362
364{
366 for (int i = monomial_size_; i != 0; i--) switch (*t++)
367 {
368 case OVER:
369 *result++ = safe::add(*m++, *n++);
370 break;
371 case OVER1:
372 *result++ = safe::pos_add(*m++, *n++);
373 break;
374 case OVER2:
375 *result++ = safe::pos_add_2(*m++, *n++);
376 break;
377 case OVER4:
378 *result++ = safe::pos_add_4(*m++, *n++);
379 break;
380 default:
381 throw(exc::internal_error("missing case"));
382 }
383}
384
385int Monoid::num_parts() const { return monorder_->nblocks; }
386int Monoid::n_slots(int nparts) const
387{
388 if (nparts == 0 or num_parts() == 0) return 0;
389 nparts--;
390 if (nparts < 0) return monomial_size();
391 if (nparts >= num_parts()) nparts = num_parts() - 1;
392 return nslots_[nparts];
393}
394
395bool Monoid::in_subring(int nslots, const_monomial m) const
396{
397 for (int i = 0; i < nslots; i++)
398 if (*m++) return false;
399 return true;
400}
401
403{
404 if (num == 0) return EQ;
405 int n[this->mVariableCount];
406 to_expvector(n0, n);
407 for (int i = 0; i < num; i++)
408 if (m[i] != n[i]) return m[i] < n[i] ? LT : GT;
409 return EQ;
410}
411
413 int mcomp,
415 int ncomp) const
416{
417 int i = n_before_component_;
418 while (1)
419 {
420 if (i == 0) break;
421 if (*m > *n) return GT;
422 if (*m < *n) return LT;
423 m++, n++;
424 --i;
425 }
426 if (component_up_)
427 {
428 if (mcomp < ncomp) return LT;
429 if (mcomp > ncomp) return GT;
430 }
431 else
432 {
433 if (mcomp < ncomp) return GT;
434 if (mcomp > ncomp) return LT;
435 }
437 while (1)
438 {
439 if (i == 0) break;
440 if (*m > *n) return GT;
441 if (*m < *n) return LT;
442 m++, n++;
443 --i;
444 }
445 return EQ;
446}
447
449{
450 if (mVariableCount == 0) return nullptr;
452 copy(d, result);
453 return result;
454}
456{
457 if (mVariableCount == 0) return nullptr;
459 one(result);
460 return result;
461}
463{
464 (void) d;
465#if 0
466// freemem(d);
467#endif
468}
469
471{
472 for (int i = 0; i < monomial_size(); i++) *result++ = 0;
473}
474
476{
477 memcpy(result, m, monomial_size() * sizeof(int));
478}
479
481// Is each exponent m_i <= n_i, for all i=0..nvars-1?
482{
483 if (mVariableCount == 0) return true;
484
487 // can we speed this up by not unpacking ??
488 to_expvector(m, EXP1);
489 to_expvector(n, EXP2);
490 return exponents::divides(mVariableCount, EXP1, EXP2);
491}
492
494// Does m divide n?
495{
496 if (mVariableCount == 0) return true;
497
500 // can we speed this up by not unpacking ??
501 to_expvector(m, EXP1);
502 to_expvector(n, EXP2);
503 if (numInvertibleVariables() == 0)
504 return exponents::divides(mVariableCount, EXP1, EXP2);
505 for (int i = 0; i < mVariableCount; ++i)
506 if (not mLaurentVariablesPredicate[i] and EXP1[i] > EXP2[i])
507 return false;
508 return true;
509}
510
512{
513 if (mVariableCount == 0) return;
514
516 to_expvector(m, EXP1);
517 exponents::power(mVariableCount, EXP1, n, EXP1);
518 from_expvector(EXP1, result);
519}
520
523 monomial sm,
524 monomial sn) const
525{
526 if (mVariableCount == 0) return;
527
530
531 to_expvector(m, EXP1);
532 to_expvector(n, EXP2);
533 for (int i = 0; i < mVariableCount; i++)
534 if (EXP1[i] > EXP2[i])
535 {
536 EXP2[i] = EXP1[i] - EXP2[i];
537 EXP1[i] = 0;
538 }
539 else
540 {
541 EXP1[i] = EXP2[i] - EXP1[i];
542 EXP2[i] = 0;
543 }
544 from_expvector(EXP1, sm);
545 from_expvector(EXP2, sn);
546}
547
549{
550 if (mVariableCount == 0) return;
551
554
555 to_expvector(m, EXP1);
556 to_expvector(n, EXP2);
557 exponents::gcd(mVariableCount, EXP1, EXP2, EXP1);
558 from_expvector(EXP1, p);
559}
560
562{
563 if (mVariableCount == 0) return;
564
567
568 to_expvector(m, EXP1);
569 to_expvector(n, EXP2);
570 exponents::lcm(mVariableCount, EXP1, EXP2, EXP1);
571 from_expvector(EXP1, p);
572}
573
574// TODO: replace buffer and use standard IO
575void Monoid::elem_text_out(buffer &o, const_monomial m, bool p_one) const
576{
578 to_expvector(m, EXP1);
579// elem_text_out(o, EXP1, p_one);
580// }
581// void Monoid::elem_text_out(buffer &o, const_exponents EXP1, bool p_one) const
582// {
583 int len_ = 0;
584 for (unsigned int v = 0; v < mVariableCount; v++)
585 if (EXP1[v] != 0)
586 {
587 len_++;
588 if (mVariableNames.size() < v)
589 o << ".";
590 else
591 o << mVariableNames[v];
592 int e = EXP1[v];
593 int single = (mVariableNames[v].size() == 1);
594 if (e > 1 && single)
595 o << e;
596 else if (e > 1)
597 o << "^" << e;
598 else if (e < 0)
599 o << "^(" << e << ")";
600 }
601 if (len_ == 0 && p_one) o << "1";
602}
603
604// void Monoid::elem_text_out(buffer &o, const_varpower m, bool p_one) const
605// {
606// index_varpower i = m;
607// if (!i.valid() and p_one) o << "1";
608// for (; i.valid(); ++i)
609// {
610// int v = i.var();
611// int e = i.exponent();
612// if (mVariableNames.size() < v)
613// o << ".";
614// else
615// o << mVariableNames[v];
616// int single = (mVariableNames[v].size() == 1);
617// if (e > 1 && single)
618// o << e;
619// else if (e > 1)
620// o << "^" << e;
621// else if (e < 0)
622// o << "^(" << e << ")";
623// }
624// }
625
627{
628 if (mDegreeMonoid->n_vars() == 0) return;
629
631
632 mDegreeMonoid->one(result);
633 if (mVariableCount == 0) return;
634 monomial mon1 = mDegreeMonoid->make_one();
635
636 to_expvector(m, EXP1);
637
638 for (int i = 0; i < mVariableCount; i++)
639 if (EXP1[i] != 0)
640 {
641 mDegreeMonoid->power(mDegreeOfVar[i], EXP1[i], mon1);
642 mDegreeMonoid->mult(result, mon1, result);
643 }
644 mDegreeMonoid->remove(mon1);
645}
646
648{
649 if (mVariableCount == 0) return;
650 if (mDegreeMonoid->n_vars() == 0) return;
651
652 mDegreeMonoid->one(result);
653 monomial mon1 = mDegreeMonoid->make_one();
654
655 for (index_varpower j = vp; j.valid(); ++j)
656 {
657 int v = j.var();
658 int e = j.exponent();
659 mDegreeMonoid->power(mDegreeOfVar[v], e, mon1);
660 mDegreeMonoid->mult(result, mon1, result);
661 }
662 mDegreeMonoid->remove(mon1);
663}
664
669
670int Monoid::degree_weights(const_monomial m, const std::vector<int> &wts) const
671{
672 if (mVariableCount == 0) return 0;
673
675 to_expvector(m, EXP1);
676 int sz = (wts.size() < mVariableCount ? wts.size() : mVariableCount);
677 return exponents::weight(sz, EXP1, wts);
678}
679
680// TODO: this doesn't have the same overflow check as the one above
681// implement overflow check for int64_t and combine with the above
682template<typename T>
683T Monoid::degree_weights(const_monomial m, const std::vector<T>& wts) const
684{
685 if (mVariableCount == 0) return 0;
686
688 to_expvector(m, EXP1);
689 int sz = (wts.size() < mVariableCount ? wts.size() : mVariableCount);
690 T wt = 0;
691 for (int i=0; i<sz; i++)
692 wt += EXP1[i] * wts[i];
693 return wt;
694}
695
696template int Monoid::degree_weights<int>(const_monomial m, const std::vector<int>& wts) const;
697
699{
700 if (mVariableCount == 0) return 0;
701
703 to_expvector(m, EXP1);
705}
706
708{
709 for (int i = 0; i < monomial_size(); i++)
710 if (*m++ != 0) return false;
711 return true;
712}
713
715// is every variable that occurs
716// in 'm' allowed to be negative?
717{
718 // Only the trivial monomial is invertible in this case
719 if (n_invertible_vars_ == 0) { return is_one(m); }
720
722 to_expvector(m, EXP1);
723 for (int i = 0; i < mVariableCount; i++)
724 if (!monorder_->is_laurent[i] && EXP1[i] > 0) return false;
725 return true;
726}
727
734
741
746
751
752// Local Variables:
753// compile-command: "make -C $M2BUILDDIR/Macaulay2/e monoid.o "
754// indent-tabs-mode: nil
755// End:
varpower::ConstExponents const_varpower
ExponentListIterator< int, true > index_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.
Append-only GC-backed byte buffer used throughout the engine for text output.
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
static void to_expvector(int n, ConstExponents a, exponents::Exponents result)
static Exponent weight(int nvars, ConstExponents a, const std::vector< Exponent > &wts)
static Exponent simple_degree(int nvars, ConstExponents a)
static void gcd(int nvars, ConstExponents a, ConstExponents b, Exponents result)
static void power(int nvars, ConstExponents a, const Exponent n, Exponents result)
static void lcm(int nvars, ConstExponents a, ConstExponents b, Exponents result)
static bool divides(int nvars, ConstExponents a, ConstExponents b)
bool component_up_
indicates whether free module components are ordered lexicographically
Definition monoid.hpp:136
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
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
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
const Monoid * mDegreeMonoid
Definition monoid.hpp:90
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
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
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
size_t exp_size
Definition monoid.hpp:120
monomial make_one() const
Definition monoid.cpp:455
const PolynomialRing * mDegreeRing
Definition monoid.hpp:91
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
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
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 > getFirstWeightVector() const
Definition monoid.cpp:220
void copy(const_monomial m, monomial result) const
Definition monoid.cpp:475
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
static Monoid * get_trivial_monoid()
Definition monoid.cpp:54
const std::vector< int > mHeftVector
length of a single degree vector
Definition monoid.hpp:105
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_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
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
unsigned int hash() const
Definition hash.hpp:106
int n_vars() const
Definition polyring.hpp:196
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
void INTERNAL_ERROR(const char *s,...)
Definition error.c:36
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
int p
void monomialOrderEncodeFromActualExponents(const MonomialOrder *mo, const_exponents expon, monomial result_psums)
MonomialOrder * monomialOrderMake(const MonomialOrdering *mo)
void monomialOrderDecodeToActualExponents(const MonomialOrder *mo, const_monomial psums, exponents_t expon)
const int * const_monomial
Definition imonorder.hpp:45
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
char newline[]
Definition m2-types.cpp:49
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
const int * const_monomial
Definition monoid.hpp:59
int * monomial
Definition monoid.hpp:58
#define EXPONENT_BYTE_SIZE(nvars)
Definition monoid.hpp:63
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
int rawNumberOfInvertibleVariables(const MonomialOrdering *mo)
M2_arrayint rawNonTermOrderVariables(const MonomialOrdering *mo)
M2_string IM2_MonomialOrdering_to_string(const MonomialOrdering *mo)
int rawNumberOfVariables(const MonomialOrdering *mo)
@ MO_GREVLEX4_WTS
@ MO_LAURENT_REVLEX
@ MO_NC_LEX
@ MO_LEX4
@ MO_REVLEX
@ MO_POSITION_UP
@ MO_LEX
@ MO_GREVLEX
@ MO_LEX2
@ MO_GREVLEX4
@ MO_LAURENT
@ MO_GREVLEX2_WTS
@ MO_WEIGHTS
@ MO_POSITION_DOWN
@ MO_GREVLEX2
@ MO_GREVLEX_WTS
Engine-boundary C API for assembling block-level MonomialOrderings from declarative pieces.
static int32_t pos_add(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:197
static int32_t add(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:116
static int32_t pos_add_4(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:222
static int32_t pos_add_2(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:209
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
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
Overflow-checked integer arithmetic for monomial exponents and degree sums.
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
Front-end-side description of a monomial ordering as a list of mon_part blocks.
int first_slot
Definition imonorder.hpp:53
const int EQ
Definition style.hpp:40
const int GT
Definition style.hpp:41
const int LT
Definition style.hpp:39
#define T
Definition table.c:13
std::vector< T > M2_arrayint_to_stdvector(M2_arrayint arr)
Definition util.hpp:96
Conversion helpers between M2 boundary types and standard C++ containers.