Generated on Mon Aug 25 11:35:33 2008 for Gecode by doxygen 1.5.6

select.cc

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Patrick Pekczynski <pekczynski@ps.uni-sb.de>
00005  *
00006  *  Copyright:
00007  *     Patrick Pekczynski, 2006
00008  *
00009  *  Last modified:
00010  *     $Date: 2007-09-18 15:42:41 +0200 (Tue, 18 Sep 2007) $ by $Author: tack $
00011  *     $Revision: 5046 $
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/cpltset.hh"
00039 #include "gecode/cpltset/propagators.hh"
00040 
00041 using namespace Gecode::CpltSet;
00042 
00043 namespace Gecode {
00044 
00045   namespace CpltSet { namespace Select {
00046 
00052     template <class View>
00053     forceinline void 
00054     selectNonEmptySub_post(Space* home, ViewArray<View> x) {
00055       if (home->failed()) return;
00056       int n = x.size() - 2;
00057       int s = n;
00058       int t = n + 1;
00059       // just assume that they all have the same range
00060     
00061       unsigned int xrange = x[0].tableWidth();
00062 
00063       // compute maximum value
00064       for (int i = n; i--; ) {
00065         if (x[i].tableWidth() > xrange) {
00066           xrange = x[i].tableWidth();
00067         }
00068       }
00069 
00070       if (x[t].tableWidth() > xrange) {
00071         int a = x[t].initialLubMin() + xrange;
00072         int b = x[t].initialLubMin() + x[t].tableWidth();
00073         GECODE_ME_FAIL(home, x[t].exclude(home, a, b));
00074       } 
00075     
00076       bdd d0 = bdd_true();
00077 
00078       // restrict selector variable s to be \f$ s\subseteq \{0, n - 1\}\f$
00079       // int range = xrange;
00080       int shift = 0;
00081       if (x[s].initialLubMin() < 0) {
00082         shift = 0 - x[s].initialLubMin();
00083       }
00084 
00085       Iter::Ranges::Singleton idx(0, n - 1);
00086       GECODE_ME_FAIL(home, x[s].intersectI(home, idx));
00087 
00088       for (int j = 0; j < n; j++) {    
00089         bdd subset = bdd_true();
00090         bdd inter  = bdd_false();
00091         for (unsigned int k = 0; k < xrange; k++) {
00092           subset &= (x[j].element(k) >>= x[t].element(k));
00093           inter  |= (x[j].element(k) & x[t].element(k));
00094         }     
00095         d0 &= (x[s].element(j + shift) % (subset & inter));
00096       }
00097     
00098       GECODE_ES_FAIL(home, NaryCpltSetPropagator<View>::post(home, x, d0));
00099     }
00100 
00101     forceinline void 
00102     selectNonEmptySub_con(Space* home, const CpltSetVarArgs& x,
00103                         const CpltSetVar& s, const CpltSetVar& t) {
00104       int n = x.size();
00105       int m = n + 2;
00106       ViewArray<CpltSetView> bv(home, m);
00107       for (int i = 0; i < n; i++) {
00108         bv[i] = x[i];
00109       }
00110       bv[n] = s;
00111       bv[n + 1] = t;
00112       selectNonEmptySub_post(home, bv);    
00113     }
00114 
00115   }} // end namespace CpltSet::Select;
00116   
00117   using namespace CpltSet::Select;
00118 
00119   void selectNonEmptySub(Space* home, const CpltSetVarArgs& x, CpltSetVar s, 
00120                          CpltSetVar t) {
00121     selectNonEmptySub_con(home, x, s, t);
00122   }
00123 
00124 }
00125 
00126 // STATISTICS: cpltset-post