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

conv.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Guido Tack <tack@gecode.org>
00005  *     Christian Schulte <schulte@gecode.org>
00006  *     Gabor Szokoli <szokoli@gecode.org>
00007  *
00008  *  Copyright:
00009  *     Guido Tack, 2004
00010  *     Christian Schulte, 2004
00011  *     Gabor Szokoli, 2004
00012  *
00013  *  Last modified:
00014  *     $Date: 2011-08-08 18:04:53 +0200 (Mon, 08 Aug 2011) $ by $Author: schulte $
00015  *     $Revision: 12253 $
00016  *
00017  *  This file is part of Gecode, the generic constraint
00018  *  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/convex.hh>
00043 
00044 namespace Gecode { namespace Set { namespace Convex {
00045 
00046   Actor*
00047   Convex::copy(Space& home, bool share) {
00048     return new (home) Convex(home,share,*this);
00049   }
00050 
00051   ExecStatus
00052   Convex::propagate(Space& home, const ModEventDelta&) {
00053     //I, drop ranges from UB that are shorter than cardMin
00054     //II, add range LB.smallest to LB.largest to LB
00055     //III, Drop ranges from UB that do not contain all elements of LB
00056     //that is: range.min()>LB.smallest or range.max()<LB.largest
00057     //This leaves only one range.
00058     //II
00059     if (x0.glbSize()>0) {
00060       GECODE_ME_CHECK( x0.include(home,x0.glbMin(),x0.glbMax()) );
00061     } else {
00062       //If lower bound is empty, we can still constrain the cardinality
00063       //maximum with the width of the longest range in UB.
00064       //No need to do this if there is anything in LB because UB
00065       //becomes a single range then.
00066        LubRanges<SetView> ubRangeIt(x0);
00067        unsigned int maxWidth = 0;
00068        for (;ubRangeIt();++ubRangeIt) {
00069          assert(ubRangeIt());
00070          maxWidth = std::max(maxWidth, ubRangeIt.width());
00071        }
00072        GECODE_ME_CHECK( x0.cardMax(home,maxWidth) );
00073     }
00074 
00075 
00076     //I + III
00077 
00078     Region r(home);
00079     LubRanges<SetView> ubRangeIt(x0);
00080     Iter::Ranges::Cache ubRangeItC(r,ubRangeIt);
00081 
00082     for (; ubRangeItC(); ++ubRangeItC) {
00083       if (ubRangeItC.width() < (unsigned int) x0.cardMin()
00084           || ubRangeItC.min() > x0.glbMin() //No need to test for empty lb.
00085           || ubRangeItC.max() < x0.glbMax()
00086           ) {
00087         GECODE_ME_CHECK( x0.exclude(home,ubRangeItC.min(), ubRangeItC.max()) );
00088       }
00089     }
00090     if (x0.assigned()) 
00091       return home.ES_SUBSUMED(*this);
00092     return ES_FIX;
00093   }
00094 
00095 }}}
00096 
00097 // STATISTICS: set-prop