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