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 *
6 * Copyright:
7 * Christian Schulte, 2006
8 *
9 * This file is part of Gecode, the generic constraint
10 * development environment:
11 * http://www.gecode.org
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this software and associated documentation files (the
15 * "Software"), to deal in the Software without restriction, including
16 * without limitation the rights to use, copy, modify, merge, publish,
17 * distribute, sublicense, and/or sell copies of the Software, and to
18 * permit persons to whom the Software is furnished to do so, subject to
19 * the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be
22 * included in all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 *
32 */
33
34#include <gecode/int/linear.hh>
35
36namespace Gecode {
37
38 using namespace Int;
39
40 void
41 linear(Home home, const BoolVarArgs& x, IntRelType irt, int c,
42 IntPropLevel ipl) {
43 GECODE_POST;
44
45 int n=x.size();
46 Region re;
47 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
48 for (int i=0; i<n; i++) {
49 t[i].a=1; t[i].x=x[i];
50 }
51
52 Linear::post(home,t,n,irt,c,ipl);
53 }
54
55 void
56 linear(Home home, const BoolVarArgs& x, IntRelType irt, IntVar y,
57 IntPropLevel ipl) {
58 GECODE_POST;
59
60 int n=x.size();
61 Region re;
62 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
63 for (int i=0; i<n; i++) {
64 t[i].a=1; t[i].x=x[i];
65 }
66
67 Linear::post(home,t,n,irt,y,0,ipl);
68 }
69
70 void
71 linear(Home home,
72 const IntArgs& a, const BoolVarArgs& x, IntRelType irt, int c,
73 IntPropLevel ipl) {
74 if (a.size() != x.size())
75 throw ArgumentSizeMismatch("Int::linear");
76
77 GECODE_POST;
78
79 int n=x.size();
80 Region re;
81 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
82 for (int i=0; i<n; i++) {
83 t[i].a=a[i]; t[i].x=x[i];
84 }
85
86 Linear::post(home,t,n,irt,c,ipl);
87 }
88
89 void
90 linear(Home home,
91 const IntArgs& a, const BoolVarArgs& x, IntRelType irt, IntVar y,
92 IntPropLevel ipl) {
93 if (a.size() != x.size())
94 throw ArgumentSizeMismatch("Int::linear");
95
96 GECODE_POST;
97
98 int n=x.size();
99 Region re;
100 Linear::Term<BoolView>* t =
101 re.alloc<Linear::Term<BoolView>>(n);
102 for (int i=0; i<n; i++) {
103 t[i].a=a[i]; t[i].x=x[i];
104 }
105 int min, max;
106 estimate(t,n,0,min,max);
107 IntView v(y);
108 switch (irt) {
109 case IRT_EQ:
110 GECODE_ME_FAIL(v.gq(home,min)); GECODE_ME_FAIL(v.lq(home,max));
111 break;
112 case IRT_GQ:
113 GECODE_ME_FAIL(v.lq(home,max));
114 break;
115 case IRT_LQ:
116 GECODE_ME_FAIL(v.gq(home,min));
117 break;
118 default: ;
119 }
120 if (home.failed()) return;
121 Linear::post(home,t,n,irt,y,0,ipl);
122 }
123
124 void
125 linear(Home home, const BoolVarArgs& x, IntRelType irt, int c,
126 Reify r, IntPropLevel ipl) {
127 GECODE_POST;
128
129 int n=x.size();
130 Region re;
131 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
132 for (int i=0; i<n; i++) {
133 t[i].a=1; t[i].x=x[i];
134 }
135
136 Linear::post(home,t,n,irt,c,r,ipl);
137 }
138
139 void
140 linear(Home home, const BoolVarArgs& x, IntRelType irt, IntVar y,
141 Reify r, IntPropLevel ipl) {
142 GECODE_POST;
143
144 int n=x.size();
145 Region re;
146 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
147 for (int i=0; i<n; i++) {
148 t[i].a=1; t[i].x=x[i];
149 }
150
151 Linear::post(home,t,n,irt,y,r,ipl);
152 }
153
154 void
155 linear(Home home,
156 const IntArgs& a, const BoolVarArgs& x, IntRelType irt, int c,
157 Reify r, IntPropLevel ipl) {
158 if (a.size() != x.size())
159 throw ArgumentSizeMismatch("Int::linear");
160 GECODE_POST;
161
162 int n=x.size();
163 Region re;
164 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
165 for (int i=0; i<n; i++) {
166 t[i].a=a[i]; t[i].x=x[i];
167 }
168
169 Linear::post(home,t,n,irt,c,r,ipl);
170 }
171
172 void
173 linear(Home home,
174 const IntArgs& a, const BoolVarArgs& x, IntRelType irt, IntVar y,
175 Reify r, IntPropLevel ipl) {
176 if (a.size() != x.size())
177 throw ArgumentSizeMismatch("Int::linear");
178 GECODE_POST;
179
180 int n=x.size();
181 Region re;
182 Linear::Term<BoolView>* t = re.alloc<Linear::Term<BoolView>>(n);
183 for (int i=0; i<n; i++) {
184 t[i].a=a[i]; t[i].x=x[i];
185 }
186
187 Linear::post(home,t,n,irt,y,r,ipl);
188 }
189
190}
191
192// STATISTICS: int-post