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