X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=vector.c;h=0a36f594c9c18b96e43464f4cd0c32cef5e0ad67;hb=937c4900d4b165a27178d0c80cbe6f61fcdd1a3d;hp=e4456a82d037a69b77feb72087e5e6fffc104987;hpb=d01193ed5f4474a0f51b2b8dd809f5b39ac9b722;p=libfirm diff --git a/vector.c b/vector.c index e4456a82d..0a36f594c 100644 --- a/vector.c +++ b/vector.c @@ -1,20 +1,47 @@ +#include + #include "adt/array.h" +#include "pbqp_t.h" #include "vector.h" -vector *vector_copy(pbqp *pbqp, vector *v) +num pbqp_add(num x, num y) { - int i; - int len; - vector *copy = obstack_alloc(pbqp->obstack, sizeof(*copy)); + if (x == INF_COSTS || y == INF_COSTS) return INF_COSTS; - assert(copy); + num res = x + y; - len = v->len; + /* No positive overflow. */ + assert(x < 0 || y < 0 || res >= x); + assert(x < 0 || y < 0 || res >= y); - for (i = 0; i < len; ++i) { - copy->entries[i] = v->entries[i]; - } + /* No negative overflow. */ + assert(x > 0 || y > 0 || res <= x); + assert(x > 0 || y > 0 || res <= y); + + /* Result is not infinity.*/ + assert(res < INF_COSTS); + + return res; +} + +vector *vector_alloc(pbqp *pbqp, unsigned length) +{ + assert(length > 0); + vector *vec = obstack_alloc(&pbqp->obstack, sizeof(*vec) + sizeof(*vec->entries) * length); + assert(vec); + + vec->len = length; + memset(vec->entries, 0, sizeof(*vec->entries) * length); + + return vec; +} + +vector *vector_copy(pbqp *pbqp, vector *v) +{ + unsigned len = v->len; + vector *copy = obstack_copy(&pbqp->obstack, v, sizeof(*copy) + sizeof(*copy->entries) * len); + assert(copy); return copy; } @@ -31,6 +58,116 @@ void vector_add(vector *sum, vector *summand) len = sum->len; for (i = 0; i < len; ++i) { - sum->entries[i] += summand->entries[i]; + sum->entries[i].data = pbqp_add(sum->entries[i].data, + summand->entries[i].data); + } +} + +void vector_set(vector *vec, unsigned index, num value) +{ + assert(index < vec->len); + vec->entries[index].data = value; +} + +#if EXT_GRS_DEBUG +void vector_set_description(vector *vec, unsigned index, char *name) +{ + assert(index < vec->len); + vec->entries[index].name = name; +} +#endif + +void vector_add_value(vector *vec, num value) +{ + unsigned index; + unsigned len; + + assert(vec); + + len = vec->len; + + for (index = 0; index < len; ++index) { + vec->entries[index].data = pbqp_add(vec->entries[index].data, value); } } + +void vector_add_matrix_col(vector *vec, pbqp_matrix *mat, unsigned col_index) +{ + unsigned index; + unsigned len; + + assert(vec); + assert(mat); + assert(vec->len == mat->rows); + assert(col_index < mat->cols); + + len = vec->len; + + for (index = 0; index < len; ++index) { + vec->entries[index].data = pbqp_add(vec->entries[index].data, mat->entries[index * mat->cols + col_index]); + } +} + +void vector_add_matrix_row(vector *vec, pbqp_matrix *mat, unsigned row_index) +{ + unsigned index; + unsigned len; + + assert(vec); + assert(mat); + assert(vec->len == mat->cols); + assert(row_index < mat->rows); + + len = vec->len; + + for (index = 0; index < len; ++index) { + vec->entries[index].data = pbqp_add(vec->entries[index].data, + mat->entries[row_index * mat->cols + index]); + } +} + +num vector_get_min(vector *vec) +{ + unsigned index; + unsigned len; + num min = INF_COSTS; + + assert(vec); + + len = vec->len; + assert(len > 0); + + for (index = 0; index < len; ++index) { + num elem = vec->entries[index].data; + + if (elem < min) { + min = elem; + } + } + + return min; +} + +unsigned vector_get_min_index(vector *vec) +{ + unsigned index; + unsigned len; + unsigned min_index = 0; + num min = INF_COSTS; + + assert(vec); + + len = vec->len; + assert(len > 0); + + for (index = 0; index < len; ++index) { + num elem = vec->entries[index].data; + + if (elem < min) { + min = elem; + min_index = index; + } + } + + return min_index; +}