#!python3 from pysat.formula import CNF from pysat.solvers import Glucose4 import pathlib as pl import random import bz2 import sys CORE_DIR = pl.Path("./cores") EXTENDED_DIR = pl.Path("./extended") usage_str = "usage: gen_eq_instance.py [instance dir] [num per instance]" def main(): instances_dir = None try: instances_dir = pl.Path(sys.argv[1]) except: print(usage_str) return else: if not instances_dir.is_dir(): print(usage_str) return num_per_instance = 0 try: num_per_instance = int(sys.argv[2]) except: print(usage_str) return instances = get_instance_paths(instances_dir) for instance in instances: run(instance, num_per_instance) def get_instance_paths(instances_dir): instances = [] for p in instances_dir.iterdir(): if str(p).endswith(".cnf.bz2"): instances.append(p) return instances def run(instance, calls_per_instance): ipath = pl.Path(instance) iname = ipath.stem[:-4] f = CNF(str(ipath)) for i in range(calls_per_instance): extension = gen_extension(iname, len(f.clauses) / 10) ext_f = CNF() ext_f.extend(extension) print(iname) print(len(f.clauses)) print() fpath, nr = next_file_path(iname) ext_f.to_file(fpath, comments=["c extending:{} nr:{}".format(iname, nr), "c number of cores: {}".format(len(extension))], compress_with="bzip2") def gen_extension(instance, expected_num_of_core): cores = parse_cores(instance) p = expected_num_of_core / len(cores) extension = [] print((expected_num_of_core * 10) / len(cores)) print(expected_num_of_core * 10, len(cores)) for core in cores: if p >= random.random(): extension.append(core) return extension def parse_cores(instance): cores = [] with bz2.open(CORE_DIR / (instance + ".cores.bz2"), "tr") as cores_file: cores = list(map(lambda l: l.strip(), cores_file.readlines())) cores = list(map(lambda l: l.split(","), cores)) for i in range(len(cores)): cores[i] = list(map(int, cores[i])) cores[i] = list(map(lambda lit: -1 * lit, cores[i])) return cores def next_file_path(name): counter = 0 ext_file_path = EXTENDED_DIR / ("{}_{:04}.cnf.bz2".format(name, counter)) while ext_file_path.exists(): counter += 1 ext_file_path = EXTENDED_DIR / ("{}_{:04}.cnf.bz2".format(name, counter)) return ext_file_path, counter if __name__ == "__main__": main()