17template <
typename Key>
34template <
typename Key>
51template <
typename Key>
54 if (
p ==
nullptr)
return;
63template <
typename Key>
79template <
typename Key>
82 for (
typename VECTOR(
mi_node *)::const_iterator i = mis.begin();
89template <
typename Key>
96 bool one_element =
true;
108 (*p)->header = (*p)->left = (*p)->right = *
p;
110 else if ((*p)->var < insert_var)
113 mi_node *header_node, *zero_node;
117 header_node->
left = header_node->
right = zero_node;
118 (*p)->
down() = zero_node;
120 zero_node->
right = header_node;
123 if ((*p)->var > insert_var)
125 insert_var = (*p)->var;
130 insert_exp = i.exponent();
136 if (q->
exp != insert_exp)
143 insert_var, insert_exp,
static_cast<mi_node *
>(
nullptr));
149 insert_node =
new_mi_node(insert_var, insert_exp, k);
169template <
typename Key>
176 if (mi ==
nullptr)
return false;
186 if ((
p =
p->down()) ==
nullptr)
return false;
190 if (
p->exp > exp[
p->var])
192 if ((
p =
p->header->down()) ==
nullptr)
return false;
206template <
typename Key>
210 VECTOR(Key) & result_k)
const
220 if ((
p =
p->down()) ==
nullptr)
return;
224 if (
p->exp > exp[
p->var])
226 if ((
p =
p->header->down()) ==
nullptr)
return;
232 result_k.push_back(
p->key());
239template <
typename Key>
244 int nvars = topvar + 1;
245 if (*m > 0 && m[1] >= nvars) nvars =
static_cast<int>(m[1] + 1);
258 int nparts =
static_cast<int>(*m++);
259 for (
int i = nparts; i > 0; i--, m += 2)
265template <
typename Key>
269 int nparts =
static_cast<int>(*m++);
270 for (
int i = nparts; i > 0; i--, m += 2)
276template <
typename Key>
282 if (comp >= mis.size())
return false;
284 if (mi ==
nullptr)
return false;
293template <
typename Key>
297 VECTOR(Key) & result_k)
const
299 if (comp >= mis.size())
return;
301 if (mi ==
nullptr)
return;
309template <
typename Key>
316 auto comp = M->get_component(m);
317 if (comp >= mis.size())
return false;
319 if (mi ==
nullptr)
return false;
320 M->to_expvector(m,
exp0, comp);
324template <
typename Key>
328 VECTOR(Key) & result_k)
const
331 if (comp >= mis.size())
return;
333 if (mi ==
nullptr)
return;
338template <
typename Key>
344 if (comp >= mis.size())
346 for (
long j = comp - mis.size(); j >= 0; j--) mis.push_back(
nullptr);
351template <
typename Key>
364template <
typename Key>
379template <
typename Key>
399template <
typename Key>
406 assert(
p->left != NULL);
407 assert(
p->right != NULL);
408 assert(
p->left->right ==
p);
409 assert(
p->right->left ==
p);
412 for (i = 1; i <=
indent; i++) o <<
' ';
413 o <<
p->var <<
' ' <<
p->exp;
418 if (disp) o <<
' ' <<
p->key();
420 else if (
p ==
p->header)
427template <
typename Key>
445template <
typename Key>
453 for (
typename VECTOR(
mi_node *)::const_iterator i = mis.begin();
456 if (*i != NULL)
do_tree(*i, 0, 0, disp);
465template <
typename Key>
478 if (up !=
nullptr) assert(
p->var < up->var);
479 assert(
p->header ==
p);
481 assert(
p->down() == up);
482 assert(
p->left != NULL);
483 assert(
p->right != NULL);
487 for (q =
p->left; q !=
p; q = q->
left)
489 assert(q->
left != NULL);
490 assert(q->
right != NULL);
494 assert(q->
var ==
p->var);
501 for (q =
p->right; q !=
p; q = q->
right)
509template <
typename Key>
513 for (
typename VECTOR(
mi_node *)::const_iterator i = mis.begin();
517 if (*i != NULL) nfound +=
debug_check(*i,
nullptr);
519 assert(
count / 2 == nfound);
522template <
typename Key>
525 o <<
"ResF4MonomialLookupTableT (";
526 o <<
count / 2 <<
" entries)\n";
528 for (
typename VECTOR(
mi_node *)::const_iterator i = mis.begin();
534 if ((++a) % 15 == 0) o <<
newline;
535 o <<
p->key() <<
" ";
542 VECTOR(
int) & result_minimals,
546 for (
int j = 0; j < elems.size(); j++)
549 if (d >= bins.size())
550 for (
int i =
INTSIZE(bins); i <= d; i++) bins.push_back(
nullptr);
551 if (bins[d] ==
nullptr) bins[d] =
new VECTOR(
int);
552 bins[d]->push_back(j);
558 for (
int i = 0; i < bins.size(); i++)
559 if (bins[i] !=
nullptr)
561 for (
VECTOR(
int)::iterator j = bins[i]->
begin(); j != bins[i]->end();
568 result_minimals.push_back(*j);
Append-only GC-backed byte buffer used throughout the engine for text output.
static Exponent simple_degree(ConstExponents m)
void insert_minimal_vp(long comp, const_varpower_monomial m, Key k)
res_const_ntuple_monomial const_ntuple_monomial
res_ntuple_word ntuple_word
void do_node(mi_node *p, int indent, int disp) const
void debug_out(int disp=1) const
int debug_check(mi_node *p, const mi_node *up) const
void reset_expvector(const_varpower_monomial m)
void update_expvector(int topvar, const_varpower_monomial m)
void do_tree(mi_node *p, int depth, int indent, int disp) const
void text_out(buffer &o) const
mi_node * prev(mi_node *p) const
mi_node * next(mi_node *p) const
bool find_one_divisor_packed(const ResMonoid *M, const_packed_monomial m, Key &result_k) const
void find_all_divisors_vp(long comp, const_varpower_monomial m, VECTOR(Key) &result_k) const
res_const_packed_monomial const_packed_monomial
void find_all_divisors_packed(const ResMonoid *M, const_packed_monomial m, VECTOR(Key) &result_k) const
ResF4MonomialLookupTableT(int nvars, stash *mi_stash=nullptr)
bool insert_vp(long comp, const_varpower_monomial m, Key &k)
~ResF4MonomialLookupTableT()
void delete_mi_node(mi_node *p)
bool find_one_divisor1(mi_node *mi, const_ntuple_monomial exp, Key &result_k) const
res_const_varpower_monomial const_varpower_monomial
void find_all_divisors1(mi_node *mi, const_ntuple_monomial exp, VECTOR(Key) &result_k) const
bool find_one_divisor_vp(long comp, const_varpower_monomial m, Key &result_k) const
res_varpower_word varpower_word
mi_node * new_mi_node(varpower_word v, varpower_word e, mi_node *d)
void insert1(mi_node *&p, const_varpower_monomial m, Key k)
component_index get_component(res_const_packed_monomial m) const
bool to_expvector(res_const_packed_monomial m, res_ntuple_monomial result, component_index &result_comp) const
VALGRIND_MAKE_MEM_DEFINED & result(result)
Engine-to-interpreter type vocabulary across the C++ / .dd boundary.
stash and doubling_stash — legacy size-class allocator interfaces, now stubbed to plain GC allocation...
#define newarray_atomic_clear(T, len)
void minimalize_res_varpower_monomials(const VECTOR(res_varpower_monomial) &elems, VECTOR(int) &result_minimals, stash *mi_stash)
ResF4MonomialLookupTableT<Key> — tree-structured leading-term index for the F4 resolution.
ExponentListIterator< myword, false > index_res_varpower_monomial
res_varpower_word * res_varpower_monomial
res_varpower_monomials::Exponent res_varpower_word
Typed-monomial vocabulary shared by ResMonoid, ResPolyRing, SchreyerFrame, and F4Res.
TermIterator< Nterm > begin(Nterm *ptr)
enum ResF4MonomialLookupTableT::mi_node::@025031101115250154050127052044034126032125025377 tag
void insert_to_left(mi_node *q)
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
void emit_line(const char *s)
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.