예제 #1
0
/*
 * Test binary operations with b1 and b2
 */
static void test_ops(rba_buffer_t *b1, rba_buffer_t *b2) {
  rba_buffer_t b;

  printf("b1: ");
  print_rba_buffer(stdout, b1);
  printf("\nb2: ");
  print_rba_buffer(stdout, b2);
  printf("\n");

  printf("Equality test: ");
  if (rba_buffer_equal(b1, b2)) {
    printf("yes\n");
  } else {
    printf("no\n");
  }

  init_rba_buffer(&b, &prod_table);

  reset_rba_buffer(&b);
  rba_buffer_add_buffer(&b, b1);
  rba_buffer_add_buffer(&b, b2);
  printf("  b1 + b2: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_add_buffer(&b, b1);
  rba_buffer_sub_buffer(&b, b2);
  printf("  b1 - b2: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_add_buffer(&b, b2);
  rba_buffer_sub_buffer(&b, b1);
  printf("  b2 - b1: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_add_buffer(&b, b1);
  rba_buffer_mul_buffer(&b, b2);
  printf("  b1 * b2: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_add_buffer(&b, b2);
  rba_buffer_mul_buffer(&b, b1);
  printf("  b2 * b1: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_add_buffer_times_buffer(&b, b1, b2);
  printf("  b1 * b2: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  reset_rba_buffer(&b);
  rba_buffer_sub_buffer_times_buffer(&b, b1, b2);
  printf("- b1 * b2: ");
  print_rba_buffer(stdout, &b);
  printf("\n");

  delete_rba_buffer(&b);

  printf("----\n");
}
예제 #2
0
/*
 * Tests: add and remove
 */
static void run_tests(rba_buffer_t *b) {
  uint32_t i, h, n;

  check_tree(b);
  init_tests();

  // add all power products
  n = NUM_TESTS;
  for (i=0; i<n; i++) {
    test_add(b, test[i]);
  }
  printf("\nAfter %"PRIu32" additions\n", n);
  printf("   num_nodes = %"PRIu32"\n", b->num_nodes);
  printf("   num_terms = %"PRIu32"\n", b->nterms);
  printf("   root node = %"PRIu32"\n", b->root);
  if (is_balanced(b, b->root, &h)) {
    printf("   b-height    = %"PRIu32"\n", h);
    printf("   full height = %"PRIu32"\n", tree_height(b));
  } else {
    printf("   not balanced\n");
  }
  printf("\n");

  // remove half
  n = NUM_TESTS/2;
  for (i=0; i<n; i++) {
    test_remove(b, test[i]);
  }
  printf("\nAfter %"PRIu32" removals\n", n);
  printf("   num_nodes = %"PRIu32"\n", b->num_nodes);
  printf("   num_terms = %"PRIu32"\n", b->nterms);
  printf("   root node = %"PRIu32"\n", b->root);
  if (is_balanced(b, b->root, &h)) {
    printf("   b-height    = %"PRIu32"\n", h);
    printf("   full height = %"PRIu32"\n", tree_height(b));
  } else {
    printf("   not balanced\n");
  }

  // add them back
  for (i=0; i<n; i++) {
    test_add(b, test[i]);
  }
  printf("\nAfter %"PRIu32" additions\n", n);
  printf("   num_nodes = %"PRIu32"\n", b->num_nodes);
  printf("   num_terms = %"PRIu32"\n", b->nterms);
  printf("   root node = %"PRIu32"\n", b->root);
  if (is_balanced(b, b->root, &h)) {
    printf("   b-height    = %"PRIu32"\n", h);
    printf("   full height = %"PRIu32"\n", tree_height(b));
  } else {
    printf("   not balanced\n");
  }
  printf("\n");


  // Try again after reset
  reset_rba_buffer(b);
  n = NUM_TESTS/2;
  i = n;
  while (i > 0) {
    i --;
    test_add(b, test[i]);
  }

  printf("\nAfter %"PRIu32" additions\n", n);
  printf("   num_nodes = %"PRIu32"\n", b->num_nodes);
  printf("   num_terms = %"PRIu32"\n", b->nterms);
  printf("   root node = %"PRIu32"\n", b->root);
  if (is_balanced(b, b->root, &h)) {
    printf("   b-height    = %"PRIu32"\n", h);
    printf("   full height = %"PRIu32"\n", tree_height(b));
  } else {
    printf("   not balanced\n");
  }
  printf("\n");

  i = n;
  while (i > 0) {
    i --;
    test_remove(b, test[i]);
  }

  printf("\nAfter %"PRIu32" removals\n", n);
  printf("   num_nodes = %"PRIu32"\n", b->num_nodes);
  printf("   num_terms = %"PRIu32"\n", b->nterms);
  printf("   root node = %"PRIu32"\n", b->root);
  if (is_balanced(b, b->root, &h)) {
    printf("   b-height    = %"PRIu32"\n", h);
    printf("   full height = %"PRIu32"\n", tree_height(b));
  } else {
    printf("   not balanced\n");
  }



  fflush(stdout);
}
예제 #3
0
/*
 * Tests: one buffer
 */
static void test1(void) {
  rba_buffer_t buffer;
  rational_t q0;

  q_init(&q0);
  init_rba_buffer(&buffer, &prod_table);
  printf("Empty buffer\n");
  test_buffer(&buffer);

  printf("x_0 + x_1\n");
  rba_buffer_add_var(&buffer, 0);
  rba_buffer_add_var(&buffer, 1);
  test_buffer(&buffer);

  printf("After reset\n");
  reset_rba_buffer(&buffer);
  test_buffer(&buffer);

  printf("x_2 - x_0\n");
  rba_buffer_add_var(&buffer, 2);
  rba_buffer_sub_var(&buffer, 0);
  test_buffer(&buffer);

  printf("x_2 - x_0 + x_1 + x_0\n");
  reset_rba_buffer(&buffer);
  rba_buffer_add_var(&buffer, 2);
  rba_buffer_sub_var(&buffer, 0);
  rba_buffer_add_var(&buffer, 1);
  rba_buffer_add_var(&buffer, 0);
  test_buffer(&buffer);

  printf("Adding 3\n");
  q_set32(&q0, 3);
  rba_buffer_add_const(&buffer, &q0);
  test_buffer(&buffer);

  printf("Negating\n");
  rba_buffer_negate(&buffer);
  test_buffer(&buffer);

  printf("Negating again\n");
  rba_buffer_negate(&buffer);
  test_buffer(&buffer);

  printf("Multiplying by 2 x_4\n");
  q_set32(&q0, 2);
  rba_buffer_mul_varmono(&buffer, &q0, 4);
  test_buffer(&buffer);

  printf("Multiplying by x_1^2\n");
  rba_buffer_mul_var(&buffer, 1);
  rba_buffer_mul_var(&buffer, 1);
  test_buffer(&buffer);

  printf("Multiplying by 0\n");
  q_clear(&q0);
  rba_buffer_mul_const(&buffer, &q0);
  test_buffer(&buffer);

  printf("x_1 + 1 - x_2\n");
  reset_rba_buffer(&buffer);
  rba_buffer_add_var(&buffer, 1);
  q_set32(&q0, 1);
  rba_buffer_add_const(&buffer, &q0);
  rba_buffer_sub_var(&buffer, 2);
  test_buffer(&buffer);

  printf("Squaring\n");
  rba_buffer_square(&buffer);
  test_buffer(&buffer);

  printf("Squaring\n");
  rba_buffer_square(&buffer);
  test_buffer(&buffer);

  printf("Squaring\n");
  rba_buffer_square(&buffer);
  test_buffer(&buffer);

  q_clear(&q0);
  delete_rba_buffer(&buffer);
}