Frobby 0.9.5
TermGraderTest.cpp
Go to the documentation of this file.
1/* Frobby: Software for monomial ideal computations.
2 Copyright (C) 2009 Bjarke Hammersholt Roune (www.broune.com)
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see http://www.gnu.org/licenses/.
16*/
17#include "stdinc.h"
18#include "TermGrader.h"
19#include "tests.h"
20
21#include "TermTranslator.h"
22#include "Term.h"
23
25
26TEST(TermGrader, getUpperBound) {
27 vector<mpz_class> v(3);
28 v[0] = -10;
29 v[1] = 0;
30 v[2] = 10;
32
33 // Simple cases.
34 ASSERT_EQ(grader.getUpperBound(Term("0 0 0"), Term("0 0 0")), 0);
35 ASSERT_EQ(grader.getUpperBound(Term("1 0 0"), Term("2 0 0")), -10);
36 ASSERT_EQ(grader.getUpperBound(Term("0 1 0"), Term("0 2 0")), 0);
37 ASSERT_EQ(grader.getUpperBound(Term("0 0 1"), Term("0 0 2")), 20);
38 ASSERT_EQ(grader.getUpperBound(Term("1 1 1"), Term("2 2 2")), 10);
39
40 // Test handling of highest value mapping to zero.
41 ASSERT_EQ(grader.getUpperBound(Term("9 9 9"), Term("9 9 9")), 0);
42 ASSERT_EQ(grader.getUpperBound(Term("1 0 0"), Term("9 0 0")), 0);
43 ASSERT_EQ(grader.getUpperBound(Term("0 0 0"), Term("0 9 0")), 0);
44 ASSERT_EQ(grader.getUpperBound(Term("0 0 0"), Term("0 0 9")), 80);
45 ASSERT_EQ(grader.getUpperBound(Term("1 1 1"), Term("9 9 9")), 80);
46}
47
48#define MIN_INDEX_TEST(from, to, maxDegree, strict, expectFind, expectedIndex) \
49 { \
50 Exponent foundIndex = 0; \
51 bool returnValue = grader.getMinIndexLessThan \
52 (0, from, to, foundIndex, maxDegree - strict); \
53 if (expectFind) { \
54 ASSERT_TRUE(returnValue); \
55 ASSERT_EQ(foundIndex, (Exponent)expectedIndex); \
56 } else { \
57 ASSERT_FALSE(returnValue); \
58 } \
59 }
60
62 vector<mpz_class> v;
63 v.push_back(-2);
65
66 // General case of represented degree
67 MIN_INDEX_TEST(0, 10, -12, true, true, 7); // -14 < -12
68 MIN_INDEX_TEST(0, 10, -12, false, true, 6); // -12 <= -12
69
70 // General case not of represented degree
71 MIN_INDEX_TEST(0, 10, -5, true, true, 3); // -6 < -5
72 MIN_INDEX_TEST(0, 10, -5, false, true, 3); // -6 <= -5
73
74 // The zero at 0
75 MIN_INDEX_TEST(0, 10, 0, true, true, 1); // -2 < 0
76 MIN_INDEX_TEST(0, 10, 0, false, true, 0); // 0 <= 0
77
78 // The zero at 10
79 MIN_INDEX_TEST(10, 10, 1, true, true, 10); // 0 < 1
80 MIN_INDEX_TEST(10, 10, 0, false, true, 10); // 0 <= 0
81
82 // Left of interval
83 MIN_INDEX_TEST(4, 10, -6, true, true, 4);
84 MIN_INDEX_TEST(4, 10, -5, false, true, 4);
85
86 // Right of interval
87 MIN_INDEX_TEST(0, 3, -6, true, false, 0); // no [0,-6] < -6
88 MIN_INDEX_TEST(0, 3, -7, false, false, 0); // no [0,-6] <= -7
89
90 // Empty interval
91 MIN_INDEX_TEST(10, 0, -5, true, false, 0);
92 MIN_INDEX_TEST(10, 0, -5, false, false, 0);
93}
94
96 vector<mpz_class> v;
97 v.push_back(2);
99
100 // General case
101 MIN_INDEX_TEST(0, 10, 12, true, true, 0); // 0 < 12
102 MIN_INDEX_TEST(0, 10, 12, false, true, 0); // 0 <= 12
103
104 // The zero at 0
105 MIN_INDEX_TEST(0, 10, 0, true, false, 0); // 0 not < [0,18]
106 MIN_INDEX_TEST(0, 10, 0, false, true, 0); // 0 <= 0
107
108 // The zero at 10
109 MIN_INDEX_TEST(10, 10, 0, true, false, 0); // 0 not < 0
110 MIN_INDEX_TEST(10, 10, 0, false, true, 10); // 0 <= 0
111
112 // Search at -1.
113 MIN_INDEX_TEST(0, 10, -1, true, false, 0);
114 MIN_INDEX_TEST(0, 10, -1, false, false, 0);
115
116 // Empty interval
117 MIN_INDEX_TEST(10, 0, -5, true, false, 0);
118 MIN_INDEX_TEST(10, 0, -5, false, false, 0);
119}
120
122 vector<mpz_class> v;
123 v.push_back(0);
125
126 // Search above 0.
127 MIN_INDEX_TEST(5, 10, 1, true, true, 5);
128 MIN_INDEX_TEST(5, 10, 1, false, true, 5);
129
130 // Search at 0.
131 MIN_INDEX_TEST(5, 10, 0, true, false, 0);
132 MIN_INDEX_TEST(5, 10, 0, false, true, 5);
133
134 // Search at -1.
135 MIN_INDEX_TEST(0, 10, -1, true, false, 0);
136 MIN_INDEX_TEST(0, 10, -1, false, false, 0);
137
138 // Empty interval
139 MIN_INDEX_TEST(10, 0, -5, true, false, 0);
140 MIN_INDEX_TEST(10, 0, -5, false, false, 0);
141}
142
143
144
145#define MAX_INDEX_TEST(from, to, maxDegree, strict, expectFind, expectedIndex) \
146 { \
147 Exponent foundIndex = 0; \
148 bool returnValue = grader.getMaxIndexLessThan \
149 (0, from, to, foundIndex, maxDegree - strict); \
150 if (expectFind) { \
151 ASSERT_TRUE(returnValue); \
152 ASSERT_EQ(foundIndex, (Exponent)expectedIndex); \
153 } else { \
154 ASSERT_FALSE(returnValue); \
155 } \
156 }
157
159 vector<mpz_class> v;
160 v.push_back(-2);
162
163 // General case
164 MAX_INDEX_TEST(0, 10, -12, true, true, 9); // -18 < -12
165 MAX_INDEX_TEST(0, 10, -12, false, true, 9); // -18 <= 12
166
167 // The zero at 10
168 MAX_INDEX_TEST(10, 10, 0, true, false, 0); // 0 not < 0
169 MAX_INDEX_TEST(0, 10, 0, false, true, 10); // 0 <= 0
170
171 // The zero at 0
172 MAX_INDEX_TEST(0, 0, 0, true, false, 0); // 0 not < 0
173 MAX_INDEX_TEST(0, 0, 0, false, true, 0); // 0 <= 0
174}
175
177 vector<mpz_class> v;
178 v.push_back(2);
180
181 // General case of represented degree
182 MAX_INDEX_TEST(0, 9, 12, true, true, 5); // 10 < 12
183 MAX_INDEX_TEST(0, 9, 12, false, true, 6); // 12 <= 12
184
185 // General case not of represented degree
186 MAX_INDEX_TEST(0, 9, 5, true, true, 2); // 4 < 5
187 MAX_INDEX_TEST(0, 9, 5, false, true, 2); // 4 <= 5
188
189 // The zero at 0
190 MAX_INDEX_TEST(0, 9, 1, true, true, 0); // 0 < 1
191 MAX_INDEX_TEST(0, 9, 0, false, true, 0); // 0 <= 0
192
193 // The zero at 10
194 MAX_INDEX_TEST(0, 10, 1, true, true, 10); // 0 < 1
195 MAX_INDEX_TEST(0, 10, 0, false, true, 10); // 0 <= 0
196
197 // Left of interval
198 MAX_INDEX_TEST(4, 9, 7, true, false, 0); // no [8, 18] < 7
199 MAX_INDEX_TEST(4, 9, 7, false, false, 0); // no [8, 18] <= 7
200
201 // Right of interval
202 MAX_INDEX_TEST(1, 5, 12, true, true, 5); // 10 < 12
203 MAX_INDEX_TEST(1, 5, 12, false, true, 5); // 10 <= 12
204
205 // Search at -1.
206 MAX_INDEX_TEST(0, 10, -1, true, false, 0); // no [0,18] < -1
207 MAX_INDEX_TEST(0, 10, -1, false, false, 0); // no [0,18] <= -1
208}
209
211 vector<mpz_class> v;
212 v.push_back(0);
214
215 // Search above 0.
216 MAX_INDEX_TEST(5, 10, 1, true, true, 10);
217 MAX_INDEX_TEST(5, 10, 1, false, true, 10);
218
219 // Search at 0.
220 MAX_INDEX_TEST(5, 10, 0, true, false, 0);
221 MAX_INDEX_TEST(5, 10, 0, false, true, 10);
222
223 // Search at -1.
224 MAX_INDEX_TEST(0, 10, -1, true, false, 0);
225 MAX_INDEX_TEST(0, 10, -1, false, false, 0);
226}
void nameFactoryRegister(NameFactory< AbstractProduct > &factory)
Registers the string returned by ConcreteProduct::getStaticName() to a function that default-construc...
#define MIN_INDEX_TEST(from, to, maxDegree, strict, expectFind, expectedIndex)
#define MAX_INDEX_TEST(from, to, maxDegree, strict, expectFind, expectedIndex)
#define ASSERT_EQ(A, B)
Definition asserts.h:147
A TermGrader assigns a value, the degree, to each monomial.
Definition TermGrader.h:27
TermTranslator handles translation between terms whose exponents are infinite precision integers and ...
Term represents a product of variables which does not include a coefficient.
Definition Term.h:49
#define TEST(SUITE, TEST_NAME)
Definition macroes.h:41
#define TEST_SUITE(SUITE)
Definition macroes.h:26