5 #include "heuristical.h"
6 #include "html_dumper.h"
10 #include "pbqp_edge_t.h"
11 #include "pbqp_node_t.h"
14 static pbqp_edge **edge_bucket;
15 static pbqp_node **node_buckets[4];
17 static void init_buckets(void)
21 edge_bucket = NEW_ARR_F(pbqp_edge *, 0);
23 for (i = 0; i < 4; ++i) {
24 node_buckets[i] = NEW_ARR_F(pbqp_node *, 0);
28 static void fill_node_buckets(pbqp *pbqp)
34 node_len = pbqp->num_nodes;
36 for (node_index = 0; node_index < node_len; ++node_index) {
38 pbqp_node *node = get_node(pbqp, node_index);
42 arity = ARR_LEN(node->edges);
44 /* We have only one bucket for nodes with arity >= 3. */
49 ARR_APP1(pbqp_node *, node_buckets[arity], node);
53 static void simplify_edge(pbqp *pbqp, pbqp_edge *edge)
70 sprintf(txt, "Simplification of Edge n%d-n%d", edge->src, edge->tgt);
71 dump_section(pbqp->dump_file, 3, txt);
74 src_node = get_node(pbqp, edge->src);
75 tgt_node = get_node(pbqp, edge->tgt);
79 src_vec = src_node->costs;
80 tgt_vec = tgt_node->costs;
84 src_len = src_vec->len;
85 tgt_len = tgt_vec->len;
92 if (pbqp->dump_file) {
93 fputs("Input:<br>\n", pbqp->dump_file);
94 dump_simplifyedge(pbqp, edge);
97 /* Normalize towards source node. */
98 for (src_index = 0; src_index < src_len; ++src_index) {
99 num min = pbqp_matrix_get_row_min(mat, src_index, tgt_vec);
102 pbqp_matrix_sub_row_value(mat, src_index, tgt_vec, min);
103 vector_add_value(src_vec, min);
105 // TODO add to edge_list if inf
109 /* Normalize towards target node. */
110 for (tgt_index = 0; tgt_index < tgt_len; ++tgt_index) {
111 num min = pbqp_matrix_get_col_min(mat, tgt_index, src_vec);
114 pbqp_matrix_sub_col_value(mat, tgt_index, src_vec, min);
115 vector_add_value(tgt_vec, min);
117 // TODO add to edge_list if inf
121 if (pbqp->dump_file) {
122 fputs("<br>\nOutput:<br>\n", pbqp->dump_file);
123 dump_simplifyedge(pbqp, edge);
126 if (pbqp_matrix_is_zero(mat, src_vec, tgt_vec)) {
127 if (pbqp->dump_file) {
128 fputs("edge has been eliminated", pbqp->dump_file);
130 delete_edge(pbqp, edge);
135 void solve_pbqp_heuristical(pbqp *pbqp)
142 if (pbqp->dump_file) {
143 pbqp_dump_input(pbqp);
144 dump_section(pbqp->dump_file, 1, "2. Simplification of Cost Matrices");
147 node_len = pbqp->num_nodes;
151 /* First simplify all edges. */
152 for (node_index = 0; node_index < node_len; ++node_index) {
154 pbqp_node *node = get_node(pbqp, node_index);
161 edge_len = ARR_LEN(edges);
163 for (edge_index = 0; edge_index < edge_len; ++edge_index) {
164 pbqp_edge *edge = edges[edge_index];
166 /* Simplify only once per edge. */
167 if (node_index != edge->src) continue;
169 simplify_edge(pbqp, edge);
173 /* Put node into bucket representing their arity. */
174 fill_node_buckets(pbqp);
177 if (ARR_LEN(edge_bucket) > 0) {
178 panic("Please implement edge simplification");
179 } else if (ARR_LEN(node_buckets[1]) > 0) {
180 panic("Please implement RI simplification");
181 } else if (ARR_LEN(node_buckets[2]) > 0) {
182 panic("Please implement RII simplification");
183 } else if (ARR_LEN(node_buckets[3]) > 0) {
184 panic("Please implement RN simplification");
186 panic("Please implement back propagation");