pset_family irred_gasp(pset_family F, pset_family D, pset_family G) { if (G->count != 0) F = irredundant(sf_append(F, G), D); else sf_free(G); return F; }
pset_family super_gasp(pset_family F, pset_family D, pset_family R, cost_t *cost) { pset_family G, G1; {long t=util_cpu_time();G = reduce_gasp(F, D);totals(t, 9, G,&( *cost));}; {long t=util_cpu_time();G1 = all_primes(G, R);totals(t, 7, G1,&( *cost));}; sf_free(G); {long t=util_cpu_time();G = sf_dupl(sf_append(F, G1));if(trace)print_trace( G, "NEWPRIMES",util_cpu_time()-t);}; {long t=util_cpu_time();F = irredundant(G, D);totals(t, 5, F,&( *cost));}; return F; }
static bool compl_special_cases(pset *T, pset_family *Tbar) /* will be disposed if answer is determined */ /* returned only if answer determined */ { register pcube *T1, p, ceil, cof=T[0]; pcover A, ceil_compl; /* Check for no cubes in the cover */ if (T[2] == NULL) { *Tbar = sf_addset(new_cover(1), cube.fullset); free_cubelist(T); return TRUE; } /* Check for only a single cube in the cover */ if (T[3] == NULL) { *Tbar = compl_cube(set_or(cof, cof, T[2])); free_cubelist(T); return TRUE; } /* Check for a row of all 1's (implies complement is null) */ for(T1 = T+2; (p = *T1++) != NULL; ) { if (full_row(p, cof)) { *Tbar = new_cover(0); free_cubelist(T); return TRUE; } } /* Check for a column of all 0's which can be factored out */ ceil = set_save(cof); for(T1 = T+2; (p = *T1++) != NULL; ) { INLINEset_or(ceil, ceil, p); } if (! setp_equal(ceil, cube.fullset)) { ceil_compl = compl_cube(ceil); (void) set_or(cof, cof, set_diff(ceil, cube.fullset, ceil)); set_free(ceil); *Tbar = sf_append(complement(T), ceil_compl); return TRUE; } set_free(ceil); /* Collect column counts, determine unate variables, etc. */ massive_count(T); /* If single active variable not factored out above, then tautology ! */ if (cdata.vars_active == 1) { *Tbar = new_cover(0); free_cubelist(T); return TRUE; /* Check for unate cover */ } else if (cdata.vars_unate == cdata.vars_active) { A = map_cover_to_unate(T); free_cubelist(T); A = unate_compl(A); *Tbar = map_unate_to_cover(A); sf_free(A); return TRUE; /* Not much we can do about it */ } else { return MAYBE; } }
static bool compl_special_cases(set **T, set_family_t **Tbar) { set **T1, *p, *ceil, *cof=T[0]; set_family_t *A, *ceil_compl; // Check for no cubes in the cover if (T[2] == NULL) { *Tbar = sf_addset(sf_new(1, CUBE.size), CUBE.fullset); free_cubelist(T); return TRUE; } // Check for only a single cube in the cover if (T[3] == NULL) { *Tbar = compl_cube(set_or(cof, cof, T[2])); free_cubelist(T); return TRUE; } // Check for a row of all 1's (implies complement is null) for (T1 = T+2; (p = *T1++) != NULL; ) { if (full_row(p, cof)) { *Tbar = sf_new(0, CUBE.size); free_cubelist(T); return TRUE; } } // Check for a column of all 0's which can be factored out ceil = set_save(cof); for (T1 = T+2; (p = *T1++) != NULL; ) { set_or(ceil, ceil, p); } if (! setp_equal(ceil, CUBE.fullset)) { ceil_compl = compl_cube(ceil); set_or(cof, cof, set_diff(ceil, CUBE.fullset, ceil)); set_free(ceil); *Tbar = sf_append(complement(T), ceil_compl); return TRUE; } set_free(ceil); // Collect column counts, determine unate variables, etc. massive_count(T); // If single active variable not factored out above, then tautology! if (CDATA.vars_active == 1) { *Tbar = sf_new(0, CUBE.size); free_cubelist(T); return TRUE; // Check for unate cover } else if (CDATA.vars_unate == CDATA.vars_active) { A = map_cover_to_unate(T); free_cubelist(T); A = unate_compl(A); *Tbar = map_unate_to_cover(A); sf_free(A); return TRUE; // Not much we can do about it } else { return MAYBE; } }