28 ERROR(
"ring is not a polynomial ring");
35 M =
GR->get_flattened_monoid();
36 K =
GR->get_flattened_coefficients();
42 gb->next_min =
nullptr;
59 for (i = 0; i <
F->rank(); i++) monideals.push_back(
new MonomialIdeal(R));
69 set_up0(m, csyz, nsyz, gb_weights);
95 for (
int i = hi; i >= lo; i--)
100 if (
p !=
nullptr)
spairs->insert(
p);
111 int max_degree_limit)
113 (void) use_max_degree_limit;
114 (void) max_degree_limit;
118 ERROR(
"expected polynomial ring over a field");
132 set_up(m, csyz, nsyz, gb_weights, strat);
137 GR->gbvector_remove(
p->f);
138 GR->gbvector_remove(
p->fsyz);
178 result->lcm =
M->make_new(lcm);
197 result->lcm =
M->make_new(lcm);
206 fsyz =
GR->gbvector_term(
Fsyz, denom, i + 1);
208 fsyz =
GR->gbvector_zero();
210 if (
GR->gbvector_is_zero(f))
212 if (!
GR->gbvector_is_zero(fsyz))
214 vec fsyzvec =
originalR->translate_gbvector_to_vec(
Fsyz, fsyz);
239 for (r =
p->pair_list; r !=
nullptr; r = r->
next_same)
248 o <<
"---- removed pair ";
266 o <<
"---- removed pair ";
285 int nvars =
M->n_vars();
294 GR->gbvector_get_lead_monomial(
F,
p->f, f_m);
295 if (
GR->is_skew_commutative())
298 M->to_expvector(f_m, find_pairs_exp);
300 for (
int v = 0; v <
GR->n_skew_commutative_vars(); v++)
302 int w =
GR->skew_variable(v);
303 if (find_pairs_exp[w] == 0)
continue;
306 M->from_expvector(find_pairs_exp, find_pairs_lcm);
310 M->to_varpower(find_pairs_lcm, vplcm);
312 elems.push_back(
new Bag(q2, vplcm));
319#warning "quotient ring stuff"
323 for (
int i = 0; i <
originalR->n_quotients(); i++)
326 M->lcm(f->
monom, f_m, find_pairs_lcm);
328 M->to_varpower(find_pairs_lcm, vplcm);
330 elems.push_back(
new Bag(q2, vplcm));
335 for (
gb_elem *
s =
gb->next_min;
s !=
nullptr;
s =
s->next_min)
337 if (
p->f->comp !=
s->f->comp)
continue;
339 GR->gbvector_get_lead_monomial(
F,
s->f, f_m2);
340 M->lcm(f_m, f_m2, find_pairs_lcm);
343 M->to_varpower(find_pairs_lcm, vplcm);
345 elems.push_back(
new Bag(q, vplcm));
352 for (
auto& b : rejects)
354 s_pair *q2 =
reinterpret_cast<s_pair *
>(b->basis_ptr());
365 q =
reinterpret_cast<s_pair *
>(a.basis_ptr());
372 if (
M->is_one(find_pairs_mon))
388 nextsame->
next =
nullptr;
389 p->pair_list = head.
next;
390 spairs->sort_list(
p->pair_list);
394 for (q =
p->pair_list; q !=
nullptr; q = q->
next)
403 spairs->insert(
p->pair_list, len);
411 for (
s_pair *s1 =
p->pair_list; s1 !=
nullptr; s1 = s1->next_same)
415 GR->gbvector_get_lead_monomial(
F, s1->second->f, f_m);
417 M->divide(s1->lcm, f_m, pi);
422 GR->gbvector_get_lead_monomial(
F, t1->second->f, f_m);
423 M->divide(t1->lcm, f_m, pj);
440 M->remove(find_pairs_mon);
450 M->divide(
p->lcm,
p->first->f->monom,
s);
452 GR->gbvector_mult_by_term(
453 F,
Fsyz,
GR->one(),
s,
p->first->f,
p->first->fsyz,
p->f,
p->fsyz);
455 GR->gbvector_reduce_lead_term(
456 F,
Fsyz,
nullptr,
p->f,
p->fsyz,
p->second->f,
p->second->fsyz);
475 GR->gbvector_text_out(o,
F, f);
480 GR->gbvector_get_lead_exponents(
F, f, div_totalexp);
482#warning "quotient ring stuff"
486 originalR->get_quotient_monomials()->search_expvector(div_totalexp,
490 GR->gbvector_reduce_lead_term(
F,
Fsyz, head.
next, f, fsyz, g,
nullptr);
495 GR->gbvector_reduce_lead_term(
537 GR->gbvector_get_lead_exponents(
F, lead, div_totalexp);
539#warning "quotient ring stuff"
543 originalR->get_quotient_monomials()->search_expvector(div_totalexp,
547 GR->reduce_lead_term_heap(
F,
560 GR->reduce_lead_term_heap(
561 F,
Fsyz, lead, div_totalexp, head.
next, fb, fsyzb, q->
f, q->
fsyz);
580 fsyz = fsyzb.
value();
587 int cmp =
M->compare(
p->f->monom, q->
f->
monom);
588 if (cmp == -1)
return LT;
589 if (cmp == 1)
return GT;
590 cmp =
p->f->comp - q->
f->
comp;
591 if (cmp < 0)
return LT;
592 if (cmp > 0)
return GT;
597 int nvars =
M->n_vars();
601 if (
p->f->comp != comp)
continue;
604 for (
int i = 0; i < nvars; i++)
605 if (exp2[i] > exp[i])
626 GR->gbvector_get_lead_monomial(
F,
p->f, f_m);
627 GR->gbvector_remove_content(
p->f,
p->fsyz);
629 M->to_expvector(f_m,
p->lead_exp);
687 o <<
"--- computing pair ";
693 int compute_pair = (
p->compare_num >= 0);
704 if (
p->first !=
nullptr)
707 assert(
p->first->pair_list ==
p);
708 p->first->pair_list =
p->next_same;
714 if (!
GR->gbvector_is_zero(f))
721 GR->gbvector_text_out(o,
F, f);
726 if (!
GR->gbvector_is_zero(fsyz))
732 GR->gbvector_text_out(o,
Fsyz, fsyz);
737 vec fsyzvec =
originalR->translate_gbvector_to_vec(
Fsyz, fsyz);
743 GR->gbvector_remove(fsyz);
753 if (
stop_.basis_element_limit > 0 &&
n_gb >=
stop_.basis_element_limit)
825 o <<
"Number of gb elements = " <<
n_gb <<
newline;
843 for (
gb_elem *q =
gb->next_min; q !=
nullptr; q = q->next_min)
863 const Matrix **result_remainder,
864 const Matrix **result_quotient)
867 return minimal_gb->matrix_lift(m, result_remainder, result_quotient);
901 for (
gb_elem *q =
gb->next; q !=
nullptr; q = q->next)
916 return minimal_gb->get_parallel_lead_terms(w);
936 "this is not correct: this grabs the vectors, and so can't be called twice"
938 return syz.to_matrix();
950 if (q ==
nullptr)
return;
953 if (q->
first !=
nullptr)
963 if (q->
first !=
nullptr)
966 M->elem_text_out(o, m);
972 M->elem_text_out(o, m);
975 M->elem_text_out(o, q->
lcm);
991 for (q =
p->pair_list; q !=
nullptr; q = q->
next_same)
1011 for (
int i = 0; i <
NHEAP; i++)
1014 if (q ==
nullptr)
continue;
1015 o <<
"---- pairs in bin " << i <<
" -----" <<
newline;
1017 for (; q !=
nullptr; q = q->
next)
1021 if (n % 10 == 0) o <<
newline;
1033 for (
gb_elem *q =
gb->next_min; q !=
nullptr; q = q->next_min)
1037 GR->gbvector_text_out(o,
F, q->f);
exponents::Exponents exponents_t
enum ComputationStatusCode set_status(enum ComputationStatusCode)
FreeModule * sub_space(int n) const
Heuristic-weight evaluator for gbvectors, used during Groebner basis computation to drive the S-pair ...
void find_pairs(gb_elem *p)
void inter_reduce(gb_elem *&gens)
void add_gens(int lo, int hi, const Matrix *m)
virtual const Matrix * get_syzygies()
int compare(const gb_elem *p, const gb_elem *q) const
virtual M2_bool matrix_lift(const Matrix *m, const Matrix **result_remainder, const Matrix **result_quotient)
int mark_pair(gb_elem *p, gb_elem *q) const
virtual const Matrix * matrix_remainder(const Matrix *m)
virtual int contains(const Matrix *m)
void gb_insert(gbvector *f, gbvector *fsyz, int minlevel)
virtual void text_out(buffer &o) const
virtual int complete_thru_degree() const
void compute_s_pair(s_pair *p)
s_pair * new_ring_pair(gb_elem *p, const int *lcm)
virtual const Matrix * get_initial(int nparts)
void debug_pairs_out(gb_elem *p) const
int gb_geo_reduce(gbvector *&f, gbvector *&fsyz)
int gb_reduce(gbvector *&f, gbvector *&fsyz)
static GBinhom_comp * create(const Matrix *m, M2_bool collect_syz, int n_rows_to_keep, M2_arrayint gb_weights, int strategy, M2_bool use_max_degree, int max_degree)
GBinhom_comp(const Matrix *m, int collect_syz, int n_syz, M2_arrayint gb_weights, int strategy)
virtual const Matrix * get_parallel_lead_terms(M2_arrayint w)
void set_up(const Matrix *m, int csyz, int nsyz, M2_arrayint gb_weights, int strategy)
virtual const Matrix * get_change()
void remove_pair(s_pair *&p)
s_pair * new_s_pair(gb_elem *p, gb_elem *q, const int *lcm)
virtual const Matrix * get_gb()
s_pair * new_var_pair(gb_elem *p, const int *lcm)
int search(const int *exp, int comp, gb_elem *&result)
virtual const Matrix * get_mingens()
void debug_out(s_pair *q) const
ComputationStatusCode computation_complete() const
int s_pair_step(s_pair *p)
void set_up0(const Matrix *m, int csyz, int nsyz, M2_arrayint gb_weights)
const PolynomialRing * originalR
s_pair * new_gen(int i, gbvector *f, ring_elem denom)
const Ring * get_ring() const
const FreeModule * rows() const
const FreeModule * cols() const
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
virtual GBRing * get_gb_ring() const
virtual const Ring * getCoefficients() const
Abstract base for the engine's polynomial-ring hierarchy.
static ReducedGB * create(const PolynomialRing *originalR0, const FreeModule *F0, const FreeModule *Fsyz0, const GBWeight *wt0=nullptr)
virtual bool is_ZZ() const
virtual const PolynomialRing * cast_to_PolynomialRing() const
gbvector * remove_lead_term()
const gbvector * get_lead_term()
@ STRATEGY_LONGPOLYNOMIALS
@ COMP_DONE_SUBRING_LIMIT
static const int MINGB_MASK
static const int MINGEN_MASK
GBinhom_comp — Buchberger GB without the sugar heuristic, primarily for inhomogeneous input.
GBWeight — packed-weight evaluator that drives S-pair selection.
bool system_interrupted()
system_interrupted() — thread-safe polling predicate for Ctrl+C handling.
VALGRIND_MAKE_MEM_DEFINED & result(result)
MatrixConstructor — the mutable builder that produces an immutable Matrix.
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)
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
void emit_wrapped(const char *s)
void emit_line(const char *s)
Text-formatting helpers layered on buffer: bignum print, line wrapping, M2_gbTrace-gated emit.