Macaulay2 Engine
Loading...
Searching...
No Matches
MonomialLookupTable.cpp
Go to the documentation of this file.
1//
2// Created by Frank Moore on 7/5/23.
3//
4
6
7namespace newf4 {
8
9// insert monomial(s) into table
10void MonomialLookupTable::insertMonomial(const MonomialView monView, int index)
11{
12 MonomialInfo newMonomialInfo;
13 newMonomialInfo.mIsUsed = true;
14 newMonomialInfo.mSimpleDegree = monView.simpleDegree();
15 newMonomialInfo.mMask = createMask(monView);
16 newMonomialInfo.mOffset = mMonomialSpace.size();
17 mMonomialSpace.insert(mMonomialSpace.end(), monView.dataBegin(), monView.dataEnd());
18 newMonomialInfo.mValue = index;
19 mMonomialInfo.push_back(newMonomialInfo);
20}
21
22// compactify
23void MonomialLookupTable::compactify()
24{
25}
26
27// find divisor
28int MonomialLookupTable::findDivisor(const MonomialView monView) const
29{
30 std::vector<int> result;
31 findAllDivisors(monView, result, true);
32 return (result.size() > 0 ? result[0] : -1);
33}
34
35// find divisors
36std::vector<int> MonomialLookupTable::findAllDivisors(const MonomialView monView) const
37{
38 std::vector<int> result;
39 findAllDivisors(monView, result);
40 return result;
41}
42
43// adds all divisors to the end of result.
44void MonomialLookupTable::findAllDivisors(const MonomialView monView,
45 std::vector<int>& result,
46 bool stopAtOne) const
47{
48 int curIndex = 0;
49 MonomialMask mask = createMask(monView);
50 for (; curIndex < mMonomialInfo.size(); ++curIndex)
51 {
52 auto m = mMonomialInfo[curIndex];
53 if (m.mIsUsed && maskDivides(m.mMask,mask))
54 {
55 // ugh with the const_cast, but MonomialInt doesn't store const pointers
56 MonomialView mvDivisor(const_cast<MonomialInt*>(mMonomialSpace.data() + m.mOffset));
57 if ((monView.simpleDegree() >= m.mSimpleDegree) &&
58 (MonomialView::monomialDivides(mvDivisor, monView)))
59 {
60 result.push_back(curIndex);
61 if (stopAtOne) break;
62 }
63 }
64 }
65}
66
67// find divisees
68std::vector<int> MonomialLookupTable::findAllDivisees(const MonomialView monView) const
69{
70 std::vector<int> result;
71 findAllDivisees(monView,result);
72 return result;
73}
74
75void MonomialLookupTable::findAllDivisees(const MonomialView monView, std::vector<int>& result) const
76{
77 int curIndex = 0;
78 MonomialMask mask = createMask(monView);
79 for (; curIndex < mMonomialInfo.size(); ++curIndex)
80 {
81 auto m = mMonomialInfo[curIndex];
82 if (m.mIsUsed && maskDivides(mask,m.mMask))
83 {
84 // ugh with the const_cast, but MonomialInt doesn't store const pointers
85 MonomialView mvDivisee(const_cast<MonomialInt*>(mMonomialSpace.data() + m.mOffset));
86 if ((monView.simpleDegree() <= m.mSimpleDegree) &&
87 (MonomialView::monomialDivides(monView, mvDivisee)))
88 {
89 result.push_back(curIndex);
90 }
91 }
92 }
93}
94
95// retire monomial(s)
96std::vector<int> MonomialLookupTable::retireAllDivisees(const MonomialView monView)
97{
98 std::vector<int> result;
100 return result;
101}
102
103void MonomialLookupTable::retireAllDivisees(const MonomialView monView, std::vector<int>& result)
104{
105 findAllDivisees(monView,result);
106 for (auto m : result) retire(m);
107}
108
109// display
110std::ostream& MonomialLookupTable::display(std::ostream& ostr) const
111{
112 return ostr;
113}
114
115// memoryUsed
116long MonomialLookupTable::memoryUsed() const
117{
118 return 0;
119}
120
121} // namespace newf4
newf4::MonomialLookupTable — divisibility-aware leading-term index for the new F4.
static MonomialMask createMask(const MonomialView &monView)
std::vector< int > findAllDivisors(const MonomialView monView) const
std::vector< int > retireAllDivisees(const MonomialView monView)
std::vector< MonomialInt > mMonomialSpace
std::vector< MonomialInfo > mMonomialInfo
std::vector< int > findAllDivisees(const MonomialView monView) const
static bool maskDivides(MonomialMask divisor, MonomialMask divisee)
MonomialInt simpleDegree() const
auto dataEnd() -> MonomialInt *
static bool monomialDivides(const MonomialView &divisor, const MonomialView &divisee)
auto dataBegin() -> MonomialInt *
VALGRIND_MAKE_MEM_DEFINED & result(result)
int32_t MonomialInt
uint64_t MonomialMask