X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=vector.c;h=4f8ce17ee4d995a93990382170a7ae7cd1e621d2;hb=dab331acb65abde58d635b58de24f676f3eae69b;hp=c7dad8be2637c8c61e7dbe2434c9f13ccdb5394b;hpb=a78b677aed1215eb4c5e4156b4ee584594abd854;p=libfirm diff --git a/vector.c b/vector.c index c7dad8be2..4f8ce17ee 100644 --- a/vector.c +++ b/vector.c @@ -1,41 +1,35 @@ +#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; + + return x + y; +} +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 +45,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); } } @@ -68,3 +63,98 @@ void vector_set_description(vector *vec, unsigned index, char *name) 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; +}