Generated on Sat Feb 7 2015 02:01:24 for Gecode by doxygen 1.8.9.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: 2012-09-07 17:31:22 +0200 (Fri, 07 Sep 2012) $ by $Author: schulte $
11  * $Revision: 13068 $
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 irt, 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(),irt,c,icl);
55  }
56 
57  void
58  linear(Home home,
59  const IntVarArgs& x, IntRelType irt, int c, Reify r,
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(),irt,c,r);
68  }
69 
70  void
71  linear(Home home,
72  const IntArgs& a, const IntVarArgs& x, IntRelType irt, 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(),irt,c,icl);
83  }
84 
85  void
86  linear(Home home,
87  const IntArgs& a, const IntVarArgs& x, IntRelType irt, int c,
88  Reify r, 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(),irt,c,r);
98  }
99 
100  void
101  linear(Home home,
102  const IntVarArgs& x, IntRelType irt, 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 (irt) {
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,irt,0,icl);
128  }
129 
130  void
131  linear(Home home,
132  const IntVarArgs& x, IntRelType irt, IntVar y, Reify r,
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,irt,0,r);
142  }
143 
144  void
145  linear(Home home,
146  const IntArgs& a, const IntVarArgs& x, IntRelType irt, 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 (irt) {
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,irt,0,icl);
174  }
175 
176  void
177  linear(Home home,
178  const IntArgs& a, const IntVarArgs& x, IntRelType irt, IntVar y,
179  Reify r, 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,irt,0,r);
190  }
191 
192 }
193 
194 // STATISTICS: int-post
bool failed(void) const
Check whether corresponding space is failed.
Definition: core.hpp:3446
NodeType t
Type of node.
Definition: bool-expr.cpp:234
IntConLevel
Consistency levels for integer propagators.
Definition: int.hh:937
void linear(Home home, const FloatVarArgs &x, FloatRelType frt, FloatNum c)
Post propagator for .
Definition: linear.cpp:45
int size(void) const
Return size of array (number of elements)
Definition: array.hpp:1662
void post(Home home, Term< BoolView > *t, int n, IntRelType irt, IntView x, int c, IntConLevel)
Post propagator for linear constraint over Booleans.
Definition: bool-post.cpp:608
int a
Coefficient.
Definition: linear.hh:1313
T * alloc(long unsigned int n)
Allocate block of n objects of type T from region.
Definition: region.hpp:326
void max(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Definition: arithmetic.cpp:57
Less or equal ( )
Definition: int.hh:906
Handle to region.
Definition: region.hpp:61
Greater or equal ( )
Definition: int.hh:908
Gecode::FloatVal c(-8, 8)
Gecode::IntArgs i(4, 1, 2, 3, 4)
Equality ( )
Definition: int.hh:904
IntRelType
Relation types for integers.
Definition: int.hh:903
NNF * r
Right subtree.
Definition: bool-expr.cpp:246
Reification specification.
Definition: int.hh:854
Passing integer variables.
Definition: int.hh:636
Passing integer arguments.
Definition: int.hh:607
const int v[7]
Definition: distinct.cpp:207
void min(Home home, FloatVar x0, FloatVar x1, FloatVar x2)
Post propagator for .
Definition: arithmetic.cpp:75
Integer view for integer variables.
Definition: view.hpp:129
Node * x
Pointer to corresponding Boolean expression node.
Definition: bool-expr.cpp:253
Integer variables.
Definition: int.hh:350
void estimate(Term *t, int n, FloatVal c, FloatNum &l, FloatNum &u)
Estimate lower and upper bounds.
Definition: post.cpp:49
#define GECODE_ME_FAIL(me)
Check whether modification event me is failed, and fail space home.
Definition: macros.hpp:70
Class for describing linear term .
Definition: linear.hh:1310
Gecode toplevel namespace
Home class for posting propagators
Definition: core.hpp:717
Exception: Arguments are of different size
Definition: exception.hpp:77
struct Gecode::@518::NNF::@57::@59 a
For atomic nodes.