7 #include "pbqp_edge_t.h"
9 #include "pbqp_node_t.h"
12 pbqp_node *alloc_node(pbqp *pbqp, unsigned node_index, vector *costs)
14 pbqp_node *node = obstack_alloc(&pbqp->obstack, sizeof(*node));
17 node->edges = NEW_ARR_F(pbqp_edge *, 0);
18 node->costs = vector_copy(pbqp, costs);
19 node->bucket_index = UINT_MAX;
20 node->solution = UINT_MAX;
21 node->index = node_index;
26 int is_connected(pbqp_node *node, pbqp_edge *edge)
35 if (edge->src != node && edge->tgt != node) return 0;
38 edge_len = ARR_LEN(edges);
40 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
41 pbqp_edge *edge_candidate = edges[edge_index];
42 if (edge_candidate == edge) {
50 void disconnect_edge(pbqp_node *node, pbqp_edge *edge)
57 edge_len = ARR_LEN(edges);
59 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
60 pbqp_edge *edge_candidate = edges[edge_index];
61 if (edge_candidate == edge) {
62 edges[edge_index] = edges[edge_len - 1];
63 ARR_SHRINKLEN(edges, (int)edge_len - 1);
69 unsigned pbqp_node_get_degree(pbqp_node *node)
72 return ARR_LEN(node->edges);
75 pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node_bucket old_bucket, pbqp_node *node)
78 unsigned edge_length = pbqp_node_get_degree(node);
79 pbqp_node *copy = obstack_alloc(&pbqp->obstack, sizeof(*node));
82 copy->edges = NEW_ARR_F(pbqp_edge *, 0);
83 for (edge_index = 0; edge_index < edge_length; ++edge_index) {
85 pbqp_edge *edge = node->edges[edge_index];
86 int is_src = edge->src == node;
89 unsigned other_index = edge->tgt->bucket_index;
90 unsigned is_copied = other_index < node->bucket_index;
96 edge_copy = pbqp_edge_deep_copy(pbqp, edge, copy, edge->tgt);
99 unsigned other_index = edge->src->bucket_index;
100 unsigned is_copied = other_index < node->bucket_index;
106 edge_copy = pbqp_edge_deep_copy(pbqp, edge, edge->src, copy);
109 ARR_APP1(pbqp_edge *, copy->edges, edge_copy);
111 copy->costs = vector_copy(pbqp, node->costs);
112 copy->bucket_index = node->bucket_index;
113 copy->solution = node->solution;
114 copy->index = node->index;