8#include <gc/gc_allocator.h>
26 , mScheduler(scheduler)
45 int deg =
p->deg1 +
gb[me]->deg;
51 result.lcm = allocRange.first;
53 M->from_varpower_monomial(
p->quot, 0,
result.lcm);
56 mSPairLCMs.shrinkLastAllocate(allocRange.first,
58 allocRange.first +
M->monomial_size(
result.lcm));
60 auto sPairIndex =
mSPairs.size();
72 result.lcm = allocRange.first;
76 auto sPairIndex =
mSPairs.size();
85 if (
M->get_component(
p->lcm) !=
M->get_component(m->
f.
monoms))
return false;
86 return M->unnecessary(
97 if (
gb.size() == 0)
return 0;
103 mScheduler.execute([&] {
105 [&](
const mtbb::blocked_range<int>& r)
107 for (
auto i = r.begin(); i != r.end(); ++i)
185 fprintf(stderr,
"[%d %d deg %d lcm ",
p->i,
p->j,
p->deg);
187 fprintf(stderr,
"\n");
191 fprintf(stderr,
"unknown type\n");
227 M->quotient_as_vp(
gb[j]->f.monoms,
228 gb[
gb.size() - 1]->f.monoms,
240 if (d >= bins.size()) bins.resize(d + 1);
241 bins[d].push_back(
p);
248 if (
gb.size() == 0)
return 0;
253 int me_component =
static_cast<int>(
M->get_component(me->
f.
monoms));
255 std::vector<std::vector<pre_spair *>> bins;
257 mtbb::tick_count t0 {mtbb::tick_count::now()};
260 for (
int i = 0; i <
gb.size() - 1; i++)
263 if (me_component !=
M->get_component(
gb[i]->f.monoms))
continue;
268 mtbb::tick_count t1 {mtbb::tick_count::now()};
278 for (
int i = 0; i < bins.size(); i++)
280 if (bins[i].size() == 0)
continue;
283 std::stable_sort(bins[i].
begin(), bins[i].
end(), C);
286 auto first = bins[i].begin();
288 auto end = bins[i].end();
289 for (; first !=
end; first = next)
317 mtbb::tick_count t2 {mtbb::tick_count::now()};
325class TestPairQueueConfiguration
331 TestPairQueueConfiguration(
const gb_array&
gb,
334 using PairData = MonomialInfo::OrderedMonomial;
335 void computePairData(
341 using CompareResult =
bool;
345 MonomialInfo::ConstOrderedMonomial a,
348 MonomialInfo::ConstOrderedMonomial b)
const
351 const auto cmp = orderMonoid().compare(*a, *b);
357 const bool aRetired = mBasis.retired(rowA) || mBasis.retired(colA);
358 const bool bRetired = mBasis.retired(rowB) || mBasis.retired(colB);
359 if (aRetired || bRetired)
362 if (mPreferSparseSPairs) {
363 const auto termCountA =
364 mBasis.basisElement(colA).termCount() +
365 mBasis.basisElement(rowA).termCount();
366 const auto termCountB =
367 mBasis.basisElement(colB).termCount() +
368 mBasis.basisElement(rowB).termCount();
369 if (termCountA > termCountB)
371 if (termCountA < termCountB)
374 return colA + rowA > colB + rowB;
377 bool cmpLessThan(
bool v)
const {
return v;}
383 mathic::PairQueue<TestPairQueueConfiguration> mPairQueue;
386 TestSPairs(gb_poly& currentGroebnerBasis);
static const Exponent length(ConstExponents m)
static bool is_equal(ConstExponents a, ConstExponents b)
void insert_minimal_vp(long comp, const_varpower_monomial m, Key k)
bool find_one_divisor_vp(long comp, const_varpower_monomial m, Key &result_k) const
int construct_pairs(bool remove_disjoints)
std::pair< bool, spair > get_next_pair()
std::pair< bool, int > setThisDegree()
int remove_unneeded_pairs()
void delete_spair(spair *p)
void insert_generator(int deg, packed_monomial lcm, int column)
std::vector< spair > mSPairs
void discardSPairsInCurrentDegree()
SPairCompare mSPairCompare
void display_spair(spair *p)
void insert_spair(pre_spair *p, int me)
F4SPairSet(const MonomialInfo *MI0, const gb_array &gb0)
F4MemoryBlock< varpower_word > VP
bool pair_not_needed(spair *p, gbelem *m)
double mMinimizePairsSeconds
F4MemoryBlock< pre_spair > PS
std::priority_queue< size_t, std::vector< size_t >, SPairCompare > mSPairQueue
int find_new_pairs(bool remove_disjoints)
pre_spair * create_pre_spair(int i)
Per-ring monomial layout / encoding helper used by F4GB.
Comparator that orders pre_spair* pointers by the quot varpower monomial of each pre-S-pair.
void insert_pre_spair(std::vector< std::vector< pre_spair * > > &bins, pre_spair *p)
F4SPairSet — priority-queue + pruning logic for F4 S-pairs.
F4MonomialLookupTableT< int32_t > MonomialLookupTable
std::vector< gbelem * > gb_array
void gb(IntermediateBasis &F, int n)
static unsigned long nsaved_unneeded
static int compare(const vecterm *t, const vecterm *s)
VALGRIND_MAKE_MEM_DEFINED & result(result)
stash and doubling_stash — legacy size-class allocator interfaces, now stubbed to plain GC allocation...
monomial_word * packed_monomial
TermIterator< Nterm > begin(Nterm *ptr)
TermIterator< Nterm > end(Nterm *)
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
double seconds(DurationType time_diff)