X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=vector.c;h=8902c6e0b767edbe8a1798b56f4c5d5b834324d9;hb=ca2ff2b33005c39b8f8b0b9ee9c35ef082619225;hp=c7dad8be2637c8c61e7dbe2434c9f13ccdb5394b;hpb=a78b677aed1215eb4c5e4156b4ee584594abd854;p=libfirm diff --git a/vector.c b/vector.c index c7dad8be2..8902c6e0b 100644 --- a/vector.c +++ b/vector.c @@ -1,41 +1,47 @@ +#include + #include "adt/array.h" -#include "pbqp_t.h" #include "vector.h" -vector *vector_alloc(pbqp *pbqp, unsigned length) +num pbqp_add(num x, num y) { - unsigned index; + if (x == INF_COSTS || y == INF_COSTS) return INF_COSTS; + + num res = x + y; + + /* No positive overflow. */ + assert(x < 0 || y < 0 || res >= x); + assert(x < 0 || y < 0 || res >= y); + + /* 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; - for (index = 0; index < length; ++index) { - vec->entries[index].data = 0; -#if EXT_GRS_DEBUG - vec->entries[index].name = NULL; -#endif - } + memset(vec->entries, 0, sizeof(*vec->entries) * length); return vec; } vector *vector_copy(pbqp *pbqp, vector *v) { - unsigned i; - vector *copy = obstack_alloc(&pbqp->obstack, sizeof(*copy) + sizeof(*copy->entries) * length); - + unsigned len = v->len; + vector *copy = obstack_copy(&pbqp->obstack, v, sizeof(*copy) + sizeof(*copy->entries) * len); assert(copy); - unsigned len = v->len; - - copy->len = len; - for (i = 0; i < len; ++i) { - copy->entries[i] = v->entries[i]; - } - return copy; } @@ -51,7 +57,8 @@ void vector_add(vector *sum, vector *summand) len = sum->len; for (i = 0; i < len; ++i) { - sum->entries[i].data += summand->entries[i].data; + sum->entries[i].data = pbqp_add(sum->entries[i].data, + summand->entries[i].data); } } @@ -61,10 +68,105 @@ void vector_set(vector *vec, unsigned index, num value) vec->entries[index].data = value; } -#if EXT_GRS_DEBUG -void vector_set_description(vector *vec, unsigned index, char *name) +#if KAPS_ENABLE_VECTOR_NAMES +void vector_set_description(vector *vec, unsigned index, const 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; +}