Generated on Thu Jan 16 2025 00:00:00 for Gecode by doxygen 1.14.0
array.cpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Guido Tack <tack@gecode.org>
5 * Christian Schulte <schulte@gecode.org>
6 * Gabor Szokoli <szokoli@gecode.org>
7 *
8 * Copyright:
9 * Guido Tack, 2004
10 * Christian Schulte, 2004
11 * Gabor Szokoli, 2004
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
39
40#include <gecode/set.hh>
41
42namespace Gecode {
43
45 : VarArray<SetVar>(home,n) {
46 for (int i = size(); i--; )
47 x[i] = SetVar(home);
48 }
49
51 int lbMin,int lbMax,int ubMin,int ubMax,
52 unsigned int minCard,
53 unsigned int maxCard)
54 : VarArray<SetVar>(home,n) {
55 Set::Limits::check(lbMin,"SetVarArray::SetVarArray");
56 Set::Limits::check(lbMax,"SetVarArray::SetVarArray");
57 Set::Limits::check(ubMin,"SetVarArray::SetVarArray");
58 Set::Limits::check(ubMax,"SetVarArray::SetVarArray");
59 Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
60 unsigned int glbSize =
61 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
62 unsigned int lubSize =
63 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
64 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
65 lbMin < ubMin || lbMax > ubMax)
66 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
67 for (int i = size(); i--; )
68 x[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard);
69 }
70
72 const IntSet& glb,int ubMin,int ubMax,
73 unsigned int minCard,unsigned int maxCard)
74 : VarArray<SetVar>(home,n) {
75 Set::Limits::check(glb,"SetVarArray::SetVarArray");
76 Set::Limits::check(ubMin,"SetVarArray::SetVarArray");
77 Set::Limits::check(ubMax,"SetVarArray::SetVarArray");
78 Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
79 IntSetRanges glbr(glb);
80 unsigned int glbSize = Iter::Ranges::size(glbr);
81 unsigned int lubSize =
82 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
83 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
84 glb.min() < ubMin || glb.max() > ubMax)
85 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
86 for (int i = size(); i--; )
87 x[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard);
88 }
89
91 int lbMin,int lbMax,const IntSet& lub,
92 unsigned int minCard,unsigned int maxCard)
93 : VarArray<SetVar>(home,n) {
94 Set::Limits::check(lbMin,"SetVarArray::SetVarArray");
95 Set::Limits::check(lbMax,"SetVarArray::SetVarArray");
96 Set::Limits::check(lub,"SetVarArray::SetVarArray");
97 Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
98 Iter::Ranges::Singleton glbr(lbMin,lbMax);
99 IntSetRanges lubr(lub);
100 IntSetRanges lubr_s(lub);
101 unsigned int glbSize =
102 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
103 unsigned int lubSize = Iter::Ranges::size(lubr_s);
104 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
105 !Iter::Ranges::subset(glbr,lubr))
106 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray");
107 for (int i = size(); i--; )
108 x[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard);
109 }
110
112 const IntSet& glb, const IntSet& lub,
113 unsigned int minCard, unsigned int maxCard)
114 : VarArray<SetVar>(home,n) {
115 Set::Limits::check(glb,"SetVarArray::SetVarArray");
116 Set::Limits::check(lub,"SetVarArray::SetVarArray");
117 Set::Limits::check(maxCard,"SetVarArray::SetVarArray");
118 IntSetRanges glbr(glb);
119 IntSetRanges glbr_s(glb);
120 unsigned int glbSize = Iter::Ranges::size(glbr_s);
121 IntSetRanges lubr(lub);
122 IntSetRanges lubr_s(lub);
123 unsigned int lubSize = Iter::Ranges::size(lubr_s);
124 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
125 !Iter::Ranges::subset(glbr,lubr))
126 throw Set::VariableEmptyDomain("SetVar");
127 for (int i = size(); i--; )
128 x[i] = SetVar(home,glb,lub,minCard,maxCard);
129 }
130
132 int lbMin,int lbMax,int ubMin,int ubMax,
133 unsigned int minCard,
134 unsigned int maxCard)
135 : VarArgArray<SetVar>(n) {
136 Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs");
137 Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs");
138 Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs");
139 Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs");
140 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
141 unsigned int glbSize =
142 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
143 unsigned int lubSize =
144 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
145 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
146 lbMin < ubMin || lbMax > ubMax)
147 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
148 for (int i = size(); i--; )
149 a[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard);
150 }
151
153 const IntSet& glb,int ubMin,int ubMax,
154 unsigned int minCard,unsigned int maxCard)
155 : VarArgArray<SetVar>(n) {
156 Set::Limits::check(glb,"SetVarArgs::SetVarArgs");
157 Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs");
158 Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs");
159 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
160 IntSetRanges glbr(glb);
161 unsigned int glbSize = Iter::Ranges::size(glbr);
162 unsigned int lubSize =
163 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U);
164 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
165 glb.min() < ubMin || glb.max() > ubMax)
166 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
167 for (int i = size(); i--; )
168 a[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard);
169 }
170
172 int lbMin,int lbMax,const IntSet& lub,
173 unsigned int minCard,unsigned int maxCard)
174 : VarArgArray<SetVar>(n) {
175 Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs");
176 Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs");
177 Set::Limits::check(lub,"SetVarArgs::SetVarArgs");
178 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
179 Iter::Ranges::Singleton glbr(lbMin,lbMax);
180 IntSetRanges lubr(lub);
181 IntSetRanges lubr_s(lub);
182 unsigned int glbSize =
183 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U);
184 unsigned int lubSize = Iter::Ranges::size(lubr_s);
185 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
186 !Iter::Ranges::subset(glbr,lubr))
187 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs");
188 for (int i = size(); i--; )
189 a[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard);
190 }
191
193 const IntSet& glb, const IntSet& lub,
194 unsigned int minCard, unsigned int maxCard)
195 : VarArgArray<SetVar>(n) {
196 Set::Limits::check(glb,"SetVarArgs::SetVarArgs");
197 Set::Limits::check(lub,"SetVarArgs::SetVarArgs");
198 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs");
199 IntSetRanges glbr(glb);
200 IntSetRanges glbr_s(glb);
201 unsigned int glbSize = Iter::Ranges::size(glbr_s);
202 IntSetRanges lubr(lub);
203 IntSetRanges lubr_s(lub);
204 unsigned int lubSize = Iter::Ranges::size(lubr_s);
205 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize ||
206 !Iter::Ranges::subset(glbr,lubr))
207 throw Set::VariableEmptyDomain("SetVar");
208 for (int i = size(); i--; )
209 a[i] = SetVar(home,glb,lub,minCard,maxCard);
210 }
211
212}
213
214// STATISTICS: set-other
215
Range iterator for integer sets.
Definition int.hh:292
Integer sets.
Definition int.hh:174
int min(int i) const
Return minimum of range at position i.
int max(int i) const
Return maximum of range at position i.
Exception: Variable created with empty domain
Definition exception.hpp:59
Range iterator for singleton range.
SetVarArgs(void)
Allocate empty array.
Definition array.hpp:48
SetVarArray(void)
Default constructor (array of size 0)
Definition array.hpp:77
Set variables
Definition set.hh:127
Computation spaces.
Definition core.hpp:1744
int size(void) const
Definition array.hpp:932
bool subset(I &i, J &j)
Check whether range iterator i is subset of range iterator j.
unsigned int size(I &i)
Size of all ranges of range iterator i.
void check(int n, const char *l)
Check whether integer n is in range, otherwise throw overflow exception with information l.
Definition limits.hpp:37
Gecode toplevel namespace