this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Christian Schulte <schulte@gecode.org>
5 * Vincent Barichard <Vincent.Barichard@univ-angers.fr>
6 *
7 * Copyright:
8 * Christian Schulte, 2002
9 * Vincent Barichard, 2012
10 *
11 * This file is part of Gecode, the generic constraint
12 * development environment:
13 * http://www.gecode.org
14 *
15 * Permission is hereby granted, free of charge, to any person obtaining
16 * a copy of this software and associated documentation files (the
17 * "Software"), to deal in the Software without restriction, including
18 * without limitation the rights to use, copy, modify, merge, publish,
19 * distribute, sublicense, and/or sell copies of the Software, and to
20 * permit persons to whom the Software is furnished to do so, subject to
21 * the following conditions:
22 *
23 * The above copyright notice and this permission notice shall be
24 * included in all copies or substantial portions of the Software.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 *
34 */
35
36#include <gecode/float/rel.hh>
37
38#include <algorithm>
39
40namespace Gecode {
41
42 void
43 rel(Home home, FloatVar x0, FloatRelType frt, FloatVal n) {
44 using namespace Float;
45 Limits::check(n,"Float::rel");
46 GECODE_POST;
47 FloatView x(x0);
48 switch (frt) {
49 case FRT_EQ: GECODE_ME_FAIL(x.eq(home,n)); break;
50 case FRT_NQ:
51 GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,x,n)));
52 break;
53 case FRT_LQ: GECODE_ME_FAIL(x.lq(home,n)); break;
54 case FRT_LE:
55 GECODE_ME_FAIL(x.lq(home,n));
56 GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,x,n)));
57 break;
58 case FRT_GQ: GECODE_ME_FAIL(x.gq(home,n)); break;
59 case FRT_GR:
60 GECODE_ME_FAIL(x.gq(home,n));
61 GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,x,n)));
62 break;
63 default: throw UnknownRelation("Float::rel");
64 }
65 }
66
67 void
68 rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1) {
69 using namespace Float;
70 GECODE_POST;
71 switch (frt) {
72 case FRT_EQ:
73 GECODE_ES_FAIL((Rel::Eq<FloatView,FloatView>::post(home,x0,x1)));
74 break;
75 case FRT_NQ:
76 GECODE_ES_FAIL((Rel::Nq<FloatView,FloatView>::post(home,x0,x1)));
77 break;
78 case FRT_GQ:
79 std::swap(x0,x1); // Fall through
80 case FRT_LQ:
81 GECODE_ES_FAIL((Rel::Lq<FloatView>::post(home,x0,x1))); break;
82 case FRT_GR:
83 std::swap(x0,x1); // Fall through
84 case FRT_LE:
85 GECODE_ES_FAIL((Rel::Le<FloatView>::post(home,x0,x1))); break;
86 default:
87 throw UnknownRelation("Float::rel");
88 }
89 }
90
91 void
92 rel(Home home, FloatVar x0, FloatRelType frt, FloatVar x1, Reify r) {
93 using namespace Float;
94 GECODE_POST;
95 switch (frt) {
96 case FRT_EQ:
97 switch (r.mode()) {
98 case RM_EQV:
99 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::BoolView,RM_EQV>::
100 post(home,x0,x1,r.var())));
101 break;
102 case RM_IMP:
103 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::BoolView,RM_IMP>::
104 post(home,x0,x1,r.var())));
105 break;
106 case RM_PMI:
107 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::BoolView,RM_PMI>::
108 post(home,x0,x1,r.var())));
109 break;
110 default: throw Int::UnknownReifyMode("Float::rel");
111 }
112 break;
113 case FRT_NQ:
114 {
115 Int::NegBoolView n(r.var());
116 switch (r.mode()) {
117 case RM_EQV:
118 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::NegBoolView,RM_EQV>::
119 post(home,x0,x1,n)));
120 break;
121 case RM_IMP:
122 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::NegBoolView,RM_PMI>::
123 post(home,x0,x1,n)));
124 break;
125 case RM_PMI:
126 GECODE_ES_FAIL((Rel::ReEq<FloatView,Int::NegBoolView,RM_IMP>::
127 post(home,x0,x1,n)));
128 break;
129 default: throw Int::UnknownReifyMode("Float::rel");
130 }
131 break;
132 }
133 case FRT_GQ:
134 std::swap(x0,x1); // Fall through
135 case FRT_LQ:
136 switch (r.mode()) {
137 case RM_EQV:
138 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::BoolView,RM_EQV>::
139 post(home,x0,x1,r.var())));
140 break;
141 case RM_IMP:
142 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::BoolView,RM_IMP>::
143 post(home,x0,x1,r.var())));
144 break;
145 case RM_PMI:
146 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::BoolView,RM_PMI>::
147 post(home,x0,x1,r.var())));
148 break;
149 default: throw Int::UnknownReifyMode("Float::rel");
150 }
151 break;
152 case FRT_LE:
153 std::swap(x0,x1); // Fall through
154 case FRT_GR:
155 {
156 Int::NegBoolView n(r.var());
157 switch (r.mode()) {
158 case RM_EQV:
159 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::NegBoolView,RM_EQV>::
160 post(home,x0,x1,n)));
161 break;
162 case RM_IMP:
163 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::NegBoolView,RM_PMI>::
164 post(home,x0,x1,n)));
165 break;
166 case RM_PMI:
167 GECODE_ES_FAIL((Rel::ReLq<FloatView,Int::NegBoolView,RM_IMP>::
168 post(home,x0,x1,n)));
169 break;
170 default: throw Int::UnknownReifyMode("Float::rel");
171 }
172 break;
173 }
174 default:
175 throw Int::UnknownRelation("Float::rel");
176 }
177 }
178
179 void
180 rel(Home home, FloatVar x, FloatRelType frt, FloatVal n, Reify r) {
181 using namespace Float;
182 Limits::check(n,"Float::rel");
183 GECODE_POST;
184 switch (frt) {
185 case FRT_EQ:
186 switch (r.mode()) {
187 case RM_EQV:
188 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_EQV>::
189 post(home,x,n,r.var())));
190 break;
191 case RM_IMP:
192 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_IMP>::
193 post(home,x,n,r.var())));
194 break;
195 case RM_PMI:
196 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::BoolView,RM_PMI>::
197 post(home,x,n,r.var())));
198 break;
199 default: throw Int::UnknownReifyMode("Float::rel");
200 }
201 break;
202 case FRT_NQ:
203 {
204 Int::NegBoolView nb(r.var());
205 switch (r.mode()) {
206 case RM_EQV:
207 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::NegBoolView,RM_EQV>::
208 post(home,x,n,nb)));
209 break;
210 case RM_IMP:
211 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::NegBoolView,RM_PMI>::
212 post(home,x,n,nb)));
213 break;
214 case RM_PMI:
215 GECODE_ES_FAIL((Rel::ReEqFloat<FloatView,Int::NegBoolView,RM_IMP>::
216 post(home,x,n,nb)));
217 break;
218 default: throw Int::UnknownReifyMode("Float::rel");
219 }
220 break;
221 }
222 case FRT_LQ:
223 switch (r.mode()) {
224 case RM_EQV:
225 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::BoolView,RM_EQV>::
226 post(home,x,n,r.var())));
227 break;
228 case RM_IMP:
229 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::BoolView,RM_IMP>::
230 post(home,x,n,r.var())));
231 break;
232 case RM_PMI:
233 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::BoolView,RM_PMI>::
234 post(home,x,n,r.var())));
235 break;
236 default: throw Int::UnknownReifyMode("Float::rel");
237 }
238 break;
239 case FRT_LE:
240 switch (r.mode()) {
241 case RM_EQV:
242 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::BoolView,RM_EQV>::
243 post(home,x,n,r.var())));
244 break;
245 case RM_IMP:
246 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::BoolView,RM_IMP>::
247 post(home,x,n,r.var())));
248 break;
249 case RM_PMI:
250 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::BoolView,RM_PMI>::
251 post(home,x,n,r.var())));
252 break;
253 default: throw Int::UnknownReifyMode("Float::rel");
254 }
255 break;
256 case FRT_GQ:
257 {
258 Int::NegBoolView nb(r.var());
259 switch (r.mode()) {
260 case RM_EQV:
261 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::NegBoolView,RM_EQV>::
262 post(home,x,n,nb)));
263 break;
264 case RM_IMP:
265 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::NegBoolView,RM_PMI>::
266 post(home,x,n,nb)));
267 break;
268 case RM_PMI:
269 GECODE_ES_FAIL((Rel::ReLeFloat<FloatView,Int::NegBoolView,RM_IMP>::
270 post(home,x,n,nb)));
271 break;
272 default: throw Int::UnknownReifyMode("Float::rel");
273 }
274 break;
275 }
276 case FRT_GR:
277 {
278 Int::NegBoolView nb(r.var());
279 switch (r.mode()) {
280 case RM_EQV:
281 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::NegBoolView,RM_EQV>::
282 post(home,x,n,nb)));
283 break;
284 case RM_IMP:
285 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::NegBoolView,RM_PMI>::
286 post(home,x,n,nb)));
287 break;
288 case RM_PMI:
289 GECODE_ES_FAIL((Rel::ReLqFloat<FloatView,Int::NegBoolView,RM_IMP>::
290 post(home,x,n,nb)));
291 break;
292 default: throw Int::UnknownReifyMode("Float::rel");
293 }
294 break;
295 }
296 default:
297 throw Int::UnknownRelation("Float::rel");
298 }
299 }
300
301 void
302 rel(Home home, const FloatVarArgs& x, FloatRelType frt, FloatVal c) {
303 using namespace Float;
304 Limits::check(c,"Float::rel");
305 GECODE_POST;
306 switch (frt) {
307 case FRT_EQ:
308 for (int i=x.size(); i--; ) {
309 FloatView xi(x[i]); GECODE_ME_FAIL(xi.eq(home,c));
310 }
311 break;
312 case FRT_NQ:
313 for (int i=x.size(); i--; ) {
314 FloatView xi(x[i]); GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,xi,c)));
315 }
316 break;
317 case FRT_LQ:
318 for (int i=x.size(); i--; ) {
319 FloatView xi(x[i]); GECODE_ME_FAIL(xi.lq(home,c));
320 }
321 break;
322 case FRT_LE:
323 for (int i=x.size(); i--; ) {
324 FloatView xi(x[i]); GECODE_ME_FAIL(xi.lq(home,c));
325 GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,xi,c)));
326 }
327 break;
328 case FRT_GQ:
329 for (int i=x.size(); i--; ) {
330 FloatView xi(x[i]); GECODE_ME_FAIL(xi.gq(home,c));
331 }
332 break;
333 case FRT_GR:
334 for (int i=x.size(); i--; ) {
335 FloatView xi(x[i]); GECODE_ME_FAIL(xi.gq(home,c));
336 GECODE_ES_FAIL((Rel::NqFloat<FloatView>::post(home,xi,c)));
337 }
338 break;
339 default:
340 throw UnknownRelation("Float::rel");
341 }
342 }
343
344 void
345 rel(Home home, const FloatVarArgs& x, FloatRelType frt, FloatVar y) {
346 using namespace Float;
347 GECODE_POST;
348 switch (frt) {
349 case FRT_EQ:
350 for (int i=x.size(); i--; ) {
351 GECODE_ES_FAIL((Rel::Eq<FloatView,FloatView>::post(home,y,x[i])));
352 }
353 break;
354 case FRT_NQ:
355 for (int i=x.size(); i--; ) {
356 GECODE_ES_FAIL((Rel::Nq<FloatView,FloatView>::post(home,y,x[i])));
357 }
358 break;
359 case FRT_GQ:
360 for (int i=x.size(); i--; ) {
361 GECODE_ES_FAIL((Rel::Lq<FloatView>::post(home,y,x[i])));
362 }
363 break;
364 case FRT_GR:
365 for (int i=x.size(); i--; ) {
366 GECODE_ES_FAIL((Rel::Le<FloatView>::post(home,y,x[i])));
367 }
368 break;
369 case FRT_LQ:
370 for (int i=x.size(); i--; ) {
371 GECODE_ES_FAIL((Rel::Lq<FloatView>::post(home,x[i],y)));
372 }
373 break;
374 case FRT_LE:
375 for (int i=x.size(); i--; ) {
376 GECODE_ES_FAIL((Rel::Le<FloatView>::post(home,x[i],y)));
377 }
378 break;
379 default:
380 throw UnknownRelation("Float::rel");
381 }
382 }
383}
384
385// STATISTICS: float-post