xref: /haiku/headers/libs/linprog/LinearSpec.h (revision 0306945545b0fc20ec4da7cff2e99ac39f48d726)
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