Exemplo n.º 1
0
def generate(args):
    f = open(args.gen_log, 'w')

    n_cnt = args.max_n - args.min_n + 1
    problems_per_n = args.n_pairs * 1.0 / n_cnt

    problems = []
    batches = []
    n_nodes_in_batch = 0
    prev_n_vars = None

    for n_var in range(args.min_n, args.max_n + 1):
        lower_bound = int((n_var - args.min_n) * problems_per_n)
        upper_bound = int((n_var - args.min_n + 1) * problems_per_n)
        for problems_idx in range(lower_bound, upper_bound):
            n_vars, iclauses, iclause_unsat, iclause_sat = gen_iclause_pair(
                args, n_var)

            if random.random() < 0.5:
                iclauses.append(iclause_unsat)
            else:
                iclauses.append(iclause_sat)

            n_clauses = len(iclauses)
            n_cells = sum([len(iclause) for iclause in iclauses])
            n_nodes = 2 * n_vars + n_clauses
            if n_nodes > args.max_nodes_per_batch:
                continue

            batch_ready = False
            if (args.one and len(problems) > 0):
                batch_ready = True
            elif (prev_n_vars and n_vars != prev_n_vars):
                batch_ready = True
            elif (not args.one
                  ) and n_nodes_in_batch + n_nodes > args.max_nodes_per_batch:
                batch_ready = True

            if batch_ready:
                batches.append(mk_batch_problem(problems))
                print("batch %d done (%d vars, %d problems)..." %
                      (len(batches), prev_n_vars, len(problems)),
                      file=f)
                del problems[:]
                n_nodes_in_batch = 0

            prev_n_vars = n_vars

            is_sat, stats = solve_sat(n_vars, iclauses)
            problems.append(("sr_n=%.4d_pk2=%.2f_pg=%.2f_t=%d_sat=0" %
                             (n_vars, args.p_k_2, args.p_geo, problems_idx),
                             n_vars, iclauses, is_sat))
            n_nodes_in_batch += n_nodes

    if len(problems) > 0:
        batches.append(mk_batch_problem(problems))
        print("batch %d done (%d vars, %d problems)..." %
              (len(batches), n_vars, len(problems)),
              file=f)
        del problems[:]

    return batches
Exemplo n.º 2
0
    n_nodes = 2 * n_vars + n_clauses
    if n_nodes > opts.max_nodes_per_batch:
        continue

    batch_ready = False
    if (opts.one and len(problems) > 0):
        batch_ready = True
    elif (prev_n_vars and n_vars != prev_n_vars):
        batch_ready = True
    elif (not opts.one
          ) and n_nodes_in_batch + n_nodes > opts.max_nodes_per_batch:
        batch_ready = True

    if batch_ready:
        batches.append(mk_batch_problem(problems))
        print("batch %d done (%d vars, %d problems)...\n" %
              (len(batches), prev_n_vars, len(problems)))
        del problems[:]
        n_nodes_in_batch = 0

    prev_n_vars = n_vars

    print('Number of Variables =', n_vars, '\nClauses =', iclauses)
    is_sat, is_time, stats = solve_sat(n_vars, iclauses)
    print('Time =', is_time, 'secs')
    avg_time.append(is_time)
    print('Satisfiability =', is_sat, '\n')

    problems.append((filename, n_vars, iclauses, is_time))
    n_nodes_in_batch += n_nodes
Exemplo n.º 3
0
def fun_generate(num=1, dir=None, dirout=None):
    opts = Package()
    problems = []
    batches = []
    n_nodes_in_batch = 0
    if dir != None:
        opts.dimacs_dir = dir
    if dirout != None:
        opts.out_dir = dirout
    filenames = os.listdir(opts.dimacs_dir)
    filenames = sorted(filenames)
    prev_n_vars = None

    for filename in filenames:
        """   n_vars:变元数量,iclauses:[[1,2,-3],[?],[?]]
              n_clauses:子句数量, n_cells:文字和,n_nodes:2 * n_vars + n_clauses
        """
        print(filename)
        n_vars, iclauses, answerpro = parse_dimacs("%s/%s" %
                                                   (opts.dimacs_dir, filename))
        print(n_vars)
        n_clauses = len(iclauses)
        n_cells = sum([len(iclause) for iclause in iclauses])
        n_nodes = 2 * n_vars + n_clauses
        if n_nodes > opts.max_nodes_per_batch:
            continue
        batch_ready = False
        opts.one = True  # 一个公式一个的包装
        if (opts.one and len(problems) > 0):
            batch_ready = True
        elif (prev_n_vars and n_vars != prev_n_vars):
            # bianyuan shuliang bu tong
            batch_ready = True
        elif (not opts.one
              ) and n_nodes_in_batch + n_nodes > opts.max_nodes_per_batch:
            # chao guo dan yuan shu
            batch_ready = True
        if batch_ready:
            batches.append(mk_batch_problem(problems))
            print("batch %d done (%d vars, %d problems)...\n" %
                  (len(batches), prev_n_vars, len(problems)))
            del problems[:]
            n_nodes_in_batch = 0
        prev_n_vars = n_vars
        # is_sat, stats = solve_sat(n_vars, iclauses)
        # 默认为可满足
        # print("----"+answerpro)
        problems.append((filename, n_vars, iclauses, True))
        n_nodes_in_batch += n_nodes

    if len(problems) > 0:
        batches.append(mk_batch_problem(problems))
        print("batch %d done (%d vars, %d problems)...\n" %
              (len(batches), n_vars, len(problems)))
        del problems[:]

    # create directory
    if not os.path.exists(opts.out_dir):
        os.mkdir(opts.out_dir)

    dataset_filename = mk_dataset_filename(opts, len(batches))
    print("Writing %d batches to %s...\n" % (len(batches), dataset_filename))
    with open(dataset_filename, 'wb') as f_dump:
        pickle.dump(batches, f_dump)