array.cpp
Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Guido Tack <tack@gecode.org> 00005 * Christian Schulte <schulte@gecode.org> 00006 * Gabor Szokoli <szokoli@gecode.org> 00007 * 00008 * Copyright: 00009 * Guido Tack, 2004 00010 * Christian Schulte, 2004 00011 * Gabor Szokoli, 2004 00012 * 00013 * Last modified: 00014 * $Date: 2010-07-14 17:46:18 +0200 (Wed, 14 Jul 2010) $ by $Author: schulte $ 00015 * $Revision: 11192 $ 00016 * 00017 * This file is part of Gecode, the generic constraint 00018 * development environment: 00019 * http://www.gecode.org 00020 * 00021 * Permission is hereby granted, free of charge, to any person obtaining 00022 * a copy of this software and associated documentation files (the 00023 * "Software"), to deal in the Software without restriction, including 00024 * without limitation the rights to use, copy, modify, merge, publish, 00025 * distribute, sublicense, and/or sell copies of the Software, and to 00026 * permit persons to whom the Software is furnished to do so, subject to 00027 * the following conditions: 00028 * 00029 * The above copyright notice and this permission notice shall be 00030 * included in all copies or substantial portions of the Software. 00031 * 00032 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00033 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00034 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00035 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00036 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00037 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00038 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00039 * 00040 */ 00041 00042 00043 00044 #include <gecode/set.hh> 00045 00046 namespace Gecode { 00047 00048 SetVarArray::SetVarArray(Space& home, int n) 00049 : VarArray<SetVar>(home,n) { 00050 for (int i = size(); i--; ) 00051 x[i] = SetVar(home); 00052 } 00053 00054 SetVarArray::SetVarArray(Space& home,int n, 00055 int lbMin,int lbMax,int ubMin,int ubMax, 00056 unsigned int minCard, 00057 unsigned int maxCard) 00058 : VarArray<SetVar>(home,n) { 00059 Set::Limits::check(lbMin,"SetVarArray::SetVarArray"); 00060 Set::Limits::check(lbMax,"SetVarArray::SetVarArray"); 00061 Set::Limits::check(ubMin,"SetVarArray::SetVarArray"); 00062 Set::Limits::check(ubMax,"SetVarArray::SetVarArray"); 00063 Set::Limits::check(maxCard,"SetVarArray::SetVarArray"); 00064 unsigned int glbSize = 00065 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U); 00066 unsigned int lubSize = 00067 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U); 00068 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00069 lbMin < ubMin || lbMax > ubMax) 00070 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray"); 00071 for (int i = size(); i--; ) 00072 x[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard); 00073 } 00074 00075 SetVarArray::SetVarArray(Space& home,int n, 00076 const IntSet& glb,int ubMin,int ubMax, 00077 unsigned int minCard,unsigned int maxCard) 00078 : VarArray<SetVar>(home,n) { 00079 Set::Limits::check(glb,"SetVarArray::SetVarArray"); 00080 Set::Limits::check(ubMin,"SetVarArray::SetVarArray"); 00081 Set::Limits::check(ubMax,"SetVarArray::SetVarArray"); 00082 Set::Limits::check(maxCard,"SetVarArray::SetVarArray"); 00083 IntSetRanges glbr(glb); 00084 unsigned int glbSize = Iter::Ranges::size(glbr); 00085 unsigned int lubSize = 00086 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U); 00087 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00088 glb.min() < ubMin || glb.max() > ubMax) 00089 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray"); 00090 for (int i = size(); i--; ) 00091 x[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard); 00092 } 00093 00094 SetVarArray::SetVarArray(Space& home,int n, 00095 int lbMin,int lbMax,const IntSet& lub, 00096 unsigned int minCard,unsigned int maxCard) 00097 : VarArray<SetVar>(home,n) { 00098 Set::Limits::check(lbMin,"SetVarArray::SetVarArray"); 00099 Set::Limits::check(lbMax,"SetVarArray::SetVarArray"); 00100 Set::Limits::check(lub,"SetVarArray::SetVarArray"); 00101 Set::Limits::check(maxCard,"SetVarArray::SetVarArray"); 00102 Iter::Ranges::Singleton glbr(lbMin,lbMax); 00103 IntSetRanges lubr(lub); 00104 IntSetRanges lubr_s(lub); 00105 unsigned int glbSize = 00106 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U); 00107 unsigned int lubSize = Iter::Ranges::size(lubr_s); 00108 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00109 !Iter::Ranges::subset(glbr,lubr)) 00110 throw Set::VariableEmptyDomain("SetVarArray::SetVarArray"); 00111 for (int i = size(); i--; ) 00112 x[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard); 00113 } 00114 00115 SetVarArray::SetVarArray(Space& home,int n, 00116 const IntSet& glb, const IntSet& lub, 00117 unsigned int minCard, unsigned int maxCard) 00118 : VarArray<SetVar>(home,n) { 00119 Set::Limits::check(glb,"SetVarArray::SetVarArray"); 00120 Set::Limits::check(lub,"SetVarArray::SetVarArray"); 00121 Set::Limits::check(maxCard,"SetVarArray::SetVarArray"); 00122 IntSetRanges glbr(glb); 00123 IntSetRanges glbr_s(lub); 00124 unsigned int glbSize = Iter::Ranges::size(glbr_s); 00125 IntSetRanges lubr(lub); 00126 IntSetRanges lubr_s(lub); 00127 unsigned int lubSize = Iter::Ranges::size(lubr_s); 00128 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00129 !Iter::Ranges::subset(glbr,lubr)) 00130 throw Set::VariableEmptyDomain("SetVar"); 00131 for (int i = size(); i--; ) 00132 x[i] = SetVar(home,glb,lub,minCard,maxCard); 00133 } 00134 00135 SetVarArgs::SetVarArgs(Space& home,int n, 00136 int lbMin,int lbMax,int ubMin,int ubMax, 00137 unsigned int minCard, 00138 unsigned int maxCard) 00139 : VarArgArray<SetVar>(n) { 00140 Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs"); 00141 Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs"); 00142 Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs"); 00143 Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs"); 00144 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs"); 00145 unsigned int glbSize = 00146 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U); 00147 unsigned int lubSize = 00148 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U); 00149 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00150 lbMin < ubMin || lbMax > ubMax) 00151 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs"); 00152 for (int i = size(); i--; ) 00153 a[i] = SetVar(home,lbMin,lbMax,ubMin,ubMax,minCard,maxCard); 00154 } 00155 00156 SetVarArgs::SetVarArgs(Space& home,int n, 00157 const IntSet& glb,int ubMin,int ubMax, 00158 unsigned int minCard,unsigned int maxCard) 00159 : VarArgArray<SetVar>(n) { 00160 Set::Limits::check(glb,"SetVarArgs::SetVarArgs"); 00161 Set::Limits::check(ubMin,"SetVarArgs::SetVarArgs"); 00162 Set::Limits::check(ubMax,"SetVarArgs::SetVarArgs"); 00163 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs"); 00164 IntSetRanges glbr(glb); 00165 unsigned int glbSize = Iter::Ranges::size(glbr); 00166 unsigned int lubSize = 00167 (ubMin <= ubMax ? static_cast<unsigned int>(ubMax-ubMin+1) : 0U); 00168 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00169 glb.min() < ubMin || glb.max() > ubMax) 00170 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs"); 00171 for (int i = size(); i--; ) 00172 a[i] = SetVar(home,glb,ubMin,ubMax,minCard,maxCard); 00173 } 00174 00175 SetVarArgs::SetVarArgs(Space& home,int n, 00176 int lbMin,int lbMax,const IntSet& lub, 00177 unsigned int minCard,unsigned int maxCard) 00178 : VarArgArray<SetVar>(n) { 00179 Set::Limits::check(lbMin,"SetVarArgs::SetVarArgs"); 00180 Set::Limits::check(lbMax,"SetVarArgs::SetVarArgs"); 00181 Set::Limits::check(lub,"SetVarArgs::SetVarArgs"); 00182 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs"); 00183 Iter::Ranges::Singleton glbr(lbMin,lbMax); 00184 IntSetRanges lubr(lub); 00185 IntSetRanges lubr_s(lub); 00186 unsigned int glbSize = 00187 (lbMin <= lbMax ? static_cast<unsigned int>(lbMax-lbMin+1) : 0U); 00188 unsigned int lubSize = Iter::Ranges::size(lubr_s); 00189 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00190 !Iter::Ranges::subset(glbr,lubr)) 00191 throw Set::VariableEmptyDomain("SetVarArgs::SetVarArgs"); 00192 for (int i = size(); i--; ) 00193 a[i] = SetVar(home,lbMin,lbMax,lub,minCard,maxCard); 00194 } 00195 00196 SetVarArgs::SetVarArgs(Space& home,int n, 00197 const IntSet& glb, const IntSet& lub, 00198 unsigned int minCard, unsigned int maxCard) 00199 : VarArgArray<SetVar>(n) { 00200 Set::Limits::check(glb,"SetVarArgs::SetVarArgs"); 00201 Set::Limits::check(lub,"SetVarArgs::SetVarArgs"); 00202 Set::Limits::check(maxCard,"SetVarArgs::SetVarArgs"); 00203 IntSetRanges glbr(glb); 00204 IntSetRanges glbr_s(lub); 00205 unsigned int glbSize = Iter::Ranges::size(glbr_s); 00206 IntSetRanges lubr(lub); 00207 IntSetRanges lubr_s(lub); 00208 unsigned int lubSize = Iter::Ranges::size(lubr_s); 00209 if (minCard > maxCard || minCard > lubSize || maxCard < glbSize || 00210 !Iter::Ranges::subset(glbr,lubr)) 00211 throw Set::VariableEmptyDomain("SetVar"); 00212 for (int i = size(); i--; ) 00213 a[i] = SetVar(home,glb,lub,minCard,maxCard); 00214 } 00215 00216 } 00217 00218 // STATISTICS: set-other 00219