Macaulay2 Engine
Loading...
Searching...
No Matches
f4-m2-interface.cpp
Go to the documentation of this file.
1// Copyright 2005-2021 Michael E. Stillman
2
4#include "f4/moninfo.hpp" // for monomial_word, MonomialInfo
5#include "f4/ntuple-monomial.hpp" // for ntuple_word
6#include "freemod.hpp" // for FreeModule
7#include "gbring.hpp" // for gbvector, GBRing
8#include "interface/mutable-matrix.h" // for IM2_MutableMatrix_make
9#include "mat.hpp" // for MutableMatrix
10#include "matrix-con.hpp" // for MatrixConstructor
11#include "matrix.hpp" // for Matrix
12#include "monoid.hpp" // for Monoid
13#include "newdelete.hpp" // for newarray, newarray_atomic, del...
14#include "polyring.hpp" // for PolynomialRing
15#include "ring.hpp" // for Ring
16#include "style.hpp" // for INTSIZE
17#include "VectorArithmetic.hpp"
18
20 const MonomialInfo *MI,
21 const FreeModule *F,
22 vec v,
24{
26 const Monoid *M = R->getMonoid();
27
28 ring_elem denom;
29 gbvector *f = R->translate_gbvector_from_vec(F, v, denom);
30 GBRing *GR = R->get_gb_ring();
31 int n = GR->gbvector_n_terms(f);
32
33 int *exp = new int[M->n_vars() + 1]; // newarray_atomic(int, M->n_vars() + 1);
34 ntuple_word *lexp = new ntuple_word[M->n_vars() + 1]; // newarray_atomic(ntuple_word, M->n_vars() + 1);
35
36 result.len = n;
37 std::vector<ring_elem> relem_array;
39 n = 0;
40 monomial_word *nextmonom = result.monoms;
41 for (gbvector *t = f; t != nullptr; t = t->next)
42 {
43 relem_array.push_back(t->coeff);
44 M->to_expvector(t->monom, exp);
45 for (int a = 0; a < M->n_vars(); a++) lexp[a] = exp[a];
47 lexp,
48 t->comp - 1,
49 nextmonom); // gbvector components are shifted up by one
50 nextmonom += MI->monomial_size(nextmonom);
51 n++;
52 }
53 result.coeffs = VA->elementArrayFromContainer(relem_array);
54 delete [] exp;
55 delete [] lexp;
56}
57
59 const MonomialInfo *MI,
60 const Matrix *m,
61 gb_array &result_polys)
62{
63 const FreeModule *F = m->rows();
64 for (int i = 0; i < m->n_cols(); i++)
65 {
66 gbelem *g = new gbelem;
67 from_M2_vec(VA, MI, F, m->elem(i), g->f);
68 result_polys.push_back(g);
69 }
70}
71
73 const MonomialInfo *MI,
74 const GBF4Polynomial &f,
75 const FreeModule *F)
76{
78 const Monoid *M = R->getMonoid();
79
80 monomial m1 = M->make_one();
81
82 Nterm **comps = newarray(Nterm *, F->rank());
83 Nterm **last = newarray(Nterm *, F->rank());
84 for (int i = 0; i < F->rank(); i++)
85 {
86 comps[i] = nullptr;
87 last[i] = nullptr;
88 }
89
90 int *exp = newarray_atomic(int, M->n_vars() + 1);
92
93 const monomial_word *w = f.monoms;
94 for (int i = 0; i < f.len; i++)
95 {
96 long comp;
97 MI->to_expvector(w, lexp, comp);
98 w = w + MI->monomial_size(w);
99 for (int a = 0; a < M->n_vars(); a++) exp[a] = static_cast<int>(lexp[a]);
100 M->from_expvector(exp, m1);
102 Nterm *g = R->make_flat_term(a, m1);
103 g->next = nullptr;
104 if (last[comp] == nullptr)
105 {
106 comps[comp] = g;
107 last[comp] = g;
108 }
109 else
110 {
111 last[comp]->next = g;
112 last[comp] = g;
113 }
114 }
115 vec result = nullptr;
116 for (int i = 0; i < F->rank(); i++)
117 {
118 if (comps[i] != nullptr)
119 {
120 vec v = R->make_vec(i, comps[i]);
121 R->add_vec_to(result, v);
122 comps[i] = nullptr;
123 last[i] = nullptr;
124 }
125 }
126
127 return result;
128}
129
131 const MonomialInfo *MI,
132 gb_array &polys,
133 const FreeModule *F)
134{
136 for (int i = 0; i < polys.size(); i++)
137 result.set_column(i, to_M2_vec(VA, MI, polys[i]->f, F));
138 return result.to_matrix();
139}
140
143 gb_array &gens,
144 gb_array &gb)
145{
146 int nrows = INTSIZE(mat->rows);
147 int ncols = INTSIZE(mat->columns);
148 MutableMatrix *M =
149 IM2_MutableMatrix_make(VA->ring(), nrows, ncols, false);
150 for (int r = 0; r < nrows; r++)
151 {
152 row_elem &row = mat->rows[r];
153 const ElementArray* coeffs;
154 if (row.coeffs.isNull())
155 {
156 if (row.monom == nullptr)
157 coeffs = & gens[row.elem]->f.coeffs;
158 else
159 coeffs = & gb[row.elem]->f.coeffs;
160 }
161 else
162 {
163 coeffs = & row.coeffs;
164 }
165 for (int i = 0; i < row.len; i++)
166 {
167 int c = row.comps[i];
168 ring_elem a = VA->ringElemFromElementArray(* coeffs, i);
169 M->set_entry(r, c, a);
170 }
171 }
172 return M;
173}
174
175// Local Variables:
176// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
177// indent-tabs-mode: nil
178// End:
Coefficient-ring-erased arithmetic dispatcher used by F4, GB, and resolution code.
bool isNull() const
Type-erased owning handle to a dense coefficient vector held by a ConcreteVectorArithmetic<Ring>.
static void from_M2_vec(const VectorArithmetic *VA, const MonomialInfo *MI, const FreeModule *F, vec v, GBF4Polynomial &result)
static MutableMatrix * to_M2_MutableMatrix(const VectorArithmetic *VA, coefficient_matrix *mat, gb_array &gens, gb_array &gb)
static Matrix * to_M2_matrix(const VectorArithmetic *VA, const MonomialInfo *MI, gb_array &polys, const FreeModule *F)
static void from_M2_matrix(const VectorArithmetic *VA, const MonomialInfo *MI, const Matrix *m, gb_array &result_polys)
static vec to_M2_vec(const VectorArithmetic *VA, const MonomialInfo *MI, const GBF4Polynomial &f, const FreeModule *F)
const Ring * get_ring() const
Definition freemod.hpp:102
int rank() const
Definition freemod.hpp:105
Engine-side free module R^n over a Ring.
Definition freemod.hpp:66
int gbvector_n_terms(const gbvector *f) const
Definition gbring.cpp:392
Polynomial-ring view tuned for the inner loop of classical Buchberger Groebner-basis computations.
Definition gbring.hpp:120
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
const FreeModule * rows() const
Definition matrix.hpp:144
Mutable builder used to assemble an immutable Matrix one column (or one term) at a time.
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
int n_vars() const
Definition monoid.hpp:207
monomial make_one() const
Definition monoid.cpp:455
void from_expvector(const_exponents exp, monomial result) const
Definition monoid.cpp:742
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
bool to_expvector(const_packed_monomial m, ntuple_monomial result, long &result_comp) const
Definition moninfo.hpp:246
int max_monomial_size() const
Definition moninfo.hpp:159
int monomial_size(const_packed_monomial m) const
Definition moninfo.hpp:160
bool from_expvector(const_ntuple_monomial e, long comp, packed_monomial result) const
Definition moninfo.hpp:191
Per-ring monomial layout / encoding helper used by F4GB.
Definition moninfo.hpp:108
virtual bool set_entry(size_t r, size_t c, const ring_elem a)=0
Abstract base class for mutable matrices over an arbitrary engine Ring, the in-place counterpart of t...
Definition mat.hpp:79
virtual GBRing * get_gb_ring() const
Definition polyring.hpp:276
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
virtual gbvector * translate_gbvector_from_vec(const FreeModule *F, const vec v, ring_elem &result_denominator) const =0
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
void add_vec_to(vec &v, vec &w) const
ElementArray elementArrayFromContainer(const Container &c) const
ring_elem ringElemFromElementArray(const ElementArray &coeffs, int index) const
const Ring * ring() const
Runtime dispatcher that hides the concrete coefficient ring behind a std::variant of ConcreteVectorAr...
F4toM2Interface — static translators between engine vec / Matrix and F4's GBF4Polynomial.
std::vector< gbelem * > gb_array
Definition f4-types.hpp:145
#define Matrix
Definition factory.cpp:14
void gb(IntermediateBasis &F, int n)
FreeModule — finite-rank free module R^n, the type-level anchor for every Matrix.
#define monomial
Definition gb-toric.cpp:11
GBRing and gbvector — the GB-tuned polynomial-ring view used by classical Buchberger code.
VALGRIND_MAKE_MEM_DEFINED & result(result)
MutableMatrix — abstract base of every mutable matrix the engine hands across the boundary.
MatrixConstructor — the mutable builder that produces an immutable Matrix.
Matrix — the engine's immutable homomorphism F -> G between free modules.
long monomial_word
Definition moninfo.hpp:77
MonomialInfo — F4's packed_monomial encoding plus operations.
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
MutableMatrix * IM2_MutableMatrix_make(const Ring *R, int nrows, int ncols, M2_bool is_dense)
Engine-boundary C API for the engine's in-place MutableMatrix, including dense linear algebra.
#define newarray(T, len)
Definition newdelete.hpp:82
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
ntuple_monomials::Exponent ntuple_word
F4's dense int64_t exponent-vector specialisation of ExponentVector (legacy).
PolynomialRing — abstract polynomial-ring base, the engine's most-reused class.
Ring — the legacy abstract base class for every coefficient and polynomial ring.
monomial_word * monoms
Definition f4-types.hpp:110
ElementArray coeffs
Definition f4-types.hpp:109
Compact polynomial layout used inside the F4 GB engine.
Definition f4-types.hpp:107
Nterm * next
Definition ringelem.hpp:157
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156
column_array columns
Definition f4-types.hpp:179
GBF4Polynomial f
Definition f4-types.hpp:139
gbvector * next
Definition gbring.hpp:80
packed_monomial monom
Definition f4-types.hpp:157
int * comps
Definition f4-types.hpp:163
ElementArray coeffs
Definition f4-types.hpp:162
#define INTSIZE(a)
Definition style.hpp:37
Engine-wide stylistic constants: LT / EQ / GT codes, INTSIZE, GEOHEAP_SIZE.