/* * Print content of vector b */ static void print_bag(int32_t *b) { int_bag_t *bag; uint32_t i, n; int32_t x; printf("Bag %p\n", b); if (b == NULL) { printf(" null bag\n"); } else { bag = ibag_header(b); printf(" capacity = %"PRIu32"\n", bag->capacity); printf(" size = %"PRIu32"\n", bag->size); printf(" nelems = %"PRIu32"\n", bag->nelems); printf(" free = %"PRId32, bag->free); if (bag->free < -1) { printf(" (index %"PRId32")\n", flip_sign_bit(bag->free)); } else { printf("\n"); } printf(" content:\n"); n = ibag_size(b); for (i=0; i<n; i++) { x = b[i]; printf(" data[%"PRIu32"] = %"PRId32, i, x); if (x < -1) { printf(" (index %"PRId32")\n", flip_sign_bit(x)); } else { printf("\n"); } } } }
/* * Print a solution row: * - x = variable defined by that row * - r = the row index * - v = column indices (as an int_bag) */ static void dsolver_print_sol_row_core(FILE *f, dsolver_t *solver, int32_t x, int32_t r, int32_t *v) { dcolumn_t *c, *b; uint32_t i, n, m; int32_t k, j; // j = constant index for row r, j == -1 means constant = 0 b = solver->constant_column; j = find_row(b, r); if (v == NULL) { n = 0; m = 0; } else { m = ibag_nelems(v); n = ibag_size(v); } if (m == 0 && j < 0) { fprintf(f, "(= x_%"PRId32" 0)", x); } else { if (m > 1 || j >= 0) { fprintf(f, "(= x_%"PRId32" (+", x); } else { fprintf(f, "(= x_%"PRId32, x); } // print the constant first if (j >= 0) { fprintf(f, " "); q_print(f, &b->data[j].coeff); } // print the matrix element for (i=0; i<n; i++) { if (v[i] >= 0) { assert(v[i] < solver->ncolumns); c = solver->column[v[i]]; assert(c != NULL); k = find_row(c, r); assert(k >= 0); fprintf(f, " "); dsolver_print_monomial(f, &c->data[k].coeff, c->var, 'i'); } } if (m > 1 || j >= 0) { fprintf(f, "))"); } else { fprintf(f, ")"); } } }
/* * Print a row: * - r = row index * - v = array of columns where i occurs (as an int_bag) * Assumptions on v: * - it contains valid column indices with no repetition * (negative numbers in v are skipped, cf. int_bags) * - for every k in v, column k is non-null and contain an element for row r */ static void dsolver_print_row_core(FILE *f, dsolver_t *solver, int32_t r, int32_t *v) { dcolumn_t *c, *b; uint32_t i, n, m; int32_t k, j; char prefix; /* if main_rows is 0, variables are written x_<xx> * otherwise, variables are written i_<xxx> */ if (solver->main_rows == 0) { prefix = 'x'; } else { prefix = 'i'; } // j = constant index for row r, j == -1 means constant = 0 b = solver->constant_column; j = find_row(b, r); if (v == NULL) { m = 0; n = 0; } else { m = ibag_nelems(v); n = ibag_size(v); } if (m == 0 && j < 0) { fprintf(f, "(= 0 0)"); } else { if (m > 1 || j >= 0) { fprintf(f, "(= (+"); } else { fprintf(f, "(="); } // print the matrix element for (i=0; i<n; i++) { if (v[i] >= 0) { assert(v[i] < solver->ncolumns); c = solver->column[v[i]]; assert(c != NULL); k = find_row(c, r); assert(k >= 0); fprintf(f, " "); dsolver_print_monomial(f, &c->data[k].coeff, c->var, prefix); } } // print the constant if (j >= 0) { fprintf(f, " "); q_print(f, &b->data[j].coeff); } // close parentheses if (m > 1 || j >= 0) { fprintf(f, ") 0)"); } else { fprintf(f, " 0)"); } } }