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