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
This commit is contained in:
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
|
|
||||||
using namespace LinearProgramming;
|
using namespace LinearProgramming;
|
||||||
using namespace BPrivate::Layout;
|
//using namespace BPrivate::Layout;
|
||||||
|
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
@@ -275,7 +275,7 @@ ActiveSetSolver::ActiveSetSolver(LinearSpec* linearSpec)
|
|||||||
:
|
:
|
||||||
SolverInterface(linearSpec),
|
SolverInterface(linearSpec),
|
||||||
|
|
||||||
fVariables(linearSpec->Variables()),
|
fVariables(linearSpec->UsedVariables()),
|
||||||
fConstraints(linearSpec->Constraints())
|
fConstraints(linearSpec->Constraints())
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ negate_vector(double* x, int n)
|
|||||||
|
|
||||||
// allocate_matrix
|
// allocate_matrix
|
||||||
double**
|
double**
|
||||||
BPrivate::Layout::allocate_matrix(int m, int n)
|
allocate_matrix(int m, int n)
|
||||||
{
|
{
|
||||||
double** matrix = new(nothrow) double*[m];
|
double** matrix = new(nothrow) double*[m];
|
||||||
if (!matrix)
|
if (!matrix)
|
||||||
@@ -128,7 +128,7 @@ BPrivate::Layout::allocate_matrix(int m, int n)
|
|||||||
|
|
||||||
// free_matrix
|
// free_matrix
|
||||||
void
|
void
|
||||||
BPrivate::Layout::free_matrix(double** matrix)
|
free_matrix(double** matrix)
|
||||||
{
|
{
|
||||||
if (matrix) {
|
if (matrix) {
|
||||||
delete[] *matrix;
|
delete[] *matrix;
|
||||||
@@ -185,7 +185,7 @@ transpose_matrix(const double* const* A, double** Atrans, int m, int n)
|
|||||||
|
|
||||||
// zero_matrix
|
// zero_matrix
|
||||||
void
|
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 i = 0; i < m; i++) {
|
||||||
for (int k = 0; k < n; k++)
|
for (int k = 0; k < n; k++)
|
||||||
@@ -196,7 +196,7 @@ BPrivate::Layout::zero_matrix(double** A, int m, int n)
|
|||||||
|
|
||||||
// copy_matrix
|
// copy_matrix
|
||||||
void
|
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 i = 0; i < m; i++) {
|
||||||
for (int k = 0; k < n; k++)
|
for (int k = 0; k < n; k++)
|
||||||
@@ -261,7 +261,7 @@ swap(Type& a, Type& b)
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BPrivate::Layout::solve(double** a, int n, double* b)
|
solve(double** a, int n, double* b)
|
||||||
{
|
{
|
||||||
// index array for row permutation
|
// index array for row permutation
|
||||||
// Note: We could eliminate it, if we would permutate the row pointers of a.
|
// 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
|
int
|
||||||
BPrivate::Layout::compute_dependencies(double** a, int m, int n,
|
compute_dependencies(double** a, int m, int n,
|
||||||
bool* independent)
|
bool* independent)
|
||||||
{
|
{
|
||||||
// index array for row permutation
|
// index array for row permutation
|
||||||
@@ -383,7 +383,7 @@ BPrivate::Layout::compute_dependencies(double** a, int m, int n,
|
|||||||
|
|
||||||
// remove_linearly_dependent_rows
|
// remove_linearly_dependent_rows
|
||||||
int
|
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)
|
bool* independentRows, int m, int n)
|
||||||
{
|
{
|
||||||
// copy to temp
|
// copy to temp
|
||||||
@@ -485,7 +485,7 @@ qr_decomposition(double** a, int m, int n, double* d, double** q)
|
|||||||
struct MatrixDelete {
|
struct MatrixDelete {
|
||||||
inline void operator()(double** matrix)
|
inline void operator()(double** matrix)
|
||||||
{
|
{
|
||||||
BPrivate::Layout::free_matrix(matrix);
|
free_matrix(matrix);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
typedef BPrivate::AutoDeleter<double*, MatrixDelete> MatrixDeleter;
|
typedef BPrivate::AutoDeleter<double*, MatrixDelete> MatrixDeleter;
|
||||||
@@ -521,8 +521,8 @@ LayoutOptimizer::~LayoutOptimizer()
|
|||||||
bool
|
bool
|
||||||
LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount)
|
LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount)
|
||||||
{
|
{
|
||||||
fConstraints = list;
|
fConstraints = (ConstraintList*)&list;
|
||||||
int32 constraintCount = fConstraints.CountItems();
|
int32 constraintCount = fConstraints->CountItems();
|
||||||
|
|
||||||
if (fVariableCount != variableCount) {
|
if (fVariableCount != variableCount) {
|
||||||
_MakeEmpty();
|
_MakeEmpty();
|
||||||
@@ -532,8 +532,8 @@ LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount)
|
|||||||
zero_matrix(fSoftConstraints, constraintCount, fVariableCount);
|
zero_matrix(fSoftConstraints, constraintCount, fVariableCount);
|
||||||
double rightSide[constraintCount];
|
double rightSide[constraintCount];
|
||||||
// set up soft constraint matrix
|
// set up soft constraint matrix
|
||||||
for (int32 c = 0; c < fConstraints.CountItems(); c++) {
|
for (int32 c = 0; c < fConstraints->CountItems(); c++) {
|
||||||
Constraint* constraint = fConstraints.ItemAt(c);
|
Constraint* constraint = fConstraints->ItemAt(c);
|
||||||
if (!constraint->IsSoft()) {
|
if (!constraint->IsSoft()) {
|
||||||
rightSide[c] = 0;
|
rightSide[c] = 0;
|
||||||
continue;
|
continue;
|
||||||
@@ -644,7 +644,7 @@ LayoutOptimizer::Solve(double* values)
|
|||||||
if (values == NULL)
|
if (values == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int32 constraintCount = fConstraints.CountItems();
|
int32 constraintCount = fConstraints->CountItems();
|
||||||
|
|
||||||
// allocate the active constraint matrix and its transposed matrix
|
// allocate the active constraint matrix and its transposed matrix
|
||||||
fActiveMatrix = allocate_matrix(constraintCount, fVariableCount);
|
fActiveMatrix = allocate_matrix(constraintCount, fVariableCount);
|
||||||
@@ -663,13 +663,13 @@ LayoutOptimizer::Solve(double* values)
|
|||||||
bool
|
bool
|
||||||
LayoutOptimizer::_Solve(double* values)
|
LayoutOptimizer::_Solve(double* values)
|
||||||
{
|
{
|
||||||
int32 constraintCount = fConstraints.CountItems();
|
int32 constraintCount = fConstraints->CountItems();
|
||||||
|
|
||||||
TRACE_ONLY(
|
TRACE_ONLY(
|
||||||
TRACE("constraints:\n");
|
TRACE("constraints:\n");
|
||||||
for (int32 i = 0; i < constraintCount; i++) {
|
for (int32 i = 0; i < constraintCount; i++) {
|
||||||
TRACE(" %-2ld: ", i);
|
TRACE(" %-2ld: ", i);
|
||||||
fConstraints.ItemAt(i)->PrintToStream();
|
fConstraints->ItemAt(i)->PrintToStream();
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -694,7 +694,7 @@ TRACE_ONLY(
|
|||||||
ConstraintList activeConstraints(constraintCount);
|
ConstraintList activeConstraints(constraintCount);
|
||||||
|
|
||||||
for (int32 i = 0; i < constraintCount; i++) {
|
for (int32 i = 0; i < constraintCount; i++) {
|
||||||
Constraint* constraint = fConstraints.ItemAt(i);
|
Constraint* constraint = fConstraints->ItemAt(i);
|
||||||
if (constraint->IsSoft())
|
if (constraint->IsSoft())
|
||||||
continue;
|
continue;
|
||||||
double actualValue = _ActualValue(constraint, x);
|
double actualValue = _ActualValue(constraint, x);
|
||||||
@@ -840,7 +840,7 @@ TRACE_ONLY(
|
|||||||
int barrier = -1;
|
int barrier = -1;
|
||||||
// if alpha_k < 1, add a barrier constraint to W^k
|
// if alpha_k < 1, add a barrier constraint to W^k
|
||||||
for (int32 i = 0; i < constraintCount; i++) {
|
for (int32 i = 0; i < constraintCount; i++) {
|
||||||
Constraint* constraint = fConstraints.ItemAt(i);
|
Constraint* constraint = fConstraints->ItemAt(i);
|
||||||
if (activeConstraints.HasItem(constraint))
|
if (activeConstraints.HasItem(constraint))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -860,7 +860,7 @@ TRACE_ONLY(
|
|||||||
TRACE("alpha: %f, barrier: %d\n", alpha, barrier);
|
TRACE("alpha: %f, barrier: %d\n", alpha, barrier);
|
||||||
|
|
||||||
if (alpha < 1)
|
if (alpha < 1)
|
||||||
activeConstraints.AddItem(fConstraints.ItemAt(barrier));
|
activeConstraints.AddItem(fConstraints->ItemAt(barrier));
|
||||||
|
|
||||||
// x += p * alpha;
|
// x += p * alpha;
|
||||||
add_vectors_scaled(x, p, alpha, fVariableCount);
|
add_vectors_scaled(x, p, alpha, fVariableCount);
|
||||||
|
|||||||
@@ -14,10 +14,6 @@
|
|||||||
static const double kEqualsEpsilon = 0.000001;
|
static const double kEqualsEpsilon = 0.000001;
|
||||||
|
|
||||||
|
|
||||||
namespace BPrivate {
|
|
||||||
namespace Layout {
|
|
||||||
|
|
||||||
|
|
||||||
double** allocate_matrix(int m, int n);
|
double** allocate_matrix(int m, int n);
|
||||||
void free_matrix(double** matrix);
|
void free_matrix(double** matrix);
|
||||||
void copy_matrix(const double* const* A, double** B, int m, int n);
|
void copy_matrix(const double* const* A, double** B, int m, int n);
|
||||||
@@ -56,7 +52,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
int32 fVariableCount;
|
int32 fVariableCount;
|
||||||
ConstraintList fConstraints;
|
ConstraintList* fConstraints;
|
||||||
|
|
||||||
double** fTemp1;
|
double** fTemp1;
|
||||||
double** fTemp2;
|
double** fTemp2;
|
||||||
@@ -69,11 +65,6 @@ private:
|
|||||||
double* fDesired;
|
double* fDesired;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Layout
|
|
||||||
} // namespace BPrivate
|
|
||||||
|
|
||||||
using BPrivate::Layout::LayoutOptimizer;
|
|
||||||
|
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
fuzzy_equals(double a, double b)
|
fuzzy_equals(double a, double b)
|
||||||
|
|||||||
Reference in New Issue
Block a user