pset do_sm_minimum_cover(pset_family A) { sm_matrix *M; sm_row *sparse_cover; sm_element *pe; pset cover; register int i, base, rownum; register unsigned val; register pset last, p; M = sm_alloc(); rownum = 0; for( p=A->data, last= p+A->count*A->wsize; p< last; p+=A->wsize) { for( i = (p[0] & 0x03ff); i > 0; ) for( val = p[ i], base = -- i << 5; val != 0; base++, val >>= 1) if ( val & 1) { (void) sm_insert(M, rownum, base); } rownum++; } sparse_cover = sm_minimum_cover(M, ((int *) 0), 1, 0); sm_free(M); cover = set_clear(((unsigned int *) malloc(sizeof(unsigned int) * ( ((A->sf_size) <= 32 ? 2 : (((((A->sf_size)-1) >> 5) + 1) + 1))))), A->sf_size); for( pe = sparse_cover->first_col; pe != 0; pe = pe->next_col) { (cover[((( pe->col_num) >> 5) + 1)] |= 1 << (( pe->col_num) & (32-1))); } sm_row_free(sparse_cover); return cover; }
void sm_free(sm_matrix *A) { #ifdef FAST_AND_LOOSE register sm_row *prow; if (A->first_row != 0) { for(prow = A->first_row; prow != 0; prow = prow->next_row) { /* add the elements to the free list of elements */ prow->last_col->next_col = sm_element_freelist; sm_element_freelist = prow->first_col; } /* Add the linked list of rows to the row-free-list */ A->last_row->next_row = sm_row_freelist; sm_row_freelist = A->first_row; /* Add the linked list of cols to the col-free-list */ A->last_col->next_col = sm_col_freelist; sm_col_freelist = A->first_col; } #else register sm_row *prow, *pnext_row; register sm_col *pcol, *pnext_col; for(prow = A->first_row; prow != 0; prow = pnext_row) { pnext_row = prow->next_row; sm_row_free(prow); } for(pcol = A->first_col; pcol != 0; pcol = pnext_col) { pnext_col = pcol->next_col; pcol->first_row = pcol->last_row = NIL(sm_element); sm_col_free(pcol); } #endif /* Free the arrays to map row/col numbers into pointers */ FREE(A->rows); FREE(A->cols); FREE(A); }
void solution_free(solution_t *sol) { sm_row_free(sol->row); FREE(sol); }