/* * 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"); }
/* * 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); }
/* * 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); }