43 first_weights_slot_(-1),
44 n_invertible_vars_(0),
45 n_before_component_(0),
46 n_after_component_(0),
63 const std::vector<std::string> &names,
64 const std::vector<int> °s,
65 const std::vector<int> &hefts)
68 unsigned int degrk = deg_ring->
n_vars();
69 if (degs.size() != nvars * degrk)
71 ERROR(
"degree list should be of length %d", nvars * degrk);
74 if (names.size() != nvars)
76 ERROR(
"expected %d variable names", nvars);
80 return new Monoid(mo, deg_ring, names, degs, hefts);
85 const std::vector<std::string> names,
86 const std::vector<int> degs,
87 const std::vector<int> hefts)
100 first_weights_slot_(-1),
101 n_invertible_vars_(0),
102 n_before_component_(0),
103 n_after_component_(0),
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;
118 for (
int i = 0; i < monorder_->nblocks; i++)
120 total += monorder_->blocks[i].nslots;
121 nslots_.push_back(total);
125 bool get_out =
false;
126 first_weights_slot_ = -1;
127 for (
int i = 0; i < monorder_->nblocks && !get_out; i++)
129 switch (monorder_->blocks[i].typ)
147 first_weights_slot_ = 0;
161 set_overflow_flags();
165 for (
int i=0; i<n_vars(); ++i)
167 bool isLaurent = isLaurentVariable(i);
168 mLaurentVariablesPredicate.push_back(isLaurent);
195 ERROR(
"internal error: mHeftVector.size() == %d != degrk == %d",
229 std::copy(content->wts,
230 content->wts + content->nvars,
231 std::back_inserter(
result));
262 "internal error - MO_POSITION_DOWN or MO_POSITION_UP "
290 ERROR(
"internal error - missing case");
313 o <<
"," <<
newline <<
" DegreeLength => " << degrk;
315 o <<
"," <<
newline <<
" Degrees => {";
318 if (i != 0) o <<
", ";
319 if (degrk != 1) o <<
'{';
320 for (
int j = 0; j < degrk; j++)
322 if (j != 0) o <<
", ";
325 if (degrk != 1) o <<
'}';
331 o <<
"," <<
newline <<
" Heft => {";
334 if (i != 0) o <<
", ";
351 unsigned int seed = 0x3124252;
352 unsigned int hash = 0x43435728;
354 for (
int i = 0; i < len; i++)
356 unsigned int val = *m++;
358 seed = seed + 1342234;
388 if (nparts == 0 or
num_parts() == 0)
return 0;
397 for (
int i = 0; i < nslots; i++)
398 if (*m++)
return false;
404 if (num == 0)
return EQ;
407 for (
int i = 0; i < num; i++)
408 if (m[i] != n[i])
return m[i] < n[i] ?
LT :
GT;
421 if (*m > *n)
return GT;
422 if (*m < *n)
return LT;
428 if (mcomp < ncomp)
return LT;
429 if (mcomp > ncomp)
return GT;
433 if (mcomp < ncomp)
return GT;
434 if (mcomp > ncomp)
return LT;
440 if (*m > *n)
return GT;
441 if (*m < *n)
return LT;
534 if (EXP1[i] > EXP2[i])
536 EXP2[i] = EXP1[i] - EXP2[i];
541 EXP1[i] = EXP2[i] - EXP1[i];
599 o <<
"^(" << e <<
")";
601 if (len_ == 0 && p_one) o <<
"1";
658 int e = j.exponent();
691 for (
int i=0; i<sz; i++)
692 wt += EXP1[i] * wts[i];
710 if (*m++ != 0)
return false;
724 if (!
monorder_->is_laurent[i] && EXP1[i] > 0)
return false;
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
T degree_weights(const_monomial m, const std::vector< T > &wts) const
void gcd(const_monomial m, const_monomial n, monomial result) const
static void set_trivial_monoid_degree_ring(const PolynomialRing *DR)
void elem_text_out(buffer &o, const_monomial m, bool p_one=true) const
void to_expvector(const_monomial m, exponents_t result_exp) const
bool in_subring(int nslots, const_monomial m) const
const std::vector< int > mDegrees
length mVariableCount * (length of a single degree vector)
bool is_invertible(const_monomial m) const
void lcm(const_monomial m, const_monomial n, monomial result) const
void power(const_monomial m, int n, monomial result) const
bool divides_partial_order(const_monomial m, const_monomial n) const
int monomial_size() const
std::vector< bool > mLaurentVariablesPredicate
These are the variables which can have negative exponents.
void to_varpower(const_monomial m, gc_vector< int > &result_vp) const
const Monoid * mDegreeMonoid
void text_out(buffer &o) const
bool primary_degrees_of_vars_positive() const
void multi_degree(const_monomial m, monomial result) const
gc_vector< int > nslots_
number of slots per monomial order block
void from_varpower(const_varpower vp, monomial result) const
bool is_one(const_monomial m) const
std::vector< int > getPrimaryDegreeVector() const
monomial make_one() const
const PolynomialRing * mDegreeRing
unsigned int computeHashValue(const_monomial m) const
const std::vector< int > & primary_degree_of_vars() const
int n_invertible_vars_
number of invertible variables
static Monoid * create(const MonomialOrdering *mo, const PolynomialRing *DR, const std::vector< std::string > &names, const std::vector< int > °s, const std::vector< int > &hefts)
void set_degrees()
sets mHeftDegrees and mDegreeOfVar
int compare(int nslots, const_monomial m, const_monomial n) const
void remove(monomial d) const
void monsyz(const_monomial m, const_monomial n, monomial result_sm, monomial result_sn) const
bool divides(const_monomial m, const_monomial n) const
const int mVariableCount
number of variables
int simple_degree(const_monomial m) const
const MonomialOrdering * mo_
the monomial ordering of the variables
const MonomialOrdering * getMonomialOrdering() const
void set_overflow_flags()
used for preventing overflows
int primary_degree(const_monomial m) const
void degree_of_varpower(const_varpower vp, monomial result) const
std::vector< int > mHeftDegrees
length mVariableCount
void one(monomial result) const
int numInvertibleVariables() const
enum Monoid::overflow_type * overflow
int partial_compare(int num, const_monomial m, const_monomial n) const
gc_vector< const_monomial > mDegreeOfVar
std::vector< int > getFirstWeightVector() const
void copy(const_monomial m, monomial result) const
void mult(const_monomial m, const_monomial n, monomial result) const
int n_before_component_
indicates where the free module components are in the monomial order
static Monoid * get_trivial_monoid()
const std::vector< int > mHeftVector
length of a single degree vector
const std::vector< std::string > mVariableNames
names of variables
static Monoid * trivial_monoid
the trivial monoid
int monomial_size_
size of an encoded monomial
MonomialOrder * monorder_
monomial make_new(const_monomial d) const
void from_expvector(const_exponents exp, monomial result) const
int n_slots(int nparts) const
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
unsigned int hash() const
Abstract base for the engine's polynomial-ring hierarchy.
void INTERNAL_ERROR(const char *s,...)
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
namespace exc — internal C++ exception types and the TRY / CATCH macro pair.
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
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ALLOCATE_EXPONENTS(byte_len)
const int * const_monomial
#define EXPONENT_BYTE_SIZE(nvars)
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)
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)
static int32_t add(int32_t x, int32_t y, const char *msg)
static int32_t pos_add_4(int32_t x, int32_t y, const char *msg)
static int32_t pos_add_2(int32_t x, int32_t y, const char *msg)
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
#define newarray_atomic(T, len)
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.
std::vector< T > M2_arrayint_to_stdvector(M2_arrayint arr)
Conversion helpers between M2 boundary types and standard C++ containers.