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