#include "cube.h"
#include "bdd.h"

/* set_clear -- make "r" the empty set of "size" elements */
/*
 pset set_clear(r, size)
 register pset r;
 int size;
 {
 register int i = LOOPINIT(size);
 *r = i; do r[i] = 0; while (--i > 0);
 return r;
 }*/

ace_cube_t * ace_cube_dup(ace_cube_t * cube) {
	int i;
	ace_cube_t * cube_copy;

	assert(cube != NULL);
	assert(cube->num_literals > 0);

	cube_copy = malloc(sizeof(ace_cube_t));
	cube_copy->static_prob = cube->static_prob;
	cube_copy->num_literals = cube->num_literals;
	cube_copy->cube = set_new (2 * cube->num_literals);
	for (i = 0; i < cube->num_literals; i++) {
		switch (node_get_literal (cube->cube, i)) {
		case ZERO:
			set_insert(cube_copy->cube, 2 * i);
			set_remove(cube_copy->cube, 2 * i + 1);
			break;
		case ONE:
			set_remove(cube_copy->cube, 2 * i);
			set_insert(cube_copy->cube, 2 * i + 1);
			break;
		case TWO:
			set_insert(cube_copy->cube, 2 * i);
			set_insert(cube_copy->cube, 2 * i + 1);
			break;
		default:
			fail("Bad literal.");
		}
	}

	return (cube_copy);
}

ace_cube_t * ace_cube_new_dc(int num_literals) {
	int i;
	ace_cube_t * new_cube;

	new_cube = malloc(sizeof(ace_cube_t));
	new_cube->num_literals = num_literals;
	new_cube->static_prob = 1.0;
	new_cube->cube = set_new (2 * num_literals);

	for (i = 0; i < num_literals; i++) {
		set_insert(new_cube->cube, 2 * i);
		set_insert(new_cube->cube, 2 * i + 1);
	}

	return (new_cube);
}

void ace_cube_free(ace_cube_t * cube) {
	assert(cube != NULL);
	assert(cube->cube != NULL);
	free(cube->cube);
	free(cube);
}
