103069455SIngo Weinhold /* 203069455SIngo Weinhold * Copyright 2007-2008, Christof Lutteroth, lutteroth@cs.auckland.ac.nz 303069455SIngo Weinhold * Copyright 2007-2008, James Kim, jkim202@ec.auckland.ac.nz 444032741SClemens Zeidler * Copyright 2010, Clemens Zeidler, haiku@clemens-zeidler.de 503069455SIngo Weinhold * Distributed under the terms of the MIT License. 603069455SIngo Weinhold */ 7a101e99aSIngo Weinhold #ifndef LINEAR_SPEC_H 8a101e99aSIngo Weinhold #define LINEAR_SPEC_H 9a101e99aSIngo Weinhold 1003069455SIngo Weinhold #include <math.h> 11a101e99aSIngo Weinhold 1244032741SClemens Zeidler #include <List.h> 1344032741SClemens Zeidler #include <OS.h> 147583db5aSClemens Zeidler #include <Size.h> 1544032741SClemens Zeidler #include <String.h> 1644032741SClemens Zeidler #include <SupportDefs.h> 1744032741SClemens Zeidler 1844032741SClemens Zeidler #include "Constraint.h" 19f108cdbfSClemens Zeidler #include "LinearProgrammingTypes.h" 2044032741SClemens Zeidler #include "Summand.h" 2144032741SClemens Zeidler #include "Variable.h" 2244032741SClemens Zeidler 23cd88ee00SClemens Zeidler 24a101e99aSIngo Weinhold namespace LinearProgramming { 25a101e99aSIngo Weinhold 267583db5aSClemens Zeidler 277583db5aSClemens Zeidler class LinearSpec; 287583db5aSClemens Zeidler 297583db5aSClemens Zeidler 307583db5aSClemens Zeidler const BSize kMinSize(0, 0); 317583db5aSClemens Zeidler const BSize kMaxSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED); 327583db5aSClemens Zeidler 337583db5aSClemens Zeidler 345440f6feSClemens Zeidler class SolverInterface { 355440f6feSClemens Zeidler public: 367583db5aSClemens Zeidler SolverInterface(LinearSpec* linSpec); 377583db5aSClemens Zeidler 385440f6feSClemens Zeidler virtual ~SolverInterface() {} 395440f6feSClemens Zeidler 407583db5aSClemens Zeidler virtual ResultType Solve() = 0; 415440f6feSClemens Zeidler 427583db5aSClemens Zeidler virtual bool VariableAdded(Variable* variable) = 0; 437583db5aSClemens Zeidler virtual bool VariableRemoved(Variable* variable) = 0; 447583db5aSClemens Zeidler virtual bool VariableRangeChanged(Variable* variable) = 0; 455440f6feSClemens Zeidler 467583db5aSClemens Zeidler virtual bool ConstraintAdded(Constraint* constraint) = 0; 477583db5aSClemens Zeidler virtual bool ConstraintRemoved(Constraint* constraint) = 0; 487583db5aSClemens Zeidler virtual bool LeftSideChanged(Constraint* constraint) = 0; 497583db5aSClemens Zeidler virtual bool RightSideChanged(Constraint* constraint) = 0; 507583db5aSClemens Zeidler virtual bool OperatorChanged(Constraint* constraint) = 0; 515440f6feSClemens Zeidler 525440f6feSClemens Zeidler virtual bool SaveModel(const char* fileName) = 0; 537583db5aSClemens Zeidler 547583db5aSClemens Zeidler virtual BSize MinSize(Variable* width, Variable* height) = 0; 557583db5aSClemens Zeidler virtual BSize MaxSize(Variable* width, Variable* height) = 0; 567583db5aSClemens Zeidler 577583db5aSClemens Zeidler protected: 587583db5aSClemens Zeidler LinearSpec* fLinearSpec; 595440f6feSClemens Zeidler }; 605440f6feSClemens Zeidler 615440f6feSClemens Zeidler 6244032741SClemens Zeidler /*! 63a101e99aSIngo Weinhold * Specification of a linear programming problem. 64a101e99aSIngo Weinhold */ 65a101e99aSIngo Weinhold class LinearSpec { 66a101e99aSIngo Weinhold public: 67a101e99aSIngo Weinhold LinearSpec(); 68676ef01bSAxel Dörfler virtual ~LinearSpec(); 695bced18eSIngo Weinhold 70a101e99aSIngo Weinhold Variable* AddVariable(); 71fc691d7dSClemens Zeidler bool AddVariable(Variable* variable); 72fc691d7dSClemens Zeidler bool RemoveVariable(Variable* variable, 73fc691d7dSClemens Zeidler bool deleteVariable = true); 74fc691d7dSClemens Zeidler int32 IndexOf(const Variable* variable) const; 755440f6feSClemens Zeidler bool UpdateRange(Variable* variable); 76a101e99aSIngo Weinhold 77067f47a3SClemens Zeidler bool AddConstraint(Constraint* constraint); 78067f47a3SClemens Zeidler bool RemoveConstraint(Constraint* constraint, 79067f47a3SClemens Zeidler bool deleteConstraint = true); 80067f47a3SClemens Zeidler 81601eded9SClemens Zeidler Constraint* AddConstraint(SummandList* summands, 82a101e99aSIngo Weinhold OperatorType op, double rightSide); 83a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 84a101e99aSIngo Weinhold OperatorType op, double rightSide); 85a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 86a101e99aSIngo Weinhold double coeff2, Variable* var2, 87a101e99aSIngo Weinhold OperatorType op, double rightSide); 88a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 89a101e99aSIngo Weinhold double coeff2, Variable* var2, 90a101e99aSIngo Weinhold double coeff3, Variable* var3, 91a101e99aSIngo Weinhold OperatorType op, double rightSide); 92a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 93a101e99aSIngo Weinhold double coeff2, Variable* var2, 94a101e99aSIngo Weinhold double coeff3, Variable* var3, 95a101e99aSIngo Weinhold double coeff4, Variable* var4, 96a101e99aSIngo Weinhold OperatorType op, double rightSide); 97a101e99aSIngo Weinhold 98601eded9SClemens Zeidler Constraint* AddConstraint(SummandList* summands, 99a101e99aSIngo Weinhold OperatorType op, double rightSide, 100a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 10103069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 102a101e99aSIngo Weinhold OperatorType op, double rightSide, 103a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 10403069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 105a101e99aSIngo Weinhold double coeff2, Variable* var2, 106a101e99aSIngo Weinhold OperatorType op, double rightSide, 107a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 10803069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 109a101e99aSIngo Weinhold double coeff2, Variable* var2, 110a101e99aSIngo Weinhold double coeff3, Variable* var3, 111a101e99aSIngo Weinhold OperatorType op, double rightSide, 112a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 11303069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 114a101e99aSIngo Weinhold double coeff2, Variable* var2, 115a101e99aSIngo Weinhold double coeff3, Variable* var3, 116a101e99aSIngo Weinhold double coeff4, Variable* var4, 117a101e99aSIngo Weinhold OperatorType op, double rightSide, 118a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 119a101e99aSIngo Weinhold 1207583db5aSClemens Zeidler BSize MinSize(Variable* width, Variable* height); 1217583db5aSClemens Zeidler BSize MaxSize(Variable* width, Variable* height); 1225bced18eSIngo Weinhold 123a101e99aSIngo Weinhold ResultType Solve(); 1245440f6feSClemens Zeidler bool Save(const char* fileName); 125a101e99aSIngo Weinhold 1265bced18eSIngo Weinhold int32 CountColumns() const; 12744032741SClemens Zeidler 128a101e99aSIngo Weinhold ResultType Result() const; 1297583db5aSClemens Zeidler bigtime_t SolvingTime() const; 130a101e99aSIngo Weinhold 131b8ec67f4SStephan Aßmus operator BString() const; 132b8ec67f4SStephan Aßmus void GetString(BString& string) const; 133676ef01bSAxel Dörfler 134fc691d7dSClemens Zeidler const ConstraintList& Constraints() const; 1357583db5aSClemens Zeidler const VariableList& Variables() const; 136a101e99aSIngo Weinhold 137067f47a3SClemens Zeidler protected: 138067f47a3SClemens Zeidler friend class Constraint; 139067f47a3SClemens Zeidler bool UpdateLeftSide(Constraint* constraint); 140067f47a3SClemens Zeidler bool UpdateRightSide(Constraint* constraint); 141067f47a3SClemens Zeidler bool UpdateOperator(Constraint* constraint); 142a101e99aSIngo Weinhold private: 143067f47a3SClemens Zeidler /*! Check if all entries != NULL otherwise delete the list and its 144067f47a3SClemens Zeidler entries. */ 145067f47a3SClemens Zeidler bool _CheckSummandList(SummandList* list); 146067f47a3SClemens Zeidler Constraint* _AddConstraint(SummandList* leftSide, 147067f47a3SClemens Zeidler OperatorType op, double rightSide, 148067f47a3SClemens Zeidler double penaltyNeg, double penaltyPos); 149067f47a3SClemens Zeidler 150cd88ee00SClemens Zeidler VariableList fVariables; 151*a0ad88e0SClemens Zeidler VariableList fUsedVariables; 152cd88ee00SClemens Zeidler ConstraintList fConstraints; 153a101e99aSIngo Weinhold ResultType fResult; 1547583db5aSClemens Zeidler bigtime_t fSolvingTime; 155a101e99aSIngo Weinhold 1565440f6feSClemens Zeidler SolverInterface* fSolver; 157a101e99aSIngo Weinhold }; 158a101e99aSIngo Weinhold 159a101e99aSIngo Weinhold } // namespace LinearProgramming 160a101e99aSIngo Weinhold 161a101e99aSIngo Weinhold using LinearProgramming::LinearSpec; 162a101e99aSIngo Weinhold 163a101e99aSIngo Weinhold #endif // LINEAR_SPEC_H 164