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 #ifndef __GECODE_FLOAT_LINEAR_HH__
00039 #define __GECODE_FLOAT_LINEAR_HH__
00040
00041 #include <gecode/int.hh>
00042 #include <gecode/float.hh>
00043
00049 namespace Gecode { namespace Float { namespace Linear {
00050
00056 template<class P, class N, PropCond pc>
00057 class Lin : public Propagator {
00058 protected:
00060 ViewArray<P> x;
00062 ViewArray<N> y;
00064 FloatVal c;
00065
00067 Lin(Space& home, Lin<P,N,pc>& p);
00069 Lin(Home home, ViewArray<P>& x, ViewArray<N>& y, FloatVal c);
00070 public:
00072 virtual PropCost cost(const Space& home, const ModEventDelta& med) const;
00074 virtual void reschedule(Space& home);
00076 virtual size_t dispose(Space& home);
00077 };
00078
00084 template<class View>
00085 void bounds_p(ModEventDelta med, ViewArray<View>& x,
00086 FloatVal& c, FloatNum& sl, FloatNum& su);
00087
00093 template<class View>
00094 void bounds_n(ModEventDelta med, ViewArray<View>& y,
00095 FloatVal& c, FloatNum& sl, FloatNum& su);
00096
00105 template<class P, class N>
00106 class Eq : public Lin<P,N,PC_FLOAT_BND> {
00107 protected:
00108 using Lin<P,N,PC_FLOAT_BND>::x;
00109 using Lin<P,N,PC_FLOAT_BND>::y;
00110 using Lin<P,N,PC_FLOAT_BND>::c;
00111
00113 Eq(Space& home, Eq& p);
00114 public:
00116 Eq(Home home, ViewArray<P>& x, ViewArray<N>& y, FloatVal c);
00118 virtual Actor* copy(Space& home);
00120 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00122 static ExecStatus
00123 post(Home home, ViewArray<P>& x, ViewArray<N>& y, FloatVal c);
00124 };
00125
00126
00135 template<class P, class N>
00136 class Lq : public Lin<P,N,PC_FLOAT_BND> {
00137 protected:
00138 using Lin<P,N,PC_FLOAT_BND>::x;
00139 using Lin<P,N,PC_FLOAT_BND>::y;
00140 using Lin<P,N,PC_FLOAT_BND>::c;
00141
00143 Lq(Space& home, Lq& p);
00144 public:
00146 Lq(Home home, ViewArray<P>& x, ViewArray<N>& y, FloatVal c);
00148 virtual Actor* copy(Space& home);
00150 virtual ExecStatus propagate(Space& home, const ModEventDelta& med);
00152 static ExecStatus
00153 post(Home home, ViewArray<P>& x, ViewArray<N>& y, FloatVal c);
00154 };
00155
00156 }}}
00157
00158 #include <gecode/float/linear/nary.hpp>
00159
00160 namespace Gecode { namespace Float { namespace Linear {
00161
00166 class Term {
00167 public:
00169 FloatVal a;
00171 FloatView x;
00172 };
00173
00188 GECODE_FLOAT_EXPORT void
00189 estimate(Term* t, int n, FloatVal c, FloatNum& l, FloatNum& u);
00190
00207 GECODE_FLOAT_EXPORT void
00208 post(Home home, Term* t, int n, FloatRelType frt, FloatVal c);
00209
00227 GECODE_FLOAT_EXPORT void
00228 post(Home home, Term* t, int n, FloatRelType frt, FloatVal c, Reify r);
00229
00230 }}}
00231
00232 #endif
00233
00234