Generated on Mon Aug 25 11:35:37 2008 for Gecode by doxygen 1.5.6

linear-int.cc

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2002
00008  *
00009  *  Last modified:
00010  *     $Date: 2008-07-11 11:02:56 +0200 (Fri, 11 Jul 2008) $ by $Author: tack $
00011  *     $Revision: 7355 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  *  Permission is hereby granted, free of charge, to any person obtaining
00018  *  a copy of this software and associated documentation files (the
00019  *  "Software"), to deal in the Software without restriction, including
00020  *  without limitation the rights to use, copy, modify, merge, publish,
00021  *  distribute, sublicense, and/or sell copies of the Software, and to
00022  *  permit persons to whom the Software is furnished to do so, subject to
00023  *  the following conditions:
00024  *
00025  *  The above copyright notice and this permission notice shall be
00026  *  included in all copies or substantial portions of the Software.
00027  *
00028  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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 // STATISTICS: int-post
00272