Macaulay2 Engine
Loading...
Searching...
No Matches
ResTest.cpp
Go to the documentation of this file.
1// Copyright 2017 Michael E. Stillman
2
30
31#include <cstdio>
32#include <string>
33#include <iostream>
34#include <memory>
35#include <gtest/gtest.h>
36
38
40{
41 ResMonoidDense M1(4,
42 std::vector<int>{1, 1, 1, 1},
43 std::vector<int>{},
45
47 std::vector<int>{1, 2, 3, 4},
48 std::vector<int>{1, 1, 1, 1, 1, 1, 0, 0},
50
51 ResMonoidDense M3(4,
52 std::vector<int>{1, 1, 1, 1},
53 std::vector<int>{},
55
56 EXPECT_EQ(4, M1.n_vars());
57 std::vector<res_monomial_word> monomspace(100);
58 EXPECT_EQ(100, monomspace.size());
59}
60
61TEST(ResMonoidDense, encodeDecode)
62{
64 std::vector<int>{1, 1, 1, 1},
65 std::vector<int>{},
67
68 // Loop through a number of exponent vectors, encode, then decode.
69
70 for (int i = 0; i < M.n_vars(); i++)
71 for (int j = i; j < M.n_vars(); j++)
72 {
73 int exp[]{0, 0, 0, 0};
74 exp[i]++;
75 exp[j]++;
76 int mon[]{0, 0, 0, 0, 0, 0, 0, 0};
77 // first encode
78 M.from_expvector(exp, 3, mon);
79 // now decode
80 component_index comp;
81 int exp2[]{0, 0, 0, 0};
82 M.to_expvector(mon, exp2, comp);
83 EXPECT_EQ(3, comp);
84 for (int k = 0; k < M.n_vars(); k++) EXPECT_EQ(exp[k], exp2[k]);
85 std::cout << "i=" << i << " j=" << j << " mon = ";
86 M.dump(std::cout, mon);
87 std::cout << std::endl;
88 }
89}
90
91TEST(ResMonoidSparse, encodeDecode)
92{
94 std::vector<int>{1, 1, 1, 1},
95 std::vector<int>{},
97
98 // Loop through a number of exponent vectors, encode, then decode.
99
100 for (int i = 0; i < M.n_vars(); i++)
101 for (int j = i; j < M.n_vars(); j++)
102 {
103 int exp[]{0, 0, 0, 0};
104 int mon[]{0, 0, 0, 0, 0, 0, 0, 0};
105 component_index comp;
106 int exp2[]{0, 0, 0, 0};
107 int mon2[]{0, 0, 0, 0, 0, 0, 0, 0};
108
109 exp[i]++;
110 exp[j]++;
111 // first encode
112 M.from_expvector(exp, 3, mon);
113 // now decode
114 M.to_expvector(mon, exp2, comp);
115 EXPECT_EQ(3, comp);
116 for (int k = 0; k < M.n_vars(); k++) EXPECT_EQ(exp[k], exp2[k]);
117 // now re-encode
118 M.from_expvector(exp2, 3, mon2);
119 EXPECT_TRUE(M.is_equal(mon, mon2));
120 // now display
121 std::cout << "i=" << i << " j=" << j << " mon = ";
122 M.dump(std::cout, mon);
123 std::cout << std::endl;
124 }
125}
126
128{
129 ResMonoidDense M(4,
130 std::vector<int>{1, 1, 1, 1},
131 std::vector<int>{},
133
134 int exp1[]{0, 0, 0, 0};
135 int exp2[]{0, 1, 0, 3};
136 int exp3[]{0, 0, 0, 0};
137 int mon1[]{0, 0, 0, 0, 0, 0};
138 int mon2[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
139 int mon3[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
140 int mon[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
141 int comp;
142 M.from_expvector(exp1, 0, mon1);
143 M.from_expvector(exp2, 0, mon2);
144 M.mult(mon1, mon2, mon);
145 M.to_expvector(mon, exp3, comp);
146 EXPECT_EQ(6, M.monomial_size(mon1));
147 EXPECT_EQ(6, M.monomial_size(mon2));
148 EXPECT_EQ(6, M.monomial_size(mon));
149
150 for (int i = 0; i < M.n_vars(); i++)
151 for (int j = i; j < M.n_vars(); j++)
152 for (int k = 0; k < M.n_vars(); k++)
153 {
154 int exp1[]{0, 0, 0, 0};
155 exp1[i]++;
156 exp1[j]++;
157 int exp2[]{0, 0, 0, 0};
158 exp2[k]++;
159 M.from_expvector(exp1, 0, mon1);
160 M.from_expvector(exp2, 0, mon2);
161 M.mult(mon1, mon2, mon);
162 M.mult(mon1, mon2, mon3);
163 EXPECT_TRUE(M.is_equal(mon, mon3));
164 M.to_expvector(mon, exp3, comp);
165 int exp3a[]{0, 0, 0, 0};
166 exp3a[i]++;
167 exp3a[j]++;
168 exp3a[k]++;
169 for (int ell = 0; ell < M.n_vars(); ell++)
170 EXPECT_EQ(exp3[ell], exp3a[ell]);
171 EXPECT_EQ(M.monomial_size(mon), M.monomial_size(mon1));
172 EXPECT_EQ(M.monomial_size(mon), M.monomial_size(mon2));
173 }
174}
175
177{
178 ResMonoidSparse M(4,
179 std::vector<int>{1, 1, 1, 1},
180 std::vector<int>{},
182
183 int exp1[]{0, 0, 0, 0};
184 int exp2[]{0, 1, 0, 3};
185 int exp3[]{0, 0, 0, 0};
186 int mon1[]{0, 0, 0, 0, 0, 0};
187 int mon2[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
188 int mon3[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
189 int mon[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
190 int comp;
191 M.from_expvector(exp1, 0, mon1);
192 M.from_expvector(exp2, 0, mon2);
193 M.mult(mon1, mon2, mon);
194 M.to_expvector(mon, exp3, comp);
195 EXPECT_EQ(3, M.monomial_size(mon1));
196 EXPECT_EQ(7, M.monomial_size(mon2));
197 EXPECT_EQ(7, M.monomial_size(mon));
198
199 for (int i = 0; i < M.n_vars(); i++)
200 for (int j = i; j < M.n_vars(); j++)
201 for (int k = 0; k < M.n_vars(); k++)
202 {
203 int exp1[]{0, 0, 0, 0};
204 exp1[i]++;
205 exp1[j]++;
206 int exp2[]{0, 0, 0, 0};
207 exp2[k]++;
208 M.from_expvector(exp1, 0, mon1);
209 M.from_expvector(exp2, 0, mon2);
210 M.mult(mon1, mon2, mon);
211 M.mult(mon1, mon2, mon3);
212 EXPECT_TRUE(M.is_equal(mon, mon3));
213 M.to_expvector(mon, exp3, comp);
214 int exp3a[]{0, 0, 0, 0};
215 exp3a[i]++;
216 exp3a[j]++;
217 exp3a[k]++;
218 for (int ell = 0; ell < M.n_vars(); ell++)
219 EXPECT_EQ(exp3[ell], exp3a[ell]);
220 EXPECT_EQ(M.monomial_size(mon),
221 M.monomial_size(mon1) + M.monomial_size(mon2) - 3);
222 }
223}
224
227TEST(ResMonoidDense, concatenateResMonoidDense) {}
228TEST(ResMonoidDense, outOfRange) {}
229TEST(ResMonoidDense, encodeBoundary) {}
230// Local Variables:
231// compile-command: "make -C $M2BUILDDIR/Macaulay2/e/unit-tests check "
232// indent-tabs-mode: nil
233// End:
TEST(ResMonoidDense, create)
Definition ResTest.cpp:39
Dense-format ResMonoid implementation: monomials laid out as fixed-width exponent vectors.
Sparse / varpower-format ResMonoid implementation: monomials laid out as length-prefixed lists of (va...
Definition aring-CC.cpp:3
ResMonoid dispatcher — single typedef switch between ResMonoidDense and ResMonoidSparse.
myword component_index