count.cpp
Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Christian Schulte <schulte@gecode.org> 00005 * 00006 * Copyright: 00007 * Christian Schulte, 2002 00008 * 00009 * Last modified: 00010 * $Date: 2010-06-03 20:34:20 +0200 (Thu, 03 Jun 2010) $ by $Author: schulte $ 00011 * $Revision: 11017 $ 00012 * 00013 * This file is part of Gecode, the generic constraint 00014 * development environment: 00015 * http://www.gecode.org 00016 * 00017 * Permission is hereby granted, free of charge, to any person obtaining 00018 * a copy of this software and associated documentation files (the 00019 * "Software"), to deal in the Software without restriction, including 00020 * without limitation the rights to use, copy, modify, merge, publish, 00021 * distribute, sublicense, and/or sell copies of the Software, and to 00022 * permit persons to whom the Software is furnished to do so, subject to 00023 * the following conditions: 00024 * 00025 * The above copyright notice and this permission notice shall be 00026 * included in all copies or substantial portions of the Software. 00027 * 00028 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00029 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00030 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00031 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00032 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00033 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00034 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00035 * 00036 */ 00037 00038 #include <gecode/int/count.hh> 00039 00040 namespace Gecode { 00041 00042 void 00043 count(Home home, const IntVarArgs& x, int n, 00044 IntRelType r, int m, IntConLevel) { 00045 using namespace Int; 00046 Limits::check(n,"Int::count"); 00047 Limits::check(m,"Int::count"); 00048 if (home.failed()) return; 00049 ViewArray<IntView> xv(home,x); 00050 ConstIntView y(n); 00051 switch (r) { 00052 case IRT_EQ: 00053 GECODE_ES_FAIL((Count::EqInt<IntView,ConstIntView> 00054 ::post(home,xv,y,m))); 00055 break; 00056 case IRT_NQ: 00057 GECODE_ES_FAIL((Count::NqInt<IntView,ConstIntView> 00058 ::post(home,xv,y,m))); 00059 break; 00060 case IRT_LE: 00061 GECODE_ES_FAIL((Count::LqInt<IntView,ConstIntView> 00062 ::post(home,xv,y,m-1))); 00063 break; 00064 case IRT_LQ: 00065 GECODE_ES_FAIL((Count::LqInt<IntView,ConstIntView> 00066 ::post(home,xv,y,m))); 00067 break; 00068 case IRT_GR: 00069 GECODE_ES_FAIL((Count::GqInt<IntView,ConstIntView> 00070 ::post(home,xv,y,m+1))); 00071 break; 00072 case IRT_GQ: 00073 GECODE_ES_FAIL((Count::GqInt<IntView,ConstIntView> 00074 ::post(home,xv,y,m))); 00075 break; 00076 default: 00077 throw UnknownRelation("Int::count"); 00078 } 00079 } 00080 00081 void 00082 count(Home home, const IntVarArgs& x, IntVar y, 00083 IntRelType r, int m, IntConLevel) { 00084 using namespace Int; 00085 Limits::check(m,"Int::count"); 00086 if (home.failed()) return; 00087 ViewArray<IntView> xv(home,x); 00088 switch (r) { 00089 case IRT_EQ: 00090 GECODE_ES_FAIL((Count::EqInt<IntView,IntView> 00091 ::post(home,xv,y,m))); 00092 break; 00093 case IRT_NQ: 00094 GECODE_ES_FAIL((Count::NqInt<IntView,IntView> 00095 ::post(home,xv,y,m))); 00096 break; 00097 case IRT_LE: 00098 GECODE_ES_FAIL((Count::LqInt<IntView,IntView> 00099 ::post(home,xv,y,m-1))); 00100 break; 00101 case IRT_LQ: 00102 GECODE_ES_FAIL((Count::LqInt<IntView,IntView> 00103 ::post(home,xv,y,m))); 00104 break; 00105 case IRT_GR: 00106 GECODE_ES_FAIL((Count::GqInt<IntView,IntView> 00107 ::post(home,xv,y,m+1))); 00108 break; 00109 case IRT_GQ: 00110 GECODE_ES_FAIL((Count::GqInt<IntView,IntView> 00111 ::post(home,xv,y,m))); 00112 break; 00113 default: 00114 throw UnknownRelation("Int::count"); 00115 } 00116 } 00117 00118 void 00119 count(Home home, const IntVarArgs& x, const IntArgs& y, 00120 IntRelType r, int m, IntConLevel) { 00121 using namespace Int; 00122 if (x.size() != y.size()) 00123 throw ArgumentSizeMismatch("Int::count"); 00124 Limits::check(m,"Int::count"); 00125 if (home.failed()) return; 00126 00127 ViewArray<OffsetView> xy(home,x.size()); 00128 for (int i=x.size(); i--; ) 00129 xy[i] = OffsetView(x[i],-y[i]); 00130 00131 ZeroIntView z; 00132 switch (r) { 00133 case IRT_EQ: 00134 GECODE_ES_FAIL((Count::EqInt<OffsetView,ZeroIntView> 00135 ::post(home,xy,z,m))); 00136 break; 00137 case IRT_NQ: 00138 GECODE_ES_FAIL((Count::NqInt<OffsetView,ZeroIntView> 00139 ::post(home,xy,z,m))); 00140 break; 00141 case IRT_LE: 00142 GECODE_ES_FAIL((Count::LqInt<OffsetView,ZeroIntView> 00143 ::post(home,xy,z,m-1))); 00144 break; 00145 case IRT_LQ: 00146 GECODE_ES_FAIL((Count::LqInt<OffsetView,ZeroIntView> 00147 ::post(home,xy,z,m))); 00148 break; 00149 case IRT_GR: 00150 GECODE_ES_FAIL((Count::GqInt<OffsetView,ZeroIntView> 00151 ::post(home,xy,z,m+1))); 00152 break; 00153 case IRT_GQ: 00154 GECODE_ES_FAIL((Count::GqInt<OffsetView,ZeroIntView> 00155 ::post(home,xy,z,m))); 00156 break; 00157 default: 00158 throw UnknownRelation("Int::count"); 00159 } 00160 } 00161 00162 void 00163 count(Home home, const IntVarArgs& x, int n, 00164 IntRelType r, IntVar z, IntConLevel) { 00165 using namespace Int; 00166 Limits::check(n,"Int::count"); 00167 if (home.failed()) return; 00168 ViewArray<IntView> xv(home,x); 00169 ConstIntView yv(n); 00170 switch (r) { 00171 case IRT_EQ: 00172 GECODE_ES_FAIL((Count::EqView<IntView,ConstIntView,IntView,true> 00173 ::post(home,xv,yv,z,0))); 00174 break; 00175 case IRT_NQ: 00176 GECODE_ES_FAIL((Count::NqView<IntView,ConstIntView,IntView,true> 00177 ::post(home,xv,yv,z,0))); 00178 break; 00179 case IRT_LE: 00180 GECODE_ES_FAIL((Count::LqView<IntView,ConstIntView,IntView,true> 00181 ::post(home,xv,yv,z,-1))); 00182 break; 00183 case IRT_LQ: 00184 GECODE_ES_FAIL((Count::LqView<IntView,ConstIntView,IntView,true> 00185 ::post(home,xv,yv,z,0))); 00186 break; 00187 case IRT_GR: 00188 GECODE_ES_FAIL((Count::GqView<IntView,ConstIntView,IntView,true> 00189 ::post(home,xv,yv,z,1))); 00190 break; 00191 case IRT_GQ: 00192 GECODE_ES_FAIL((Count::GqView<IntView,ConstIntView,IntView,true> 00193 ::post(home,xv,yv,z,0))); 00194 break; 00195 default: 00196 throw UnknownRelation("Int::count"); 00197 } 00198 } 00199 00200 void 00201 count(Home home, const IntVarArgs& x, IntVar y, 00202 IntRelType r, IntVar z, IntConLevel) { 00203 using namespace Int; 00204 if (home.failed()) return; 00205 ViewArray<IntView> xv(home,x); 00206 switch (r) { 00207 case IRT_EQ: 00208 GECODE_ES_FAIL((Count::EqView<IntView,IntView,IntView,true> 00209 ::post(home,xv,y,z,0))); 00210 break; 00211 case IRT_NQ: 00212 GECODE_ES_FAIL((Count::NqView<IntView,IntView,IntView,true> 00213 ::post(home,xv,y,z,0))); 00214 break; 00215 case IRT_LE: 00216 GECODE_ES_FAIL((Count::LqView<IntView,IntView,IntView,true> 00217 ::post(home,xv,y,z,-1))); 00218 break; 00219 case IRT_LQ: 00220 GECODE_ES_FAIL((Count::LqView<IntView,IntView,IntView,true> 00221 ::post(home,xv,y,z,0))); 00222 break; 00223 case IRT_GR: 00224 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true> 00225 ::post(home,xv,y,z,1))); 00226 break; 00227 case IRT_GQ: 00228 GECODE_ES_FAIL((Count::GqView<IntView,IntView,IntView,true> 00229 ::post(home,xv,y,z,0))); 00230 break; 00231 default: 00232 throw UnknownRelation("Int::count"); 00233 } 00234 } 00235 00236 void 00237 count(Home home, const IntVarArgs& x, const IntArgs& y, 00238 IntRelType r, IntVar z, IntConLevel) { 00239 using namespace Int; 00240 if (x.size() != y.size()) 00241 throw ArgumentSizeMismatch("Int::count"); 00242 if (home.failed()) return; 00243 00244 ViewArray<OffsetView> xy(home,x.size()); 00245 for (int i=x.size(); i--; ) 00246 xy[i] = OffsetView(x[i],-y[i]); 00247 00248 ZeroIntView u; 00249 switch (r) { 00250 case IRT_EQ: 00251 GECODE_ES_FAIL((Count::EqView<OffsetView,ZeroIntView,IntView,true> 00252 ::post(home,xy,u,z,0))); 00253 break; 00254 case IRT_NQ: 00255 GECODE_ES_FAIL((Count::NqView<OffsetView,ZeroIntView,IntView,true> 00256 ::post(home,xy,u,z,0))); 00257 break; 00258 case IRT_LE: 00259 GECODE_ES_FAIL((Count::LqView<OffsetView,ZeroIntView,IntView,true> 00260 ::post(home,xy,u,z,-1))); 00261 break; 00262 case IRT_LQ: 00263 GECODE_ES_FAIL((Count::LqView<OffsetView,ZeroIntView,IntView,true> 00264 ::post(home,xy,u,z,0))); 00265 break; 00266 case IRT_GR: 00267 GECODE_ES_FAIL((Count::GqView<OffsetView,ZeroIntView,IntView,true> 00268 ::post(home,xy,u,z,1))); 00269 break; 00270 case IRT_GQ: 00271 GECODE_ES_FAIL((Count::GqView<OffsetView,ZeroIntView,IntView,true> 00272 ::post(home,xy,u,z,0))); 00273 break; 00274 default: 00275 throw UnknownRelation("Int::count"); 00276 } 00277 } 00278 00279 } 00280 00281 // STATISTICS: int-post