Bugfix: handle added edges correctly if src_index and tgt_index are in the wrong...
authorSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Mon, 6 Oct 2008 11:52:47 +0000 (11:52 +0000)
committerSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Mon, 6 Oct 2008 11:52:47 +0000 (11:52 +0000)
[r22527]

kaps.c
matrix.c
matrix.h

diff --git a/kaps.c b/kaps.c
index 3460460..5776493 100644 (file)
--- 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 {
index 43dda12..8ff873c 100644 (file)
--- 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;
index 0d45a15..90fe7ce 100644 (file)
--- 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);