Generated on Mon Jul 6 18:09:17 2009 for Gecode by doxygen 1.5.9

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::Space& 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<ViewSelDegreeMin<SetView> >(home,o_vars);
00060        break;
00061      case SET_VAR_MIN_MIN:
00062        v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars);
00063        break;
00064      case SET_VAR_MIN_MAX:
00065        v = new (home) ViewSelVirtual<ByMinMin>(home,o_vars);
00066        break;
00067      case SET_VAR_MAX_MIN:
00068        v = new (home) ViewSelVirtual<ByMaxMin>(home,o_vars);
00069        break;
00070      case SET_VAR_MAX_MAX:
00071        v = new (home) ViewSelVirtual<ByMaxMax>(home,o_vars);
00072        break;
00073      case SET_VAR_SIZE_MIN:
00074        v = new (home) ViewSelVirtual<BySizeMin>(home,o_vars);
00075        break;
00076      case SET_VAR_SIZE_MAX:
00077        v = new (home) ViewSelVirtual<BySizeMax>(home,o_vars);
00078        break;
00079      case SET_VAR_SIZE_DEGREE_MIN:
00080        v = new (home) ViewSelVirtual<BySizeDegreeMin>(home,o_vars);
00081        break;
00082      case SET_VAR_SIZE_DEGREE_MAX:
00083        v = new (home) ViewSelVirtual<BySizeDegreeMax>(home,o_vars);
00084        break;
00085     default:
00086       throw UnknownBranching("Set::branch");
00087     }
00088   }
00089 
00090 }}}
00091 
00092 namespace Gecode {
00093 
00094   void
00095   branch(Gecode::Space& home, const SetVarArgs& x,
00096          SetVarBranch vars, SetValBranch vals,
00097          const Gecode::VarBranchOptions& o_vars,
00098          const Gecode::ValBranchOptions& o_vals) {
00099     using namespace Gecode;
00100     using namespace Gecode::Set;
00101     using namespace Gecode::Set::Branch;
00102 
00103 
00104     if (home.failed()) return;
00105     ViewArray<SetView> xv(home,x);
00106     switch (vars) {
00107     case SET_VAR_NONE:
00108       {
00109         ViewSelNone<SetView> v(home,o_vars);
00110         post(home,xv,v,vals,o_vals);
00111       }
00112       break;
00113     case SET_VAR_RND:
00114       {
00115         ViewSelRnd<SetView> v(home,o_vars);
00116         post(home,xv,v,vals,o_vals);
00117       }
00118       break;
00119     case SET_VAR_DEGREE_MIN:
00120       {
00121         ViewSelDegreeMin<SetView> v(home,o_vars);
00122         post(home,xv,v,vals,o_vals);
00123       }
00124       break;
00125     case SET_VAR_DEGREE_MAX:
00126       {
00127         ViewSelDegreeMin<SetView> v(home,o_vars);
00128         post(home,xv,v,vals,o_vals);
00129       }
00130       break;
00131     case SET_VAR_MIN_MIN:
00132       {
00133         ByMinMin v(home,o_vars);
00134         post(home,xv,v,vals,o_vals);
00135       }
00136       break;
00137     case SET_VAR_MIN_MAX:
00138       {
00139         ByMinMin v(home,o_vars);
00140         post(home,xv,v,vals,o_vals);
00141       }
00142       break;
00143     case SET_VAR_MAX_MIN:
00144       {
00145         ByMaxMin v(home,o_vars);
00146         post(home,xv,v,vals,o_vals);
00147       }
00148       break;
00149     case SET_VAR_MAX_MAX:
00150       {
00151         ByMaxMax v(home,o_vars);
00152         post(home,xv,v,vals,o_vals);
00153       }
00154       break;
00155     case SET_VAR_SIZE_MIN:
00156       {
00157         BySizeMin v(home,o_vars);
00158         post(home,xv,v,vals,o_vals);
00159       }
00160       break;
00161     case SET_VAR_SIZE_MAX:
00162       {
00163         BySizeMax v(home,o_vars);
00164         post(home,xv,v,vals,o_vals);
00165       }
00166       break;
00167     case SET_VAR_SIZE_DEGREE_MIN:
00168       {
00169         BySizeDegreeMin v(home,o_vars);
00170         post(home,xv,v,vals,o_vals);
00171       }
00172       break;
00173     case SET_VAR_SIZE_DEGREE_MAX:
00174       {
00175         BySizeDegreeMax v(home,o_vars);
00176         post(home,xv,v,vals,o_vals);
00177       }
00178       break;
00179     default:
00180       throw UnknownBranching("Set::branch");
00181     }
00182   }
00183 
00184   void
00185   branch(Gecode::Space& home, const SetVarArgs& x,
00186          const Gecode::TieBreakVarBranch<SetVarBranch>& vars,
00187          SetValBranch vals,
00188          const Gecode::TieBreakVarBranchOptions& o_vars,
00189          const Gecode::ValBranchOptions& o_vals) {
00190     using namespace Gecode;
00191     using namespace Gecode::Set;
00192     using namespace Gecode::Set::Branch;
00193 
00194 
00195     if (home.failed()) return;
00196     if ((vars.a == SET_VAR_NONE) || (vars.a == SET_VAR_RND) ||
00197         ((vars.b == SET_VAR_NONE) && (vars.c == SET_VAR_NONE) && (vars.d == SET_VAR_NONE))) {
00198       branch(home,x,vars.a,vals,o_vars.a,o_vals);
00199       return;
00200     }
00201     ViewArray<SetView> xv(home,x);
00202     Gecode::ViewSelVirtualBase<SetView>* tb[3];
00203     int n=0;
00204     if (vars.b != SET_VAR_NONE)
00205       virtualize(home,vars.b,o_vars.b,tb[n++]);
00206     if (vars.c != SET_VAR_NONE)
00207       virtualize(home,vars.c,o_vars.c,tb[n++]);
00208     if (vars.d != SET_VAR_NONE)
00209       virtualize(home,vars.d,o_vars.d,tb[n++]);
00210     assert(n > 0);
00211     ViewSelTieBreakDynamic<SetView> vbcd(home,tb,n);
00212     switch (vars.a) {
00213     case SET_VAR_DEGREE_MIN:
00214       {
00215         ViewSelDegreeMin<SetView> va(home,o_vars.a);
00216         ViewSelTieBreakStatic<ViewSelDegreeMin<SetView>,
00217           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00218         post(home,xv,v,vals,o_vals);
00219       }
00220       break;
00221     case SET_VAR_DEGREE_MAX:
00222       {
00223         ViewSelDegreeMin<SetView> va(home,o_vars.a);
00224         ViewSelTieBreakStatic<ViewSelDegreeMin<SetView>,
00225           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00226         post(home,xv,v,vals,o_vals);
00227       }
00228       break;
00229     case SET_VAR_MIN_MIN:
00230       {
00231         ByMinMin va(home,o_vars.a);
00232         ViewSelTieBreakStatic<ByMinMin,
00233           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00234         post(home,xv,v,vals,o_vals);
00235       }
00236       break;
00237     case SET_VAR_MIN_MAX:
00238       {
00239         ByMinMin va(home,o_vars.a);
00240         ViewSelTieBreakStatic<ByMinMin,
00241           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00242         post(home,xv,v,vals,o_vals);
00243       }
00244       break;
00245     case SET_VAR_MAX_MIN:
00246       {
00247         ByMaxMin va(home,o_vars.a);
00248         ViewSelTieBreakStatic<ByMaxMin,
00249           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00250         post(home,xv,v,vals,o_vals);
00251       }
00252       break;
00253     case SET_VAR_MAX_MAX:
00254       {
00255         ByMaxMax va(home,o_vars.a);
00256         ViewSelTieBreakStatic<ByMaxMax,
00257           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00258         post(home,xv,v,vals,o_vals);
00259       }
00260       break;
00261     case SET_VAR_SIZE_MIN:
00262       {
00263         BySizeMin va(home,o_vars.a);
00264         ViewSelTieBreakStatic<BySizeMin,
00265           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00266         post(home,xv,v,vals,o_vals);
00267       }
00268       break;
00269     case SET_VAR_SIZE_MAX:
00270       {
00271         BySizeMax va(home,o_vars.a);
00272         ViewSelTieBreakStatic<BySizeMax,
00273           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00274         post(home,xv,v,vals,o_vals);
00275       }
00276       break;
00277     case SET_VAR_SIZE_DEGREE_MIN:
00278       {
00279         BySizeDegreeMin va(home,o_vars.a);
00280         ViewSelTieBreakStatic<BySizeDegreeMin,
00281           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00282         post(home,xv,v,vals,o_vals);
00283       }
00284       break;
00285     case SET_VAR_SIZE_DEGREE_MAX:
00286       {
00287         BySizeDegreeMax va(home,o_vars.a);
00288         ViewSelTieBreakStatic<BySizeDegreeMax,
00289           ViewSelTieBreakDynamic<SetView> > v(home,va,vbcd);
00290         post(home,xv,v,vals,o_vals);
00291       }
00292       break;
00293     default:
00294       throw UnknownBranching("Set::branch");
00295     }
00296   }
00297 
00298 }
00299 
00300 
00301 // STATISTICS: set-branch
00302