man.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 namespace Gecode { namespace Int { namespace NoOverlap {
00035
00036 template<class Box>
00037 forceinline
00038 ManProp<Box>::ManProp(Home home, Box* b, int n)
00039 : Base<Box>(home, b, n) {}
00040
00041 template<class Box>
00042 inline ExecStatus
00043 ManProp<Box>::post(Home home, Box* b, int n) {
00044 if (n > 1)
00045 (void) new (home) ManProp<Box>(home,b,n);
00046 return ES_OK;
00047 }
00048
00049 template<class Box>
00050 forceinline size_t
00051 ManProp<Box>::dispose(Space& home) {
00052 (void) Base<Box>::dispose(home);
00053 return sizeof(*this);
00054 }
00055
00056
00057 template<class Box>
00058 forceinline
00059 ManProp<Box>::ManProp(Space& home, ManProp<Box>& p)
00060 : Base<Box>(home, p, p.n) {}
00061
00062 template<class Box>
00063 Actor*
00064 ManProp<Box>::copy(Space& home) {
00065 return new (home) ManProp<Box>(home,*this);
00066 }
00067
00068 template<class Box>
00069 ExecStatus
00070 ManProp<Box>::propagate(Space& home, const ModEventDelta&) {
00071 Region r;
00072
00073
00074 int* db = r.alloc<int>(n);
00075 for (int i=0; i<n; i++)
00076 db[i] = n-1;
00077
00078
00079 int e = 0;
00080
00081 for (int i=0; i<n; i++)
00082 for (int j=0; j<i; j++)
00083 if (b[i].nooverlap(b[j])) {
00084 assert(db[i] > 0); assert(db[j] > 0);
00085 if (--db[i] == 0) e++;
00086 if (--db[j] == 0) e++;
00087 continue;
00088 } else {
00089 GECODE_ES_CHECK(b[i].nooverlap(home,b[j]));
00090 }
00091
00092 if (e == n)
00093 return home.ES_SUBSUMED(*this);
00094
00095 {
00096 int i = n-1;
00097 while (e > 0) {
00098
00099 while (db[i] > 0)
00100 i--;
00101 b[i].cancel(home, *this);
00102 b[i] = b[--n];
00103 e--; i--;
00104 }
00105 if (n < 2)
00106 return home.ES_SUBSUMED(*this);
00107 }
00108
00109 return ES_NOFIX;
00110 }
00111
00112 }}}
00113
00114
00115