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