26 typedef SchreyerFrameTypes::PreElement* value;
35 if (a->degree > b->degree)
return GT;
36 if (a->degree < b->degree)
return LT;
40 bool operator()(value a, value b)
43 if (a->degree > b->degree)
return false;
44 if (a->degree < b->degree)
return true;
49 void reset_ncomparisons() { ncmps = 0; }
50 long ncomparisons()
const {
return ncmps; }
51 ~PreElementSorter() {}
54long PreElementSorter::ncmps = 0;
72 mFrame.mLevels.resize(max_level + 1);
106 std::cout <<
"error: calling computeFrame too soon" << std::endl;
114 std::cout <<
"maxsize = " <<
mFrame.mLevels.size()
129 std::cout <<
"non-minimal betti: " << std::endl;
142 int top_slanted_degree,
165 if (stop_after_degree)
177 std::cout <<
"WARNING: cannot extend resolution length" << std::endl;
192 mScheduler.execute([&] {
194 mDepGraph.startComputation();
195 mDepGraph.waitForCompletion();
214 for (
int lev = 1; lev <= length_limit + 1; lev++)
219 for (
int lev = 1; lev <= length_limit; lev++)
226 std::cout <<
"displaying stats" << std::endl;
230 std::cout <<
"total setPolyFromArray: "
265 decltype(
timer()) timeA, timeB;
271 std::cout <<
"computation status after computing frame: " << std::endl;
284 mScheduler.execute([&] {
289 mDepGraph.startComputation();
290 mDepGraph.waitForCompletion();
325 std::cout <<
"computation status after computing syzygies: " << std::endl;
334 std::cout <<
"computation status after computing ranks: " << std::endl;
340 int top_slanted_degree = 0;
352 std::cerr <<
"ERROR: should not get to this point anymore..." << std::endl;
354 std::cout <<
"maxsize = " <<
mFrame.mLevels.size() <<
" and mCurrentLevel = " <<
mCurrentLevel << std::endl;
365 std::cout <<
"non-minimal betti: " << std::endl;
395 int rk =
rank(it->first, it->second);
415 std::cout <<
"done" << std::endl;
422 std::cout <<
"total time for make matrix: " <<
timeMakeMatrix << std::endl;
423 std::cout <<
"total time for sort matrix: " <<
timeSortMatrix << std::endl;
424 std::cout <<
"total time for reorder matrix: " <<
timeReorderMatrix << std::endl;
425 std::cout <<
"total time for gauss matrix: " <<
timeGaussMatrix << std::endl;
426 std::cout <<
"total time for clear matrix: " <<
timeClearMatrix << std::endl;
428 std::cout <<
"total time for computing ranks: " <<
timeComputeRanks << std::endl;
443 decltype(
timer()) timeA, timeB;
454 ERROR(
"betti display not implemented yet");
488 std::vector<PreElement*> elements;
489 if (
ring().isSkewCommutative())
494 for (
int i = 0; i < a; ++i)
503 elements.push_back(vp);
513 std::cout <<
" #pre elements = " << elements.size() << std::endl;
514 for (
auto i=elements.begin(); i != elements.end(); ++i)
517 fprintf(stdout,
"\n");
521 std::stable_sort(elements.begin(), elements.end(), C);
524 for (
auto i = elements.begin(); i != elements.end(); ++i)
528 if (inideal)
continue;
538 monoid().get_component(monom)));
552 int level1 = level0 + 1;
560 auto& elem =
level(level1)[i];
561 elem.mBegin = n_elems_added;
563 elem.mEnd = n_elems_added;
569 return n_elems_added;
574 auto& myframe =
level(lev);
576 myorder.mTieBreaker.resize(myframe.size());
582 myorder.mTieBreaker[i] = i;
587 long* tiebreakers =
new long[myframe.size()];
589 auto n_frame_elems = myframe.size();
593 tiebreakers[i] = i + n_frame_elems * prevorder.mTieBreaker[comp];
595 std::stable_sort(tiebreakers, tiebreakers + n_frame_elems);
599 myorder.mTieBreaker[tiebreakers[i] % n_frame_elems] = i;
601 delete[] tiebreakers;
609 auto& myframe =
level(lev);
610 long idx = myframe.size();
612 auto& myelem = myframe[idx];
621 myelem.mMonom, prevorder.mTotalMonom[comp], myTotalMonom);
624 myorder.mTotalMonom.push_back(myTotalMonom);
632 auto& myframe =
level(0);
633 long idx = myframe.size();
635 auto& myelem = myframe[idx];
642 myorder.mTotalMonom.push_back(myTotalMonom);
652 if (
p.mBegin == -1)
p.mBegin = last - 1;
659 <<
"Error: expected terms of polynomial to be in order, in poly#"
662 std::cout << std::endl;
672 if (lev == 0)
return true;
674 auto& mylevel =
level(lev);
677 for (
auto i = mylevel.cbegin(); i != mylevel.cend(); ++i, ++which)
681 std::cout <<
"Error: terms of polynomial at level " << lev
682 <<
" location " << which <<
" not in order" << std::endl;
683 std::cout <<
" poly = ";
685 std::cout << std::endl;
694 <<
"checking that all input and constructed polynomials are in order...";
696 for (
auto i = 1; i <
maxLevel(); ++i)
698 if (
result) std::cout <<
"ok" << std::endl;
705 for (
int i = 0; i <
mFrame.mLevels.size(); i++)
714 std::cout <<
"Frame memory usage" << std::endl;
716 std::cout <<
" level"
722 <<
" polalloc" << std::endl;
728 long poly_nterms = 0;
729 long poly_used_level = 0;
730 long poly_alloc_level = 0;
731 long poly_nterms_level = 0;
732 for (
int i = 0; i <
mFrame.mLevels.size(); i++)
734 long nelems_level =
level(i).size();
735 if (nelems_level == 0)
continue;
738 poly_nterms_level = 0;
740 poly_alloc_level = 0;
741 for (
int j = 0; j < nelems_level; j++)
748 poly_nterms += poly_nterms_level;
749 poly_used += poly_used_level;
750 poly_alloc += poly_alloc_level;
751 std::cout << std::setw(6) << i <<
" " << std::setw(8) << nelems_level
752 <<
" " << std::setw(6) << used_level <<
" " << std::setw(11)
753 << alloc_level <<
" " << std::setw(10) << poly_nterms_level
754 <<
" " << std::setw(10) << poly_used_level <<
" "
755 << std::setw(10) << poly_alloc_level << std::endl;
756 nelems += nelems_level;
758 alloc += alloc_level;
761 <<
" " << std::setw(8) << nelems <<
" " << std::setw(6) << used
762 <<
" " << std::setw(11) << alloc <<
" " << std::setw(10)
763 << poly_nterms <<
" " << std::setw(10) << poly_used <<
" "
764 << std::setw(10) << poly_alloc << std::endl;
769 std::cout <<
"monomials " << std::setw(6) << monomUsed <<
" "
770 << std::setw(11) << monomSpace << std::endl;
771 std::cout <<
"total mem " << std::setw(6)
772 << (used + monomUsed + poly_used) <<
" " << std::setw(11)
773 << (alloc + monomSpace + poly_alloc) << std::endl;
778 std::cout <<
"#levels=" <<
mFrame.mLevels.size()
780 for (
int i = 0; i <
mFrame.mLevels.size(); i++)
782 auto& myframe =
level(i);
784 if (myframe.size() == 0)
continue;
785 std::cout <<
"--- level " << i <<
" ------" << std::endl;
786 for (
int j = 0; j < myframe.size(); j++)
788 std::cout <<
" " << j <<
" " << myframe[j].mDegree <<
" ("
789 << myframe[j].mBegin <<
"," << myframe[j].mEnd <<
") "
791 if (myframe[j].mSyzygy.coeffs.isNull())
792 std::cout <<
"coeffs=null " << std::flush;
793 std::cout <<
"(size:" << myframe[j].mSyzygy.len <<
") [";
795 std::cout <<
" " << myorder.mTieBreaker[j] <<
"] ";
796 if (len == 0 or myframe[j].mSyzygy.len == 0)
802 std::cout << std::endl;
810 if (
mFrame.mLevels.size() == 0 or
mFrame.mLevels[0].mElements.size() == 0)
818 auto& lev0 =
level(0);
819 loDegree = hiDegree =
static_cast<int>(lev0[0].mDegree);
820 for (
int lev = 0; lev <
mFrame.mLevels.size(); lev++)
822 auto& myframe =
level(lev);
823 if (myframe.size() == 0)
return;
825 for (
auto p = myframe.begin();
p != myframe.end(); ++
p)
827 int deg =
p->mDegree;
829 if (deg < loDegree) loDegree = deg;
830 if (deg > hiDegree) hiDegree = deg;
846 for (
int lev = 0; lev <= len; lev++)
848 auto& myframe =
level(lev);
849 for (
auto p = myframe.begin();
p != myframe.end(); ++
p)
851 int deg =
p->mDegree;
861 for (
int slanted_degree = lo; slanted_degree < hi; slanted_degree++)
863 for (
int lev = 1; lev <=
maxLevel()-1; lev++)
879 for (
int slanted_degree = lo; slanted_degree <= hi; slanted_degree++)
897 for (
int lev = 2; lev <=
maxLevel(); lev++)
912 for (
int lev = 2; lev <= toplevel; lev++)
928 for (
int lev = 1; lev <= toplevel; lev++)
computeRank(deg, lev);
941 if (status != 1)
return;
951 F4Res thisComputer {*
this};
952 thisComputer.
construct(lev, slanted_deg + lev);
969 if (status == 0)
return;
974 if (status == 3)
return;
975 int rk =
rank(slanted_degree, lev);
979 if (slanted_degree <= mHiSlantedDegree and lev > 0)
997 for (
int lev = 0; lev <= len; lev++)
999 auto& myframe =
level(lev);
1000 for (
auto p = myframe.begin();
p != myframe.end(); ++
p)
1002 int deg =
p->mDegree;
1003 B.
entry(deg - lev, lev)++;
M2_arrayint getBetti() const
void resize(int new_lo_degree, int new_hi_degree, int new_length)
int & entry(int deg, int lev)
Engine-side Betti table: a (degree, homological level) rectangle of integers.
static int compare(ConstExponents a, ConstExponents b)
static void elem_text_out(buffer &o, ConstExponents m, bool p_one=true)
static const Exponent length(ConstExponents m)
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
void construct(int lev, int degree)
int max_monomial_size() const
component_index get_component(res_const_packed_monomial m) const
void copy(res_const_packed_monomial src, res_packed_monomial target) const
void showAlpha(res_const_packed_monomial m) const
void set_component(component_index component, res_packed_monomial m) const
int skew_vars(const SkewMultiplication *skew, res_const_packed_monomial m, int *skewvars) const
void from_varpower_monomial(res_const_varpower_monomial m, component_index comp, res_packed_monomial result) const
void unchecked_mult(res_const_packed_monomial m, res_const_packed_monomial n, res_packed_monomial result) const
void quotient_as_vp(res_const_packed_monomial a, res_const_packed_monomial b, res_varpower_monomial result) const
void variable_as_vp(int v, res_varpower_monomial result) const
int degree_of_vp(res_const_varpower_monomial a) const
const ResMonoid & monoid() const
void memUsage(const ResPolynomial &f, long &nterms, long &bytes_used, long &bytes_alloc) const
The polynomial-ring view the F4 resolution engine reduces against: coefficient arithmetic plus the en...
static long npoly_destructor
static long ncalls_fromarray
Polynomial type used by the F4 resolution engine: parallel coefficient vector and concatenated monomi...
int degree(int lev, component_index component) const
std::vector< std::pair< int, int > > mMinimalizeTODO
void computeSyzygies(int slanted_degree, int maxlevel)
void computeRanks(int slanted_degree, int maxlevel)
SchreyerFrame(const ResPolyRing &R, int max_level, int numThreads, bool parallelizeByDegree)
void computeRank(int slanted_degree, int lev)
bool mParallelizeByDegree
SchreyerFrameTypes::FrameElement FrameElement
BettiDisplay minimalBettiNumbers(bool stop_after_degree, int top_slanted_degree, int length_limit)
void setSchreyerOrder(int lev)
BettiDisplay mBettiMinimal
int rank(int slanted_degree, int lev)
enum SchreyerFrame::@107076371201376153077324375251043314133302145334 mState
M2_arrayint getBettiFrame() const
void insertLevelZero(res_packed_monomial monom, int degree, int maxdeglevel0)
component_index computeNextLevel()
const ResMonoid & monoid() const
ResMemoryBlock< res_monomial_word > & monomialBlock()
double timeResetHashTable
component_index computeIdealQuotient(int lev, component_index begin, component_index elem)
bool insertLevelOne(res_packed_monomial monom, int degree, ResPolynomial &syzygy)
ResMemoryBlock< PreElement > mPreElements
ResMemoryBlock< res_varpower_word > mVarpowers
void start_computation(StopConditions &stop)
BettiDisplay mComputationStatus
M2_arrayint getBetti(int type)
SchreyerFrameTypes::PreElement PreElement
std::vector< FrameElement > & level(int lev)
void insertBasic(int lev, res_packed_monomial monom, int degree)
const ResPolyRing & ring() const
PreElement * createQuotientElement(res_packed_monomial m1, res_packed_monomial m)
const ResPolyRing & mRing
double timeComputeSparseRanks
const VectorArithmetic & vectorArithmetic() const
ResMemoryBlock< res_monomial_word > mMonomialSpace
void getBounds(int &loDegree, int &hiDegree, int &length) const
void showMemoryUsage() const
BettiDisplay mBettiNonminimal
bool debugCheckOrderAll() const
ResSchreyerOrder & schreyerOrder(int lev)
void fillinSyzygies(int slanted_deg, int lev)
std::unique_ptr< F4Res > mComputer
bool debugCheckOrder(int lev) const
ElementArray allocateElementArray(ComponentIndex nelems) const
Create a coefficient vector with room for nelems coefficients.
ComputationStatusCode / StopConditions / StrategyValues / Algorithms / gbTraceValues — engine-to-inte...
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
F4MonomialLookupTableT< int32_t > MonomialLookupTable
static int compare(const vecterm *t, const vecterm *s)
VALGRIND_MAKE_MEM_DEFINED & result(result)
MonomialInfo — F4's packed_monomial encoding plus operations.
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
ResF4MonomialLookupTableT<Key> — tree-structured leading-term index for the F4 resolution.
F4Res — F4-style matrix-reduction worker over a SchreyerFrame.
res_monomial_word * res_packed_monomial
Typed-monomial vocabulary shared by ResMonoid, ResPolyRing, SchreyerFrame, and F4Res.
bool check_poly(const ResPolyRing &R, const ResPolynomial &f, const ResSchreyerOrder &ord)
void display_poly(std::ostream &o, const ResPolyRing &R, const ResPolynomial &f)
SchreyerFrame — in-progress representation of a free resolution organised by (level,...
void makeDependencyGraph(int nlevels, int nslanted_degrees)
TermIterator< Nterm > begin(Nterm *ptr)
TermIterator< Nterm > end(Nterm *)
The full frame: a vector of Levels indexed by homological degree.
M2_bool stop_after_degree
Bundle of optional early-termination knobs the front end can attach to a long-running Computation.
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.
std::chrono::steady_clock::time_point timer()
double seconds(DurationType time_diff)
Inline std::chrono::steady_clock wrappers and elapsed-time conversion helpers.