Fixed another bug concerning copying an edge.
authorSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Sat, 6 Dec 2008 19:27:48 +0000 (19:27 +0000)
committerSebastian Buchwald <Sebastian.Buchwald@kit.edu>
Sat, 6 Dec 2008 19:27:48 +0000 (19:27 +0000)
[r24363]

bucket.c
pbqp_node.c
pbqp_node.h

index 4e1a3eb..422c422 100644 (file)
--- a/bucket.c
+++ b/bucket.c
@@ -139,6 +139,6 @@ void node_bucket_deep_copy(pbqp *pbqp, pbqp_node_bucket *dst, pbqp_node_bucket s
        bucket_length = node_bucket_get_length(src);
 
        for (bucket_index = 0; bucket_index < bucket_length; ++bucket_index) {
-               node_bucket_insert(dst, pbqp_node_deep_copy(pbqp, src, src[bucket_index]));
+               node_bucket_insert(dst, pbqp_node_deep_copy(pbqp, *dst, src[bucket_index]));
        }
 }
index 9e6044e..9f982a8 100644 (file)
@@ -72,7 +72,7 @@ unsigned pbqp_node_get_degree(pbqp_node *node)
        return ARR_LEN(node->edges);
 }
 
-pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket old_bucket, pbqp_node *node)
+pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket new_bucket, pbqp_node *node)
 {
        unsigned   edge_index;
        unsigned   edge_length = pbqp_node_get_degree(node);
@@ -90,8 +90,16 @@ pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket old_bucket, pbqp_nod
                        unsigned is_copied   = other_index < node->bucket_index;
 
                        if (is_copied) {
-                               edge->src = copy;
-                               edge_copy = edge;
+                               pbqp_node *other_copy = new_bucket[other_index];
+                               unsigned degree = pbqp_node_get_degree(other_copy);
+                               unsigned index;
+
+                               for (index = 0; index < degree; ++index) {
+                                       if (other_copy->edges[index]->src == node) {
+                                               edge_copy = other_copy->edges[index];
+                                               break;
+                                       }
+                               }
                        } else {
                                edge_copy = pbqp_edge_deep_copy(pbqp, edge, copy, edge->tgt);
                        }
@@ -100,8 +108,16 @@ pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket old_bucket, pbqp_nod
                        unsigned is_copied   = other_index < node->bucket_index;
 
                        if (is_copied) {
-                               edge->tgt = copy;
-                               edge_copy = edge;
+                               pbqp_node *other_copy = new_bucket[other_index];
+                               unsigned degree = pbqp_node_get_degree(other_copy);
+                               unsigned index;
+
+                               for (index = 0; index < degree; ++index) {
+                                       if (other_copy->edges[index]->tgt == node) {
+                                               edge_copy = other_copy->edges[index];
+                                               break;
+                                       }
+                               }
                        } else {
                                edge_copy = pbqp_edge_deep_copy(pbqp, edge, edge->src, copy);
                        }
index 3cae499..da9aa99 100644 (file)
@@ -12,6 +12,7 @@ int is_connected(pbqp_node *node, pbqp_edge *edge);
 
 unsigned pbqp_node_get_degree(pbqp_node *node);
 
-pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket bucket, pbqp_node *node);
+pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket new_bucket,
+               pbqp_node *node);
 
 #endif /* KAPS_PBQP_NODE_H */