- added html dumping of RN reductions
[libfirm] / vector.c
1 #include <string.h>
2
3 #include "adt/array.h"
4
5 #include "pbqp_t.h"
6 #include "vector.h"
7
8 num pbqp_add(num x, num y)
9 {
10         if (x == INF_COSTS || y == INF_COSTS) return INF_COSTS;
11
12         return x + y;
13 }
14
15 vector *vector_alloc(pbqp *pbqp, unsigned length)
16 {
17         assert(length > 0);
18         vector *vec = obstack_alloc(&pbqp->obstack, sizeof(*vec) + sizeof(*vec->entries) * length);
19         assert(vec);
20
21         vec->len = length;
22         memset(vec->entries, 0, sizeof(*vec->entries) * length);
23
24         return vec;
25 }
26
27 vector *vector_copy(pbqp *pbqp, vector *v)
28 {
29         unsigned  len  = v->len;
30         vector   *copy = obstack_copy(&pbqp->obstack, v, sizeof(*copy) + sizeof(*copy->entries) * len);
31         assert(copy);
32
33         return copy;
34 }
35
36 void vector_add(vector *sum, vector *summand)
37 {
38         int i;
39         int len;
40
41         assert(sum);
42         assert(summand);
43         assert(sum->len == summand->len);
44
45         len = sum->len;
46
47         for (i = 0; i < len; ++i) {
48                 sum->entries[i].data = pbqp_add(sum->entries[i].data,
49                                 summand->entries[i].data);
50         }
51 }
52
53 void vector_set(vector *vec, unsigned index, num value)
54 {
55         assert(index < vec->len);
56         vec->entries[index].data = value;
57 }
58
59 #if EXT_GRS_DEBUG
60 void vector_set_description(vector *vec, unsigned index, char *name)
61 {
62         assert(index < vec->len);
63         vec->entries[index].name = name;
64 }
65 #endif
66
67 void vector_add_value(vector *vec, num value)
68 {
69         unsigned index;
70         unsigned len;
71
72         assert(vec);
73
74         len = vec->len;
75
76         for (index = 0; index < len; ++index) {
77                 vec->entries[index].data = pbqp_add(vec->entries[index].data, value);
78         }
79 }
80
81 void vector_add_matrix_col(vector *vec, pbqp_matrix *mat, unsigned col_index)
82 {
83         unsigned index;
84         unsigned len;
85
86         assert(vec);
87         assert(mat);
88         assert(vec->len == mat->rows);
89         assert(col_index < mat->cols);
90
91         len = vec->len;
92
93         for (index = 0; index < len; ++index) {
94                 vec->entries[index].data = pbqp_add(vec->entries[index].data, mat->entries[index * mat->cols + col_index]);
95         }
96 }
97
98 void vector_add_matrix_row(vector *vec, pbqp_matrix *mat, unsigned row_index)
99 {
100         unsigned index;
101         unsigned len;
102
103         assert(vec);
104         assert(mat);
105         assert(vec->len == mat->cols);
106         assert(row_index < mat->rows);
107
108         len = vec->len;
109
110         for (index = 0; index < len; ++index) {
111                 vec->entries[index].data = pbqp_add(vec->entries[index].data,
112                                 mat->entries[row_index * mat->cols + index]);
113         }
114 }
115
116 num vector_get_min(vector *vec)
117 {
118         unsigned index;
119         unsigned len;
120         num      min = INF_COSTS;
121
122         assert(vec);
123
124         len = vec->len;
125         assert(len > 0);
126
127         for (index = 0; index < len; ++index) {
128                 num elem = vec->entries[index].data;
129
130                 if (elem < min) {
131                         min = elem;
132                 }
133         }
134
135         return min;
136 }
137
138 unsigned vector_get_min_index(vector *vec)
139 {
140         unsigned index;
141         unsigned len;
142         unsigned min_index = 0;
143         num      min       = INF_COSTS;
144
145         assert(vec);
146
147         len = vec->len;
148         assert(len > 0);
149
150         for (index = 0; index < len; ++index) {
151                 num elem = vec->entries[index].data;
152
153                 if (elem < min) {
154                         min = elem;
155                         min_index = index;
156                 }
157         }
158
159         return min_index;
160 }