Macaulay2 Engine
Loading...
Searching...
No Matches
PolynomialList.hpp
Go to the documentation of this file.
1#pragma once
2
37
39#include "../BasicPolyList.hpp"
40#include "MonomialHashTable.hpp"
41#include "MonomialTypes.hpp"
42#include "PolynomialStream.hpp"
43
44namespace newf4 {
45
46class Polynomial;
47
48// This class will store the input to the GB commands, as well as
49// any intermediate polynomials encountered along the way.
51{
52 private:
55 std::vector<Polynomial> mPolynomials;
56
57 public:
59 : mVectorArithmetic(VA), mHashTable(hashTable)
60 {
61 }
62
65
67
68 Polynomial& operator[](int index) { return mPolynomials[index]; }
69 const Polynomial& operator[](int index) const { return mPolynomials[index]; }
70
71 size_t size() const { return mPolynomials.size(); }
72
73 void push_back(const Polynomial& F) { mPolynomials.push_back(F); }
74};
75
77{
79 //friend class PolynomialList;
80
81public: // TODO: change back to private
83 std::vector<MonomialIndex> mMonomials; // each monomial is an index into a vector of polynomials.
84 std::vector<ComponentIndex> mComponents;
86
87public:
88
93
94 template< bool Const = false >
96 {
97 public:
98 using iterator_category = std::forward_iterator_tag;
99
100 using ElementType = long; // not sure what to put here...
101
102 // is ElementArray always just std::vector<ElementType>?
103
104 //using CoeffIterator = typename std::conditional_t< Const,
105 // std::vector<ElementType>::const_iterator,
106 // std::vector<ElementType>::iterator>;
107
108 // we will be using the VectorArithmetic object to access the data
109 using CoeffIterator = typename std::size_t;
110
111 using MonomIterator = typename std::conditional_t< Const,
112 std::vector<MonomialIndex>::const_iterator,
113 std::vector<MonomialIndex>::iterator>;
114
115 using ComponentIterator = typename std::conditional_t< Const,
116 std::vector<ComponentIndex>::const_iterator,
117 std::vector<ComponentIndex>::iterator>;
118
119 //using CoeffReference = typename std::conditional_t< Const, ElementType const &, ElementType & >;
120 //using CoeffPointer = typename std::conditional_t< Const, ElementType const *, ElementType * >;
121
122 using MonViewReference = typename std::conditional_t< Const, MonomialView const &, MonomialView & >;
123 using MonViewPointer = typename std::conditional_t< Const, MonomialView const *, MonomialView * >;
124
125 using MonIndexReference = typename std::conditional_t< Const, MonomialIndex const &, MonomialIndex & >;
126 using MonIndexPointer = typename std::conditional_t< Const, MonomialIndex const *, MonomialIndex * >;
127
128 using CompReference = typename std::conditional_t< Const, ComponentIndex const &, ComponentIndex & >;
129 using CompPointer = typename std::conditional_t< Const, ComponentIndex const *, ComponentIndex * >;
130
131 //using MonomIterator = MonomialView::MonomialIterator<Const>;
132 // need to figure out a way to know the type of element array of polynomial type here.
133 // probably will require another template parameter of the ring.
134
135 private:
140
141 public:
142
144 MonomIterator monomIterator,
145 ComponentIterator compIterator,
146 const Polynomial& polynomial) :
147 mCoeffIterator(coeffIterator),
148 mMonomIterator(monomIterator),
149 mCompIterator(compIterator),
150 mPolynomial(polynomial)
151 {
152 }
153
154 // SFINAE enables the const dereference operator or the non
155 // const variant depending on bool Const parameter
156 // const version
157#if 0
158 template< bool _Const = Const >
159 std::enable_if_t< _Const, CoeffReference >
160 coeff() const {
161 return *mCoeffIterator;
162 }
163
164 // non-const version
165 template< bool _Const = Const >
166 std::enable_if_t< !_Const, CoeffReference >
167 coeff() {
168 return *mCoeffIterator;
169 }
170#endif
171
172 // TODO: this is horrid, but I don't yet know how to make a coeff iterator through the vector arithmetic object
173 ElementType coeff() const { return mPolynomial.polynomialList().vectorArithmetic().to_modp_long(mPolynomial.mCoefficients, mCoeffIterator); }
174
175 // const version
176 template< bool _Const = Const >
177 std::enable_if_t< _Const, MonViewReference >
178 monom() const {
179 return mPolynomial.polynomialList().monomialHashTable().monomialAt(*mMonomIterator);
180 }
181
182 // non-const version
183 template< bool _Const = Const >
184 std::enable_if_t< !_Const, MonViewReference >
186 return mPolynomial.polynomialList().monomialHashTable().monomialAt(*mMonomIterator);
187 }
188
189 // const version
190 template< bool _Const = Const >
191 std::enable_if_t< _Const, CompReference >
192 comp() const {
193 return *mCompIterator;
194 }
195
196 // non-const version
197 template< bool _Const = Const >
198 std::enable_if_t< !_Const, CompReference >
200 return *mCompIterator;
201 }
202
203 bool operator==(const PolynomialIterator& rhs) const { return mMonomIterator == rhs.mMonomIterator; }
204 bool operator!=(const PolynomialIterator& rhs) const { return mMonomIterator != rhs.mMonomIterator; }
205
206 private:
208 };
209
210 public:
211
212 auto begin() const -> PolynomialIterator<true> { return PolynomialIterator<true>(0,
213 mMonomials.begin(),
214 mComponents.begin(),
215 *this); }
216 auto end() const -> PolynomialIterator<true> { return PolynomialIterator<true>(mPolynomialList.vectorArithmetic().size(mCoefficients),
217 mMonomials.end(),
218 mComponents.end(),
219 *this); }
221 mMonomials.begin(),
222 mComponents.begin(),
223 *this); }
225 mMonomials.end(),
226 mComponents.end(),
227 *this); }
228
229 auto polynomialList() const -> const PolynomialList& { return mPolynomialList; }
231
232 // creation (output iterator?)
233 // iteration (for a const one) (similar to NC Poly)
234 // access
235};
236
239{
240public:
245
246private:
247 // We store these, as we need to be able to respond to what they are,
248 // but we don't use them here at all.
252
253 // State during the construction
254 std::vector<Coefficient> mCoefficients;
255 std::vector<Exponent> mSparseMonomial; // format: [size in ints, v1, e1, v2, e2, ..., vn, en], size=2*n+1.
256 long mCurrentPoly; // index of one we are working on
257 long mCurrentTerm; // index of term we are working on
258
259 PolynomialList& mValue; // previously constructed outside of this function??
260public:
272
273 // todo: value() should grab the resulting object, not just copy it.
275 {
276 return mValue;
277 }
278
279 // Fields required for the general stream interface (see mathicgb::mathicgb.h)
280
281 Coefficient modulus() const { return mModulus; }
282 VarIndex varCount() const { return mVarCount; }
283 Component comCount() const { return mComCount; }
284
285 void idealBegin(size_t polyCount);
286 void appendPolynomialBegin(size_t termCount);
287 void appendTermBegin(Component com);
289 void appendTermDone(Coefficient coefficient);
291 void idealDone();
292};
293
294// TODO: once we go to c++20, enable the concept PolynomialStream
295//template<PolynomialStream S>
296template<typename S>
297void toStream(const PolynomialList& Fs, S &str)
298{
299 str.idealBegin(Fs.size());
300 for (auto i=0; i<Fs.size(); ++i)
301 {
302 auto& F = Fs[i];
303 str.appendPolynomialBegin(F.mMonomials.size());
304 for (auto i=0; i<F.mMonomials.size(); ++i)
305 {
306 // get monomial
307 // write it out here using appendTermBegin, appendExponent, appendTermDone.
308 if (F.mComponents.empty())
309 str.appendTermBegin(0);
310 else
311 str.appendTermBegin(F.mComponents[i]);
312 MonomialView monom = Fs.monomialHashTable().monomialAt(F.mMonomials[i]);
313 for (auto ve = monom.begin(); ve != monom.end(); ++ve)
314 {
315 str.appendExponent(ve.var(), ve.power());
316 }
317 long val = Fs.vectorArithmetic().to_modp_long(F.mCoefficients, i);
318 str.appendTermDone(val);
319 }
320 str.appendPolynomialDone();
321 }
322 str.idealDone();
323}
324
325} // end namespace newf4
326
327// Local Variables:
328// indent-tabs-mode: nil
329// End:
Ring-agnostic polynomial-list transport type plus its streaming collector and emitter.
newf4::MonomialHashFunction and the new-F4 monomial-to-index hash table.
Typed integer vocabulary for namespace newf4 (indices, monomial words, hashes, masks).
Type aliases and the (currently disabled) C++20 concept that streaming polynomial consumers implement...
Coefficient-ring-erased arithmetic dispatcher used by F4, GB, and resolution code.
Type-erased owning handle to a dense coefficient vector held by a ConcreteVectorArithmetic<Ring>.
long to_modp_long(const ElementArray &coeffs, size_t loc) const
Runtime dispatcher that hides the concrete coefficient ring behind a std::variant of ConcreteVectorAr...
auto monomialAt(MonomialIndex m) const -> MonomialView
auto begin() const -> MonomialIterator< true >
auto end() const -> MonomialIterator< true >
typename std::conditional_t< Const, MonomialView const *, MonomialView * > MonViewPointer
bool operator!=(const PolynomialIterator &rhs) const
typename std::conditional_t< Const, MonomialIndex const *, MonomialIndex * > MonIndexPointer
typename std::conditional_t< Const, MonomialIndex const &, MonomialIndex & > MonIndexReference
typename std::conditional_t< Const, std::vector< MonomialIndex >::const_iterator, std::vector< MonomialIndex >::iterator > MonomIterator
typename std::conditional_t< Const, std::vector< ComponentIndex >::const_iterator, std::vector< ComponentIndex >::iterator > ComponentIterator
bool operator==(const PolynomialIterator &rhs) const
typename std::conditional_t< Const, ComponentIndex const *, ComponentIndex * > CompPointer
std::enable_if_t< !_Const, CompReference > comp()
std::enable_if_t< _Const, CompReference > comp() const
PolynomialIterator(CoeffIterator coeffIterator, MonomIterator monomIterator, ComponentIterator compIterator, const Polynomial &polynomial)
std::forward_iterator_tag iterator_category
std::enable_if_t< !_Const, MonViewReference > monom()
typename std::conditional_t< Const, MonomialView const &, MonomialView & > MonViewReference
std::enable_if_t< _Const, MonViewReference > monom() const
typename std::conditional_t< Const, ComponentIndex const &, ComponentIndex & > CompReference
auto polynomialList() -> PolynomialList &
auto end() const -> PolynomialIterator< true >
auto end() -> PolynomialIterator< false >
std::vector< MonomialIndex > mMonomials
friend class PolynomialListStream
ElementArray mCoefficients
auto begin() -> PolynomialIterator< false >
PolynomialList & mPolynomialList
auto polynomialList() const -> const PolynomialList &
auto begin() const -> PolynomialIterator< true >
Polynomial(PolynomialList &polynomialList)
std::vector< ComponentIndex > mComponents
PolynomialList(const VectorArithmetic &VA, MonomialHashTable &hashTable)
Polynomial & operator[](int index)
MonomialHashTable & monomialHashTable()
const Polynomial & operator[](int index) const
const VectorArithmetic & vectorArithmetic() const
const MonomialHashTable & monomialHashTable() const
MonomialHashTable & mHashTable
void push_back(const Polynomial &F)
const VectorArithmetic & mVectorArithmetic
std::vector< Polynomial > mPolynomials
std::vector< Coefficient > mCoefficients
std::vector< Exponent > mSparseMonomial
PolynomialListStreamCollector(int modulus, int varCount, int comCount, PolynomialList &result)
void appendPolynomialBegin(size_t termCount)
void appendExponent(VarIndex index, Exponent exponent)
BasicPolyListStreamCollector::VarIndex VarIndex
BasicPolyListStreamCollector::Component Component
BasicPolyListStreamCollector::Coefficient Coefficient
BasicPolyListStreamCollector::Exponent Exponent
void appendTermDone(Coefficient coefficient)
int * exponent
Definition exptable.h:34
VALGRIND_MAKE_MEM_DEFINED & result(result)
int32_t Component
int32_t Coefficient
int32_t VarIndex
void toStream(const PolynomialList &Fs, S &str)
int32_t Exponent