Macaulay2 Engine
Loading...
Searching...
No Matches
MonomialView.hpp
Go to the documentation of this file.
1#pragma once
2
39
40#include "../MemoryBlock.hpp"
41#include "MonomialTypes.hpp"
42#include <vector>
43#include <functional>
44#include <cstring> // For std::memcmp
45
46namespace newf4 {
47
49{
50 private:
51 MonomialInt* mData; // We do not own the data pointed to
52
53 public:
54 explicit MonomialView(MonomialInt* data) : mData(data) {}
55 explicit MonomialView(std::vector<MonomialInt>& data) : mData(data.data()) {}
56 MonomialView(std::vector<MonomialInt> data, MemoryBlock& block)
57 {
58 MonomialView m(data.data());
59 auto rng = block.allocateArray<MonomialInt>(m.size());
60 mData = rng.first;
61 std::copy(m.dataBegin(), m.dataEnd(), mData);
62 }
64 {
65 auto rng = block.allocateArray<MonomialInt>(m.size());
66 mData = rng.first;
67 std::copy(m.dataBegin(), m.dataEnd(), mData);
68 }
69
70 size_t size() const { return mData[0]; }
71
72 bool operator==(const MonomialView& monom) const
73 {
74 if (size() != monom.size()) return false;
75
76 // for loop version
77 //for (auto i = 1; i < size(); ++i)
78 // if (mData[i] != monom.mData[i]) return false;
79 //return true;
80
81 // memcmp version
82 return ((size() != 0) && ((std::memcmp(mData + 1,
83 monom.mData + 1,
84 sizeof(MonomialInt)*(size()-1)) == 0)));
85 }
86
87 inline static bool monomialDivides(const MonomialView& divisor,
88 const MonomialView& divisee)
89 {
90 if (divisor.size() > divisee.size()) return false;
91 auto divisorIt = divisor.begin();
92 auto diviseeIt = divisee.begin();
93 auto divisorEnd = divisor.end();
94 auto diviseeEnd = divisee.end();
95 while (divisorIt != divisorEnd)
96 {
97 auto divisorVar = divisorIt.var();
98 while (true)
99 {
100 if (diviseeIt == diviseeEnd) return false;
101 if (diviseeIt.var() > divisorVar) return false;
102 if (diviseeIt.var() == divisorVar) break;
103 ++diviseeIt;
104 }
105 // at this point, both diviseeIt.var() and divisorIt.var() are equal
106 if (divisorIt.power() > diviseeIt.power()) return false;
107 ++divisorIt;
108 ++diviseeIt;
109 }
110 return true;
111 }
112
113 // simple degree of a monomial view
115 {
117 for (auto i = begin(); i != end(); ++i)
118 result += i.power();
119 return result;
120 }
121
122 static MonomialView combine(const MonomialView& left,
123 const MonomialView& right,
124 bool copyLeft,
125 bool copyRight,
126 std::function<int(int,int)>,
127 MemoryBlock &block);
128
129 static MonomialView lcm(const MonomialView& left,
130 const MonomialView& right,
131 MemoryBlock &block);
132
133 static MonomialView product(const MonomialView& left,
134 const MonomialView& right,
135 MemoryBlock &block);
136
137
138 // returns left : right
139 static MonomialView quotient(const MonomialView& left,
140 const MonomialView& right,
141 MemoryBlock &block);
142
143 template< bool Const = false >
145 {
146 public:
147 using iterator_category = std::forward_iterator_tag;
148 using reference = typename std::conditional_t< Const, MonomialInt const &, MonomialInt & >;
149 using pointer = typename std::conditional_t< Const, MonomialInt const *, MonomialInt * >;
150
151 private:
152 // points to the var part of a var,power sequence in a MonomialView
154
155 public:
156 // constructor
157 MonomialIterator(MonomialInt* curLoc) : mCurLoc(reinterpret_cast<pointer>(curLoc)) {}
158
159 // iteration functions
161 {
162 // prefix ++ operator
163 mCurLoc += 2;
164 return *this;
165 }
166 // left out postfix operator to encourage prefix use
168 {
169 mCurLoc += 2*offset;
170 return *this;
171 }
172
173 // accessor functions
174
175 // SFINAE enables the const dereference operator or the non
176 // const variant depending on bool Const parameter
177 // const version
178 template< bool _Const = Const >
179 std::enable_if_t< _Const, reference >
180 var() const {
181 return *mCurLoc;
182 }
183
184 // non-const version
185 template< bool _Const = Const >
186 std::enable_if_t< !_Const, reference >
187 var() {
188 return *mCurLoc;
189 }
190
191 // const version
192 template< bool _Const = Const >
193 std::enable_if_t< _Const, reference >
194 power() const {
195 return *(mCurLoc + 1);
196 }
197
198 // non-const version
199 template< bool _Const = Const >
200 std::enable_if_t< !_Const, reference >
202 return *(mCurLoc + 1);
203 }
204
205 // not sure how to make this const/non-const as pairs can't hold references
206 std::pair<MonomialInt, MonomialInt> operator*() const { return std::make_pair(var(), power()); }
207
208 pointer loc() const { return mCurLoc; }
209
210 // (in)equality checks
211 bool operator==(const MonomialIterator& rhs) const { return (mCurLoc == rhs.mCurLoc); }
212 bool operator!=(const MonomialIterator& rhs) const { return (mCurLoc != rhs.mCurLoc); }
213
214 };
215
216 auto begin() const -> MonomialIterator<true> { return MonomialIterator<true>(mData + 1); }
217 auto end() const -> MonomialIterator<true> { return MonomialIterator<true>(mData + size()); }
220
221 auto dataBegin() -> MonomialInt* { return mData; }
222 auto dataEnd() -> MonomialInt* { return mData + size(); }
223 auto dataBegin() const -> MonomialInt* { return mData; }
224 auto dataEnd() const -> MonomialInt* { return mData + size(); }
225
226 static void display(std::ostream& o,
227 const std::vector<std::string>& varnames,
228 const newf4::MonomialView& m
229 );
230};
231
232} // end namespace newf4
233
234// Local Variables:
235// indent-tabs-mode: nil
236// End:
Bump-pointer arena allocator for transient inner-loop allocations.
Typed integer vocabulary for namespace newf4 (indices, monomial words, hashes, masks).
std::pair< T *, T * > allocateArray(size_t nelems)
Thin RAII wrapper around memtailor::Arena providing bump-pointer array allocation with optional mutex...
MonomialIterator & operator+=(int offset)
std::enable_if_t< !_Const, reference > var()
std::enable_if_t< _Const, reference > power() const
std::pair< MonomialInt, MonomialInt > operator*() const
std::forward_iterator_tag iterator_category
bool operator==(const MonomialIterator &rhs) const
std::enable_if_t< !_Const, reference > power()
typename std::conditional_t< Const, MonomialInt const &, MonomialInt & > reference
std::enable_if_t< _Const, reference > var() const
bool operator!=(const MonomialIterator &rhs) const
typename std::conditional_t< Const, MonomialInt const *, MonomialInt * > pointer
MonomialView(std::vector< MonomialInt > &data)
MonomialView(MonomialInt *data)
static MonomialView quotient(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
MonomialInt * mData
static void display(std::ostream &o, const std::vector< std::string > &varnames, const newf4::MonomialView &m)
MonomialInt simpleDegree() const
MonomialView(std::vector< MonomialInt > data, MemoryBlock &block)
static MonomialView combine(const MonomialView &left, const MonomialView &right, bool copyLeft, bool copyRight, std::function< int(int, int)>, MemoryBlock &block)
MonomialView(const MonomialView &m, MemoryBlock &block)
auto dataBegin() const -> MonomialInt *
auto begin() const -> MonomialIterator< true >
auto end() const -> MonomialIterator< true >
auto end() -> MonomialIterator< false >
auto dataEnd() const -> MonomialInt *
static MonomialView lcm(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
static MonomialView product(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
size_t size() const
auto dataEnd() -> MonomialInt *
static bool monomialDivides(const MonomialView &divisor, const MonomialView &divisee)
auto begin() -> MonomialIterator< false >
bool operator==(const MonomialView &monom) const
auto dataBegin() -> MonomialInt *
VALGRIND_MAKE_MEM_DEFINED & result(result)
int32_t MonomialInt
std::mt19937 rng(rd())