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 #include "gecode/int/linear.hh"
00039
00040 namespace Gecode {
00041
00042 using namespace Int;
00043
00044 void
00045 linear(Space* home,
00046 const IntVarArgs& x, IntRelType r, int c,
00047 IntConLevel icl, PropKind) {
00048 if (home->failed()) return;
00049 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size());
00050 for (int i = x.size(); i--; ) {
00051 t[i].a=1; t[i].x=x[i];
00052 }
00053 Linear::post(home,t,x.size(),r,c,icl);
00054 }
00055
00056 void
00057 linear(Space* home,
00058 const IntVarArgs& x, IntRelType r, int c, BoolVar b,
00059 IntConLevel, PropKind) {
00060 if (home->failed()) return;
00061 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size());
00062 for (int i = x.size(); i--; ) {
00063 t[i].a=1; t[i].x=x[i];
00064 }
00065 Linear::post(home,t,x.size(),r,c,b);
00066 }
00067
00068 void
00069 linear(Space* home,
00070 const IntArgs& a, const IntVarArgs& x, IntRelType r, int c,
00071 IntConLevel icl, PropKind) {
00072 if (a.size() != x.size())
00073 throw ArgumentSizeMismatch("Int::linear");
00074 if (home->failed()) return;
00075 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size());
00076 for (int i = x.size(); i--; ) {
00077 t[i].a=a[i]; t[i].x=x[i];
00078 }
00079 Linear::post(home,t,x.size(),r,c,icl);
00080 }
00081
00082 void
00083 linear(Space* home,
00084 const IntArgs& a, const IntVarArgs& x, IntRelType r, int c, BoolVar b,
00085 IntConLevel, PropKind) {
00086 if (a.size() != x.size())
00087 throw ArgumentSizeMismatch("Int::linear");
00088 if (home->failed()) return;
00089 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size());
00090 for (int i = x.size(); i--; ) {
00091 t[i].a=a[i]; t[i].x=x[i];
00092 }
00093 Linear::post(home,t,x.size(),r,c,b);
00094 }
00095
00096 void
00097 linear(Space* home,
00098 const IntVarArgs& x, IntRelType r, IntVar y,
00099 IntConLevel icl, PropKind) {
00100 if (home->failed()) return;
00101 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00102 for (int i = x.size(); i--; ) {
00103 t[i].a=1; t[i].x=x[i];
00104 }
00105 int min, max;
00106 estimate(static_cast<Linear::Term<IntView>*>(t),x.size(),0,min,max);
00107 IntView v(y);
00108 switch (r) {
00109 case IRT_EQ:
00110 GECODE_ME_FAIL(home,v.gq(home,min)); GECODE_ME_FAIL(home,v.lq(home,max));
00111 break;
00112 case IRT_GQ:
00113 GECODE_ME_FAIL(home,v.lq(home,max));
00114 break;
00115 case IRT_LQ:
00116 GECODE_ME_FAIL(home,v.gq(home,min));
00117 break;
00118 default: ;
00119 }
00120 if (home->failed()) return;
00121 t[x.size()].a=-1; t[x.size()].x=y;
00122 Linear::post(home,t,x.size()+1,r,0,icl);
00123 }
00124
00125 void
00126 linear(Space* home,
00127 const IntVarArgs& x, IntRelType r, IntVar y, BoolVar b,
00128 IntConLevel, PropKind) {
00129 if (home->failed()) return;
00130 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00131 for (int i = x.size(); i--; ) {
00132 t[i].a=1; t[i].x=x[i];
00133 }
00134 t[x.size()].a=-1; t[x.size()].x=y;
00135 Linear::post(home,t,x.size()+1,r,0,b);
00136 }
00137
00138 void
00139 linear(Space* home,
00140 const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
00141 IntConLevel icl, PropKind) {
00142 if (a.size() != x.size())
00143 throw ArgumentSizeMismatch("Int::linear");
00144 if (home->failed()) return;
00145 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00146 for (int i = x.size(); i--; ) {
00147 t[i].a=a[i]; t[i].x=x[i];
00148 }
00149 int min, max;
00150 estimate(static_cast<Linear::Term<IntView>*>(t),x.size(),0,min,max);
00151 IntView v(y);
00152 switch (r) {
00153 case IRT_EQ:
00154 GECODE_ME_FAIL(home,v.gq(home,min)); GECODE_ME_FAIL(home,v.lq(home,max));
00155 break;
00156 case IRT_GQ:
00157 GECODE_ME_FAIL(home,v.lq(home,max));
00158 break;
00159 case IRT_LQ:
00160 GECODE_ME_FAIL(home,v.gq(home,min));
00161 break;
00162 default: ;
00163 }
00164 if (home->failed()) return;
00165 t[x.size()].a=-1; t[x.size()].x=y;
00166 Linear::post(home,t,x.size()+1,r,0,icl);
00167 }
00168
00169 void
00170 linear(Space* home,
00171 const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
00172 BoolVar b, IntConLevel, PropKind) {
00173 if (a.size() != x.size())
00174 throw ArgumentSizeMismatch("Int::linear");
00175 if (home->failed()) return;
00176 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00177 for (int i = x.size(); i--; ) {
00178 t[i].a=a[i]; t[i].x=x[i];
00179 }
00180 t[x.size()].a=-1; t[x.size()].x=y;
00181 Linear::post(home,t,x.size()+1,r,0,b);
00182 }
00183
00184 namespace {
00185 using namespace Int;
00186 GECODE_REGISTER3(Linear::DomEq<double,ScaleView<double,double> >);
00187 GECODE_REGISTER3(Linear::DomEq<int,ScaleView<int,unsigned int> >);
00188 GECODE_REGISTER3(Linear::Eq<double,Linear::NoView,Linear::NoView>);
00189 GECODE_REGISTER4(Linear::Eq<double,ScaleView<double,double>,Linear::NoView>);
00190 GECODE_REGISTER5(Linear::Eq<double,ScaleView<double,double>,ScaleView<double,double> >);
00191 GECODE_REGISTER3(Linear::Eq<int,IntView,IntView>);
00192 GECODE_REGISTER3(Linear::Eq<int,IntView,Linear::NoView>);
00193 GECODE_REGISTER3(Linear::Eq<int,Linear::NoView,Linear::NoView>);
00194 GECODE_REGISTER4(Linear::Eq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00195 GECODE_REGISTER5(Linear::Eq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00196 GECODE_REGISTER3(Linear::EqBin<int,IntView,IntView>);
00197 GECODE_REGISTER3(Linear::EqBin<int,IntView,MinusView>);
00198 GECODE_REGISTER3(Linear::EqBin<int,MinusView,MinusView>);
00199 GECODE_REGISTER4(Linear::EqTer<int,IntView,IntView,IntView>);
00200 GECODE_REGISTER4(Linear::EqTer<int,IntView,IntView,MinusView>);
00201 GECODE_REGISTER4(Linear::EqTer<int,IntView,MinusView,MinusView>);
00202 GECODE_REGISTER4(Linear::EqTer<int,MinusView,MinusView,MinusView>);
00203 GECODE_REGISTER3(Linear::GqBin<int,IntView,IntView>);
00204 GECODE_REGISTER3(Linear::GqBin<int,IntView,MinusView>);
00205 GECODE_REGISTER3(Linear::GqBin<int,MinusView,MinusView>);
00206 GECODE_REGISTER3(Linear::Lq<double,Linear::NoView,Linear::NoView>);
00207 GECODE_REGISTER4(Linear::Lq<double,Linear::NoView,ScaleView<double,double> >);
00208 GECODE_REGISTER4(Linear::Lq<double,ScaleView<double,double>,Linear::NoView>);
00209 GECODE_REGISTER5(Linear::Lq<double,ScaleView<double,double>,ScaleView<double,double> >);
00210 GECODE_REGISTER3(Linear::Lq<int,IntView,IntView>);
00211 GECODE_REGISTER3(Linear::Lq<int,IntView,Linear::NoView>);
00212 GECODE_REGISTER3(Linear::Lq<int,Linear::NoView,IntView>);
00213 GECODE_REGISTER3(Linear::Lq<int,Linear::NoView,Linear::NoView>);
00214 GECODE_REGISTER4(Linear::Lq<int,Linear::NoView,ScaleView<int,unsigned int> >);
00215 GECODE_REGISTER4(Linear::Lq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00216 GECODE_REGISTER5(Linear::Lq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00217 GECODE_REGISTER3(Linear::LqBin<int,IntView,IntView>);
00218 GECODE_REGISTER3(Linear::LqBin<int,IntView,MinusView>);
00219 GECODE_REGISTER3(Linear::LqBin<int,MinusView,MinusView>);
00220 GECODE_REGISTER4(Linear::LqTer<int,IntView,IntView,IntView>);
00221 GECODE_REGISTER4(Linear::LqTer<int,IntView,IntView,MinusView>);
00222 GECODE_REGISTER4(Linear::LqTer<int,IntView,MinusView,MinusView>);
00223 GECODE_REGISTER4(Linear::LqTer<int,MinusView,MinusView,MinusView>);
00224 GECODE_REGISTER3(Linear::Nq<double,Linear::NoView,Linear::NoView>);
00225 GECODE_REGISTER4(Linear::Nq<double,ScaleView<double,double>,Linear::NoView>);
00226 GECODE_REGISTER5(Linear::Nq<double,ScaleView<double,double>,ScaleView<double,double> >);
00227 GECODE_REGISTER3(Linear::Nq<int,IntView,IntView>);
00228 GECODE_REGISTER3(Linear::Nq<int,IntView,Linear::NoView>);
00229 GECODE_REGISTER3(Linear::Nq<int,Linear::NoView,Linear::NoView>);
00230 GECODE_REGISTER4(Linear::Nq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00231 GECODE_REGISTER5(Linear::Nq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00232 GECODE_REGISTER3(Linear::NqBin<int,IntView,IntView>);
00233 GECODE_REGISTER3(Linear::NqBin<int,IntView,MinusView>);
00234 GECODE_REGISTER3(Linear::NqBin<int,MinusView,MinusView>);
00235 GECODE_REGISTER4(Linear::NqTer<int,IntView,IntView,IntView>);
00236 GECODE_REGISTER4(Linear::NqTer<int,IntView,IntView,MinusView>);
00237 GECODE_REGISTER4(Linear::NqTer<int,IntView,MinusView,MinusView>);
00238 GECODE_REGISTER4(Linear::NqTer<int,MinusView,MinusView,MinusView>);
00239 GECODE_REGISTER5(Linear::ReEq<double,ScaleView<double,double>,Linear::NoView,BoolView>);
00240 GECODE_REGISTER5(Linear::ReEq<double,ScaleView<double,double>,Linear::NoView,NegBoolView>);
00241 GECODE_REGISTER6(Linear::ReEq<double,ScaleView<double,double>,ScaleView<double,double>,BoolView>);
00242 GECODE_REGISTER6(Linear::ReEq<double,ScaleView<double,double>,ScaleView<double,double>,NegBoolView>);
00243 GECODE_REGISTER4(Linear::ReEq<int,IntView,IntView,BoolView>);
00244 GECODE_REGISTER4(Linear::ReEq<int,IntView,IntView,NegBoolView>);
00245 GECODE_REGISTER4(Linear::ReEq<int,IntView,Linear::NoView,BoolView>);
00246 GECODE_REGISTER4(Linear::ReEq<int,IntView,Linear::NoView,NegBoolView>);
00247 GECODE_REGISTER5(Linear::ReEq<int,ScaleView<int,unsigned int>,Linear::NoView,BoolView>);
00248 GECODE_REGISTER5(Linear::ReEq<int,ScaleView<int,unsigned int>,Linear::NoView,NegBoolView>);
00249 GECODE_REGISTER6(Linear::ReEq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int>,BoolView>);
00250 GECODE_REGISTER6(Linear::ReEq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int>,NegBoolView>);
00251 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,IntView,BoolView>);
00252 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,IntView,NegBoolView>);
00253 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,MinusView,BoolView>);
00254 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,MinusView,NegBoolView>);
00255 GECODE_REGISTER4(Linear::ReLq<double,Linear::NoView,ScaleView<double,double> >);
00256 GECODE_REGISTER4(Linear::ReLq<double,ScaleView<double,double>,Linear::NoView>);
00257 GECODE_REGISTER5(Linear::ReLq<double,ScaleView<double,double>,ScaleView<double,double> >);
00258 GECODE_REGISTER3(Linear::ReLq<int,IntView,IntView>);
00259 GECODE_REGISTER3(Linear::ReLq<int,IntView,Linear::NoView>);
00260 GECODE_REGISTER3(Linear::ReLq<int,Linear::NoView,IntView>);
00261 GECODE_REGISTER4(Linear::ReLq<int,Linear::NoView,ScaleView<int,unsigned int> >);
00262 GECODE_REGISTER4(Linear::ReLq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00263 GECODE_REGISTER5(Linear::ReLq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00264 GECODE_REGISTER3(Linear::ReLqBin<int,IntView,IntView>);
00265 GECODE_REGISTER3(Linear::ReLqBin<int,IntView,MinusView>);
00266 GECODE_REGISTER3(Linear::ReLqBin<int,MinusView,MinusView>);
00267 }
00268
00269 }
00270
00271
00272