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 11static const double kEqualsEpsilon = 0.000001; 12 13 14namespace BPrivate { 15namespace Layout { 16 17class LayoutOptimizer { 18public: 19 LayoutOptimizer(int32 variableCount); 20 ~LayoutOptimizer(); 21 22 status_t InitCheck() const; 23 24 LayoutOptimizer* Clone() const; 25 26 bool AddConstraint(int32 left, int32 right, 27 double value, bool equality); 28 bool AddConstraintsFrom( 29 const LayoutOptimizer* solver); 30 void RemoveAllConstraints(); 31 32 bool Solve(const double* desired, double size, 33 double* values); 34 35private: 36 bool _Solve(const double* desired, double* values); 37 bool _SolveSubProblem(const double* d, int am, 38 double* p); 39 void _SetResult(const double* x, double* values); 40 41 42 struct Constraint; 43 44 int32 fVariableCount; 45 BList fConstraints; 46 double* fVariables; 47 double** fTemp1; 48 double** fTemp2; 49 double** fZtrans; 50 double** fQ; 51 double** fActiveMatrix; 52 double** fActiveMatrixTemp; 53}; 54 55} // namespace Layout 56} // namespace BPrivate 57 58using BPrivate::Layout::LayoutOptimizer; 59 60 61inline bool 62fuzzy_equals(double a, double b) 63{ 64 return fabs(a - b) < kEqualsEpsilon; 65} 66 67 68#endif // LAYOUT_OPTIMIZER_H 69