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
00039
00040
00041 #include <gecode/set/rel.hh>
00042 #include <gecode/set/rel-op.hh>
00043 #include <gecode/set/int.hh>
00044
00045 namespace Gecode {
00046 using namespace Set;
00047 using namespace Set::Rel;
00048 using namespace Set::RelOp;
00049
00050 template<class View0, class View1>
00051 void
00052 rel_post(Home home, View0 x0, SetRelType r, View1 x1) {
00053 if (home.failed()) return;
00054 switch (r) {
00055 case SRT_EQ:
00056 GECODE_ES_FAIL((Eq<View0,View1>::post(home,x0,x1)));
00057 break;
00058 case SRT_NQ:
00059 GECODE_ES_FAIL((Distinct<View0,View1>::post(home,x0,x1)));
00060 break;
00061 case SRT_SUB:
00062 GECODE_ES_FAIL((Subset<View0,View1>::post(home, x0,x1)));
00063 break;
00064 case SRT_SUP:
00065 GECODE_ES_FAIL((Subset<View1,View0>::post(home, x1,x0)));
00066 break;
00067 case SRT_DISJ:
00068 {
00069 EmptyView emptyset;
00070 GECODE_ES_FAIL((SuperOfInter<View0,View1,EmptyView>
00071 ::post(home, x0, x1, emptyset)));
00072 }
00073 break;
00074 case SRT_CMPL:
00075 {
00076 ComplementView<View0> cx0(x0);
00077 GECODE_ES_FAIL((Eq<ComplementView<View0>, View1>
00078 ::post(home, cx0, x1)));
00079 }
00080 break;
00081 case SRT_LQ:
00082 GECODE_ES_FAIL((Lq<View0,View1,false>::post(home,x0,x1)));
00083 break;
00084 case SRT_LE:
00085 GECODE_ES_FAIL((Lq<View0,View1,true>::post(home,x0,x1)));
00086 break;
00087 case SRT_GQ:
00088 GECODE_ES_FAIL((Lq<View1,View0,false>::post(home,x1,x0)));
00089 break;
00090 case SRT_GR:
00091 GECODE_ES_FAIL((Lq<View1,View0,true>::post(home,x1,x0)));
00092 break;
00093 default:
00094 throw UnknownRelation("Set::rel");
00095 }
00096 }
00097
00098 template<class View0, class View1, ReifyMode rm>
00099 void
00100 rel_re(Home home, View0 x, SetRelType r, View1 y, BoolVar b) {
00101 if (home.failed()) return;
00102 switch (r) {
00103 case SRT_EQ:
00104 GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::BoolView,rm>
00105 ::post(home, x,y,b)));
00106 break;
00107 case SRT_NQ:
00108 {
00109 Gecode::Int::NegBoolView notb(b);
00110 switch (rm) {
00111 case RM_EQV:
00112 GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_EQV>
00113 ::post(home,x,y,notb)));
00114 break;
00115 case RM_IMP:
00116 GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_PMI>
00117 ::post(home,x,y,notb)));
00118 break;
00119 case RM_PMI:
00120 GECODE_ES_FAIL((ReEq<View0,View1,Gecode::Int::NegBoolView,RM_IMP>
00121 ::post(home,x,y,notb)));
00122 break;
00123 default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00124 }
00125 }
00126 break;
00127 case SRT_SUB:
00128 GECODE_ES_FAIL((ReSubset<View0,View1,rm>::post(home, x,y,b)));
00129 break;
00130 case SRT_SUP:
00131 GECODE_ES_FAIL((ReSubset<View1,View0,rm>::post(home, y,x,b)));
00132 break;
00133 case SRT_DISJ:
00134 {
00135
00136
00137
00138 ComplementView<View0> xc(x);
00139 GECODE_ES_FAIL((ReSubset<View1,ComplementView<View0>,rm>
00140 ::post(home, y, xc, b)));
00141 }
00142 break;
00143 case SRT_CMPL:
00144 {
00145 ComplementView<View0> xc(x);
00146 GECODE_ES_FAIL((ReEq<ComplementView<View0>,View1,
00147 Gecode::Int::BoolView,rm>
00148 ::post(home, xc, y, b)));
00149 }
00150 break;
00151 case SRT_LQ:
00152 GECODE_ES_FAIL((ReLq<View0,View1,rm,false>::post(home,x,y,b)));
00153 break;
00154 case SRT_LE:
00155 GECODE_ES_FAIL((ReLq<View0,View1,rm,true>::post(home,x,y,b)));
00156 break;
00157 case SRT_GQ:
00158 GECODE_ES_FAIL((ReLq<View1,View0,rm,false>::post(home,y,x,b)));
00159 break;
00160 case SRT_GR:
00161 GECODE_ES_FAIL((ReLq<View1,View0,rm,true>::post(home,y,x,b)));
00162 break;
00163 default:
00164 throw UnknownRelation("Set::rel");
00165 }
00166 }
00167
00168 void
00169 rel(Home home, SetVar x, SetRelType r, SetVar y) {
00170 rel_post<SetView,SetView>(home,x,r,y);
00171 }
00172
00173 void
00174 rel(Home home, SetVar s, SetRelType r, IntVar x) {
00175 Gecode::Int::IntView xv(x);
00176 SingletonView xsingle(xv);
00177 rel_post<SetView,SingletonView>(home,s,r,xv);
00178 }
00179
00180 void
00181 rel(Home home, IntVar x, SetRelType r, SetVar s) {
00182 switch (r) {
00183 case SRT_SUB:
00184 rel(home, s, SRT_SUP, x);
00185 break;
00186 case SRT_SUP:
00187 rel(home, s, SRT_SUB, x);
00188 break;
00189 default:
00190 rel(home, s, r, x);
00191 }
00192 }
00193
00194 void
00195 rel(Home home, SetVar x, SetRelType rt, SetVar y, Reify r) {
00196 switch (r.mode()) {
00197 case RM_EQV:
00198 rel_re<SetView,SetView,RM_EQV>(home,x,rt,y,r.var());
00199 break;
00200 case RM_IMP:
00201 rel_re<SetView,SetView,RM_IMP>(home,x,rt,y,r.var());
00202 break;
00203 case RM_PMI:
00204 rel_re<SetView,SetView,RM_PMI>(home,x,rt,y,r.var());
00205 break;
00206 default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00207 }
00208 }
00209
00210 void
00211 rel(Home home, SetVar s, SetRelType rt, IntVar x, Reify r) {
00212 Gecode::Int::IntView xv(x);
00213 SingletonView xsingle(xv);
00214 switch (r.mode()) {
00215 case RM_EQV:
00216 rel_re<SetView,SingletonView,RM_EQV>(home,s,rt,xsingle,r.var());
00217 break;
00218 case RM_IMP:
00219 rel_re<SetView,SingletonView,RM_IMP>(home,s,rt,xsingle,r.var());
00220 break;
00221 case RM_PMI:
00222 rel_re<SetView,SingletonView,RM_PMI>(home,s,rt,xsingle,r.var());
00223 break;
00224 default: throw Gecode::Int::UnknownReifyMode("Set::rel");
00225 }
00226 }
00227
00228 void
00229 rel(Home home, IntVar x, SetRelType rt, SetVar s, Reify r) {
00230 switch (rt) {
00231 case SRT_SUB:
00232 rel(home, s, SRT_SUP, x, r);
00233 break;
00234 case SRT_SUP:
00235 rel(home, s, SRT_SUB, x, r);
00236 break;
00237 default:
00238 rel(home, s, rt, x, r);
00239 }
00240 }
00241
00242 }
00243
00244