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

◆ create() [1/3]

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

Definition at line 80 of file schorder.cpp.

81{
82#ifdef DEVELOPMENT
83#warning "the logic in SchreyerOrder creation is WRONG!"
84#endif
85 int i;
86 const FreeModule *F = m->get_free_module();
87 const Ring *R = F->get_ring();
88 const SchreyerOrder *S = F->get_schreyer_order();
89 const PolynomialRing *P = R->cast_to_PolynomialRing();
90 const Monoid *M = P->getMonoid();
92 int rk = INTSIZE(m->elems);
93 if (rk == 0) return result;
94
95 monomial base = M->make_one();
96 int *tiebreaks = newarray_atomic(int, rk);
97 int *ties = newarray_atomic(int, rk);
98 for (i = 0; i < rk; i++)
99 {
100 gbvector *v = m->elems[i];
101 if (v == nullptr || S == nullptr)
102 tiebreaks[i] = i;
103 else
104 tiebreaks[i] = i + rk * S->compare_num(v->comp - 1);
105 }
106 // Now sort tiebreaks in increasing order.
107 std::sort<int *>(tiebreaks, tiebreaks + rk);
108 for (i = 0; i < rk; i++) ties[tiebreaks[i] % rk] = i;
109 for (i = 0; i < rk; i++)
110 {
111 gbvector *v = m->elems[i];
112 if (v == nullptr)
113 M->one(base);
114 else // if (S == NULL)
115 M->copy(v->monom, base);
116#ifdef DEVELOPMENT
117#warning "Schreyer unencoded case not handled here"
118#endif
119#if 0
120// else
121// M->mult(v->monom, S->base_monom(i), base);
122#endif
123 result->append(ties[i], base);
124 }
125
127 M->remove(base);
128 freemem(tiebreaks);
129 freemem(ties);
130 return result;
131}
const Ring * get_ring() const
Definition freemod.hpp:102
const SchreyerOrder * get_schreyer_order() const
Definition freemod.hpp:103
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
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
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
const FreeModule * get_free_module() const
Definition Eschreyer.hpp:61
gc_vector< gbvector * > elems
Definition Eschreyer.hpp:56
int monom[1]
Definition gbring.hpp:83
int comp
Definition gbring.hpp:82
#define INTSIZE(a)
Definition style.hpp:37

References base, Ring::cast_to_PolynomialRing(), gbvector::comp, compare_num(), GBMatrix::elems, freemem(), GBMatrix::get_free_module(), FreeModule::get_ring(), FreeModule::get_schreyer_order(), PolynomialRing::getMonoid(), intern_SchreyerOrder(), INTSIZE, M, gbvector::monom, monomial, newarray_atomic, result(), and SchreyerOrder().