580{
581 bool onlyConstantMaps = false;
582 std::vector<bool> track(
mReducers.size());
583
584 if (onlyConstantMaps)
585 {
586 for (
auto i = 0; i <
mReducers.size(); i++)
587 {
592 }
593 }
594
595#if defined(WITH_TBB)
596
597 using threadLocalDense_t = mtbb::enumerable_thread_specific<ElementArray>;
598
599 threadLocalDense_t threadLocalDense([&]() {
601 });
602
603
604
605
606
607
608
609
610
611
612
613 mFrame.getScheduler().execute([
this,&onlyConstantMaps,&track,&threadLocalDense] {
614
615 mtbb::parallel_for(mtbb::blocked_range<int>{0,(int)
mSPairs.size()},
616 [&](const mtbb::blocked_range<int>& r)
617 {
618
619 threadLocalDense_t::reference my_dense = threadLocalDense.local();
620 for (auto i = r.begin(); i != r.end(); ++i) {
622 }
623 });
624 });
625
626 for (auto tlDense : threadLocalDense)
627 mRing.vectorArithmetic().deallocateElementArray(tlDense);
628#else
629
630 ElementArray gauss_row =
mRing.vectorArithmetic().allocateElementArray(
632 for (
long i = 0; i <
mSPairs.size(); i++)
633 {
635 }
636 mRing.vectorArithmetic().deallocateElementArray(gauss_row);
637#endif
638}
const ResMonoid & monoid() const
std::vector< res_packed_monomial > mColumns
std::vector< Row > mReducers
void gaussReduceRow(int index, ElementArray &dense, bool onlyConstantMaps, const std::vector< bool > &track)
const ResPolyRing & mRing
std::vector< Row > mSPairs
bool is_divisible_by_var_in_range(res_const_packed_monomial monom, int lo, int hi) const