4 #include "heuristical.h"
5 #include "html_dumper.h"
9 #include "pbqp_edge_t.h"
10 #include "pbqp_node_t.h"
13 static pbqp_edge **edge_bucket;
14 static pbqp_node **node_buckets[4];
16 static void init_buckets(pbqp *pbqp)
21 static void simplify_edge(pbqp *pbqp, pbqp_edge *edge)
38 sprintf(txt, "Simplification of Edge n%d-n%d", edge->src, edge->tgt);
39 dump_section(pbqp->dump_file, 3, txt);
42 src_node = get_node(pbqp, edge->src);
43 tgt_node = get_node(pbqp, edge->tgt);
47 src_vec = src_node->costs;
48 tgt_vec = tgt_node->costs;
52 src_len = src_vec->len;
53 tgt_len = tgt_vec->len;
60 if (pbqp->dump_file) {
61 fputs("Input:<br>\n", pbqp->dump_file);
62 dump_simplifyedge(pbqp, edge);
65 /* Normalize towards source node. */
66 for (src_index = 0; src_index < src_len; ++src_index) {
67 num min = pbqp_matrix_get_row_min(mat, src_index, tgt_vec);
70 pbqp_matrix_sub_row_value(mat, src_index, tgt_vec, min);
71 vector_add_value(src_vec, min);
73 // TODO add to edge_list if inf
77 /* Normalize towards target node. */
78 for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) {
79 num min = pbqp_matrix_get_col_min(mat, tgt_index, src_vec);
82 pbqp_matrix_sub_col_value(mat, tgt_index, src_vec, min);
83 vector_add_value(tgt_vec, min);
85 // TODO add to edge_list if inf
89 if (pbqp->dump_file) {
90 fputs("<br>\nOutput:<br>\n", pbqp->dump_file);
91 dump_simplifyedge(pbqp, edge);
94 if (pbqp_matrix_is_zero(mat, src_vec, tgt_vec)) {
95 if (pbqp->dump_file) {
96 fputs("edge has been eliminated", pbqp->dump_file);
98 delete_edge(pbqp, edge);
103 void solve_pbqp_heuristical(pbqp *pbqp)
110 if (pbqp->dump_file) {
111 pbqp_dump_input(pbqp);
112 dump_section(pbqp->dump_file, 1, "2. Simplification of Cost Matrices");
115 node_len = pbqp->num_nodes;
119 /* First simplify all edges. */
120 for (node_index = 0; node_index < node_len; ++node_index) {
122 pbqp_node *node = get_node(pbqp, node_index);
129 edge_len = ARR_LEN(edges);
131 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
132 pbqp_edge *edge = edges[edge_index];
134 /* Simplify only once per edge. */
135 if (node_index != edge->src) continue;
137 simplify_edge(pbqp, edge);