Generated on Wed Nov 1 15:04:47 2006 for Gecode by doxygen 1.4.5

seq-u.cc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Guido Tack <tack@gecode.org>
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Contributing authors:
00007  *     Gabor Szokoli <szokoli@gecode.org>
00008  *
00009  *  Copyright:
00010  *     Guido Tack, 2004
00011  *     Christian Schulte, 2004
00012  *     Gabor Szokoli, 2004
00013  *
00014  *  Last modified:
00015  *     $Date: 2006-04-11 15:58:37 +0200 (Tue, 11 Apr 2006) $ by $Author: tack $
00016  *     $Revision: 3188 $
00017  *
00018  *  This file is part of Gecode, the generic constraint
00019  *  development environment:
00020  *     http://www.gecode.org
00021  *
00022  *  See the file "LICENSE" for information on usage and
00023  *  redistribution of this file, and for a
00024  *     DISCLAIMER OF ALL WARRANTIES.
00025  *
00026  */
00027 
00028 #include "gecode/set.hh"
00029 #include "gecode/set/sequence.hh"
00030 
00031 namespace Gecode { namespace Set { namespace Sequence {
00032 
00033   /*
00034    * "Sequenced union" propagator
00035    *
00036    */
00037 
00038   Actor*
00039   SeqU::copy(Space* home, bool share) {
00040     return new (home) SeqU(home,share,*this);
00041   }
00042 
00043   //Enforces sequentiality and ensures y contains union of Xi lower bounds.
00044   ExecStatus
00045   SeqU::propagate(Space* home) {
00046     ModEvent me0 = SetView::pme(this);
00047     bool ubevent = Rel::testSetEventUB(me0);
00048     bool lbevent = Rel::testSetEventLB(me0);
00049     bool anybevent = Rel::testSetEventAnyB(me0);
00050     bool cardevent = Rel::testSetEventCard(me0);
00051 
00052     bool modified = false;
00053     bool assigned=false;
00054     bool oldModified = false;
00055 
00056     do {
00057       oldModified = modified;
00058       modified = false;
00059 
00060       if (oldModified || modified || lbevent)
00061         GECODE_ME_CHECK(propagateSeq(home,modified,assigned,x));
00062       if (oldModified || modified || lbevent)
00063         GECODE_ME_CHECK(propagateSeqUnion(home,modified,x,y));
00064       if (oldModified || modified || ubevent)
00065         GECODE_ME_CHECK(RelOp::unionNXiUB(home,modified,x,y,unionOfDets));
00066       if (oldModified || modified || ubevent)
00067         GECODE_ME_CHECK(RelOp::partitionNYUB(home,modified,x,y,unionOfDets));
00068       if (oldModified || modified || anybevent)
00069         GECODE_ME_CHECK(RelOp::partitionNXiLB(home,modified,x,y,unionOfDets));
00070       if (oldModified || modified || cardevent || ubevent)
00071         GECODE_ME_CHECK(RelOp::partitionNCard(home,modified,x,y,unionOfDets));
00072 
00073     } while (modified);
00074 
00075     for (int i=x.size(); i--;)
00076       if (!x[i].assigned())
00077         return ES_FIX;
00078     return ES_SUBSUMED;
00079   }
00080 
00081 }}}
00082 
00083 // STATISTICS: set-prop