return copy;
}
+void pbqp_matrix_transpose(pbqp *pbqp, pbqp_matrix *mat)
+{
+ unsigned len;
+
+ assert(mat);
+ len = mat->rows * mat->cols;
+
+ pbqp_matrix *tmp = pbqp_matrix_copy_and_transpose(pbqp, mat);
+
+ memcpy(mat, tmp, sizeof(*mat) + sizeof(*mat->entries) * len);
+
+ obstack_free(&pbqp->obstack, tmp);
+}
+
void pbqp_matrix_add(pbqp_matrix *sum, pbqp_matrix *summand)
{
int i;
len = sum->rows * sum->cols;
for (i = 0; i < len; ++i) {
- sum->entries[i] += summand->entries[i];
+ sum->entries[i] = pbqp_add(sum->entries[i], summand->entries[i]);
+ }
+}
+
+void pbqp_matrix_set_col_value(pbqp_matrix *mat, unsigned col, num value)
+{
+ unsigned row_index;
+ unsigned row_len;
+
+ assert(mat);
+ assert(col < mat->cols);
+
+ row_len = mat->rows;
+
+ for (row_index = 0; row_index < row_len; ++row_index) {
+ mat->entries[row_index * mat->cols + col] = value;
+ }
+}
+
+void pbqp_matrix_set_row_value(pbqp_matrix *mat, unsigned row, num value)
+{
+ unsigned col_index;
+ unsigned col_len;
+
+ assert(mat);
+ assert(row < mat->rows);
+
+ col_len = mat->cols;
+
+ for (col_index = 0; col_index < col_len; ++col_index) {
+ mat->entries[row * mat->cols + col_index] = value;
}
}
void pbqp_matrix_sub_col_value(pbqp_matrix *matrix, unsigned col_index,
vector *flags, num value)
{
+ unsigned col_len;
unsigned row_index;
+ unsigned row_len;
assert(matrix);
assert(flags);
assert(matrix->rows == flags->len);
- unsigned col_len = matrix->cols;
- unsigned row_len = matrix->rows;
+ col_len = matrix->cols;
+ row_len = matrix->rows;
for (row_index = 0; row_index < row_len; ++row_index) {
+ if (flags->entries[row_index].data == INF_COSTS) {
+ matrix->entries[row_index * col_len + col_index] = 0;
+ continue;
+ }
/* inf - x = inf if x < inf */
if (matrix->entries[row_index * col_len + col_index] == INF_COSTS && value
!= INF_COSTS)
vector *flags, num value)
{
unsigned col_index;
+ unsigned col_len;
assert(matrix);
assert(flags);
assert(matrix->cols == flags->len);
- unsigned len = flags->len;
+ col_len = matrix->cols;
- for (col_index = 0; col_index < len; ++col_index) {
+ for (col_index = 0; col_index < col_len; ++col_index) {
+ if (flags->entries[col_index].data == INF_COSTS) {
+ matrix->entries[row_index * col_len + col_index] = 0;
+ continue;
+ }
/* inf - x = inf if x < inf */
- if (matrix->entries[row_index * len + col_index] == INF_COSTS && value
+ if (matrix->entries[row_index * col_len + col_index] == INF_COSTS && value
!= INF_COSTS)
continue;
- matrix->entries[row_index * len + col_index] -= value;
+ matrix->entries[row_index * col_len + col_index] -= value;
}
}
return 1;
}
+
+void pbqp_matrix_add_to_all_cols(pbqp_matrix *mat, vector *vec)
+{
+ unsigned col_index;
+ unsigned col_len;
+ unsigned row_index;
+ unsigned row_len;
+
+ assert(mat);
+ assert(vec);
+ assert(mat->rows == vec->len);
+
+ col_len = mat->cols;
+ row_len = mat->rows;
+
+ for (row_index = 0; row_index < row_len; ++row_index) {
+ num value = vec->entries[row_index].data;
+ for (col_index = 0; col_index < col_len; ++col_index) {
+ mat->entries[row_index * col_len + col_index] = pbqp_add(
+ mat->entries[row_index * col_len + col_index], value);
+ }
+ }
+}
+
+void pbqp_matrix_add_to_all_rows(pbqp_matrix *mat, vector *vec)
+{
+ unsigned col_index;
+ unsigned col_len;
+ unsigned row_index;
+ unsigned row_len;
+
+ assert(mat);
+ assert(vec);
+ assert(mat->cols == vec->len);
+
+ col_len = mat->cols;
+ row_len = mat->rows;
+
+ for (row_index = 0; row_index < row_len; ++row_index) {
+ for (col_index = 0; col_index < col_len; ++col_index) {
+ num value = vec->entries[col_index].data;
+
+ mat->entries[row_index * col_len + col_index] = pbqp_add(mat->entries[row_index * col_len + col_index], value);
+ }
+ }
+}