From af62a5a6153b41868533764b79a1f6158453537d Mon Sep 17 00:00:00 2001 From: Sebastian Buchwald Date: Sat, 6 Dec 2008 19:27:48 +0000 Subject: [PATCH] Fixed another bug concerning copying an edge. [r24363] --- bucket.c | 2 +- pbqp_node.c | 26 +++++++++++++++++++++----- pbqp_node.h | 3 ++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/bucket.c b/bucket.c index 4e1a3ebb0..422c4224d 100644 --- 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])); } } diff --git a/pbqp_node.c b/pbqp_node.c index 9e6044e7e..9f982a834 100644 --- a/pbqp_node.c +++ b/pbqp_node.c @@ -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); } diff --git a/pbqp_node.h b/pbqp_node.h index 3cae499ca..da9aa9963 100644 --- a/pbqp_node.h +++ b/pbqp_node.h @@ -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 */ -- 2.20.1