Beispiel #1
0
def cvc4_compile(config):
    """Compiles a FlatZinc model in SMT-LIB format."""
    assert common.is_binary_in_path(binary_filename())
    assert config.smt2

    optimathsat_config = argparse.Namespace(**vars(config))
    optimathsat_config.infinite_precision = True  # always override!
    optimathsat_config.compile_raw = True

    if not hasattr(optimathsat_config, 'ovars'):
        optimathsat_config.ovars = None

    fzn2optimathsat.optimathsat(optimathsat_config)

    make_smtlib_compatible_with_cvc4(config, optimathsat_config)
Beispiel #2
0
def zthree_solve(config, solver_config=None):
    """Solves a FlatZinc model with Z3.

    The FlatZinc model is compiled to a SMT-LIBv2
    formula with OptiMathSAT first."""
    assert common.is_binary_in_path(binary_filename())
    assert not config.smt2

    with tempfile.TemporaryDirectory() as tmp_dir:
        config.smt2 = os.path.join(tmp_dir, "formula.smt2")
        config.ovars = os.path.join(tmp_dir, "output_vars.txt")
        output_trace = os.path.join(tmp_dir, "trace.out")
        config.get_model = False

        # 1. generate SMT-LIB + OVARS files
        zthree_compile(config)

        # 2. parse OVARS skeleton
        oskeleton = common.extract_solution_skeleton(config.ovars)

        # 3. solve
        args = zthree_solve_cmdline_args(config)
        if solver_config:
            args.extend(solver_config)

        with io.open(output_trace, "w", newline=None) as out_f:
            result = subprocess.run(args,
                                    universal_newlines=True,
                                    stderr=subprocess.PIPE,
                                    stdout=out_f,
                                    check=True)

            # 4. display any error
            if result.returncode:
                with io.open(output_trace, "r", newline=None) as in_f:
                    print(in_f.read(), file=sys.stderr, end='')
                sys.exit(1)

        # 5. extract status
        status = zthree_extract_search_status(output_trace)

        # 6. extract model(s)
        models = zthree_extract_models(output_trace)

        # 7. print status + model(s)
        is_opt_problem = common.is_optimization_problem(config.model)
        common.print_search_status(config, status, models, oskeleton,
                                   is_opt_problem)