}
}
+static void free_buckets(void)
+{
+ int i;
+
+ for (i = 0; i < 4; ++i) {
+ DEL_ARR_F(node_buckets[i]);
+ }
+
+ DEL_ARR_F(edge_bucket);
+ DEL_ARR_F(reduced_bucket);
+
+ buckets_filled = 0;
+}
+
static void fill_node_buckets(pbqp *pbqp)
{
unsigned node_index;
if (ARR_LEN(edge_bucket) > 0) {
panic("Please implement edge simplification");
} else if (ARR_LEN(node_buckets[1]) > 0) {
- applyRI(pbqp);
+ apply_RI(pbqp);
} else if (ARR_LEN(node_buckets[2]) > 0) {
- applyRII(pbqp);
+ apply_RII(pbqp);
} else if (ARR_LEN(node_buckets[3]) > 0) {
panic("Please implement RN simplification");
} else {
back_propagate_RI(pbqp, node);
break;
case 2:
- panic("Please implement back propagation for RII");
+ back_propagate_RII(pbqp, node);
break;
default:
panic("Only nodes with degree one or two should be in this bucket");
break;
}
}
+
+ free_buckets();
}
-void applyRI(pbqp *pbqp)
+void apply_RI(pbqp *pbqp)
{
pbqp_node **bucket = node_buckets[1];
unsigned bucket_len = ARR_LEN(bucket);
ARR_APP1(pbqp_node *, reduced_bucket, node);
}
-void applyRII(pbqp *pbqp)
+void apply_RII(pbqp *pbqp)
{
pbqp_node **bucket = node_buckets[2];
unsigned bucket_len = ARR_LEN(bucket);
}
mat->entries[row_index * col_len + col_index] = vector_get_min(vec);
+
+ obstack_free(&pbqp->obstack, vec);
}
}
}
}
+void back_propagate_RII(pbqp *pbqp, pbqp_node *node)
+{
+ pbqp_edge *src_edge = node->edges[0];
+ pbqp_edge *tgt_edge = node->edges[1];
+ int src_is_src = src_edge->src == node;
+ int tgt_is_src = tgt_edge->src == node;
+ pbqp_matrix *src_mat;
+ pbqp_matrix *tgt_mat;
+ pbqp_node *src_node;
+ pbqp_node *tgt_node;
+ vector *vec;
+ vector *node_vec;
+ unsigned col_index;
+ unsigned row_index;
+
+ assert(pbqp);
+
+ if (src_is_src) {
+ src_node = src_edge->tgt;
+ } else {
+ src_node = src_edge->src;
+ }
+
+ if (tgt_is_src) {
+ tgt_node = tgt_edge->tgt;
+ } else {
+ tgt_node = tgt_edge->src;
+ }
+
+ /* Swap nodes if necessary. */
+ if (tgt_node->index < src_node->index) {
+ pbqp_node *tmp_node;
+ pbqp_edge *tmp_edge;
+
+ tmp_node = src_node;
+ src_node = tgt_node;
+ tgt_node = tmp_node;
+
+ tmp_edge = src_edge;
+ src_edge = tgt_edge;
+ tgt_edge = tmp_edge;
+
+ src_is_src = src_edge->src == node;
+ tgt_is_src = tgt_edge->src == node;
+ }
+
+ src_mat = src_edge->costs;
+ tgt_mat = tgt_edge->costs;
+
+ node_vec = node->costs;
+
+ row_index = src_node->solution;
+ col_index = tgt_node->solution;
+
+ vec = vector_copy(pbqp, node_vec);
+
+ if (src_is_src) {
+ vector_add_matrix_col(vec, src_mat, row_index);
+ } else {
+ vector_add_matrix_row(vec, src_mat, row_index);
+ }
+
+ if (tgt_is_src) {
+ vector_add_matrix_col(vec, tgt_mat, col_index);
+ } else {
+ vector_add_matrix_row(vec, tgt_mat, col_index);
+ }
+
+ node->solution = vector_get_min_index(vec);
+ if (pbqp->dump_file) {
+ fprintf(pbqp->dump_file, "node n%d is set to %d<br>\n", node->index, node->solution);
+ }
+
+ obstack_free(&pbqp->obstack, vec);
+}
+
int node_is_reduced(pbqp_node *node)
{
if (!reduced_bucket) return 0;