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(void)
20 edge_bucket = NEW_ARR_F(pbqp_edge *, 0);
22 for (i = 0; i < 4; ++i) {
23 node_buckets[i] = NEW_ARR_F(pbqp_node *, 0);
27 static void fill_node_buckets(pbqp *pbqp)
33 node_len = pbqp->num_nodes;
35 for (node_index = 0; node_index < node_len; ++node_index) {
37 pbqp_node *node = get_node(pbqp, node_index);
41 arity = ARR_LEN(node->edges);
43 /* We have only one bucket for nodes with arity >= 3. */
48 ARR_APP1(pbqp_node *, node_buckets[arity], node);
52 static void simplify_edge(pbqp *pbqp, pbqp_edge *edge)
69 sprintf(txt, "Simplification of Edge n%d-n%d", edge->src, edge->tgt);
70 dump_section(pbqp->dump_file, 3, txt);
73 src_node = get_node(pbqp, edge->src);
74 tgt_node = get_node(pbqp, edge->tgt);
78 src_vec = src_node->costs;
79 tgt_vec = tgt_node->costs;
83 src_len = src_vec->len;
84 tgt_len = tgt_vec->len;
91 if (pbqp->dump_file) {
92 fputs("Input:<br>\n", pbqp->dump_file);
93 dump_simplifyedge(pbqp, edge);
96 /* Normalize towards source node. */
97 for (src_index = 0; src_index < src_len; ++src_index) {
98 num min = pbqp_matrix_get_row_min(mat, src_index, tgt_vec);
101 pbqp_matrix_sub_row_value(mat, src_index, tgt_vec, min);
102 vector_add_value(src_vec, min);
104 // TODO add to edge_list if inf
108 /* Normalize towards target node. */
109 for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) {
110 num min = pbqp_matrix_get_col_min(mat, tgt_index, src_vec);
113 pbqp_matrix_sub_col_value(mat, tgt_index, src_vec, min);
114 vector_add_value(tgt_vec, min);
116 // TODO add to edge_list if inf
120 if (pbqp->dump_file) {
121 fputs("<br>\nOutput:<br>\n", pbqp->dump_file);
122 dump_simplifyedge(pbqp, edge);
125 if (pbqp_matrix_is_zero(mat, src_vec, tgt_vec)) {
126 if (pbqp->dump_file) {
127 fputs("edge has been eliminated", pbqp->dump_file);
129 delete_edge(pbqp, edge);
134 void solve_pbqp_heuristical(pbqp *pbqp)
141 if (pbqp->dump_file) {
142 pbqp_dump_input(pbqp);
143 dump_section(pbqp->dump_file, 1, "2. Simplification of Cost Matrices");
146 node_len = pbqp->num_nodes;
150 /* First simplify all edges. */
151 for (node_index = 0; node_index < node_len; ++node_index) {
153 pbqp_node *node = get_node(pbqp, node_index);
160 edge_len = ARR_LEN(edges);
162 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
163 pbqp_edge *edge = edges[edge_index];
165 /* Simplify only once per edge. */
166 if (node_index != edge->src) continue;
168 simplify_edge(pbqp, edge);
172 /* Put node into bucket representing their arity. */
173 fill_node_buckets(pbqp);