post-view.cpp
Go to the documentation of this file.
00001 /* 00002 * CAUTION: 00003 * This file has been automatically generated. Do not edit, 00004 * edit the specification file 00005 * gecode/set/branch/post-view.bs 00006 * instead. 00007 * 00008 * This file contains generated code fragments which are 00009 * copyrighted as follows: 00010 * 00011 * Main author: 00012 * Christian Schulte <schulte@gecode.org> 00013 * 00014 * Copyright: 00015 * Christian Schulte, 2008 00016 * 00017 * The generated code fragments are part of Gecode, the generic 00018 * constraint 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 #include <gecode/set/branch.hh> 00043 00044 namespace Gecode { namespace Set { namespace Branch { 00045 00047 void 00048 virtualize(Gecode::Home home, SetVarBranch vars, 00049 const Gecode::VarBranchOptions& o_vars, 00050 Gecode::ViewSelVirtualBase<SetView>*& v) { 00051 switch (vars) { 00052 case SET_VAR_RND: 00053 v = new (home) ViewSelVirtual<ViewSelRnd<SetView> >(home,o_vars); 00054 break; 00055 case SET_VAR_DEGREE_MIN: 00056 v = new (home) ViewSelVirtual<ViewSelDegreeMin<SetView> >(home,o_vars); 00057 break; 00058 case SET_VAR_DEGREE_MAX: 00059 v = new (home) ViewSelVirtual<ViewSelDegreeMax<SetView> >(home,o_vars); 00060 break; 00061 case SET_VAR_AFC_MIN: 00062 v = new (home) ViewSelVirtual<ViewSelAfcMin<SetView> >(home,o_vars); 00063 break; 00064 case SET_VAR_AFC_MAX: 00065 v = new (home) ViewSelVirtual<ViewSelAfcMax<SetView> >(home,o_vars); 00066 break; 00067 case SET_VAR_MIN_MIN: 00068 v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars); 00069 break; 00070 case SET_VAR_MIN_MAX: 00071 v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars); 00072 break; 00073 case SET_VAR_MAX_MIN: 00074 v = new (home) ViewSelVirtual<ByMaxMin>(home,o_vars); 00075 break; 00076 case SET_VAR_MAX_MAX: 00077 v = new (home) ViewSelVirtual<ByMaxMax>(home,o_vars); 00078 break; 00079 case SET_VAR_SIZE_MIN: 00080 v = new (home) ViewSelVirtual<BySizeMin>(home,o_vars); 00081 break; 00082 case SET_VAR_SIZE_MAX: 00083 v = new (home) ViewSelVirtual<BySizeMax>(home,o_vars); 00084 break; 00085 case SET_VAR_SIZE_DEGREE_MIN: 00086 v = new (home) ViewSelVirtual<BySizeDegreeMin>(home,o_vars); 00087 break; 00088 case SET_VAR_SIZE_DEGREE_MAX: 00089 v = new (home) ViewSelVirtual<BySizeDegreeMax>(home,o_vars); 00090 break; 00091 case SET_VAR_SIZE_AFC_MIN: 00092 v = new (home) ViewSelVirtual<BySizeAfcMin>(home,o_vars); 00093 break; 00094 case SET_VAR_SIZE_AFC_MAX: 00095 v = new (home) ViewSelVirtual<BySizeAfcMax>(home,o_vars); 00096 break; 00097 default: 00098 throw UnknownBranching("Set::branch"); 00099 } 00100 } 00101 00102 }}} 00103 00104 namespace Gecode { 00105 00106 void 00107 branch(Gecode::Home home, const SetVarArgs& x, 00108 SetVarBranch vars, SetValBranch vals, 00109 const Gecode::VarBranchOptions& o_vars, 00110 const Gecode::ValBranchOptions& o_vals) { 00111 using namespace Gecode; 00112 using namespace Gecode::Set; 00113 using namespace Gecode::Set::Branch; 00114 00115 00116 if (home.failed()) return; 00117 ViewArray<SetView> xv(home,x); 00118 switch (vars) { 00119 case SET_VAR_NONE: 00120 { 00121 ViewSelNone<SetView> v(home,o_vars); 00122 post(home,xv,v,vals,o_vals); 00123 } 00124 break; 00125 case SET_VAR_RND: 00126 { 00127 ViewSelRnd<SetView> v(home,o_vars); 00128 post(home,xv,v,vals,o_vals); 00129 } 00130 break; 00131 case SET_VAR_DEGREE_MIN: 00132 { 00133 ViewSelDegreeMin<SetView> v(home,o_vars); 00134 post(home,xv,v,vals,o_vals); 00135 } 00136 break; 00137 case SET_VAR_DEGREE_MAX: 00138 { 00139 ViewSelDegreeMax<SetView> v(home,o_vars); 00140 post(home,xv,v,vals,o_vals); 00141 } 00142 break; 00143 case SET_VAR_AFC_MIN: 00144 { 00145 ViewSelAfcMin<SetView> v(home,o_vars); 00146 post(home,xv,v,vals,o_vals); 00147 } 00148 break; 00149 case SET_VAR_AFC_MAX: 00150 { 00151 ViewSelAfcMax<SetView> v(home,o_vars); 00152 post(home,xv,v,vals,o_vals); 00153 } 00154 break; 00155 case SET_VAR_MIN_MIN: 00156 { 00157 ByMinMin v(home,o_vars); 00158 post(home,xv,v,vals,o_vals); 00159 } 00160 break; 00161 case SET_VAR_MIN_MAX: 00162 { 00163 ByMinMin v(home,o_vars); 00164 post(home,xv,v,vals,o_vals); 00165 } 00166 break; 00167 case SET_VAR_MAX_MIN: 00168 { 00169 ByMaxMin v(home,o_vars); 00170 post(home,xv,v,vals,o_vals); 00171 } 00172 break; 00173 case SET_VAR_MAX_MAX: 00174 { 00175 ByMaxMax v(home,o_vars); 00176 post(home,xv,v,vals,o_vals); 00177 } 00178 break; 00179 case SET_VAR_SIZE_MIN: 00180 { 00181 BySizeMin v(home,o_vars); 00182 post(home,xv,v,vals,o_vals); 00183 } 00184 break; 00185 case SET_VAR_SIZE_MAX: 00186 { 00187 BySizeMax v(home,o_vars); 00188 post(home,xv,v,vals,o_vals); 00189 } 00190 break; 00191 case SET_VAR_SIZE_DEGREE_MIN: 00192 { 00193 BySizeDegreeMin v(home,o_vars); 00194 post(home,xv,v,vals,o_vals); 00195 } 00196 break; 00197 case SET_VAR_SIZE_DEGREE_MAX: 00198 { 00199 BySizeDegreeMax v(home,o_vars); 00200 post(home,xv,v,vals,o_vals); 00201 } 00202 break; 00203 case SET_VAR_SIZE_AFC_MIN: 00204 { 00205 BySizeAfcMin v(home,o_vars); 00206 post(home,xv,v,vals,o_vals); 00207 } 00208 break; 00209 case SET_VAR_SIZE_AFC_MAX: 00210 { 00211 BySizeAfcMax v(home,o_vars); 00212 post(home,xv,v,vals,o_vals); 00213 } 00214 break; 00215 default: 00216 throw UnknownBranching("Set::branch"); 00217 } 00218 } 00219 00220 void 00221 branch(Gecode::Home home, const SetVarArgs& x, 00222 const Gecode::TieBreakVarBranch<SetVarBranch>& vars, 00223 SetValBranch vals, 00224 const Gecode::TieBreakVarBranchOptions& o_vars, 00225 const Gecode::ValBranchOptions& o_vals) { 00226 using namespace Gecode; 00227 using namespace Gecode::Set; 00228 using namespace Gecode::Set::Branch; 00229 00230 00231 if (home.failed()) return; 00232 if ((vars.a == SET_VAR_NONE) || (vars.a == SET_VAR_RND) || 00233 ((vars.b == SET_VAR_NONE) && (vars.c == SET_VAR_NONE) && (vars.d == SET_VAR_NONE))) { 00234 branch(home,x,vars.a,vals,o_vars.a,o_vals); 00235 return; 00236 } 00237 ViewArray<SetView> xv(home,x); 00238 Gecode::ViewSelVirtualBase<SetView>* tb[3]; 00239 int n=0; 00240 if (vars.b != SET_VAR_NONE) 00241 virtualize(home,vars.b,o_vars.b,tb[n++]); 00242 if (vars.c != SET_VAR_NONE) 00243 virtualize(home,vars.c,o_vars.c,tb[n++]); 00244 if (vars.d != SET_VAR_NONE) 00245 virtualize(home,vars.d,o_vars.d,tb[n++]); 00246 assert(n > 0); 00247 ViewSelTieBreakDynamic<SetView> vbcd(home,tb,n); 00248 switch (vars.a) { 00249 case SET_VAR_DEGREE_MIN: 00250 { 00251 ViewSelDegreeMin<SetView> va(home,o_vars.a); 00252 ViewSelTieBreakStatic<ViewSelDegreeMin<SetView>, 00253 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00254 post(home,xv,v,vals,o_vals); 00255 } 00256 break; 00257 case SET_VAR_DEGREE_MAX: 00258 { 00259 ViewSelDegreeMax<SetView> va(home,o_vars.a); 00260 ViewSelTieBreakStatic<ViewSelDegreeMax<SetView>, 00261 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00262 post(home,xv,v,vals,o_vals); 00263 } 00264 break; 00265 case SET_VAR_AFC_MIN: 00266 { 00267 ViewSelAfcMin<SetView> va(home,o_vars.a); 00268 ViewSelTieBreakStatic<ViewSelAfcMin<SetView>, 00269 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00270 post(home,xv,v,vals,o_vals); 00271 } 00272 break; 00273 case SET_VAR_AFC_MAX: 00274 { 00275 ViewSelAfcMax<SetView> va(home,o_vars.a); 00276 ViewSelTieBreakStatic<ViewSelAfcMax<SetView>, 00277 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00278 post(home,xv,v,vals,o_vals); 00279 } 00280 break; 00281 case SET_VAR_MIN_MIN: 00282 { 00283 ByMinMin va(home,o_vars.a); 00284 ViewSelTieBreakStatic<ByMinMin, 00285 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00286 post(home,xv,v,vals,o_vals); 00287 } 00288 break; 00289 case SET_VAR_MIN_MAX: 00290 { 00291 ByMinMin va(home,o_vars.a); 00292 ViewSelTieBreakStatic<ByMinMin, 00293 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00294 post(home,xv,v,vals,o_vals); 00295 } 00296 break; 00297 case SET_VAR_MAX_MIN: 00298 { 00299 ByMaxMin va(home,o_vars.a); 00300 ViewSelTieBreakStatic<ByMaxMin, 00301 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00302 post(home,xv,v,vals,o_vals); 00303 } 00304 break; 00305 case SET_VAR_MAX_MAX: 00306 { 00307 ByMaxMax va(home,o_vars.a); 00308 ViewSelTieBreakStatic<ByMaxMax, 00309 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00310 post(home,xv,v,vals,o_vals); 00311 } 00312 break; 00313 case SET_VAR_SIZE_MIN: 00314 { 00315 BySizeMin va(home,o_vars.a); 00316 ViewSelTieBreakStatic<BySizeMin, 00317 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00318 post(home,xv,v,vals,o_vals); 00319 } 00320 break; 00321 case SET_VAR_SIZE_MAX: 00322 { 00323 BySizeMax va(home,o_vars.a); 00324 ViewSelTieBreakStatic<BySizeMax, 00325 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00326 post(home,xv,v,vals,o_vals); 00327 } 00328 break; 00329 case SET_VAR_SIZE_DEGREE_MIN: 00330 { 00331 BySizeDegreeMin va(home,o_vars.a); 00332 ViewSelTieBreakStatic<BySizeDegreeMin, 00333 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00334 post(home,xv,v,vals,o_vals); 00335 } 00336 break; 00337 case SET_VAR_SIZE_DEGREE_MAX: 00338 { 00339 BySizeDegreeMax va(home,o_vars.a); 00340 ViewSelTieBreakStatic<BySizeDegreeMax, 00341 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00342 post(home,xv,v,vals,o_vals); 00343 } 00344 break; 00345 case SET_VAR_SIZE_AFC_MIN: 00346 { 00347 BySizeAfcMin va(home,o_vars.a); 00348 ViewSelTieBreakStatic<BySizeAfcMin, 00349 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00350 post(home,xv,v,vals,o_vals); 00351 } 00352 break; 00353 case SET_VAR_SIZE_AFC_MAX: 00354 { 00355 BySizeAfcMax va(home,o_vars.a); 00356 ViewSelTieBreakStatic<BySizeAfcMax, 00357 ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd); 00358 post(home,xv,v,vals,o_vals); 00359 } 00360 break; 00361 default: 00362 throw UnknownBranching("Set::branch"); 00363 } 00364 } 00365 00366 } 00367 00368 00369 // STATISTICS: set-branch 00370