1*03069455SIngo Weinhold /* 2*03069455SIngo Weinhold * Copyright 2007-2008, Christof Lutteroth, lutteroth@cs.auckland.ac.nz 3*03069455SIngo Weinhold * Copyright 2007-2008, James Kim, jkim202@ec.auckland.ac.nz 4*03069455SIngo Weinhold * Distributed under the terms of the MIT License. 5*03069455SIngo Weinhold */ 6*03069455SIngo Weinhold 7a101e99aSIngo Weinhold #ifndef LINEAR_SPEC_H 8a101e99aSIngo Weinhold #define LINEAR_SPEC_H 9a101e99aSIngo Weinhold 10a101e99aSIngo Weinhold #include "OperatorType.h" 11a101e99aSIngo Weinhold #include "ResultType.h" 12a101e99aSIngo Weinhold #include "OptimizationType.h" 13a101e99aSIngo Weinhold 14a101e99aSIngo Weinhold #include "lp_lib.h" 15a101e99aSIngo Weinhold 16a101e99aSIngo Weinhold #include <List.h> 17a101e99aSIngo Weinhold #include <OS.h> 18a101e99aSIngo Weinhold #include <SupportDefs.h> 19*03069455SIngo Weinhold #include <math.h> 20a101e99aSIngo Weinhold 21a101e99aSIngo Weinhold 22a101e99aSIngo Weinhold namespace LinearProgramming { 23a101e99aSIngo Weinhold 24a101e99aSIngo Weinhold class Constraint; 25a101e99aSIngo Weinhold class ObjFunctionSummand; 26a101e99aSIngo Weinhold class PenaltyFunction; 27a101e99aSIngo Weinhold class Variable; 28a101e99aSIngo Weinhold 29a101e99aSIngo Weinhold /** 30a101e99aSIngo Weinhold * Specification of a linear programming problem. 31a101e99aSIngo Weinhold */ 32a101e99aSIngo Weinhold class LinearSpec { 33a101e99aSIngo Weinhold 34a101e99aSIngo Weinhold public: 35a101e99aSIngo Weinhold LinearSpec(); 36a101e99aSIngo Weinhold ~LinearSpec(); 37a101e99aSIngo Weinhold void UpdateObjFunction(); 38*03069455SIngo Weinhold void SetObjFunction(BList* summands); 39a101e99aSIngo Weinhold ObjFunctionSummand* AddObjFunctionSummand(double coeff, Variable* var); 40a101e99aSIngo Weinhold Variable* AddVariable(); 41a101e99aSIngo Weinhold 42*03069455SIngo Weinhold Constraint* AddConstraint(BList* summands, 43a101e99aSIngo Weinhold OperatorType op, double rightSide); 44a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 45a101e99aSIngo Weinhold OperatorType op, double rightSide); 46a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 47a101e99aSIngo Weinhold double coeff2, Variable* var2, 48a101e99aSIngo Weinhold OperatorType op, double rightSide); 49a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 50a101e99aSIngo Weinhold double coeff2, Variable* var2, 51a101e99aSIngo Weinhold double coeff3, Variable* var3, 52a101e99aSIngo Weinhold OperatorType op, double rightSide); 53a101e99aSIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 54a101e99aSIngo Weinhold double coeff2, Variable* var2, 55a101e99aSIngo Weinhold double coeff3, Variable* var3, 56a101e99aSIngo Weinhold double coeff4, Variable* var4, 57a101e99aSIngo Weinhold OperatorType op, double rightSide); 58a101e99aSIngo Weinhold 59*03069455SIngo Weinhold Constraint* AddConstraint(BList* summands, 60a101e99aSIngo Weinhold OperatorType op, double rightSide, 61a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 62*03069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 63a101e99aSIngo Weinhold OperatorType op, double rightSide, 64a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 65*03069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 66a101e99aSIngo Weinhold double coeff2, Variable* var2, 67a101e99aSIngo Weinhold OperatorType op, double rightSide, 68a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 69*03069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 70a101e99aSIngo Weinhold double coeff2, Variable* var2, 71a101e99aSIngo Weinhold double coeff3, Variable* var3, 72a101e99aSIngo Weinhold OperatorType op, double rightSide, 73a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 74*03069455SIngo Weinhold Constraint* AddConstraint(double coeff1, Variable* var1, 75a101e99aSIngo Weinhold double coeff2, Variable* var2, 76a101e99aSIngo Weinhold double coeff3, Variable* var3, 77a101e99aSIngo Weinhold double coeff4, Variable* var4, 78a101e99aSIngo Weinhold OperatorType op, double rightSide, 79a101e99aSIngo Weinhold double penaltyNeg, double penaltyPos); 80a101e99aSIngo Weinhold 81a101e99aSIngo Weinhold PenaltyFunction* AddPenaltyFunction(Variable* var, BList* xs, BList* gs); 82a101e99aSIngo Weinhold void RemovePresolved(); 83a101e99aSIngo Weinhold ResultType Presolve(); 84a101e99aSIngo Weinhold ResultType Solve(); 85a101e99aSIngo Weinhold void Save(char* fname); 86a101e99aSIngo Weinhold 87a101e99aSIngo Weinhold int32 Columns() const; 88a101e99aSIngo Weinhold void SetColumns(int32 value); 89a101e99aSIngo Weinhold OptimizationType Optimization() const; 90a101e99aSIngo Weinhold void SetOptimization(OptimizationType value); 91a101e99aSIngo Weinhold lprec* LP() const; 92a101e99aSIngo Weinhold void SetLP(lprec* value); 93a101e99aSIngo Weinhold BList* ObjFunctionSummands() const; 94a101e99aSIngo Weinhold void SetObjFunctionSummands(BList* value); 95a101e99aSIngo Weinhold BList* Variables() const; 96a101e99aSIngo Weinhold void SetVariables(BList* value); 97a101e99aSIngo Weinhold BList* Constraints() const; 98a101e99aSIngo Weinhold void SetConstraints(BList* value); 99a101e99aSIngo Weinhold ResultType Result() const; 100a101e99aSIngo Weinhold void SetResult(ResultType value); 101a101e99aSIngo Weinhold double ObjectiveValue() const; 102a101e99aSIngo Weinhold void SetObjectiveValue(double value); 103a101e99aSIngo Weinhold double SolvingTime() const; 104a101e99aSIngo Weinhold void SetSolvingTime(double value); 105a101e99aSIngo Weinhold 106a101e99aSIngo Weinhold protected: 107a101e99aSIngo Weinhold int32 fColumns; 108a101e99aSIngo Weinhold 109a101e99aSIngo Weinhold private: 110a101e99aSIngo Weinhold lprec* fLpPresolved; 111a101e99aSIngo Weinhold OptimizationType fOptimization; 112a101e99aSIngo Weinhold lprec* fLP; 113a101e99aSIngo Weinhold BList* fObjFunctionSummands; 114a101e99aSIngo Weinhold BList* fVariables; 115a101e99aSIngo Weinhold BList* fConstraints; 116a101e99aSIngo Weinhold ResultType fResult; 117a101e99aSIngo Weinhold double fObjectiveValue; 118a101e99aSIngo Weinhold double fSolvingTime; // = Double.Nan 119a101e99aSIngo Weinhold 120a101e99aSIngo Weinhold public: 121a101e99aSIngo Weinhold friend class ObjFunctionSummand; 122*03069455SIngo Weinhold friend class Constraint; 123a101e99aSIngo Weinhold 124a101e99aSIngo Weinhold }; 125a101e99aSIngo Weinhold 126a101e99aSIngo Weinhold } // namespace LinearProgramming 127a101e99aSIngo Weinhold 128a101e99aSIngo Weinhold using LinearProgramming::LinearSpec; 129a101e99aSIngo Weinhold 130a101e99aSIngo Weinhold #endif // LINEAR_SPEC_H 131