xref: /haiku/src/libs/linprog/LayoutOptimizer.h (revision 4fd62caa9acc437534c41bbb7d3fc9d53e915005)
1 /*
2  * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef LAYOUT_OPTIMIZER_H
6 #define LAYOUT_OPTIMIZER_H
7 
8 #include <List.h>
9 #include <math.h>
10 
11 #include "LinearSpec.h"
12 
13 
14 static const double kEqualsEpsilon = 0.000001;
15 
16 
17 double** allocate_matrix(int m, int n);
18 void free_matrix(double** matrix);
19 void copy_matrix(const double* const* A, double** B, int m, int n);
20 void zero_matrix(double** A, int m, int n);
21 int compute_dependencies(double** a, int m, int n, bool* independent);
22 
23 
24 bool is_soft(Constraint* constraint);
25 
26 
27 class LayoutOptimizer {
28 public:
29 								LayoutOptimizer(const ConstraintList& list,
30 									int32 variableCount);
31 								~LayoutOptimizer();
32 
33 			bool				SetConstraints(const ConstraintList& list,
34 									int32 variableCount);
35 
36 			status_t			InitCheck() const;
37 
38 			bool				Solve(double* initialSolution);
39 
40 private:
41 			double				_ActualValue(Constraint* constraint,
42 									double* values) const;
43 			double				_RightSide(Constraint* constraint);
44 
45 			void				_MakeEmpty();
46 			void				_Init(int32 variableCount, int32 nConstraints);
47 
48 			bool				_Solve(double* values);
49 			bool				_SolveSubProblem(const double* d, int am,
50 									double* p);
51 			void				_SetResult(const double* x, double* values);
52 
53 
54 			int32				fVariableCount;
55 			ConstraintList*		fConstraints;
56 
57 			double**			fTemp1;
58 			double**			fTemp2;
59 			double**			fZtrans;
60 			double**			fQ;
61 			double**			fActiveMatrix;
62 			double**			fActiveMatrixTemp;
63 			double**			fSoftConstraints;
64 			double**			fG;
65 			double*				fDesired;
66 };
67 
68 
69 inline bool
70 fuzzy_equals(double a, double b)
71 {
72 	return fabs(a - b) < kEqualsEpsilon;
73 }
74 
75 
76 #endif	// LAYOUT_OPTIMIZER_H
77