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