#include "mincov_int.h"


solution_t *
solution_alloc()
{
    solution_t *sol;

    sol = ALLOC(solution_t, 1);
    sol->cost = 0;
    sol->row = sm_row_alloc();
    return sol;
}


void
solution_free(sol)
solution_t *sol;
{
    sm_row_free(sol->row);
    FREE(sol);
}


solution_t *
solution_dup(sol)
solution_t *sol;
{
    solution_t *new_sol;

    new_sol = ALLOC(solution_t, 1);
    new_sol->cost = sol->cost;
    new_sol->row = sm_row_dup(sol->row);
    return new_sol;
}


void 
solution_add(sol, weight, col)
solution_t *sol;
int *weight;
int col;
{
    (void) sm_row_insert(sol->row, col);
    sol->cost += WEIGHT(weight, col);
}


void 
solution_accept(sol, A, weight, col)
solution_t *sol;
sm_matrix *A;
int *weight;
int col;
{
    register sm_element *p, *pnext;
    sm_col *pcol;

    solution_add(sol, weight, col);

    /* delete rows covered by this column */
    pcol = sm_get_col(A, col);
    for(p = pcol->first_row; p != 0; p = pnext) {
	pnext = p->next_row;		/* grab it before it disappears */
	sm_delrow(A, p->row_num);
    }
}


/* ARGSUSED */
void 
solution_reject(sol, A, weight, col)
solution_t *sol;
sm_matrix *A;
int *weight;
int col;
{
    sm_delcol(A, col);
}


solution_t *
solution_choose_best(best1, best2)
solution_t *best1, *best2;
{
    if (best1 != NIL(solution_t)) {
	if (best2 != NIL(solution_t)) {
	    if (best1->cost <= best2->cost) {
		solution_free(best2);
		return best1;
	    } else {
		solution_free(best1);
		return best2;
	    }
	} else {
	    return best1;
	}
    } else {
	if (best2 != NIL(solution_t)) {
	    return best2;
	} else {
	    return NIL(solution_t);
	}
    }
}
