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.hh"
00042 #include "gecode/set/rel.hh"
00043 #include "gecode/set/rel-op.hh"
00044
00045 namespace Gecode { namespace Set { namespace RelOp {
00046
00047 template <class View0, class View1, class Res>
00048 forceinline void
00049 rel_eq(Space* home, View0 x0, SetOpType op, View1 x1, Res x2) {
00050 switch(op) {
00051 case SOT_DUNION:
00052 {
00053 EmptyView emptyset;
00054 GECODE_ES_FAIL(home,(SuperOfInter<View0,View1,EmptyView>
00055 ::post(home, x0, x1, emptyset)));
00056
00057 }
00058 case SOT_UNION:
00059 {
00060 GECODE_ES_FAIL(home,
00061 (Union<View0,View1,Res>
00062 ::post(home, x0, x1, x2)));
00063 }
00064 break;
00065 case SOT_INTER:
00066 {
00067 GECODE_ES_FAIL(home,(Intersection<View0,View1,Res>
00068 ::post(home, x0,x1,x2)));
00069 }
00070 break;
00071 case SOT_MINUS:
00072 {
00073 ComplementView<View1> cx1(x1);
00074 GECODE_ES_FAIL(home,
00075 (Intersection<View0,
00076 ComplementView<View1>,Res>
00077 ::post(home,x0,cx1,x2)));
00078 }
00079 break;
00080 }
00081 }
00082
00083 template <class View0, class View1, class View2>
00084 forceinline void
00085 rel_sub(Space* home, View0 x0, SetOpType op, View1 x1, View2 x2) {
00086 switch(op) {
00087 case SOT_DUNION:
00088 {
00089 EmptyView emptyset;
00090 GECODE_ES_FAIL(home,(SuperOfInter<View0,View1,EmptyView>
00091 ::post(home, x0, x1, emptyset)));
00092
00093 }
00094 case SOT_UNION:
00095 {
00096 SetVar tmp(home);
00097 GECODE_ES_FAIL(home,
00098 (Rel::SubSet<SetView,View2>::post(home,tmp,x2)));
00099
00100 GECODE_ES_FAIL(home,
00101 (Union<View0,View1,SetView>
00102 ::post(home, x0, x1, tmp)));
00103 }
00104 break;
00105 case SOT_INTER:
00106 {
00107 GECODE_ES_FAIL(home,(SuperOfInter<View0,View1,View2>
00108 ::post(home, x0,x1,x2)));
00109 }
00110 break;
00111 case SOT_MINUS:
00112 {
00113 ComplementView<View1> cx1(x1);
00114 GECODE_ES_FAIL(home,
00115 (SuperOfInter<View0,
00116 ComplementView<View1>,View2>
00117 ::post(home,x0,cx1,x2)));
00118 }
00119 break;
00120 }
00121
00122 }
00123
00124 template <class View0, class View1, class View2>
00125 forceinline void
00126 rel_sup(Space* home, View0 x0, SetOpType op, View1 x1, View2 x2) {
00127 switch(op) {
00128 case SOT_DUNION:
00129 {
00130 EmptyView emptyset;
00131 GECODE_ES_FAIL(home,(SuperOfInter<View0,View1,EmptyView>
00132 ::post(home, x0, x1, emptyset)));
00133
00134 }
00135 case SOT_UNION:
00136 {
00137 GECODE_ES_FAIL(home,
00138 (SubOfUnion<View0,View1,View2>
00139 ::post(home, x0, x1, x2)));
00140 }
00141 break;
00142 case SOT_INTER:
00143 {
00144 SetVar tmp(home);
00145 GECODE_ES_FAIL(home,
00146 (Rel::SubSet<View2,SetView>::post(home,x2,tmp)));
00147
00148 GECODE_ES_FAIL(home,(Intersection<View0,View1,SetView>
00149 ::post(home, x0,x1,tmp)));
00150 }
00151 break;
00152 case SOT_MINUS:
00153 {
00154 SetVar tmp(home);
00155 GECODE_ES_FAIL(home,
00156 (Rel::SubSet<View2,SetView>::post(home,x2,tmp)));
00157
00158 ComplementView<View1> cx1(x1);
00159 GECODE_ES_FAIL(home,
00160 (Intersection<View0,
00161 ComplementView<View1>,SetView>
00162 ::post(home,x0,cx1,tmp)));
00163 }
00164 break;
00165 }
00166
00167 }
00168
00169 template <class View0, class View1, class View2>
00170 forceinline void
00171 rel_op_post_nocompl(Space* home, View0 x, SetOpType op, View1 y,
00172 SetRelType r, View2 z) {
00173 if (home->failed()) return;
00174 switch(r) {
00175 case SRT_EQ:
00176 rel_eq<View0,View1,View2>(home, x, op, y, z);
00177 break;
00178 case SRT_NQ:
00179 {
00180 SetVar tmp(home);
00181 GECODE_ES_FAIL(home,
00182 (Rel::Distinct<SetView,View2>
00183 ::post(home,tmp,z)));
00184 rel_eq<View0,View1,SetView>(home, x, op, y, tmp);
00185 }
00186 break;
00187 case SRT_SUB:
00188 rel_sub<View0,View1,View2>(home, x, op, y, z);
00189 break;
00190 case SRT_SUP:
00191 rel_sup<View0,View1,View2>(home, x, op, y, z);
00192 break;
00193 case SRT_DISJ:
00194 {
00195 SetVar tmp(home);
00196 EmptyView emptyset;
00197 GECODE_ES_FAIL(home,(SuperOfInter<View2,SetView,EmptyView>
00198 ::post(home, z, tmp, emptyset)));
00199 rel_eq<View0,View1,SetView>(home, x, op, y, tmp);
00200 }
00201 break;
00202 default:
00203 GECODE_NEVER;
00204 }
00205
00206 }
00207
00208 template <class View0, class View1, class View2>
00209 forceinline void
00210 rel_op_post(Space* home, View0 x, SetOpType op, View1 y,
00211 SetRelType r, View2 z) {
00212 if (home->failed()) return;
00213 if (r == SRT_CMPL) {
00214 ComplementView<View2> cz(z);
00215 rel_eq<View0,View1,ComplementView<View2> >(home, x, op, y, cz);
00216 } else {
00217 rel_op_post_nocompl<View0,View1,View2>(home, x, op, y, r, z);
00218 }
00219 }
00220
00221 }}}
00222
00223