Macaulay2 Engine
Loading...
Searching...
No Matches
res-poly-ring.hpp
Go to the documentation of this file.
1/* Copyright 2015-2016, Michael E. Stillman */
2
3#ifndef _res_poly_ring_hpp_
4#define _res_poly_ring_hpp_
5
44
45#include "VectorArithmetic.hpp" // for VectorArithmetic
46#include "newdelete.hpp" // for our_new_delete
47#include "schreyer-resolution/res-moninfo.hpp" // for ResMonoid
48#include "schreyer-resolution/res-monomial-types.hpp" // for res_monomial_word
49
50#include <iostream> // for ostream
51#include <memory> // for unique_ptr
52#include <type_traits> // for swap
53#include <vector> // for vector, swap
54
55class Monoid;
57struct ResSchreyerOrder;
58
76{
77 friend class ResPolyRing;
80
81 public:
82 static long npoly_destructor;
83 int len; // in monomials? This only determines both sizes below
84 // in the case of fixed length monomials
86 std::vector<res_monomial_word> monoms;
87
88 public:
91 {
92 if (!coeffs.isNull()) npoly_destructor++;
93 // std::cout << "Calling ~poly()" << std::endl << std::flush;
94 }
95
96 ResPolynomial(const ResPolynomial& other) = default;
97 ResPolynomial(ResPolynomial&& other) = default;
98 ResPolynomial& operator=(const ResPolynomial& other) = default;
100};
101
116{
117 public:
118 ResPolyRing(const Ring* baseRing,
119 const ResMonoid* M,
120 const Monoid* origM)
121 : mVectorArithmetic(baseRing),
122 mMonoid(M),
123 mOriginalMonoid(origM),
124 mSkew(nullptr)
125 {
126 }
127 ResPolyRing(const Ring* baseRing, // usually the underlying base field, although for non-minimal complexes, it does not need to be a field.
128 const ResMonoid* M,
129 const Monoid* origM,
131 : mVectorArithmetic(baseRing),
132 mMonoid(M),
133 mOriginalMonoid(origM),
135 {
136 }
137
139 const ResMonoid& monoid() const { return *mMonoid; }
140 const Monoid& originalMonoid() const { return *mOriginalMonoid; }
141 bool isSkewCommutative() const { return mSkew != nullptr; }
142 const SkewMultiplication* skewInfo() const { return mSkew; }
143 void memUsage(const ResPolynomial& f,
144 long& nterms,
145 long& bytes_used,
146 long& bytes_alloc) const;
147
148 private:
150 std::unique_ptr<const ResMonoid> mMonoid;
153};
154
172{
173 private:
174 std::vector<res_packed_monomial> monoms;
177
178 public:
179 static long ncalls;
180 static long ncalls_fromarray;
181
183 {
184 coeffs = R.vectorArithmetic().allocateElementArray();
185 }
186
188 mRing.vectorArithmetic().deallocateElementArray(coeffs);
189 }
191 {
192 monoms.push_back(monom); // a pointer
193 mRing.vectorArithmetic().pushBackOne(coeffs);
194 }
195
197 {
198 monoms.push_back(monom); // a pointer
199 }
200
203 {
204 ncalls++;
205 result.len = static_cast<int>(mRing.vectorArithmetic().size(coeffs));
206 std::swap(result.coeffs, coeffs);
207 result.monoms.resize(result.len * mRing.monoid().max_monomial_size());
208
209 // copy monoms: not pointers, actual monoms
210 res_monomial_word* monomptr = result.monoms.data();
211 for (int i = 0; i < result.len; i++)
212 {
213 mRing.monoid().copy(monoms[i], monomptr);
214 monomptr += mRing.monoid().monomial_size(monoms[i]);
215 }
216 }
217
219 int len,
221 std::vector<res_monomial_word>& monoms)
222 {
224 result.len = len;
225 result.coeffs.swap(coeffs);
226 std::swap(result.monoms, monoms);
227 }
228};
229
243{
248
249 public:
250 friend bool operator==(const ResPolynomialIterator& a, const ResPolynomialIterator& b);
251 friend bool operator!=(const ResPolynomialIterator& a, const ResPolynomialIterator& b);
252
254 : mRing(R), elem(elem0), coeff_index(0), monom_index(0)
255 {
256 }
257
258 ResPolynomialIterator(const ResPolyRing& R, const ResPolynomial& elem0, int) // end
259 : mRing(R),
260 elem(elem0),
261 coeff_index(elem.len),
262 monom_index(0)
263 {
264 }
265
266 int coefficient_index() const { return static_cast<int>(coeff_index); }
268 {
269 return elem.monoms.data() + monom_index;
270 }
272 {
273 coeff_index++;
274 monom_index +=
275 mRing.monoid().monomial_size(elem.monoms.data() + monom_index);
276 }
277};
278
280{
281 return a.coeff_index == b.coeff_index;
282}
284{
285 return a.coeff_index != b.coeff_index;
286}
287
288inline void display_poly(std::ostream& o, const ResPolyRing& R, const ResPolynomial& f)
289{
290 auto end = ResPolynomialIterator(R, f, 1); // end
291 int i = 0;
292 for (auto it = ResPolynomialIterator(R, f); it != end; ++it, ++i)
293 {
295 res_const_packed_monomial mon = it.monomial();
296 R.monoid().showAlpha(mon);
297 }
298}
299
300bool check_poly(const ResPolyRing& R, const ResPolynomial& f, const ResSchreyerOrder& O);
301#endif
302
303// Local Variables:
304// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
305// indent-tabs-mode: nil
306// End:
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>.
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
void showAlpha(res_const_packed_monomial m) const
const Monoid & originalMonoid() const
bool isSkewCommutative() const
const SkewMultiplication * skewInfo() const
const SkewMultiplication * mSkew
const ResMonoid & monoid() const
ResPolyRing(const Ring *baseRing, const ResMonoid *M, const Monoid *origM)
const Monoid * mOriginalMonoid
void memUsage(const ResPolynomial &f, long &nterms, long &bytes_used, long &bytes_alloc) const
ResPolyRing(const Ring *baseRing, const ResMonoid *M, const Monoid *origM, const SkewMultiplication *skewInfo)
VectorArithmetic mVectorArithmetic
const VectorArithmetic & vectorArithmetic() const
std::unique_ptr< const ResMonoid > mMonoid
The polynomial-ring view the F4 resolution engine reduces against: coefficient arithmetic plus the en...
std::vector< res_monomial_word > monoms
ResPolynomial & operator=(ResPolynomial &&other)=default
friend class ResPolynomialIterator
ResPolynomial(const ResPolynomial &other)=default
ResPolynomial(ResPolynomial &&other)=default
friend class ResPolynomialConstructor
ElementArray coeffs
friend class ResPolyRing
ResPolynomial & operator=(const ResPolynomial &other)=default
static long npoly_destructor
ElementArray & coefficientInserter()
std::vector< res_packed_monomial > monoms
const ResPolyRing & mRing
void appendMonicTerm(res_packed_monomial monom)
ResPolynomialConstructor(const ResPolyRing &R)
void pushBackTerm(res_packed_monomial monom)
static void setPolyFromArrays(ResPolynomial &result, int len, ElementArray &coeffs, std::vector< res_monomial_word > &monoms)
void setPoly(ResPolynomial &result)
Polynomial type used by the F4 resolution engine: parallel coefficient vector and concatenated monomi...
res_const_packed_monomial monomial() const
ResPolynomialIterator(const ResPolyRing &R, const ResPolynomial &elem0)
ResPolynomialIterator(const ResPolyRing &R, const ResPolynomial &elem0, int)
const ResPolynomial & elem
friend bool operator!=(const ResPolynomialIterator &a, const ResPolynomialIterator &b)
friend bool operator==(const ResPolynomialIterator &a, const ResPolynomialIterator &b)
const ResPolyRing & mRing
Forward iterator over the terms of a ResPolynomial.
xxx xxx xxx
Definition ring.hpp:102
Sign-rule helper used by every ring that has a skew-commutative subset of variables (exterior factor,...
Definition skew.hpp:54
std::ostream & displayElement(std::ostream &o, const ElementArray &v, int index) const
(Debugging) Display /////
Runtime dispatcher that hides the concrete coefficient ring behind a std::variant of ConcreteVectorAr...
VALGRIND_MAKE_MEM_DEFINED & result(result)
void swap(mpfr::mpreal &x, mpfr::mpreal &y)
Definition mpreal.h:3244
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
ResMonoidDense ResMonoid
ResMonoid dispatcher — single typedef switch between ResMonoidDense and ResMonoidSparse.
const res_monomial_word * res_const_packed_monomial
myword res_monomial_word
res_monomial_word * res_packed_monomial
Typed-monomial vocabulary shared by ResMonoid, ResPolyRing, SchreyerFrame, and F4Res.
bool operator!=(const ResPolynomialIterator &a, const ResPolynomialIterator &b)
bool operator==(const ResPolynomialIterator &a, const ResPolynomialIterator &b)
bool check_poly(const ResPolyRing &R, const ResPolynomial &f, const ResSchreyerOrder &O)
void display_poly(std::ostream &o, const ResPolyRing &R, const ResPolynomial &f)
TermIterator< Nterm > end(Nterm *)
Definition ringelem.cpp:5
Per-level Schreyer-order data attached to a SchreyerFrame::Level.