Macaulay2 Engine
Loading...
Searching...
No Matches

◆ choose_res()

ResolutionComputation * ResolutionComputation::choose_res ( const Matrix * m,
M2_bool resolve_cokernel,
int max_level,
M2_bool use_max_slanted_degree,
int max_slanted_degree,
int algorithm,
int strategy,
int numThreads,
M2_bool parallelizeByDegree )
static

Definition at line 16 of file comp-res.cpp.

26{
27 // The following modification is because some algorithms do not work if
28 // max_level is 0.
29 // github issue (crash, #368).
30 if (max_level <= 0) max_level = 1;
31
32 const Ring *R = m->get_ring();
33 ResolutionComputation *C = nullptr;
34 int origsyz;
35 // First, we need to check that m is homogeneous, and that
36 // the heft values of the variables are all positive.
37 // All of these algorithms also assume that R is a polynomial ring.
38
39 const M2FreeAlgebraOrQuotient *NCP = R->cast_to_M2FreeAlgebraOrQuotient();
40 if (NCP != nullptr)
41 {
42 if (M2_gbTrace > 0) emit_line("NC resolution");
43 C = createNCRes(m, max_level, strategy);
44 return C;
45 }
46 const PolynomialRing *P = R->cast_to_PolynomialRing();
47 if (P == nullptr)
48 {
49 ERROR("engine resolution strategies all require a polynomial base ring");
50 return nullptr;
51 }
52 const Ring* K = P->getCoefficientRing();
53 if (K->get_precision() != 0)
54 {
55 ERROR("free resolutions over polynomial rings with RR or CC coefficients not yet implemented");
56 return nullptr;
57 }
59 {
60 ERROR(
61 "engine resolution strategies all require a Heft vector which is "
62 "positive for all variables");
63 return nullptr;
64 }
65 if (algorithm < 4 and !m->is_homogeneous())
66 {
67 ERROR("engine resolution strategies require a homogeneous module");
68 return nullptr;
69 }
70
71 switch (algorithm)
72 {
73 case 1:
74 if (!resolve_cokernel)
75 {
76 ERROR(
77 "resolution Strategy=>1 cannot resolve a cokernel with a given "
78 "presentation: use Strategy=>2 or Strategy=>3 instead");
79 return nullptr;
80 }
81 if (!R->is_commutative_ring())
82 {
83 ERROR(
84 "use resolution Strategy=>2 or Strategy=>3 for non commutative "
85 "polynomial rings");
86 return nullptr;
87 }
88 if (M2_gbTrace > 0) emit_line("resolution Strategy=>1");
89 C = new res_comp(m, max_level, strategy);
90 break;
91 case 0:
92 if (!resolve_cokernel)
93 {
94 ERROR(
95 "resolution Strategy=>0 cannot resolve a cokernel with a given "
96 "presentation: use Strategy=>2 or Strategy=>3 instead");
97 return nullptr;
98 }
99 if (!R->is_commutative_ring())
100 {
101 ERROR(
102 "use resolution Strategy=>2 or Strategy=>3 for non commutative "
103 "polynomial rings");
104 return nullptr;
105 }
106 if (M2_gbTrace > 0) emit_line("resolution Strategy=>0");
107 C = new res2_comp(
108 m, max_level, use_max_slanted_degree, max_slanted_degree, strategy);
109 break;
110 case 2:
111 origsyz = m->n_cols();
112 if (M2_gbTrace > 0) emit_line("resolution Strategy=>2");
113 C = new gbres_comp(m, max_level + 1, origsyz, strategy);
114 break;
115 case 3:
116 origsyz = m->n_cols();
117 if (M2_gbTrace > 0) emit_line("resolution Strategy=>3");
118 C = new gbres_comp(
119 m, max_level + 1, origsyz, strategy | STRATEGY_USE_HILB);
120 break;
121 case 4:
122 case 5:
123 if (!resolve_cokernel)
124 {
125 ERROR(
126 "resolution Strategy=>4 cannot resolve a cokernel with a given "
127 "presentation: use Strategy=>2 or Strategy=>3 instead");
128 return nullptr;
129 }
130 if (!P->is_skew_commutative() and !R->is_commutative_ring())
131 {
132 ERROR(
133 "use resolution Strategy=>2 or Strategy=>3 for non commutative "
134 "polynomial rings");
135 return nullptr;
136 }
137 if (M2_gbTrace > 0) emit_line("resolution Strategy=>4 (res-f4)");
138 C = createF4Res(m, max_level, strategy, numThreads, parallelizeByDegree);
139 if (C == nullptr) return nullptr;
140 break;
141 }
142 if (C == nullptr)
143 {
144 ERROR("unknown resolution algorithm");
145 return nullptr;
146 }
147 intern_res(C);
148 return C;
149}
const Ring * get_ring() const
Definition matrix.hpp:134
int n_cols() const
Definition matrix.hpp:147
bool primary_degrees_of_vars_positive() const
Definition monoid.cpp:298
const Ring * getCoefficientRing() const
Definition polyring.hpp:200
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
bool is_skew_commutative() const
Definition polyring.hpp:237
virtual const M2FreeAlgebraOrQuotient * cast_to_M2FreeAlgebraOrQuotient() const
Definition ring.hpp:266
virtual bool is_commutative_ring() const
Definition ring.hpp:189
virtual unsigned long get_precision() const
Definition ring.cpp:438
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
void intern_res(ResolutionComputation *G)
Definition finalize.cpp:144
@ STRATEGY_USE_HILB
const int ERROR
Definition m2-mem.cpp:55
int M2_gbTrace
Definition m2-types.cpp:52
ResolutionComputation * createNCRes(const Matrix *gbModuleMatrix, int max_level, int strategy)
ResolutionComputation * createF4Res(const Matrix *groebnerBasisMatrix, int max_level, int strategy, int numThreads, bool parallelizeByDegree)
void emit_line(const char *s)
Definition text-io.cpp:47

References Ring::cast_to_M2FreeAlgebraOrQuotient(), Ring::cast_to_PolynomialRing(), createF4Res(), createNCRes(), emit_line(), ERROR, Ring::get_precision(), Matrix::get_ring(), PolynomialRing::getCoefficientRing(), PolynomialRing::getMonoid(), intern_res(), Ring::is_commutative_ring(), PolynomialRing::is_skew_commutative(), M2_gbTrace, Matrix, Matrix::n_cols(), Monoid::primary_degrees_of_vars_positive(), ResolutionComputation(), and STRATEGY_USE_HILB.

Referenced by IM2_res_make().