Beispiel #1
0
bool PbSolver::convertPbs(void)
{
    vec<Formula> fs;
    vec<Lit>     ts;

    if (!rewriteAlmostClauses())
        return false;

    // construct formulas for all constraints
    for (int i = 0; i < constrs.size(); i++){
        if (constrs[i] == NULL) continue;

        /**/reportf("---[%4d]---> ", constrs.size() - 1 - i);
        linearAddition2(*constrs[i], fs);
    }

    clausify(sat_solver,fs,ts);

    for (int i = 0; i < ts.size(); i++)
        sat_solver.addUnit(ts[i]);

    constrs.clear();
    mem.clear();

    return sat_solver.okay();
}
bool PbSolver::convertPbs(bool first_call)
{
    vec<Formula>    converted_constrs;

    if (first_call){
        findIntervals();
        if (!rewriteAlmostClauses()){
            ok = false;
            return false; }
    }

    for (int i = 0; i < constrs.size(); i++){
        if (constrs[i] == NULL) continue;
        Linear& c   = *constrs[i]; assert(c.lo != Int_MIN || c.hi != Int_MAX);

        if (options->opt_verbosity >= 1)
            /**/reportf("---[%4d]---> ", constrs.size() - 1 - i);

        if (options->opt_convert == ct_Sorters) {
            if (options->opt_dump) { // no formulae built
                buildConstraint(c,primesLoader, options);
            } else {
                converted_constrs.push(buildConstraint(c,primesLoader, options));
            }
        }
        else if (options->opt_convert == ct_Adders)
            linearAddition(c, converted_constrs, options->opt_verbosity);
        else if (options->opt_convert == ct_BDDs)
            converted_constrs.push(convertToBdd(c, options->opt_verbosity));
        else if (options->opt_convert == ct_Mixed){
            int adder_cost = estimatedAdderCost(c);
            //**/printf("estimatedAdderCost: %d\n", estimatedAdderCost(c));
            Formula result = convertToBdd(c, options->opt_verbosity, (int)(adder_cost * options->opt_bdd_thres));
            if (result == _undef_)
                result = buildConstraint(c,primesLoader, options, (int)(adder_cost * options->opt_sort_thres));
            if (result == _undef_)
                linearAddition(c, converted_constrs, options->opt_verbosity);
            else
                converted_constrs.push(result);
        }else
            assert(false);

        if (!ok) return false;
    }

    if (!options->opt_validateResoult) cleanPBC();
	
	formulaSize = converted_constrs.size();
	
    clausify(*sat_solver, options, converted_constrs);
    
    if (options->opt_dump) {
        exit(0);
    }

    return ok;
}