Continued implementation of PBQP solver: Fixed errors and warnings.
[libfirm] / kaps.c
1 #include "adt/array.h"
2
3 #include "kaps.h"
4 #include "pbqp_edge_t.h"
5 #include "pbqp_node.h"
6 #include "pbqp_node_t.h"
7 #include "vector.h"
8
9 pbqp_node *get_node(pbqp *pbqp, int index)
10 {
11         return pbqp->nodes[index];
12 }
13
14 pbqp_edge *get_edge(pbqp *pbqp, int src_index, int tgt_index)
15 {
16         int i;
17         int len;
18
19         if (src_index < tgt_index) {
20                 return get_edge(pbqp, tgt_index, src_index);
21         }
22
23         pbqp_node *src_node = get_node(pbqp, src_index);
24         assert(src_node);
25         pbqp_node *tgt_node = get_node(pbqp, tgt_index);
26         assert(tgt_node);
27
28         len = ARR_LEN(src_node->edges);
29
30         for (i = 0; i < len; ++i) {
31                 pbqp_edge *cur_edge = src_node->edges[i];
32                 if (cur_edge->tgt == tgt_node) {
33                         return cur_edge;
34                 }
35         }
36
37         return NULL;
38 }
39
40 pbqp *alloc_pbqp(int number_nodes)
41 {
42         pbqp* pbqp = xmalloc(sizeof(*pbqp));
43
44         obstack_init(&pbqp->obstack);
45
46         pbqp->solution = 0;
47         pbqp->num_nodes = number_nodes;
48         pbqp->nodes = obstack_alloc(&pbqp->obstack, number_nodes
49                         * sizeof(*pbqp->nodes));
50
51         return pbqp;
52 }
53
54 void free_pbqp(pbqp *pbqp)
55 {
56         obstack_free(&pbqp->obstack, NULL);
57         xfree(pbqp);
58 }
59
60 void add_node_costs(pbqp *pbqp, int node_index, vector *costs)
61 {
62         pbqp_node *node = get_node(pbqp, node_index);
63
64         if (node == NULL) {
65                 node = alloc_node(pbqp, costs);
66         } else {
67                 vector_add(node->costs, costs);
68         }
69 }
70
71 void add_edge_costs(pbqp *pbqp, int src_index, int tgt_index, matrix *costs)
72 {
73         pbqp_edge *edge = get_edge(pbqp, src_index, tgt_index);
74
75         if (edge == NULL) {
76                 edge = alloc_edge(pbqp, src_index, tgt_index, costs);
77         } else {
78                 matrix_add(edge->costs, costs);
79         }
80 }