X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=vector.c;h=c9854bb1297dab0d69670b71e3e62f4b75fc265e;hb=0194f264862b1cdefc4189daa008173beb01a893;hp=926faac835d00a7d8150a7a5453c728ee0e18a24;hpb=b965189fa636045d37bb055c495e1f6af383af04;p=libfirm diff --git a/vector.c b/vector.c index 926faac83..c9854bb12 100644 --- a/vector.c +++ b/vector.c @@ -2,9 +2,28 @@ #include "adt/array.h" -#include "pbqp_t.h" #include "vector.h" +num pbqp_add(num x, num y) +{ + 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); @@ -38,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); } } @@ -48,10 +68,105 @@ void vector_set(vector *vec, unsigned index, num value) vec->entries[index].data = value; } -#if EXT_GRS_DEBUG +#if KAPS_ENABLE_VECTOR_NAMES 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; +}