overload.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
00035
00036
00037
00038 namespace Gecode { namespace Int { namespace Unary {
00039
00040
00041 template<class ManTask>
00042 ExecStatus
00043 overload(Space& home, TaskArray<ManTask>& t) {
00044 TaskViewArray<typename TaskTraits<ManTask>::TaskViewFwd> f(t);
00045 sort<typename TaskTraits<ManTask>::TaskViewFwd,STO_LCT,true>(f);
00046
00047 Region r(home);
00048 OmegaTree<typename TaskTraits<ManTask>::TaskViewFwd> o(r,f);
00049
00050 for (int i=0; i<f.size(); i++) {
00051 o.insert(i);
00052 if (o.ect() > f[i].lct())
00053 return ES_FAILED;
00054 }
00055 return ES_OK;
00056 }
00057
00058
00059 template<class OptTask>
00060 ExecStatus
00061 overload(Space& home, Propagator& p, TaskArray<OptTask>& t) {
00062 TaskViewArray<typename TaskTraits<OptTask>::TaskViewFwd> f(t);
00063 sort<typename TaskTraits<OptTask>::TaskViewFwd,STO_LCT,true>(f);
00064
00065 Region r(home);
00066 OmegaLambdaTree<typename TaskTraits<OptTask>::TaskViewFwd> ol(r,f,false);
00067
00068 bool to_purge = false;
00069
00070 for (int i=0; i<f.size(); i++) {
00071 if (f[i].optional()) {
00072 ol.linsert(i);
00073 } else if (f[i].mandatory()) {
00074 ol.oinsert(i);
00075 if (ol.ect() > f[i].lct())
00076 return ES_FAILED;
00077 }
00078 while (!ol.lempty() && (ol.lect() > f[i].lct())) {
00079 int j = ol.responsible();
00080 GECODE_ME_CHECK(f[j].excluded(home));
00081 ol.lremove(j);
00082 to_purge = true;
00083 }
00084 }
00085
00086 if (to_purge)
00087 GECODE_ES_CHECK((purge<OptTask,Int::PC_INT_BND>(home,p,t)));
00088 return ES_OK;
00089 }
00090
00091 }}}
00092
00093