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

◆ find_pairs()

void GBinhom_comp::find_pairs ( gb_elem * p)
private

Definition at line 277 of file gb-sugarless.cpp.

281{
282 gc_vector<Bag*> elems;
283 gc_vector<int> vplcm;
284 s_pair *q;
285 int nvars = M->n_vars();
286 monomial f_m = M->make_one();
287 monomial f_m2 = M->make_one();
288 int *find_pairs_lcm = newarray_atomic(int, nvars);
289 monomial find_pairs_mon = M->make_one();
290 int *pi = newarray_atomic(int, nvars);
291 int *pj = newarray_atomic(int, nvars);
292 int *pij = newarray_atomic(int, nvars);
293
294 GR->gbvector_get_lead_monomial(F, p->f, f_m);
295 if (GR->is_skew_commutative())
296 {
297 exponents_t find_pairs_exp = newarray_atomic(int, nvars);
298 M->to_expvector(f_m, find_pairs_exp);
299
300 for (int v = 0; v < GR->n_skew_commutative_vars(); v++)
301 {
302 int w = GR->skew_variable(v);
303 if (find_pairs_exp[w] == 0) continue;
304
305 find_pairs_exp[w]++;
306 M->from_expvector(find_pairs_exp, find_pairs_lcm);
307 find_pairs_exp[w]--;
308
309 vplcm.resize(0);
310 M->to_varpower(find_pairs_lcm, vplcm);
311 s_pair *q2 = new_var_pair(p, find_pairs_lcm);
312 elems.push_back(new Bag(q2, vplcm));
313 }
314 freemem(find_pairs_exp);
315 }
316
317// Add in syzygies arising from a base ring
318#ifdef DEVELOPMENT
319#warning "quotient ring stuff"
320#endif
321 if (originalR->is_quotient_ring())
322 {
323 for (int i = 0; i < originalR->n_quotients(); i++)
324 {
325 const gbvector *f = originalR->quotient_gbvector(i);
326 M->lcm(f->monom, f_m, find_pairs_lcm);
327 vplcm.resize(0);
328 M->to_varpower(find_pairs_lcm, vplcm);
329 s_pair *q2 = new_ring_pair(p, find_pairs_lcm);
330 elems.push_back(new Bag(q2, vplcm));
331 }
332 }
333
334 // Add in syzygies arising as s-pairs
335 for (gb_elem *s = gb->next_min; s != nullptr; s = s->next_min)
336 {
337 if (p->f->comp != s->f->comp) continue;
338
339 GR->gbvector_get_lead_monomial(F, s->f, f_m2);
340 M->lcm(f_m, f_m2, find_pairs_lcm);
341
342 vplcm.resize(0);
343 M->to_varpower(find_pairs_lcm, vplcm);
344 q = new_s_pair(p, s, find_pairs_lcm);
345 elems.push_back(new Bag(q, vplcm));
346 }
347
348 // Now minimalize these elements, and insert the minimal ones
349
350 VECTOR(Bag *) rejects;
351 MonomialIdeal mi(originalR, elems, rejects);
352 for (auto& b : rejects)
353 {
354 s_pair *q2 = reinterpret_cast<s_pair *>(b->basis_ptr());
355 remove_pair(q2);
356 delete b;
357 }
358
359 s_pair head;
360 s_pair *nextsame = &head;
361 int len = 0;
362
363 for (Bag& a : mi)
364 {
365 q = reinterpret_cast<s_pair *>(a.basis_ptr());
366 nextsame->next = q;
367 nextsame = q;
368 len++;
369 if (is_ideal && q->syz_type == SPAIR_PAIR)
370 {
371 M->gcd(q->first->f->monom, q->second->f->monom, find_pairs_mon);
372 if (M->is_one(find_pairs_mon))
373 {
374 n_saved_gcd++;
375 q->compare_num = -1; // MES: change name of field!!
376 // This means: don't compute spair.
377 if (M2_gbTrace >= 8)
378 {
379 buffer o;
380 o << "removed pair[" << q->first->me << " " << q->second->me
381 << "]";
382 emit_line(o.str());
383 }
384 }
385 }
386 }
387 n_pairs += len;
388 nextsame->next = nullptr;
389 p->pair_list = head.next;
390 spairs->sort_list(p->pair_list);
391 if (M2_gbTrace >= 8)
392 {
393 buffer o;
394 for (q = p->pair_list; q != nullptr; q = q->next)
395 {
396 o << "insert ";
397 debug_out(o, q);
398 o << newline;
399 }
400 emit(o.str());
401 }
402 for (q = p->pair_list; q != nullptr; q = q->next) q->next_same = q->next;
403 spairs->insert(p->pair_list, len);
404
405 // remove those pairs (i,j) for which gcd(p:i, p:j) = 1
406 // and for which (p,i), (p,j) are both in the previous list of add-ons.
407 // MES: this does not catch all of the un-necessary pairs...
408 // Also much optimization might be able to be done, as far as removing
409 // keeping the 'correct' minimal generator of the lcms.
410
411 for (s_pair *s1 = p->pair_list; s1 != nullptr; s1 = s1->next_same)
412 {
413 if (s1->syz_type != SPAIR_PAIR) continue;
414
415 GR->gbvector_get_lead_monomial(F, s1->second->f, f_m);
416
417 M->divide(s1->lcm, f_m, pi);
418
419 for (s_pair *t1 = s1->next_same; t1 != nullptr; t1 = t1->next_same)
420 {
421 if (t1->syz_type != SPAIR_PAIR) continue;
422 GR->gbvector_get_lead_monomial(F, t1->second->f, f_m);
423 M->divide(t1->lcm, f_m, pj);
424 M->gcd(pi, pj, pij);
425 if (M->is_one(pij))
426 {
427 if (mark_pair(s1->second, t1->second))
428 {
429 n_saved_lcm++;
430 }
431 }
432 }
433 }
434
435 // Remove the local variables
436 freemem(find_pairs_lcm);
437 freemem(pi);
438 freemem(pj);
439 freemem(pij);
440 M->remove(find_pairs_mon);
441 M->remove(f_m);
442 M->remove(f_m2);
443}
exponents::Exponents exponents_t
int mark_pair(gb_elem *p, gb_elem *q) const
const FreeModule * F
s_pair * new_ring_pair(gb_elem *p, const int *lcm)
s_pair_heap * spairs
void remove_pair(s_pair *&p)
s_pair * new_s_pair(gb_elem *p, gb_elem *q, const int *lcm)
const Monoid * M
s_pair * new_var_pair(gb_elem *p, const int *lcm)
void debug_out(s_pair *q) const
const PolynomialRing * originalR
char * str()
Definition buffer.hpp:72
const int SPAIR_PAIR
Definition comp-gb.hpp:56
#define monomial
Definition gb-toric.cpp:11
int p
int_bag Bag
Definition int-bag.hpp:70
void freemem(void *s)
Definition m2-mem.cpp:103
void size_t s
Definition m2-mem.cpp:271
char newline[]
Definition m2-types.cpp:49
int M2_gbTrace
Definition m2-types.cpp:52
typename std::vector< T, gc_allocator< T > > gc_vector
a version of the STL vector, which allocates its backing memory with gc.
Definition newdelete.hpp:76
#define VECTOR(T)
Definition newdelete.hpp:78
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
gbvector * f
Definition spair.hpp:58
int me
Definition spair.hpp:62
int monom[1]
Definition gbring.hpp:83
gb_elem * second
Definition spair.hpp:97
int syz_type
Definition spair.hpp:92
s_pair * next
Definition spair.hpp:90
gb_elem * first
Definition spair.hpp:96
int compare_num
Definition spair.hpp:93
s_pair * next_same
Definition spair.hpp:91
void emit_line(const char *s)
Definition text-io.cpp:47
void emit(const char *s)
Definition text-io.cpp:41

References s_pair::compare_num, debug_out(), emit(), emit_line(), F, gb_elem::f, s_pair::first, freemem(), gb, GR, is_ideal, M, M2_gbTrace, mark_pair(), gb_elem::me, gbvector::monom, monomial, n_pairs, n_saved_gcd, n_saved_lcm, new_ring_pair(), new_s_pair(), new_var_pair(), newarray_atomic, newline, s_pair::next, s_pair::next_same, originalR, p, remove_pair(), s, s_pair::second, SPAIR_PAIR, spairs, buffer::str(), s_pair::syz_type, and VECTOR.

Referenced by gb_insert().