diff options
Diffstat (limited to 'src/misc/espresso/solution.c')
| -rw-r--r-- | src/misc/espresso/solution.c | 114 | 
1 files changed, 114 insertions, 0 deletions
| diff --git a/src/misc/espresso/solution.c b/src/misc/espresso/solution.c new file mode 100644 index 00000000..26119185 --- /dev/null +++ b/src/misc/espresso/solution.c @@ -0,0 +1,114 @@ +/* + * Revision Control Information + * + * $Source$ + * $Author$ + * $Revision$ + * $Date$ + * + */ +#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); +    } +    } +} | 
