From 3d25371741ee3df729b2318736ca10c2a242ce0f Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Tue, 8 Feb 2011 09:07:26 +0000 Subject: [PATCH] Don't copy the constraint list, just use a pointer to the list. There was a strange crash under gcc4. After some searching I found out that there is some clash with namespaces. After removing the namespaces it works again. Could somebody explain what went wrong there? git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40386 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/libs/linprog/ActiveSetSolver.cpp | 4 ++-- src/libs/linprog/LayoutOptimizer.cpp | 36 ++++++++++++++-------------- src/libs/linprog/LayoutOptimizer.h | 11 +-------- 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/libs/linprog/ActiveSetSolver.cpp b/src/libs/linprog/ActiveSetSolver.cpp index 7c26c546dd..4b847a0b32 100644 --- a/src/libs/linprog/ActiveSetSolver.cpp +++ b/src/libs/linprog/ActiveSetSolver.cpp @@ -16,7 +16,7 @@ using namespace LinearProgramming; -using namespace BPrivate::Layout; +//using namespace BPrivate::Layout; template @@ -275,7 +275,7 @@ ActiveSetSolver::ActiveSetSolver(LinearSpec* linearSpec) : SolverInterface(linearSpec), - fVariables(linearSpec->Variables()), + fVariables(linearSpec->UsedVariables()), fConstraints(linearSpec->Constraints()) { diff --git a/src/libs/linprog/LayoutOptimizer.cpp b/src/libs/linprog/LayoutOptimizer.cpp index 0a1f964204..380c680576 100644 --- a/src/libs/linprog/LayoutOptimizer.cpp +++ b/src/libs/linprog/LayoutOptimizer.cpp @@ -106,7 +106,7 @@ negate_vector(double* x, int n) // allocate_matrix double** -BPrivate::Layout::allocate_matrix(int m, int n) +allocate_matrix(int m, int n) { double** matrix = new(nothrow) double*[m]; if (!matrix) @@ -128,7 +128,7 @@ BPrivate::Layout::allocate_matrix(int m, int n) // free_matrix void -BPrivate::Layout::free_matrix(double** matrix) +free_matrix(double** matrix) { if (matrix) { delete[] *matrix; @@ -185,7 +185,7 @@ transpose_matrix(const double* const* A, double** Atrans, int m, int n) // zero_matrix void -BPrivate::Layout::zero_matrix(double** A, int m, int n) +zero_matrix(double** A, int m, int n) { for (int i = 0; i < m; i++) { for (int k = 0; k < n; k++) @@ -196,7 +196,7 @@ BPrivate::Layout::zero_matrix(double** A, int m, int n) // copy_matrix void -BPrivate::Layout::copy_matrix(const double* const* A, double** B, int m, int n) +copy_matrix(const double* const* A, double** B, int m, int n) { for (int i = 0; i < m; i++) { for (int k = 0; k < n; k++) @@ -261,7 +261,7 @@ swap(Type& a, Type& b) bool -BPrivate::Layout::solve(double** a, int n, double* b) +solve(double** a, int n, double* b) { // index array for row permutation // Note: We could eliminate it, if we would permutate the row pointers of a. @@ -320,7 +320,7 @@ BPrivate::Layout::solve(double** a, int n, double* b) int -BPrivate::Layout::compute_dependencies(double** a, int m, int n, +compute_dependencies(double** a, int m, int n, bool* independent) { // index array for row permutation @@ -383,7 +383,7 @@ BPrivate::Layout::compute_dependencies(double** a, int m, int n, // remove_linearly_dependent_rows int -BPrivate::Layout::remove_linearly_dependent_rows(double** A, double** temp, +remove_linearly_dependent_rows(double** A, double** temp, bool* independentRows, int m, int n) { // copy to temp @@ -485,7 +485,7 @@ qr_decomposition(double** a, int m, int n, double* d, double** q) struct MatrixDelete { inline void operator()(double** matrix) { - BPrivate::Layout::free_matrix(matrix); + free_matrix(matrix); } }; typedef BPrivate::AutoDeleter MatrixDeleter; @@ -521,8 +521,8 @@ LayoutOptimizer::~LayoutOptimizer() bool LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount) { - fConstraints = list; - int32 constraintCount = fConstraints.CountItems(); + fConstraints = (ConstraintList*)&list; + int32 constraintCount = fConstraints->CountItems(); if (fVariableCount != variableCount) { _MakeEmpty(); @@ -532,8 +532,8 @@ LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount) zero_matrix(fSoftConstraints, constraintCount, fVariableCount); double rightSide[constraintCount]; // set up soft constraint matrix - for (int32 c = 0; c < fConstraints.CountItems(); c++) { - Constraint* constraint = fConstraints.ItemAt(c); + for (int32 c = 0; c < fConstraints->CountItems(); c++) { + Constraint* constraint = fConstraints->ItemAt(c); if (!constraint->IsSoft()) { rightSide[c] = 0; continue; @@ -644,7 +644,7 @@ LayoutOptimizer::Solve(double* values) if (values == NULL) return false; - int32 constraintCount = fConstraints.CountItems(); + int32 constraintCount = fConstraints->CountItems(); // allocate the active constraint matrix and its transposed matrix fActiveMatrix = allocate_matrix(constraintCount, fVariableCount); @@ -663,13 +663,13 @@ LayoutOptimizer::Solve(double* values) bool LayoutOptimizer::_Solve(double* values) { - int32 constraintCount = fConstraints.CountItems(); + int32 constraintCount = fConstraints->CountItems(); TRACE_ONLY( TRACE("constraints:\n"); for (int32 i = 0; i < constraintCount; i++) { TRACE(" %-2ld: ", i); - fConstraints.ItemAt(i)->PrintToStream(); + fConstraints->ItemAt(i)->PrintToStream(); } ) @@ -694,7 +694,7 @@ TRACE_ONLY( ConstraintList activeConstraints(constraintCount); for (int32 i = 0; i < constraintCount; i++) { - Constraint* constraint = fConstraints.ItemAt(i); + Constraint* constraint = fConstraints->ItemAt(i); if (constraint->IsSoft()) continue; double actualValue = _ActualValue(constraint, x); @@ -840,7 +840,7 @@ TRACE_ONLY( int barrier = -1; // if alpha_k < 1, add a barrier constraint to W^k for (int32 i = 0; i < constraintCount; i++) { - Constraint* constraint = fConstraints.ItemAt(i); + Constraint* constraint = fConstraints->ItemAt(i); if (activeConstraints.HasItem(constraint)) continue; @@ -860,7 +860,7 @@ TRACE_ONLY( TRACE("alpha: %f, barrier: %d\n", alpha, barrier); if (alpha < 1) - activeConstraints.AddItem(fConstraints.ItemAt(barrier)); + activeConstraints.AddItem(fConstraints->ItemAt(barrier)); // x += p * alpha; add_vectors_scaled(x, p, alpha, fVariableCount); diff --git a/src/libs/linprog/LayoutOptimizer.h b/src/libs/linprog/LayoutOptimizer.h index 1dc1aff494..82e8966f8f 100644 --- a/src/libs/linprog/LayoutOptimizer.h +++ b/src/libs/linprog/LayoutOptimizer.h @@ -14,10 +14,6 @@ static const double kEqualsEpsilon = 0.000001; -namespace BPrivate { -namespace Layout { - - double** allocate_matrix(int m, int n); void free_matrix(double** matrix); void copy_matrix(const double* const* A, double** B, int m, int n); @@ -56,7 +52,7 @@ private: int32 fVariableCount; - ConstraintList fConstraints; + ConstraintList* fConstraints; double** fTemp1; double** fTemp2; @@ -69,11 +65,6 @@ private: double* fDesired; }; -} // namespace Layout -} // namespace BPrivate - -using BPrivate::Layout::LayoutOptimizer; - inline bool fuzzy_equals(double a, double b)