Macaulay2 Engine
Loading...
Searching...
No Matches
MonomialLookupTable.hpp
Go to the documentation of this file.
1//
2// Created by Frank Moore on 7/5/23.
3//
4
5#pragma once
6
49
50#include "MonomialTypes.hpp"
51#include "MonomialView.hpp"
52#include <vector>
53#include <iostream>
54
55namespace newf4 {
56
58 bool mIsUsed; // whether to use for divisibility checks
59 int mSimpleDegree; // simple degree
60 MonomialMask mMask; // divisibility mask
61 int mOffset; // offset where monomial starts
62 int mValue; // index of polynomial associated to this MonomialInfo
63};
64
66{
68 private:
69 std::vector<MonomialInt> mMonomialSpace;
70 std::vector<MonomialInfo> mMonomialInfo;
71
72 // statistics info
73
74 public:
75
76 inline static MonomialMask createMask(const MonomialView& monView)
77 {
79 for (const auto vp : monView)
80 result |= 1 << (vp.first & (sizeof(MonomialMask)*8 - 1));
81 return result;
82 }
83
84 inline static bool maskDivides(MonomialMask divisor,
85 MonomialMask divisee)
86 {
87 auto result = divisor & (~divisee);
88 return (result == 0);
89 }
90
92 {
93 using IterType = decltype(mMonomialInfo.cbegin());
94
95 private:
96 //TODO, needs to be added: const MonomialLookupTable& mTable;
98
99 public:
101 IterType iter)
102 :
103 //TODO: to be added: mTable(table),
104 mIter(iter)
105 {
106 (void) table;
107 }
108
109 public:
110 bool isUsed() { return mIter->mIsUsed; }
111 int simpleDegree() { return mIter->mSimpleDegree; }
112 uint64_t mask() { return mIter->mMask; }
113 int value() { return mIter->mValue; }
114 int offset() { return mIter->mOffset; }
115 };
116
117 // insert monomial(s) into table
118 void insertMonomial(const MonomialView monView, int index);
119
120 // compactify
121 void compactify();
122
123 // begin and end (both const and not)
126
127 // find divisor
128 int findDivisor(const MonomialView monView) const;
129
130 // find divisors
131 std::vector<int> findAllDivisors(const MonomialView monView) const;
132 void findAllDivisors(const MonomialView monView,
133 std::vector<int>& result,
134 bool stopAtOne = false) const;
135
136 // find divisees
137 std::vector<int> findAllDivisees(const MonomialView monView) const;
138 void findAllDivisees(const MonomialView monView,
139 std::vector<int>& result) const;
140
141 // retire monomial(s)
142 void retire(int monIndex) { mMonomialInfo[monIndex].mIsUsed = false; }
143 std::vector<int> retireAllDivisees(const MonomialView monView);
144 void retireAllDivisees(const MonomialView monView,
145 std::vector<int>& result);
146
147 // display
148 std::ostream& display(std::ostream& ostr) const;
149
150 // memoryUsed
151 long memoryUsed() const;
152};
153
154} // namespace newf4
Typed integer vocabulary for namespace newf4 (indices, monomial words, hashes, masks).
newf4::MonomialView — non-owning view over a [length, var_1, e_1, ...]-encoded monomial.
MonomialLookupIterator(const MonomialLookupTable &table, IterType iter)
void insertMonomial(const MonomialView monView, int index)
static MonomialMask createMask(const MonomialView &monView)
std::vector< int > findAllDivisors(const MonomialView monView) const
MonomialLookupIterator begin() const
MonomialLookupIterator end() const
int findDivisor(const MonomialView monView) const
std::ostream & display(std::ostream &ostr) 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)
VALGRIND_MAKE_MEM_DEFINED & result(result)
uint64_t MonomialMask