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 t[x.size()].a=-1; t[x.size()].x=y;
00106 Linear::post(home,t,x.size()+1,r,0,icl);
00107 }
00108
00109 void
00110 linear(Space* home,
00111 const IntVarArgs& x, IntRelType r, IntVar y, BoolVar b,
00112 IntConLevel, PropKind) {
00113 if (home->failed()) return;
00114 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00115 for (int i = x.size(); i--; ) {
00116 t[i].a=1; t[i].x=x[i];
00117 }
00118 t[x.size()].a=-1; t[x.size()].x=y;
00119 Linear::post(home,t,x.size()+1,r,0,b);
00120 }
00121
00122 void
00123 linear(Space* home,
00124 const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
00125 IntConLevel icl, PropKind) {
00126 if (a.size() != x.size())
00127 throw ArgumentSizeMismatch("Int::linear");
00128 if (home->failed()) return;
00129 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00130 for (int i = x.size(); i--; ) {
00131 t[i].a=a[i]; t[i].x=x[i];
00132 }
00133 t[x.size()].a=-1; t[x.size()].x=y;
00134 Linear::post(home,t,x.size()+1,r,0,icl);
00135 }
00136
00137 void
00138 linear(Space* home,
00139 const IntArgs& a, const IntVarArgs& x, IntRelType r, IntVar y,
00140 BoolVar b, IntConLevel, PropKind) {
00141 if (a.size() != x.size())
00142 throw ArgumentSizeMismatch("Int::linear");
00143 if (home->failed()) return;
00144 GECODE_AUTOARRAY(Linear::Term<IntView>, t, x.size()+1);
00145 for (int i = x.size(); i--; ) {
00146 t[i].a=a[i]; t[i].x=x[i];
00147 }
00148 t[x.size()].a=-1; t[x.size()].x=y;
00149 Linear::post(home,t,x.size()+1,r,0,b);
00150 }
00151
00152 namespace {
00153 using namespace Int;
00154 GECODE_REGISTER3(Linear::DomEq<double,ScaleView<double,double> >);
00155 GECODE_REGISTER3(Linear::DomEq<int,ScaleView<int,unsigned int> >);
00156 GECODE_REGISTER3(Linear::Eq<double,Linear::NoView,Linear::NoView>);
00157 GECODE_REGISTER4(Linear::Eq<double,ScaleView<double,double>,Linear::NoView>);
00158 GECODE_REGISTER5(Linear::Eq<double,ScaleView<double,double>,ScaleView<double,double> >);
00159 GECODE_REGISTER3(Linear::Eq<int,IntView,IntView>);
00160 GECODE_REGISTER3(Linear::Eq<int,IntView,Linear::NoView>);
00161 GECODE_REGISTER3(Linear::Eq<int,Linear::NoView,Linear::NoView>);
00162 GECODE_REGISTER4(Linear::Eq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00163 GECODE_REGISTER5(Linear::Eq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00164 GECODE_REGISTER3(Linear::EqBin<int,IntView,IntView>);
00165 GECODE_REGISTER3(Linear::EqBin<int,IntView,MinusView>);
00166 GECODE_REGISTER3(Linear::EqBin<int,MinusView,MinusView>);
00167 GECODE_REGISTER4(Linear::EqTer<int,IntView,IntView,IntView>);
00168 GECODE_REGISTER4(Linear::EqTer<int,IntView,IntView,MinusView>);
00169 GECODE_REGISTER4(Linear::EqTer<int,IntView,MinusView,MinusView>);
00170 GECODE_REGISTER4(Linear::EqTer<int,MinusView,MinusView,MinusView>);
00171 GECODE_REGISTER3(Linear::GqBin<int,IntView,IntView>);
00172 GECODE_REGISTER3(Linear::GqBin<int,IntView,MinusView>);
00173 GECODE_REGISTER3(Linear::GqBin<int,MinusView,MinusView>);
00174 GECODE_REGISTER3(Linear::Lq<double,Linear::NoView,Linear::NoView>);
00175 GECODE_REGISTER4(Linear::Lq<double,Linear::NoView,ScaleView<double,double> >);
00176 GECODE_REGISTER4(Linear::Lq<double,ScaleView<double,double>,Linear::NoView>);
00177 GECODE_REGISTER5(Linear::Lq<double,ScaleView<double,double>,ScaleView<double,double> >);
00178 GECODE_REGISTER3(Linear::Lq<int,IntView,IntView>);
00179 GECODE_REGISTER3(Linear::Lq<int,IntView,Linear::NoView>);
00180 GECODE_REGISTER3(Linear::Lq<int,Linear::NoView,IntView>);
00181 GECODE_REGISTER3(Linear::Lq<int,Linear::NoView,Linear::NoView>);
00182 GECODE_REGISTER4(Linear::Lq<int,Linear::NoView,ScaleView<int,unsigned int> >);
00183 GECODE_REGISTER4(Linear::Lq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00184 GECODE_REGISTER5(Linear::Lq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00185 GECODE_REGISTER3(Linear::LqBin<int,IntView,IntView>);
00186 GECODE_REGISTER3(Linear::LqBin<int,IntView,MinusView>);
00187 GECODE_REGISTER3(Linear::LqBin<int,MinusView,MinusView>);
00188 GECODE_REGISTER4(Linear::LqTer<int,IntView,IntView,IntView>);
00189 GECODE_REGISTER4(Linear::LqTer<int,IntView,IntView,MinusView>);
00190 GECODE_REGISTER4(Linear::LqTer<int,IntView,MinusView,MinusView>);
00191 GECODE_REGISTER4(Linear::LqTer<int,MinusView,MinusView,MinusView>);
00192 GECODE_REGISTER3(Linear::Nq<double,Linear::NoView,Linear::NoView>);
00193 GECODE_REGISTER4(Linear::Nq<double,ScaleView<double,double>,Linear::NoView>);
00194 GECODE_REGISTER5(Linear::Nq<double,ScaleView<double,double>,ScaleView<double,double> >);
00195 GECODE_REGISTER3(Linear::Nq<int,IntView,IntView>);
00196 GECODE_REGISTER3(Linear::Nq<int,IntView,Linear::NoView>);
00197 GECODE_REGISTER3(Linear::Nq<int,Linear::NoView,Linear::NoView>);
00198 GECODE_REGISTER4(Linear::Nq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00199 GECODE_REGISTER5(Linear::Nq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00200 GECODE_REGISTER3(Linear::NqBin<int,IntView,IntView>);
00201 GECODE_REGISTER3(Linear::NqBin<int,IntView,MinusView>);
00202 GECODE_REGISTER3(Linear::NqBin<int,MinusView,MinusView>);
00203 GECODE_REGISTER4(Linear::NqTer<int,IntView,IntView,IntView>);
00204 GECODE_REGISTER4(Linear::NqTer<int,IntView,IntView,MinusView>);
00205 GECODE_REGISTER4(Linear::NqTer<int,IntView,MinusView,MinusView>);
00206 GECODE_REGISTER4(Linear::NqTer<int,MinusView,MinusView,MinusView>);
00207 GECODE_REGISTER5(Linear::ReEq<double,ScaleView<double,double>,Linear::NoView,BoolView>);
00208 GECODE_REGISTER5(Linear::ReEq<double,ScaleView<double,double>,Linear::NoView,NegBoolView>);
00209 GECODE_REGISTER6(Linear::ReEq<double,ScaleView<double,double>,ScaleView<double,double>,BoolView>);
00210 GECODE_REGISTER6(Linear::ReEq<double,ScaleView<double,double>,ScaleView<double,double>,NegBoolView>);
00211 GECODE_REGISTER4(Linear::ReEq<int,IntView,IntView,BoolView>);
00212 GECODE_REGISTER4(Linear::ReEq<int,IntView,IntView,NegBoolView>);
00213 GECODE_REGISTER4(Linear::ReEq<int,IntView,Linear::NoView,BoolView>);
00214 GECODE_REGISTER4(Linear::ReEq<int,IntView,Linear::NoView,NegBoolView>);
00215 GECODE_REGISTER5(Linear::ReEq<int,ScaleView<int,unsigned int>,Linear::NoView,BoolView>);
00216 GECODE_REGISTER5(Linear::ReEq<int,ScaleView<int,unsigned int>,Linear::NoView,NegBoolView>);
00217 GECODE_REGISTER6(Linear::ReEq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int>,BoolView>);
00218 GECODE_REGISTER6(Linear::ReEq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int>,NegBoolView>);
00219 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,IntView,BoolView>);
00220 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,IntView,NegBoolView>);
00221 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,MinusView,BoolView>);
00222 GECODE_REGISTER4(Linear::ReEqBin<int,IntView,MinusView,NegBoolView>);
00223 GECODE_REGISTER4(Linear::ReLq<double,Linear::NoView,ScaleView<double,double> >);
00224 GECODE_REGISTER4(Linear::ReLq<double,ScaleView<double,double>,Linear::NoView>);
00225 GECODE_REGISTER5(Linear::ReLq<double,ScaleView<double,double>,ScaleView<double,double> >);
00226 GECODE_REGISTER3(Linear::ReLq<int,IntView,IntView>);
00227 GECODE_REGISTER3(Linear::ReLq<int,IntView,Linear::NoView>);
00228 GECODE_REGISTER3(Linear::ReLq<int,Linear::NoView,IntView>);
00229 GECODE_REGISTER4(Linear::ReLq<int,Linear::NoView,ScaleView<int,unsigned int> >);
00230 GECODE_REGISTER4(Linear::ReLq<int,ScaleView<int,unsigned int>,Linear::NoView>);
00231 GECODE_REGISTER5(Linear::ReLq<int,ScaleView<int,unsigned int>,ScaleView<int,unsigned int> >);
00232 GECODE_REGISTER3(Linear::ReLqBin<int,IntView,IntView>);
00233 GECODE_REGISTER3(Linear::ReLqBin<int,IntView,MinusView>);
00234 GECODE_REGISTER3(Linear::ReLqBin<int,MinusView,MinusView>);
00235 }
00236
00237 }
00238
00239
00240