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 
26 TEST(TermGrader, getUpperBound) {
27  vector<mpz_class> v(3);
28  v[0] = -10;
29  v[1] = 0;
30  v[2] = 10;
31  TermGrader grader(v, TermTranslator(3, 9));
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 
61 TEST(TermGrader, getMinIndexLessThanNegative) {
62  vector<mpz_class> v;
63  v.push_back(-2);
64  TermGrader grader(v, TermTranslator(1, 10));
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 
95 TEST(TermGrader, getMinIndexLessThanPositive) {
96  vector<mpz_class> v;
97  v.push_back(2);
98  TermGrader grader(v, TermTranslator(1, 10));
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 
121 TEST(TermGrader, getMinIndexLessThanZero) {
122  vector<mpz_class> v;
123  v.push_back(0);
124  TermGrader grader(v, TermTranslator(1, 10));
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 
158 TEST(TermGrader, getMaxIndexLessThanNegative) {
159  vector<mpz_class> v;
160  v.push_back(-2);
161  TermGrader grader(v, TermTranslator(1, 10));
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 
176 TEST(TermGrader, getMaxIndexLessThanPositive) {
177  vector<mpz_class> v;
178  v.push_back(2);
179  TermGrader grader(v, TermTranslator(1, 10));
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 
210 TEST(TermGrader, getMaxIndexLessThanZero) {
211  vector<mpz_class> v;
212  v.push_back(0);
213  TermGrader grader(v, TermTranslator(1, 10));
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 }
TEST(TermGrader, getUpperBound)
#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
void getUpperBound(const Term &divisor, const Term &dominator, mpz_class &bound) const
Assigns to bound the degree of the largest term v such that divisor divides v and v divides dominator...
Definition: TermGrader.cpp:69
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(SUITE)
Definition: macroes.h:26