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