6 #include "pbqp_edge_t.h"
8 #include "pbqp_node_t.h"
11 pbqp_node *alloc_node(pbqp *pbqp, unsigned node_index, vector *costs)
13 pbqp_node *node = obstack_alloc(&pbqp->obstack, sizeof(*node));
16 node->edges = NEW_ARR_F(pbqp_edge *, 0);
17 node->costs = vector_copy(pbqp, costs);
18 node->bucket_index = UINT_MAX;
19 node->solution = UINT_MAX;
20 node->index = node_index;
25 int is_connected(pbqp_node *node, pbqp_edge *edge)
34 if (edge->src != node && edge->tgt != node) return 0;
37 edge_len = ARR_LEN(edges);
39 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
40 pbqp_edge *edge_candidate = edges[edge_index];
41 if (edge_candidate == edge) {
49 void disconnect_edge(pbqp_node *node, pbqp_edge *edge)
56 edge_len = ARR_LEN(edges);
58 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
59 pbqp_edge *edge_candidate = edges[edge_index];
60 if (edge_candidate == edge) {
61 edges[edge_index] = edges[edge_len - 1];
62 ARR_SHRINKLEN(edges, (int)edge_len - 1);
68 unsigned pbqp_node_get_degree(pbqp_node *node)
71 return ARR_LEN(node->edges);
74 pbqp_node *pbqp_node_deep_copy(pbqp *pbqp, pbqp_node *node)
77 unsigned edge_length = pbqp_node_get_degree(node);
78 pbqp_node *copy = obstack_alloc(&pbqp->obstack, sizeof(*node));
81 copy->edges = NEW_ARR_F(pbqp_edge *, 0);
82 for (edge_index = 0; edge_index < edge_length; ++edge_index) {
84 pbqp_edge *edge = node->edges[edge_index];
85 int is_src = edge->src == node;
88 edge_copy = pbqp_edge_deep_copy(pbqp, edge, copy, edge->tgt);
90 edge_copy = pbqp_edge_deep_copy(pbqp, edge, edge->src, copy);
92 ARR_APP1(pbqp_edge *, copy->edges, edge_copy);
94 copy->costs = vector_copy(pbqp, node->costs);
95 copy->bucket_index = node->bucket_index;
96 copy->solution = node->solution;
97 copy->index = node->index;