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