Generated on Thu Mar 22 10:39:44 2012 for Gecode by doxygen 1.6.3

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,o_vars.bf);
00123       }
00124       break;
00125     case SET_VAR_RND:
00126       {
00127         ViewSelRnd<SetView> v(home,o_vars);
00128         post(home,xv,v,vals,o_vals,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
00153       }
00154       break;
00155     case SET_VAR_MIN_MIN:
00156       {
00157         ByMinMin v(home,o_vars);
00158         post(home,xv,v,vals,o_vals,o_vars.bf);
00159       }
00160       break;
00161     case SET_VAR_MIN_MAX:
00162       {
00163         ByMinMin v(home,o_vars);
00164         post(home,xv,v,vals,o_vals,o_vars.bf);
00165       }
00166       break;
00167     case SET_VAR_MAX_MIN:
00168       {
00169         ByMaxMin v(home,o_vars);
00170         post(home,xv,v,vals,o_vals,o_vars.bf);
00171       }
00172       break;
00173     case SET_VAR_MAX_MAX:
00174       {
00175         ByMaxMax v(home,o_vars);
00176         post(home,xv,v,vals,o_vals,o_vars.bf);
00177       }
00178       break;
00179     case SET_VAR_SIZE_MIN:
00180       {
00181         BySizeMin v(home,o_vars);
00182         post(home,xv,v,vals,o_vals,o_vars.bf);
00183       }
00184       break;
00185     case SET_VAR_SIZE_MAX:
00186       {
00187         BySizeMax v(home,o_vars);
00188         post(home,xv,v,vals,o_vals,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
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,o_vars.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
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,o_vars.a.bf);
00359       }
00360       break;
00361     default:
00362       throw UnknownBranching("Set::branch");
00363     }
00364   }
00365 
00366 }
00367 
00368 
00369 // STATISTICS: set-branch
00370