Generated on Thu Feb 21 2013 23:11:44 for Gecode by doxygen 1.8.3.1
linear-int.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: 2010-03-04 03:40:32 +1100 (Thu, 04 Mar 2010) $ by $Author: schulte $
11  * $Revision: 10365 $
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/linear.hh>
39 
40 namespace Gecode {
41 
42  using namespace Int;
43 
44  void
45  linear(Home home,
46  const IntVarArgs& x, IntRelType r, int c,
47  IntConLevel icl) {
48  if (home.failed()) return;
49  Region re(home);
51  for (int i = x.size(); i--; ) {
52  t[i].a=1; t[i].x=x[i];
53  }
54  Linear::post(home,t,x.size(),r,c,icl);
55  }
56 
57  void
58  linear(Home home,
59  const IntVarArgs& x, IntRelType r, int c, BoolVar b,
60  IntConLevel) {
61  if (home.failed()) return;
62  Region re(home);
64  for (int i = x.size(); i--; ) {
65  t[i].a=1; t[i].x=x[i];
66  }
67  Linear::post(home,t,x.size(),r,c,b);
68  }
69 
70  void
71  linear(Home home,
72  const IntArgs& a, const IntVarArgs& x, IntRelType r, int c,
73  IntConLevel icl) {
74  if (a.size() != x.size())
75  throw ArgumentSizeMismatch("Int::linear");
76  if (home.failed()) return;
77  Region re(home);
79  for (int i = x.size(); i--; ) {
80  t[i].a=a[i]; t[i].x=x[i];
81  }
82  Linear::post(home,t,x.size(),r,c,icl);
83  }
84 
85  void
86  linear(Home home,
87  const IntArgs& a, const IntVarArgs& x, IntRelType r, int c, BoolVar b,
88  IntConLevel) {
89  if (a.size() != x.size())
90  throw ArgumentSizeMismatch("Int::linear");
91  if (home.failed()) return;
92  Region re(home);
94  for (int i = x.size(); i--; ) {
95  t[i].a=a[i]; t[i].x=x[i];
96  }
97  Linear::post(home,t,x.size(),r,c,b);
98  }
99 
100  void
101  linear(Home home,
102  const IntVarArgs& x, IntRelType r, IntVar y,
103  IntConLevel icl) {
104  if (home.failed()) return;
105  Region re(home);
107  for (int i = x.size(); i--; ) {
108  t[i].a=1; t[i].x=x[i];
109  }
110  int min, max;
111  estimate(t,x.size(),0,min,max);
112  IntView v(y);
113  switch (r) {
114  case IRT_EQ:
115  GECODE_ME_FAIL(v.gq(home,min)); GECODE_ME_FAIL(v.lq(home,max));
116  break;
117  case IRT_GQ:
118  GECODE_ME_FAIL(v.lq(home,max));
119  break;
120  case IRT_LQ:
121  GECODE_ME_FAIL(v.gq(home,min));
122  break;
123  default: ;
124  }
125  if (home.failed()) return;
126  t[x.size()].a=-1; t[x.size()].x=y;
127  Linear::post(home,t,x.size()+1,r,0,icl);
128  }
129 
130  void
131  linear(Home home,
132  const IntVarArgs& x, IntRelType r, IntVar y, BoolVar b,
133  IntConLevel) {
134  if (home.failed()) return;
135  Region re(home);
137  for (int i = x.size(); i--; ) {
138  t[i].a=1; t[i].x=x[i];
139  }
140  t[x.size()].a=-1; t[x.size()].x=y;
141  Linear::post(home,t,x.size()+1,r,0,b);
142  }
143 
144  void
145  linear(Home home,
146  const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
147  IntConLevel icl) {
148  if (a.size() != x.size())
149  throw ArgumentSizeMismatch("Int::linear");
150  if (home.failed()) return;
151  Region re(home);
153  for (int i = x.size(); i--; ) {
154  t[i].a=a[i]; t[i].x=x[i];
155  }
156  int min, max;
157  estimate(t,x.size(),0,min,max);
158  IntView v(y);
159  switch (r) {
160  case IRT_EQ:
161  GECODE_ME_FAIL(v.gq(home,min)); GECODE_ME_FAIL(v.lq(home,max));
162  break;
163  case IRT_GQ:
164  GECODE_ME_FAIL(v.lq(home,max));
165  break;
166  case IRT_LQ:
167  GECODE_ME_FAIL(v.gq(home,min));
168  break;
169  default: ;
170  }
171  if (home.failed()) return;
172  t[x.size()].a=-1; t[x.size()].x=y;
173  Linear::post(home,t,x.size()+1,r,0,icl);
174  }
175 
176  void
177  linear(Home home,
178  const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
179  BoolVar b, IntConLevel) {
180  if (a.size() != x.size())
181  throw ArgumentSizeMismatch("Int::linear");
182  if (home.failed()) return;
183  Region re(home);
185  for (int i = x.size(); i--; ) {
186  t[i].a=a[i]; t[i].x=x[i];
187  }
188  t[x.size()].a=-1; t[x.size()].x=y;
189  Linear::post(home,t,x.size()+1,r,0,b);
190  }
191 
192 }
193 
194 // STATISTICS: int-post