Macaulay2 Engine
Loading...
Searching...
No Matches

◆ create() [2/3]

SchreyerOrder * SchreyerOrder::create ( const Matrix * m)
static

Definition at line 29 of file schorder.cpp.

30{
31 int i;
32 const Ring *R = m->get_ring();
33 const SchreyerOrder *S = m->rows()->get_schreyer_order();
34 const PolynomialRing *P = R->cast_to_PolynomialRing();
35 if (P == nullptr)
36 {
37 throw exc::engine_error("expected polynomial ring");
38 }
39 const Monoid *M = P->getMonoid();
41 int rk = m->n_cols();
42 if (rk == 0) return result;
43 monomial base = M->make_one();
44 int *tiebreaks = newarray_atomic(int, rk);
45 int *ties = newarray_atomic(int, rk);
46 for (i = 0; i < rk; i++)
47 {
48 vec v = (*m)[i];
49 if (v == nullptr || S == nullptr)
50 tiebreaks[i] = i;
51 else
52 tiebreaks[i] = i + rk * S->compare_num(v->comp);
53 }
54 // Now sort tiebreaks in increasing order.
55 std::sort<int *>(tiebreaks, tiebreaks + rk);
56 for (i = 0; i < rk; i++) ties[tiebreaks[i] % rk] = i;
57 for (i = 0; i < rk; i++)
58 {
59 vec v = (*m)[i];
60 if (v == nullptr)
61 M->one(base);
62 else if (S == nullptr)
63 M->copy(P->lead_flat_monomial(v->coeff), base);
64 else
65 {
66 int x = v->comp;
67 M->mult(P->lead_flat_monomial(v->coeff), S->base_monom(x), base);
68 }
69
70 result->append(ties[i], base);
71 }
72
74 M->remove(base);
75 freemem(tiebreaks);
76 freemem(ties);
77 return result;
78}
const SchreyerOrder * get_schreyer_order() const
Definition freemod.hpp:103
const Ring * get_ring() const
Definition matrix.hpp:134
int n_cols() const
Definition matrix.hpp:147
const FreeModule * rows() const
Definition matrix.hpp:144
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual const_monomial lead_flat_monomial(const ring_elem f) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
const Monoid * M
Definition schorder.hpp:69
SchreyerOrder(const Monoid *m)
Definition schorder.hpp:77
int compare_num(int i) const
Definition schorder.hpp:90
const_monomial base_monom(int i) const
Definition schorder.hpp:91
static CanonicalForm base
Definition factory.cpp:289
void intern_SchreyerOrder(SchreyerOrder *G)
Definition finalize.cpp:171
#define monomial
Definition gb-toric.cpp:11
void freemem(void *s)
Definition m2-mem.cpp:103
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
volatile int x

References base, base_monom(), Ring::cast_to_PolynomialRing(), compare_num(), freemem(), Matrix::get_ring(), FreeModule::get_schreyer_order(), PolynomialRing::getMonoid(), intern_SchreyerOrder(), PolynomialRing::lead_flat_monomial(), M, Matrix, monomial, Matrix::n_cols(), newarray_atomic, result(), Matrix::rows(), SchreyerOrder(), and x.