static pbqp_node **reduced_bucket = NULL;
static int buckets_filled = 0;
+static void insert_into_edge_bucket(pbqp_edge *edge)
+{
+ unsigned bucket_len = ARR_LEN(edge_bucket);
+
+ if (edge->bucket_index < bucket_len && edge_bucket[edge->bucket_index]
+ == edge)
+ /* Edge is already inserted. */
+ return;
+
+ edge->bucket_index = bucket_len;
+ ARR_APP1(pbqp_edge *, edge_bucket, edge);
+}
+
static void init_buckets(void)
{
int i;
src_vec->entries[src_index].data = pbqp_add(
src_vec->entries[src_index].data, min);
- // TODO add to edge_list if inf
+ if (min == INF_COSTS) {
+ insert_into_edge_bucket(edge);
+ }
}
}
}
tgt_vec->entries[tgt_index].data = pbqp_add(
tgt_vec->entries[tgt_index].data, min);
- // TODO add to edge_list if inf
+ if (min == INF_COSTS) {
+ insert_into_edge_bucket(edge);
+ }
}
}
}
old_bucket_len = ARR_LEN(old_bucket);
old_bucket_index = node->bucket_index;
+ unsigned test = ARR_LEN(node_buckets[arity]);
+
if (old_bucket_len <= old_bucket_index ||
old_bucket[old_bucket_index] != node) {
/* Old arity is new arity, so we have nothing to do. */
assert(src_node);
assert(tgt_node);
+ /* If edge are already deleted, we have nothing to do. */
+ if (!is_connected(src_node, edge) || !is_connected(tgt_node, edge))
+ return;
+
if (pbqp->dump_file) {
char txt[100];
sprintf(txt, "Simplification of Edge n%d-n%d", src_node->index, tgt_node->index);
for (;;) {
if (ARR_LEN(edge_bucket) > 0) {
- panic("Please implement edge simplification");
+ apply_edge(pbqp);
} else if (ARR_LEN(node_buckets[1]) > 0) {
apply_RI(pbqp);
} else if (ARR_LEN(node_buckets[2]) > 0) {
free_buckets();
}
+void apply_edge(pbqp *pbqp)
+{
+ unsigned bucket_len = ARR_LEN(edge_bucket);
+ pbqp_edge *edge = edge_bucket[bucket_len - 1];
+
+ ARR_SHRINKLEN(edge_bucket, (int)bucket_len - 1);
+
+ simplify_edge(pbqp, edge);
+}
+
void apply_RI(pbqp *pbqp)
{
pbqp_node **bucket = node_buckets[1];
/* Add all incident edges to edge bucket, since they are now independent. */
for (edge_index = 0; edge_index < edge_len; ++edge_index) {
- ARR_APP1(pbqp_edge *, edge_bucket, node->edges[node_index]);
+ insert_into_edge_bucket(node->edges[node_index]);
}
}
#include "pbqp_node.h"
#include "pbqp_node_t.h"
+#include "pbqp_edge_t.h"
#include "vector.h"
pbqp_node *alloc_node(pbqp *pbqp, unsigned node_index, vector *costs)
return node;
}
+int is_connected(pbqp_node *node, pbqp_edge *edge)
+{
+ pbqp_edge **edges;
+ unsigned edge_index;
+ unsigned edge_len;
+
+ assert(node);
+ assert(edge);
+
+ if (edge->src != node && edge->tgt != node) return 0;
+
+ edges = node->edges;
+ edge_len = ARR_LEN(edges);
+
+ for (edge_index = 0; edge_index < edge_len; ++edge_index) {
+ pbqp_edge *edge_candidate = edges[edge_index];
+ if (edge_candidate == edge) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
void disconnect_edge(pbqp_node *node, pbqp_edge *edge)
{
pbqp_edge **edges;