From 66c782cdc0cdec7b3f96b3468ddaa705487ada1e Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Mon, 14 Mar 2011 00:17:30 +0000 Subject: [PATCH] Soft constraints can now be weighted. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40940 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/libs/linprog/LayoutOptimizer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/libs/linprog/LayoutOptimizer.cpp b/src/libs/linprog/LayoutOptimizer.cpp index 380c680576..130b1b739e 100644 --- a/src/libs/linprog/LayoutOptimizer.cpp +++ b/src/libs/linprog/LayoutOptimizer.cpp @@ -538,7 +538,17 @@ LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount) rightSide[c] = 0; continue; } - rightSide[c] = _RightSide(constraint); + double weight = 0; + double negPenalty = constraint->PenaltyNeg(); + if (negPenalty > 0) + weight += negPenalty; + double posPenalty = constraint->PenaltyPos(); + if (posPenalty > 0) + weight += posPenalty; + if (negPenalty > 0 && posPenalty > 0) + weight /= 2; + + rightSide[c] = _RightSide(constraint) * weight; SummandList* summands = constraint->LeftSide(); for (int32 s = 0; s < summands->CountItems(); s++) { Summand* summand = summands->ItemAt(s); @@ -547,6 +557,7 @@ LayoutOptimizer::SetConstraints(const ConstraintList& list, int32 variableCount) fSoftConstraints[c][variable] = -summand->Coeff(); else fSoftConstraints[c][variable] = summand->Coeff(); + fSoftConstraints[c][variable] *= weight; } }