summaryrefslogtreecommitdiff
path: root/passes
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-09-21 10:27:18 +0200
committerClifford Wolf <clifford@clifford.at>2015-09-21 10:37:24 +0200
commit11c27b5e69fc74ff147309e550b67fd9cddb5f80 (patch)
tree93e3cdc113d4f32259863ec1878cdc79aa07d28c /passes
parent80898dcbc86b3c4f50556c58115ac3be1d94dfe0 (diff)
Bugfix in "qwp" pass
Diffstat (limited to 'passes')
-rw-r--r--passes/cmds/qwp.cc37
1 files changed, 31 insertions, 6 deletions
diff --git a/passes/cmds/qwp.cc b/passes/cmds/qwp.cc
index a8a7e1dd..50fe81fb 100644
--- a/passes/cmds/qwp.cc
+++ b/passes/cmds/qwp.cc
@@ -222,7 +222,7 @@ struct QwpWorker
int j = 0;
for (auto &node : nodes) {
- double weight = 1e-6;
+ double weight = 1e-3;
if (alt_mode ? node.alt_tied : node.tied) weight = 1e3;
weight *= (1.0 + xorshift32() * 1e-3);
observation_matrix[i + observation_matrix_m*j] = weight;
@@ -278,7 +278,8 @@ struct QwpWorker
// Solve "AA*x = Ay"
// (least squares fit for "A*x = y")
//
- // Using gaussian elimination (no pivoting) to get M := [Id x]
+ // Using gaussian elimination to get M := [Id x]
+ // (no pivoting, so let's hope for the best..)
// eliminate to upper triangular matrix
for (int i = 0; i < N; i++)
@@ -318,13 +319,26 @@ struct QwpWorker
// update node positions
for (int i = 0; i < N; i++)
+ {
+ double v = M[(N+1)*i + N];
+ double c = alt_mode ? alt_midpos : midpos;
+ double r = alt_mode ? alt_radius : radius;
+
+ if (std::isfinite(v)) {
+ v = std::min(v, c+r);
+ v = std::max(v, c-r);
+ } else {
+ v = c;
+ }
+
if (alt_mode) {
if (!nodes[i].alt_tied)
- nodes[i].alt_pos = M[(N+1)*i + N];
+ nodes[i].alt_pos = v;
} else {
if (!nodes[i].tied)
- nodes[i].pos = M[(N+1)*i + N];
+ nodes[i].pos = v;
}
+ }
}
void log_cell_coordinates(int indent, bool log_all_nodes = false)
@@ -493,10 +507,21 @@ struct QwpWorker
for (auto &node : nodes)
{
double rel_pos = node.pos - median;
- if (rel_pos < 0)
+ if (rel_pos < 0) {
node.pos = midpos + left_scale*rel_pos;
- else
+ if (std::isfinite(node.pos)) {
+ node.pos = std::min(node.pos, midpos);
+ node.pos = std::max(node.pos, midpos - radius);
+ } else
+ node.pos = midpos - radius/2;
+ } else {
node.pos = midpos + right_scale*rel_pos;
+ if (std::isfinite(node.pos)) {
+ node.pos = std::max(node.pos, midpos);
+ node.pos = std::min(node.pos, midpos + radius);
+ } else
+ node.pos = midpos + radius/2;
+ }
}
if (GetSize(sorted_pos) < 2 || (2*radius <= config.grid && 2*alt_radius <= config.grid)) {