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 
42 namespace Gecode {
43 
SetVarArray(Space & home,int n)44   SetVarArray::SetVarArray(Space& home, int n)
45     : VarArray<SetVar>(home,n) {
46     for (int i = size(); i--; )
47       x[i] = SetVar(home);
48   }
49 
SetVarArray(Space & home,int n,int lbMin,int lbMax,int ubMin,int ubMax,unsigned int minCard,unsigned int maxCard)50   SetVarArray::SetVarArray(Space& home,int n,
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 
SetVarArray(Space & home,int n,const IntSet & glb,int ubMin,int ubMax,unsigned int minCard,unsigned int maxCard)71   SetVarArray::SetVarArray(Space& home,int n,
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 
SetVarArray(Space & home,int n,int lbMin,int lbMax,const IntSet & lub,unsigned int minCard,unsigned int maxCard)90   SetVarArray::SetVarArray(Space& home,int n,
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 
SetVarArray(Space & home,int n,const IntSet & glb,const IntSet & lub,unsigned int minCard,unsigned int maxCard)111   SetVarArray::SetVarArray(Space& home,int n,
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 
SetVarArgs(Space & home,int n,int lbMin,int lbMax,int ubMin,int ubMax,unsigned int minCard,unsigned int maxCard)131   SetVarArgs::SetVarArgs(Space& home,int n,
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 
SetVarArgs(Space & home,int n,const IntSet & glb,int ubMin,int ubMax,unsigned int minCard,unsigned int maxCard)152   SetVarArgs::SetVarArgs(Space& home,int n,
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 
SetVarArgs(Space & home,int n,int lbMin,int lbMax,const IntSet & lub,unsigned int minCard,unsigned int maxCard)171   SetVarArgs::SetVarArgs(Space& home,int n,
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 
SetVarArgs(Space & home,int n,const IntSet & glb,const IntSet & lub,unsigned int minCard,unsigned int maxCard)192   SetVarArgs::SetVarArgs(Space& home,int n,
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 
216