00001
00036 #ifndef ABA_CONSTRAINT_H
00037 #define ABA_CONSTRAINT_H
00038
00039 #include "abacus/convar.h"
00040 #include "abacus/array.h"
00041 #include "abacus/infeascon.h"
00042 #include "abacus/csense.h"
00043
00044 class ABA_ROW;
00045 class ABA_MASTER;
00046 class ABA_VARIABLE;
00047 class ABA_CONCLASS;
00048 class ABA_LPSUB;
00049
00050 template<class BaseType, class CoType> class ABA_ACTIVE;
00051
00052 #ifdef ABACUS_PARALLEL
00053 #include "abacus/message.h"
00054 #endif
00055 class ABA_CONSTRAINT : public ABA_CONVAR {
00056 friend class ABA_LPSUB;
00057 public:
00058
00081 ABA_CONSTRAINT (ABA_MASTER *master, const ABA_SUB *sub,
00082 ABA_CSENSE::SENSE sense, double rhs,
00083 bool dynamic, bool local, bool liftable);
00084
00093 ABA_CONSTRAINT (ABA_MASTER *master);
00094
00099 ABA_CONSTRAINT(const ABA_CONSTRAINT &rhs);
00100
00103 virtual ~ABA_CONSTRAINT();
00104 #ifdef ABACUS_PARALLEL
00105
00110 ABA_CONSTRAINT(const ABA_MASTER *master, ABA_MESSAGE &msg);
00111
00121 virtual void pack(ABA_MESSAGE &msg) const;
00122 #endif
00123
00126 ABA_CSENSE *sense();
00127
00128
00133 virtual double coeff(ABA_VARIABLE *v) = 0;
00134
00137 virtual double rhs();
00138
00148 bool liftable() const;
00149
00162 virtual bool valid(ABA_SUB *sub);
00163
00180 virtual int genRow(ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *var,
00181 ABA_ROW &row);
00182
00191 virtual double slack(ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *variables,
00192 double *x);
00193
00204 virtual bool violated(ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *variables,
00205 double *x, double *sl = 0);
00206
00219 virtual bool violated(double slack) const;
00220
00227 void printRow(ostream &out, ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *var);
00228
00242 virtual double distance(double *x,
00243 ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *actVar);
00244
00245 ABA_CONSTRAINT *duplicate()
00246 {return 0;};
00247
00258 ABA_CONCLASS *classification(ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *var = 0);
00259 protected:
00260
00276 virtual ABA_INFEASCON::INFEAS voidLhsViolated(double newRhs) const;
00277
00281 virtual ABA_CONCLASS *classify(ABA_ACTIVE<ABA_VARIABLE, ABA_CONSTRAINT> *var);
00282
00285 ABA_CSENSE sense_;
00286
00289 double rhs_;
00290 ABA_CONCLASS *conClass_;
00291
00296 bool liftable_;
00297
00298 private:
00299 const ABA_CONSTRAINT &operator=(const ABA_CONSTRAINT &rhs);
00300 };
00301
00302
00303 inline ABA_CSENSE *ABA_CONSTRAINT::sense()
00304 {
00305 return &sense_;
00306 }
00307
00308 inline bool ABA_CONSTRAINT::liftable() const
00309 {
00310 return liftable_;
00311 }
00312
00313
00314 #endif // ABA_CONSTRAINT_H
00315