From 42c981c6b53e8474a41b053247d90dcb6059b850 Mon Sep 17 00:00:00 2001 From: Sebastian Buchwald Date: Mon, 6 Oct 2008 11:52:47 +0000 Subject: [PATCH] Bugfix: handle added edges correctly if src_index and tgt_index are in the wrong order. [r22527] --- kaps.c | 6 ++++++ matrix.c | 14 ++++++++++++++ matrix.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/kaps.c b/kaps.c index 346046023..577649362 100644 --- a/kaps.c +++ b/kaps.c @@ -80,6 +80,12 @@ void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index, { pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index); + if (tgt_index < src_index) { + pbqp_matrix_transpose(pbqp, costs); + add_edge_costs(pbqp, tgt_index, src_index, costs); + return; + } + if (edge == NULL) { edge = alloc_edge(pbqp, src_index, tgt_index, costs); } else { diff --git a/matrix.c b/matrix.c index 43dda121d..8ff873cdd 100644 --- a/matrix.c +++ b/matrix.c @@ -52,6 +52,20 @@ pbqp_matrix *pbqp_matrix_copy_and_transpose(pbqp *pbqp, pbqp_matrix *m) return copy; } +void pbqp_matrix_transpose(pbqp *pbqp, pbqp_matrix *mat) +{ + unsigned len; + + assert(mat); + len = mat->rows * mat->cols; + + pbqp_matrix *tmp = pbqp_matrix_copy_and_transpose(pbqp, mat); + + memcpy(mat, tmp, sizeof(*mat) + sizeof(*mat->entries) * len); + + obstack_free(&pbqp->obstack, tmp); +} + void pbqp_matrix_add(pbqp_matrix *sum, pbqp_matrix *summand) { int i; diff --git a/matrix.h b/matrix.h index 0d45a1514..90fe7cee4 100644 --- a/matrix.h +++ b/matrix.h @@ -10,6 +10,8 @@ pbqp_matrix *pbqp_matrix_copy(pbqp *pbqp, pbqp_matrix *m); pbqp_matrix *pbqp_matrix_copy_and_transpose(pbqp *pbqp, pbqp_matrix *m); +void pbqp_matrix_transpose(pbqp *pbqp, pbqp_matrix *mat); + /* sum += summand */ void pbqp_matrix_add(pbqp_matrix *sum, pbqp_matrix *summand); -- 2.20.1