예제 #1
0
/*
 * 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");
      }
    }
  }
}
예제 #2
0
/*
 * 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, ")");
    }
  }

}
예제 #3
0
/*
 * 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)");
    }
  }
}