2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @brief Partitioned Boolean Quadratic Problem (PBQP) solver.
10 * @author Sebastian Buchwald
14 #include "adt/array.h"
15 #include "adt/xmalloc.h"
19 #include "pbqp_edge.h"
20 #include "pbqp_edge_t.h"
21 #include "pbqp_node.h"
22 #include "pbqp_node_t.h"
25 pbqp_node_t *get_node(pbqp_t *pbqp, unsigned index)
27 return pbqp->nodes[index];
30 pbqp_edge_t *get_edge(pbqp_t *pbqp, unsigned src_index, unsigned tgt_index)
34 pbqp_node_t *src_node;
35 pbqp_node_t *tgt_node;
37 if (tgt_index < src_index) {
38 unsigned tmp = src_index;
39 src_index = tgt_index;
43 src_node = get_node(pbqp, src_index);
44 tgt_node = get_node(pbqp, tgt_index);
47 len = ARR_LEN(src_node->edges);
49 for (i = 0; i < len; ++i) {
50 pbqp_edge_t *cur_edge = src_node->edges[i];
51 if (cur_edge->tgt == tgt_node) {
59 pbqp_t *alloc_pbqp(unsigned number_nodes)
61 pbqp_t *pbqp = XMALLOC(pbqp_t);
63 obstack_init(&pbqp->obstack);
66 pbqp->num_nodes = number_nodes;
68 pbqp->dump_file = NULL;
70 pbqp->nodes = OALLOCNZ(&pbqp->obstack, pbqp_node_t*, number_nodes);
84 void free_pbqp(pbqp_t *pbqp)
86 obstack_free(&pbqp->obstack, NULL);
90 void add_node_costs(pbqp_t *pbqp, unsigned node_index, vector_t *costs)
92 pbqp_node_t *node = get_node(pbqp, node_index);
95 node = alloc_node(pbqp, node_index, costs);
96 pbqp->nodes[node_index] = node;
98 vector_add(node->costs, costs);
102 void add_edge_costs(pbqp_t *pbqp, unsigned src_index, unsigned tgt_index,
103 pbqp_matrix_t *costs)
105 pbqp_edge_t *edge = get_edge(pbqp, src_index, tgt_index);
107 if (tgt_index < src_index) {
108 pbqp_matrix_transpose(pbqp, costs);
109 add_edge_costs(pbqp, tgt_index, src_index, costs);
114 alloc_edge(pbqp, src_index, tgt_index, costs);
116 pbqp_matrix_add(edge->costs, costs);
120 num get_node_solution(pbqp_t *pbqp, unsigned node_index)
122 pbqp_node_t *node = get_node(pbqp, node_index);
124 return node->solution;
127 num get_solution(pbqp_t *pbqp)
129 return pbqp->solution;
133 void set_dumpfile(pbqp *pbqp, FILE *f)