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 #include <algorithm>
00035
00036 namespace Gecode { namespace Int { namespace Unary {
00037
00038 template<class OptTask, class PL>
00039 forceinline
00040 OptProp<OptTask,PL>::OptProp(Home home, TaskArray<OptTask>& t)
00041 : TaskProp<OptTask,PL>(home,t) {}
00042
00043 template<class OptTask, class PL>
00044 forceinline
00045 OptProp<OptTask,PL>::OptProp(Space& home, OptProp<OptTask,PL>& p)
00046 : TaskProp<OptTask,PL>(home,p) {}
00047
00048 template<class OptTask, class PL>
00049 ExecStatus
00050 OptProp<OptTask,PL>::post(Home home, TaskArray<OptTask>& t) {
00051 int m=0, o=0;
00052 for (int i=0; i<t.size(); i++) {
00053 if (t[i].mandatory())
00054 m++;
00055 else if (t[i].optional())
00056 o++;
00057 }
00058 if (m == t.size()) {
00059 TaskArray<typename TaskTraits<OptTask>::ManTask> mt(home,m);
00060 for (int i=0; i<m; i++)
00061 mt[i].init(t[i]);
00062 return ManProp<typename TaskTraits<OptTask>::ManTask,PL>::post(home,mt);
00063 }
00064 if (o+m > 1)
00065 (void) new (home) OptProp<OptTask,PL>(home,t);
00066 return ES_OK;
00067 }
00068
00069 template<class OptTask, class PL>
00070 Actor*
00071 OptProp<OptTask,PL>::copy(Space& home) {
00072 return new (home) OptProp<OptTask,PL>(home,*this);
00073 }
00074
00075 template<class OptTask, class PL>
00076 ExecStatus
00077 OptProp<OptTask,PL>::propagate(Space& home, const ModEventDelta& med) {
00078
00079 if (BoolView::me(med) == ME_BOOL_VAL)
00080 GECODE_ES_CHECK((purge<OptTask,PL>(home,*this,t)));
00081
00082 GECODE_ES_CHECK((overload<OptTask,PL>(home,*this,t)));
00083
00084 if (PL::basic)
00085 GECODE_ES_CHECK(timetabling(home,*this,t));
00086
00087 if (PL::advanced) {
00088 GECODE_ES_CHECK((detectable<OptTask,PL>(home,*this,t)));
00089 GECODE_ES_CHECK((notfirstnotlast<OptTask,PL>(home,*this,t)));
00090
00091
00092 int n = t.size();
00093 int i=0, j=n-1;
00094 while (true) {
00095 while ((i < n) && t[i].mandatory()) i++;
00096 while ((j >= 0) && !t[j].mandatory()) j--;
00097 if (i >= j) break;
00098 std::swap(t[i],t[j]);
00099 }
00100
00101 if (i > 1) {
00102
00103 t.size(i);
00104 GECODE_ES_CHECK(edgefinding(home,t));
00105
00106 t.size(n);
00107 }
00108 }
00109
00110 if (!PL::basic)
00111 GECODE_ES_CHECK(subsumed(home,*this,t));
00112
00113 return ES_NOFIX;
00114 }
00115
00116 }}}
00117
00118