6 #include "pbqp_edge_t.h"
8 #include "pbqp_node_t.h"
11 pbqp_node *get_node(pbqp *pbqp, unsigned index)
13 return pbqp->nodes[index];
16 pbqp_edge *get_edge(pbqp *pbqp, unsigned src_index, unsigned tgt_index)
21 if (tgt_index < src_index) {
22 unsigned tmp = src_index;
23 src_index = tgt_index;
27 pbqp_node *src_node = get_node(pbqp, src_index);
28 pbqp_node *tgt_node = get_node(pbqp, tgt_index);
32 len = ARR_LEN(src_node->edges);
34 for (i = 0; i < len; ++i) {
35 pbqp_edge *cur_edge = src_node->edges[i];
36 if (cur_edge->tgt == tgt_node) {
44 pbqp *alloc_pbqp(unsigned number_nodes)
46 pbqp* pbqp = xmalloc(sizeof(*pbqp));
48 obstack_init(&pbqp->obstack);
51 pbqp->num_nodes = number_nodes;
52 pbqp->dump_file = NULL;
53 pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
54 * sizeof(*pbqp->nodes));
55 memset(pbqp->nodes, 0, number_nodes * sizeof(*pbqp->nodes));
68 void free_pbqp(pbqp *pbqp)
70 obstack_free(&pbqp->obstack, NULL);
74 void add_node_costs(pbqp *pbqp, unsigned node_index, vector *costs)
76 pbqp_node *node = get_node(pbqp, node_index);
79 node = alloc_node(pbqp, node_index, costs);
80 pbqp->nodes[node_index] = node;
82 vector_add(node->costs, costs);
86 void add_edge_costs(pbqp *pbqp, unsigned src_index, unsigned tgt_index,
89 pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
91 if (tgt_index < src_index) {
92 pbqp_matrix_transpose(pbqp, costs);
93 add_edge_costs(pbqp, tgt_index, src_index, costs);
98 edge = alloc_edge(pbqp, src_index, tgt_index, costs);
100 pbqp_matrix_add(edge->costs, costs);
104 num get_node_solution(pbqp *pbqp, unsigned node_index)
106 pbqp_node *node = get_node(pbqp, node_index);
109 return node->solution;
112 num get_solution(pbqp *pbqp)
114 return pbqp->solution;
117 void set_dumpfile(pbqp *pbqp, FILE *f)