37 static unsigned int next_hash = 23023421;
40 z->
_hash = next_hash++;
42 for (i = 0; i < n; i++) z->
array[i] =
nullptr;
50 for (i = 0; i < mo->
len; i++)
59 for (j = 0; j < offset; j++) q->wts[j] = 0;
60 for (; j < q->nvars; j++) q->wts[j] =
p->wts[j - offset];
84 return (
p->nvars > 0);
107 for (
int i = 0; i < nvars; i++) w.push_back(1);
113 for (
int i = 0; i < nvars; i++) w.push_back(1);
119 for (
int i = 0; i < nvars; i++) w.push_back(1);
170 for (
int i = 0; i < degs.size(); i++)
173 ERROR(
"grevlex: expected all degrees to be positive");
176 else if (degs[i] > 1)
183 else if (packing == 4)
193 else if (packing == 4)
207 const std::vector<MonomialOrdering *> &M)
212 int nvars_so_far = 0;
215 for (i = 0; i < M.size(); i++)
218 for (j = 0; j < mo->
len; j++)
224 for (i = 0; i < M.size(); i++)
227 for (j = 0; j < mo->
len; j++)
229 mon_part
p = mo->
array[j];
232 nvars_so_far +=
p->nvars;
238 for (j = 0; j < nvars_so_far; j++) q->wts[j] = 0;
239 for (; j < q->nvars; j++) q->wts[j] =
p->wts[j - nvars_so_far];
249 const std::vector<MonomialOrdering *> &M)
252 int i, j, sum, next, offset;
254 for (i = 0; i < M.size(); i++) sum += M[i]->len;
259 for (i = 0; i < M.size(); i++)
263 for (j = 0; j < mo->
len; j++)
result->array[next++] = mo->
array[j];
269std::ostringstream &
toString(std::ostringstream &o,
int len,
int *
p)
272 for (
int i = 0; i < len; i++)
281std::ostringstream &
ones(std::ostringstream &o,
int len)
284 for (
int i = 0; i < len; i++)
295 std::ostringstream o;
296 o <<
"MonomialOrder => {";
297 for (
int i = 0; i < mo->
len; i++)
299 mon_part
p = mo->
array[i];
308 o <<
"Lex => " <<
p->nvars;
311 o <<
"LexSmall => " <<
p->nvars;
314 o <<
"LexTiny => " <<
p->nvars;
321 o <<
"GRevLexSmall => ";
325 o <<
"GRevLexTiny => ";
332 o <<
"GRevLexSmall => ";
335 o <<
"GRevLexTiny => ";
338 o <<
"RevLex => " <<
p->nvars;
344 o <<
"GroupLex => " <<
p->nvars;
347 o <<
"GroupRevLex => " <<
p->nvars;
350 o <<
"NCLex => " <<
p->nvars;
353 o <<
"Position => Up";
356 o <<
"Position => Down";
381 for (i = 0; i < mo->
len; i++)
408 for (i = 0; i < mo->
len; i++)
428 return (ngrevlex == 1);
434 for (i = 0; i < mo->
len; i++)
443 if (mo->
len == 0)
return nullptr;
449 for (i = 0; i < mo->
array[0]->nvars; i++)
result->array[i] =
wts[i];
459 for (i = 0; i < mo->
len; i++)
462 sum += mo->
array[i]->nvars;
470 int i, j, sum, nextvar;
473 for (i = 0; i <
nvars; i++)
478 for (i = 0; i < mo->
len; i++)
480 mon_part
p = mo->
array[i];
494 for (j = 0; j <
p->nvars; j++, nextvar++)
495 if (gt[nextvar] == 0) gt[nextvar] = 1;
499 for (j = 0; j <
p->nvars; j++, nextvar++)
500 if (gt[nextvar] == 0) gt[nextvar] = -1;
503 for (j = nextvar; j <
p->nvars; j++)
508 else if (
p->wts[j] < 0)
519 for (i = 0; i <
nvars; i++)
522 if (gt[i] < 0) sum++;
528 for (i = 0; i <
nvars; i++)
529 if (gt[i] < 0)
result->array[nextvar++] = i;
541 else if (packing == 4)
561 for (i = 0; i < degs->len; i++)
562 if (degs->array[i] <= 0)
564 ERROR(
"grevlex: expected all degrees to be positive");
567 else if (degs->array[i] > 1)
574 else if (packing == 4)
584 else if (packing == 4)
647 int nvars_so_far = 0;
654 for (i = 0; i < M->len; i++)
657 for (j = 0; j < mo->
len; j++)
663 for (i = 0; i < M->len; i++)
666 for (j = 0; j < mo->
len; j++)
668 mon_part
p = mo->
array[j];
671 nvars_so_far +=
p->nvars;
677 for (j = 0; j < nvars_so_far; j++) q->wts[j] = 0;
678 for (; j < q->nvars; j++) q->wts[j] =
p->wts[j - nvars_so_far];
690 int i, j, sum, next, offset;
692 for (i = 0; i < M->len; i++) sum += M->array[i]->len;
697 for (i = 0; i < M->len; i++)
701 for (j = 0; j < mo->
len; j++)
result->array[next++] = mo->
array[j];
713 for (i = 0; i < len; i++)
716 snprintf(
s, N,
"%d",
p[i]);
732 for (i = 0; i < len; i++)
753 for (i = 0; i < mo->
len; i++)
755 mon_part
p = mo->
array[i];
764 snprintf(
s, N,
"Lex => %d",
p->nvars);
767 snprintf(
s, N,
"LexSmall => %d",
p->nvars);
770 snprintf(
s, N,
"LexTiny => %d",
p->nvars);
773 snprintf(
s, N,
"GRevLex => ");
777 snprintf(
s, N,
"GRevLexSmall => ");
781 snprintf(
s, N,
"GRevLexTiny => ");
785 snprintf(
s, N,
"GRevLex => ");
788 snprintf(
s, N,
"GRevLexSmall => ");
791 snprintf(
s, N,
"GRevLexTiny => ");
794 snprintf(
s, N,
"RevLex => %d",
p->nvars);
797 snprintf(
s, N,
"Weights => ");
800 snprintf(
s, N,
"GroupLex => %d",
p->nvars);
803 snprintf(
s, N,
"GroupRevLex => %d",
p->nvars);
806 snprintf(
s, N,
"NCLex => %d",
p->nvars);
809 snprintf(
s, N,
"Position => Up");
812 snprintf(
s, N,
"Position => Down");
815 snprintf(
s, N,
"UNKNOWN");
819 if (
p->wts !=
nullptr)
837 for (
int i = 0; i <
nvars; i++)
839 grading.push_back(value);
841 grading.push_back(0);
853 for (
int i = 0; i < firstvar; i++) grading.push_back(0);
855 for (
int i = 0; i < nwts; i++) grading.push_back(1);
857 for (
int i = 0; i < nwts; i++) grading.push_back(
wts[i]);
858 for (
int i = firstvar + nwts; i <
nvars; i++) grading.push_back(0);
863 std::vector<int> &mat,
864 bool &base_is_revlex,
865 int &component_direction,
866 int &component_is_before_row)
872 base_is_revlex =
true;
873 enum LastBlock { LEX, REVLEX, WEIGHTS, NONE };
874 LastBlock last = NONE;
878 component_direction = 0;
879 component_is_before_row =
881 size_t last_element = 0;
884 for (
int i = 0; i < mo.
len; i++)
893 last_element = mat.size();
894 for (
int j = 0; j <
p->nvars; j++)
899 firstvar +=
p->nvars;
907 last_element = mat.size();
908 for (
int j =
p->nvars - 1; j >= 1; --j)
913 firstvar +=
p->nvars;
921 last_element = mat.size();
922 for (
int j =
p->nvars - 1; j >= 1; --j)
927 firstvar +=
p->nvars;
932 last_element = mat.size();
933 for (
int j =
p->nvars - 1; j >= 0; --j)
938 firstvar +=
p->nvars;
947 last_element = mat.size();
956 component_direction = 1;
957 component_is_before_row = nrows;
960 component_direction = -1;
961 component_is_before_row = nrows;
971 mat.resize(last_element);
972 if (nrows == component_is_before_row) component_is_before_row = -1;
973 base_is_revlex =
false;
975 else if (last == REVLEX)
978 if (nrows == component_is_before_row) component_is_before_row = -1;
979 mat.resize(last_element);
992 std::vector<int> mat;
994 int component_is_before_row = 0;
995 int component_direction = 0;
997 *mo, mat,
base, component_direction, component_is_before_row))
999 int top =
static_cast<int>(mat.size());
1001 for (
int i = 0; i < top; i++)
result->array[i] = mat[i];
1003 result->array[top + 1] = component_direction;
1004 result->array[top + 2] = component_is_before_row;
static MonomialOrdering * GRevLex2(int nvars)
static MonomialOrdering * Weights(const std::vector< int > &wts)
static MonomialOrdering * Lex4(int nvars)
static MonomialOrdering * Lex2(int nvars)
static MonomialOrdering * PositionDown()
static MonomialOrdering * PositionUp()
static MonomialOrdering * GRevLex(int nvars)
static MonomialOrdering * GRevLex4(int nvars)
static MonomialOrdering * GroupLex(int nvars)
static MonomialOrdering * product(const std::vector< MonomialOrdering * > &M)
static MonomialOrdering * Lex(int nvars)
static MonomialOrdering * GroupRevLex(int nvars)
static MonomialOrdering * RevLex(int nvars)
static std::string toString(const MonomialOrdering *mo)
static MonomialOrdering * join(const std::vector< MonomialOrdering * > &M)
void INTERNAL_ERROR(const char *s,...)
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
static CanonicalForm base
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define getmematomicvectortype(S, len)
#define getmemarraytype(S, len)
#define getmemvectortype(S, len)
#define getmemstructtype(S)
Engine-wide GC allocator surface (getmem / getmem_atomic) and debug-allocation trap.
M2_string M2_tostring(const char *s)
M2_arrayint M2_makearrayint(int n)
M2_string M2_join(M2_string x, M2_string y)
int moIsLex(const MonomialOrdering *mo)
MonomialOrdering * rawRevLexMonomialOrdering(int nvars)
MonomialOrdering * rawNClexMonomialOrdering(int nvars)
static struct mon_part_rec_ * mo_make(enum MonomialOrdering_type type, int nvars, const int *wts)
int rawNumberOfInvertibleVariables(const MonomialOrdering *mo)
std::ostringstream & toString(std::ostringstream &o, int len, int *p)
unsigned int rawMonomialOrderingHash(const MonomialOrdering *mo)
static void write_weights(std::vector< int > &grading, int nvars, int firstvar, int *wts, int nwts)
MonomialOrdering * rawProductMonomialOrdering(engine_RawMonomialOrderingArray M)
static void write_row(std::vector< int > &grading, int nvars, int which, int value)
int moIsGRevLex(const MonomialOrdering *mo)
M2_arrayint rawNonTermOrderVariables(const MonomialOrdering *mo)
static MonomialOrdering * M2_mo_offset(const MonomialOrdering *mo, int offset)
MonomialOrdering * rawGroupLexMonomialOrdering(int nvars)
static bool is_good(mon_part p)
static MonomialOrdering * make_mon_order(int n)
MonomialOrdering * rawLexMonomialOrdering(int nvars, int packing)
M2_arrayint rawMonomialOrderingToMatrix(const struct MonomialOrdering *mo)
MonomialOrdering * rawGroupRevLexMonomialOrdering(int nvars)
M2_string IM2_MonomialOrdering_to_string(const MonomialOrdering *mo)
MonomialOrdering * rawWeightsMonomialOrdering(M2_arrayint wts)
MonomialOrdering * rawGRevLexMonomialOrdering(M2_arrayint degs, int packing)
bool monomialOrderingToMatrix(const struct MonomialOrdering &mo, std::vector< int > &mat, bool &base_is_revlex, int &component_direction, int &component_is_before_row)
M2_string ones_to_string(int len)
M2_string intarray_to_string(int len, int *p)
MonomialOrdering * rawJoinMonomialOrdering(engine_RawMonomialOrderingArray M)
MonomialOrdering * rawPositionMonomialOrdering(M2_bool up_or_down)
std::ostringstream & ones(std::ostringstream &o, int len)
int rawNumberOfVariables(const MonomialOrdering *mo)
M2_arrayint moGetWeightValues(const MonomialOrdering *mo)
Engine-boundary C API for assembling block-level MonomialOrderings from declarative pieces.
MonomialOrderings — C++ factories for the declarative MonomialOrdering blocks.
Front-end-side description of a monomial ordering as a list of mon_part blocks.
enum MonomialOrdering_type type